Compare commits

...

811 commits

Author SHA1 Message Date
b402f8309e Ajouter 'docker-compose.override.yml' 2023-02-18 23:06:20 +01:00
Tobias Genannt
39c7de4af4
Merge pull request from netbox-community/develop
Release 2.4.0
2022-12-15 15:36:27 +01:00
Tobias Genannt
238f95c5ce Preparation for 2.4.0 2022-12-15 12:57:51 +01:00
Christian Mäder
751a131b78
Merge pull request from netbox-community/listenOnIPv6
Make nginx-unit listen on IPv4 and IPv6
2022-12-06 21:09:02 +01:00
Tobias Genannt
5e2158da24
Merge pull request from ryanmerolle/issue_784
Address housekeeping traceback
2022-12-06 18:12:02 +01:00
Tobias Genannt
4a530947f8
Merge pull request from tobiasge/ldap-cert-settings
Added settings for CA certificates for LDAP
2022-12-01 13:59:22 +01:00
Tobias Genannt
bdb4396275 Added settings for CA certificates for LDAP 2022-12-01 08:17:25 +01:00
Tobias Genannt
80d87bdf1b
Merge pull request from tobiasge/psycopg2-changes
Optimize psycopg2 dependency
2022-11-30 16:23:20 +01:00
Tobias Genannt
6d465e6f81 Optimize psycopg2 dependency
We have beeing installing psycopg2 for a while now. This updates to the latest version. Because psycopg2-binary is a direct dependency of Netbox both versions were installled. Now we remove the pre-compiled version from the dependency file.
2022-11-30 14:36:53 +01:00
Tobias Genannt
b72084290a
Merge pull request from tobiasge/startup-scripts-complete-removal
Startup scripts complete removal
2022-11-30 13:14:32 +01:00
Tobias Genannt
aa3357817a Disable Gitleaks 2022-11-30 10:54:24 +01:00
Tobias Genannt
9441be459c Improved testing
After the initializer scripts were removed, we didn't test the actual compose setup anymore. This adds new tests to run the database migrations.
2022-11-30 10:54:24 +01:00
Tobias Genannt
1779ba790d Removed warning for initializer scripts 2022-11-30 09:51:36 +01:00
Tobias Genannt
22cb2d5812
Merge pull request from netbox-community/renovate/postgres-15.x
Update postgres Docker tag to v15
2022-11-30 08:50:15 +01:00
Christian Mäder
6020f4503a
Make nginx-unit listen on IPv4 and IPv6 2022-11-23 14:40:03 +01:00
renovate[bot]
a4f494db14
Update postgres Docker tag to v15 2022-11-11 14:24:44 +00:00
Tobias Genannt
0cac6f51a9
Merge pull request from Wellyas/patch-1
Add requirements for SAML SSO
2022-11-11 14:08:15 +01:00
Wellyas
dd01e3c227 Enable SAML & OPENIDCONNECT for social-auth-core 2022-11-11 13:07:14 +01:00
Tobias Genannt
925f41b97f
Merge pull request from movelg/housekeeping_var_name_fix
Housekeeping var name fix
2022-11-11 10:54:13 +01:00
movelg
7d871778eb
Don't use bash internal variable name 2022-11-11 08:40:29 +01:00
Christian Mäder
8b16b16e45
Merge pull request from netbox-community/develop
Version 2.3.0
2022-11-02 11:19:30 +01:00
Christian Mäder
c5f91ad359 Preparation for 2.3.0 2022-10-25 17:38:03 +02:00
Ryan Merolle
35a94cb7e5
Update docker-compose.yml
Address housekeeping tracebacks & remove whitespace
2022-10-22 09:40:03 -04:00
Christian Mäder
1835d3cafd
Merge pull request from cimnine/ConfigurationUpdate
Updates the configuration, changes default for dynamic paramters to None
2022-10-15 12:48:52 +02:00
Christian Mäder
df8f406432 Remove unnecessary import 2022-10-15 10:23:14 +02:00
Christian Mäder
b8b1c8fc63 Rename conversion lambdas 2022-10-15 10:23:14 +02:00
Christian Mäder
41ff541225 Simplified test for existance of dynamic parameters 2022-10-15 10:17:49 +02:00
Christian Mäder
26399e224d Make dynamic configuration parameters actually work 2022-10-15 10:17:17 +02:00
Christian Mäder
951c12132a Updates the configuration, changes default for dynamic paramters to None 2022-10-15 10:15:55 +02:00
Christian Mäder
a3680b22dd
Merge pull request from cimnine/HereDocForBuildHelp
Improve Help for build.sh
2022-10-10 18:30:25 +02:00
Christian Mäder
d96e8f1dfd Improve Help for build.sh 2022-10-08 17:18:56 +02:00
Christian Mäder
c21a29b383
Merge pull request from Delta1977/release
Define a volume for the caching Redis
2022-10-06 22:58:43 +02:00
Christian Mäder
f9f1533332
Merge pull request from netbox-community/renovate/psycopg2-2.x
Update dependency psycopg2 to v2.9.4
2022-10-06 21:30:50 +02:00
renovate[bot]
4f45df571f
Update dependency psycopg2 to v2.9.4 2022-10-06 16:58:57 +00:00
Delta / Subo /Stefan
cd5015642e
Fix for random volume Redis Cache
fixes:
https://github.com/netbox-community/netbox-docker/issues/851
2022-09-23 14:33:49 +02:00
Tobias Genannt
d385cd2aa9
Merge pull request from BegBlev/ldap-group-search-issue
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER is now loaded from environment
2022-09-21 13:03:13 +02:00
Vincent Catros
7f285af7b4
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER defaults to false 2022-09-09 16:11:21 +02:00
Tobias Genannt
c8c360da99
Merge pull request from tymekxxl/jobresult_retention
add JOBRESULT_RETENTION to configuration.py
2022-09-05 08:24:10 +02:00
Michal Tyminski
53dcdc7bfc add JOBRESULT_RETENTION to configuration.py
Netbox v3.2.1 introduces new enhancement to retain old script
and report results for configured lifetime.
2022-09-01 10:03:19 -07:00
Tobias Genannt
3f1e45f636
Merge pull request from netbox-community/develop
Version 2.2.0
2022-09-01 12:12:06 +02:00
Tobias Genannt
e38c1d3c85 Preparation for 2.2.0 2022-09-01 10:43:10 +02:00
Tobias Genannt
e48ab084ce
Merge pull request from tobiasge/fix-for-811
Installed bzip2
2022-08-31 15:14:41 +02:00
Tobias Genannt
5ea3008f82
Merge pull request from tobiasge/test-config
Removed unnecessary logging from tests
2022-08-31 15:08:54 +02:00
Tobias Genannt
1418808930 Installed bzip2
In the Wiki backup section we use bzip2 in some of the examples. So it should be installed in the image.
2022-08-31 14:11:05 +02:00
Tobias Genannt
da412e3bdb Removed unnecessary logging from tests 2022-08-31 14:05:34 +02:00
Tobias Genannt
98add8f83a
Merge pull request from tobiasge/remove-initializers
Initializers are now a plugin
2022-08-31 13:43:58 +02:00
Tobias Genannt
6f1d46d765 Initializers are now a plugin 2022-08-30 16:01:43 +02:00
Tobias Genannt
ada2bd6501
Merge pull request from tobiasge/readme-update
Improved README.md
2022-08-09 10:30:07 +02:00
Tobias Genannt
8707cef55a Improved README.md
- Removed the hint to the `-ldap` tags that where discontinnued with version 2.0.
- Increased minimum Docker version to reflect the needed version for running newer Ubuntu versions. See: https://medium.com/nttlabs/ubuntu-21-10-and-fedora-35-do-not-work-on-docker-20-10-9-1cd439d9921
- Fixed some Markdown linter errors
2022-08-09 09:08:40 +02:00
Tobias Genannt
dc45dfc383
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.13.1
2022-08-06 17:05:58 +02:00
renovate[bot]
691ad94498
Update dependency django-storages to v1.13.1 2022-08-06 13:38:07 +00:00
Tobias Genannt
535fefe12f
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.13
2022-08-05 22:31:10 +02:00
renovate[bot]
db982814a1
Update dependency django-storages to v1.13 2022-08-05 13:52:56 +00:00
Tobias Genannt
ebda4660de
Merge pull request from netbox-community/develop
Version 2.1.0
2022-07-25 08:19:22 +02:00
Tobias Genannt
f44e377e29
Merge branch 'release' into develop 2022-07-25 08:14:46 +02:00
Tobias Genannt
0a6d4c998d Preparation for 2.1.0 2022-07-22 10:15:51 +02:00
Tobias Genannt
bd9733d929
Merge pull request from tobiasge/ldap-tls-fix
LDAP TLS connection use the system trusted root store
2022-07-21 11:29:27 +02:00
Tobias Genannt
9ae3282dcf Install libldap-common
This installs the LDAP configurationn file which is needed to load the trusted root certificates from the system.
2022-07-21 09:13:11 +02:00
Tobias Genannt
e62fedbd5e
Merge pull request from rjmidau/oidc
Add requirements for OIDC SSO
2022-07-19 13:58:48 +02:00
Tobias Genannt
c53ae2afa0
Merge pull request from tobiasge/with-ubuntu
Using Ubuntu 22.04 because Debian has old packages
2022-07-19 11:37:16 +02:00
Tobias Genannt
45e7f6a30c Using Ubuntu 22.04 because Debian has old packages
With Debian the Quay.io security checker found several issues in the
image. With Ubuntu we have never versions of all packages and therefore
less (or no) issues.
2022-07-19 09:42:56 +02:00
Tobias Genannt
8fbedf2886
Merge pull request from netbox-community/renovate/docker-setup-buildx-action-2.x
Update docker/setup-buildx-action action to v2
2022-07-16 10:24:23 +02:00
renovate[bot]
c0063a6573
Update docker/setup-buildx-action action to v2 2022-07-16 08:23:01 +00:00
Tobias Genannt
c9795a8213
Merge pull request from netbox-community/renovate/docker-setup-qemu-action-2.x
Update docker/setup-qemu-action action to v2
2022-07-16 10:22:43 +02:00
renovate[bot]
8aec402ea2
Update docker/setup-qemu-action action to v2 2022-07-15 18:36:01 +00:00
Tobias Genannt
adc2079b17
Merge pull request from tobiasge/arm64-auto-build
Arm64 auto build
2022-07-15 16:56:57 +02:00
Tobias Genannt
cee1b5b079 Build ARM64 images 2022-07-15 15:06:16 +02:00
Tobias Genannt
13d66f2ae7
Merge pull request from tobiasge/path-update
Added our Python venv to the PATH variable
2022-07-14 22:37:14 +02:00
Tobias Genannt
901ac05e99 Added our Python venv to the PATH variable
Now users can run "manage.py" without specifying the full path.
2022-07-13 15:53:56 +02:00
Robert Meredith
2bdaed1e6f Add requirements for OIDC SSO 2022-07-13 16:55:38 +10:00
Tobias Genannt
b45934cd9e
Merge pull request from netbox-community/develop
Version 2.0.0
2022-07-12 18:10:25 +02:00
Tobias Genannt
fceb6e0e13 Removed CSRF_TRUSTED_ORIGINS from extra.py
CSRF_TRUSTED_ORIGINS is already in configuration.py
2022-07-12 17:16:20 +02:00
Tobias Genannt
f05a9c67ae Preparation for 2.0.0 2022-07-12 16:50:32 +02:00
Tobias Genannt
f2d1e62204
Merge pull request from netbox-community/renovate/napalm-4.x
Update dependency napalm to v4
2022-07-12 07:53:50 +02:00
renovate[bot]
8f704f220a
Update dependency napalm to v4 2022-07-11 13:11:13 +00:00
Tobias Genannt
d5093201ee
Merge pull request from tobiasge/fixed-comment
Fixed comment and variable name
2022-06-22 12:51:27 +02:00
Tobias Genannt
401777adff Fixed comment and variable name 2022-06-22 12:28:33 +02:00
Vincent Catros
5ff292ba5f AUTH_LDAP_BIND_AS_AUTHENTICATING_USER is now loaded from environment 2022-06-20 14:10:37 +02:00
Tobias Genannt
f80cc70d76
Merge pull request from tobiasge/image-label-update
Updated image labels and build script
2022-06-16 19:21:39 +02:00
Tobias Genannt
5b8bf780df Updated image labels and build script 2022-06-15 16:18:21 +02:00
Tobias Genannt
bce52596a5
Merge pull request from tobiasge/debian-based
Debian based
2022-06-15 11:02:30 +02:00
Tobias Genannt
c3c94b0a63 Used version number and remove explicit dependency 2022-06-15 10:15:15 +02:00
Tobias Genannt
14c30fb81c Changed the ignored warnings 2022-06-15 09:04:00 +02:00
Christian Mäder
1130ff6c6d Merge branch 'csrf-trusted-origins' into develop 2022-06-12 10:52:10 +02:00
SejiL
993c93b34a Add CSRF option to extra.py 2022-06-12 10:51:56 +02:00
Tobias Genannt
dcf0bdb950 Added psycopg2 as additionnal dependency
With psycopg2-binary the images doesn't work on ARM64.
2022-06-10 10:38:21 +02:00
Tobias Genannt
9e2f4313fb First version of Debian based image 2022-06-10 09:31:41 +02:00
Tobias Genannt
df41020cb8
Merge pull request from netbox-community/renovate/redis-7.x
Update dependency redis to v7
2022-06-09 15:35:34 +02:00
Tobias Genannt
1332df4857
Merge pull request from netbox-community/renovate/django-auth-ldap-4.x
Update dependency django-auth-ldap to v4.1.0
2022-06-09 15:35:12 +02:00
Tobias Genannt
3f23419bb7
Merge pull request from FliesLikeABrick/feature/skip-git-no-git-operations-fix-#765
Proposing SKIP_GIT now skips all git operations
2022-06-09 15:34:53 +02:00
Renovate Bot
184ff72912
Update dependency redis to v7 2022-06-09 06:12:46 +00:00
Renovate Bot
55ee95df78
Update dependency django-auth-ldap to v4.1.0 2022-06-09 06:12:42 +00:00
Tobias Genannt
78fe47aaba
Merge pull request from netbox-community/renovate/actions-setup-python-4.x
Update actions/setup-python action to v4
2022-06-09 08:12:17 +02:00
Tobias Genannt
1370596f27
Fixed missing Python version
Python version hast to be set with v4 of the action. The version is now fixed to what is in Alpine 3.14.
2022-06-09 07:47:48 +02:00
Renovate Bot
606e56d78f
Update actions/setup-python action to v4 2022-06-08 19:42:43 +00:00
Ryan Rawdon
51226c8e50 Proposed fix for netbox-docker -- SKIP_GIT will skip other git operations 2022-05-25 10:43:23 -04:00
Tobias Genannt
6c9d4aebac
Merge pull request from netbox-community/renovate/docker-login-action-2.x
Update docker/login-action action to v2
2022-05-06 08:53:08 +02:00
Renovate Bot
ed8b42fbde
Update docker/login-action action to v2 2022-05-05 19:01:27 +00:00
Tobias Genannt
aa56f645e9
Merge pull request from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.4.1
2022-05-05 16:41:23 +02:00
Renovate Bot
9a1bb788d2
Update dependency napalm to v3.4.1 2022-04-29 17:02:51 +00:00
Tobias Genannt
7d32f79379
Merge pull request from thomas-mc-work/patch-2
Add MAPS_URL to config
2022-04-25 17:04:04 +02:00
Tobias Genannt
0410cf2fd2
Merge pull request from Lon1/contact-startups
Contact startups
2022-04-25 17:03:31 +02:00
Tobias Genannt
c9f5e34c0d Improved contact initializer examples 2022-04-25 16:38:09 +02:00
Thompson, Lon
047f2abdb5 adding contact startups 2022-04-25 15:51:32 +02:00
Tobias Genannt
f13a6573a8
Merge pull request from kr3ator/feature/cable_initializers
Startup script for cables
2022-04-25 15:44:36 +02:00
Thomas McWork
596bb6953c
preserve sort order 2022-04-19 12:59:27 +02:00
kr3ator
d482e623df fix: Template and non-template fields example 2022-04-19 12:54:37 +02:00
Thomas McWork
bf910dea02
Handle MAPS_URL config value
Regarding https://github.com/netbox-community/netbox/blob/develop/docs/configuration/dynamic-settings.md#maps_url
2022-04-19 12:21:07 +02:00
kr3ator
57da852af6 Cabling script minor updates 2022-04-12 14:47:24 +02:00
Tobias Genannt
4c21344e8b
Merge pull request from kr3ator/feature/interfaces_improvements
Add support for bridge, lag, parent in DCIM Interfaces startup script
2022-04-12 14:07:56 +02:00
kr3ator
302c0fed59 Cable startup script 2022-04-12 13:51:57 +02:00
kr3ator
0e7afe466d feat: Add support for bridge, lag, parent 2022-04-12 13:49:44 +02:00
Tobias Genannt
2c757af250
Merge pull request from kr3ator/feature/device_type_components
Add support for DeviceType components
2022-04-12 13:29:28 +02:00
Tobias Genannt
27f28935d7
Merge pull request from RobinBeismann/develop
Added environment variable for CSRF_TRUSTED_ORIGINS
2022-04-08 17:03:28 +02:00
kr3ator
12753dd7d4 Document field name precedence 2022-04-08 15:57:52 +02:00
kr3ator
dd8dce1b49 feat: Add support for DeviceType components 2022-04-08 15:57:46 +02:00
Robin Beismann
19280c2bb0
Fixed default value to reflect upstream 2022-04-08 15:36:49 +02:00
Tobias Genannt
5c4a1cc082
Merge pull request from kr3ator/feature/separate_default_params
feat: Make startup scripts idempotent
2022-04-08 15:17:07 +02:00
kr3ator
a63af05bec
Update initializers/users.yml
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2022-04-08 14:57:37 +02:00
kr3ator
9be7b0e109 feat: Make startup scripts idempotent 2022-04-07 19:47:19 +02:00
Robin Beismann
d5b1d9ce39
Added environment variable for CSRF_TRUSTED_ORIGINS 2022-04-07 16:09:27 +02:00
Tobias Genannt
a6eb4fef00
Merge pull request from kr3ator/bugfix/cf_creation
Fix setting custom field data if custom field object is missing
2022-04-07 09:01:04 +02:00
kr3ator
d1c69e8fe5 fix: invalid Interface optional assoc 2022-04-06 16:45:25 +02:00
kr3ator
81d9e4f560 Fix setting CF data if CF object is missing 2022-04-06 14:09:07 +02:00
Tobias Genannt
61a3afbb3b
Merge pull request from netbox-community/develop
Version 1.6.1
2022-04-06 09:58:45 +02:00
Tobias Genannt
91ab616cc5 Preparation for 1.6.1 2022-04-06 09:39:22 +02:00
Tobias Genannt
43d62f1284
Merge pull request from tobiasge/remove-tzdata
tzdata is already required in Netbox
2022-04-06 09:03:28 +02:00
Tobias Genannt
d61470d6ef
Merge pull request from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.4.0
2022-04-06 08:50:29 +02:00
Tobias Genannt
091d23d537 tzdata is already required in Netbox 2022-04-06 08:43:10 +02:00
Renovate Bot
2f24902436
Update dependency napalm to v3.4.0 2022-03-21 20:43:51 +00:00
Tobias Genannt
36d47b9b88
Merge pull request from netbox-community/renovate/actions-checkout-3.x
Update actions/checkout action to v3
2022-03-02 07:46:38 +01:00
Renovate Bot
2c20771682
Update actions/checkout action to v3 2022-03-01 19:06:16 +00:00
Tobias Genannt
a9cdec6d87
Merge pull request from netbox-community/renovate/actions-setup-python-3.x
Update actions/setup-python action to v3
2022-03-01 09:17:08 +01:00
Renovate Bot
f1efccea6b
Update actions/setup-python action to v3 2022-02-28 13:52:44 +00:00
Tobias Genannt
226d8438de
Merge pull request from netbox-community/develop
Release 1.6.0
2022-02-21 12:17:25 +01:00
Tobias Genannt
b6d6f85dc0 Preparation for 1.6.0 2022-02-21 11:25:37 +01:00
Tobias Genannt
49ed10bbee
Merge pull request from tobiasge/requirements
Added missing tzdata
2022-02-16 12:22:27 +01:00
Tobias Genannt
3afdd3bf13 Added missing tzdata 2022-02-16 09:32:03 +01:00
Christian Mäder
0170ed7d6f
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.21
2022-02-15 18:39:26 +01:00
Renovate Bot
dad2e93572
Update dependency ruamel.yaml to v0.17.21 2022-02-12 11:16:45 +00:00
Tobias Genannt
d726426611
Merge pull request from netbox-community/renovate/django-auth-ldap-4.x
Update dependency django-auth-ldap to v4
2022-02-05 11:37:07 +01:00
Renovate Bot
b31d99b936
Update dependency django-auth-ldap to v4 2022-02-03 16:50:11 +00:00
Ryan Merolle
8860d32f97
Cleanup & Reorg startup scripts ()
* Cleanup & Reorg startup scripts
2022-02-03 17:10:39 +01:00
Tobias Genannt
b9dff0d22e
Merge pull request from tobiasge/feature-build-fix
Fixed build for Netbox feature branch
2022-02-02 17:07:32 +01:00
Tobias Genannt
297aab1fd3 Fixed build for Netbox feature branch 2022-02-02 16:49:29 +01:00
Christian Mäder
54bf7a3819
Merge pull request from ryanmerolle/graphql
Explicitly set GRAPHQL_ENABLED
2022-02-02 16:43:32 +01:00
ryanmerolle
52876be723 add graphql 2022-01-31 21:45:29 -05:00
Tobias Genannt
ff20e4f49c
Merge pull request from tobiasge/asn-initializers
Added ASN initializer script
2022-01-10 11:14:55 +01:00
Tobias Genannt
ee47ba04bc Added ASN initializer script 2022-01-10 10:49:51 +01:00
Christian Mäder
688374d13f
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.20
2022-01-03 12:28:53 +01:00
Renovate Bot
22c4212438
Update dependency ruamel.yaml to v0.17.20 2022-01-03 09:48:22 +00:00
Christian Mäder
26dcb2f2e0
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.19
2021-12-29 22:47:22 +01:00
Renovate Bot
46afa266fa
Update dependency ruamel.yaml to v0.17.19 2021-12-26 15:22:25 +00:00
Tobias Genannt
b2d26d9dce
Merge pull request from tobiasge/fix-link
Fixed GHCR link
2021-12-11 12:12:13 +01:00
Tobias Genannt
0b622361f3
Merge pull request from tobiasge/disable-edge
Removed Alpine edge from tests
2021-12-11 12:12:02 +01:00
Tobias Genannt
ed48909f96 Removed Alpine edge from tests 2021-12-10 14:29:53 +01:00
Tobias Genannt
60d191bb2a
Fixed textlint errors 2021-12-09 22:23:03 +01:00
Tobias Genannt
4f482e484f Fixed GHCR link 2021-12-09 22:06:59 +01:00
Tobias Genannt
58a1579832
Merge pull request from netbox-community/develop
Version 1.5.1
2021-12-09 12:36:52 +01:00
Tobias Genannt
6d5cf7a815 Preparation for 1.5.1 2021-12-09 12:15:26 +01:00
Tobias Genannt
2e92554423
Merge pull request from tobiasge/fix-action
Fixed release action workflow
2021-12-09 12:10:23 +01:00
Tobias Genannt
2456a642b7 Fixed release action workflow 2021-12-09 11:23:30 +01:00
Tobias Genannt
b5108625ff
Merge pull request from netbox-community/develop
Version 1.5.0
2021-12-09 08:48:49 +01:00
Tobias Genannt
9ab54f27b1 Preparation for 1.5.0 2021-12-09 08:29:42 +01:00
Tobias Genannt
4b7037bbe6
Merge pull request from tobiasge/fix-653
Add __dir__ to configuration file
2021-11-30 11:48:11 +01:00
Tobias Genannt
f183603bc0 Fix : Add missing __dir__ to configuration.py 2021-11-30 11:19:49 +01:00
Tobias Genannt
544a58325d
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.17
2021-11-01 12:54:39 +01:00
Renovate Bot
9557bdf209
Update dependency ruamel.yaml to v0.17.17 2021-10-31 21:08:10 +00:00
Tobias Genannt
4890a8510d
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.12.3
2021-10-30 10:12:25 +02:00
Renovate Bot
66f77b5eb1
Update dependency django-storages to v1.12.3 2021-10-30 04:09:42 +00:00
Tobias Genannt
661b6b07a3
Merge pull request from grawert/startup_scripts_typos
Startup scripts typos
2021-10-25 14:59:08 +02:00
Uwe Grawert
ce8db1065d Fix some small typos in startup_scripts
- group creation prints proper group name
  - permission creation prints proper permission name
2021-10-25 14:36:37 +02:00
Tobias Genannt
9a0e1115ed
Merge pull request from tobiasge/fix-540
Set filter_logic from YAML file
2021-10-25 14:08:00 +02:00
Tobias Genannt
2b4c058af8 Set filter_logic from YAML file 2021-10-21 17:06:24 +02:00
Tobias Genannt
a206ad6811
Merge pull request from tobiasge/fix-580
Added ENV variables for INSECURE_SKIP_TLS_VERIFY
2021-10-20 09:49:33 +02:00
Tobias Genannt
a1dabcb758 Added ENV variables for INSECURE_SKIP_TLS_VERIFY 2021-10-20 09:27:18 +02:00
Christian Mäder
940c1bb50c
Merge pull request from cimnine/UpdateReadme 2021-10-19 17:49:28 +02:00
Christian Mäder
6c49d4fef5
Merge pull request from netbox-community/renovate/postgres-14.x
Update postgres Docker tag to v14
2021-10-19 17:30:49 +02:00
cimnine
621df33df9 Add missing words 2021-10-19 17:29:29 +02:00
cimnine
7e86ba002f More overhaul of the README 2021-10-19 17:22:19 +02:00
cimnine
6f12cb36af Add ghcr 2021-10-19 17:14:48 +02:00
cimnine
4ef35aadb6 Update the README with regards to the tags 2021-10-19 17:10:50 +02:00
Renovate Bot
d4081c15e1
Update postgres Docker tag to v14 2021-10-19 12:25:17 +00:00
Christian Mäder
6e870b4d0b
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.12.2
2021-10-19 14:24:58 +02:00
Christian Mäder
1e78ccd204
Merge pull request from cimnine/GHCR
Publish image to GitHub Container Registry
2021-10-19 14:24:07 +02:00
Renovate Bot
84e9b63524
Update dependency django-storages to v1.12.2 2021-10-18 23:36:23 +00:00
cimnine
4cc7f13b6e Push to ghcr.io 2021-10-18 11:42:59 +02:00
Tobias Genannt
fc2d0d1852
Merge pull request from tobiasge/psql-client
Install postgresql-client
2021-10-14 16:31:21 +02:00
Tobias Genannt
ef98ad54fa Install postgresql-client
Make usage of 'manage.py dbshell' possible
2021-10-14 15:37:30 +02:00
Tobias Genannt
4785e09945
Merge pull request from rsp2k/patch-1
Add friendly check for jq
2021-10-14 09:11:56 +02:00
Tobias Genannt
d4f9bb6da3 Shellcheck errors 2021-10-14 08:37:28 +02:00
rsp2k
ab41eaa5d9 Add friendly message/exit when jq isn't available 2021-10-14 08:37:28 +02:00
rsp2k
02794f368b Add friendly check for jq 2021-10-14 08:37:28 +02:00
Tobias Genannt
9c66cc4c32
Merge pull request from netbox-community/develop
Version 1.4.1
2021-10-14 07:45:50 +02:00
Christian Mäder
68401caf1c
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.12.1
2021-10-11 22:39:39 +02:00
Renovate Bot
4f466bb5a1
Update dependency django-storages to v1.12.1 2021-10-11 19:24:42 +00:00
Christian Mäder
daaea77144
Merge pull request from tobiasge/user-unit
Fix : Use user name instead of userid
2021-10-06 17:25:47 +02:00
Christian Mäder
faa1cb52dd Preparation for 1.4.1 2021-10-06 17:03:48 +02:00
Christian Mäder
57ac14f295
Merge pull request from netbox-community/renovate/google-crc32c-1.x
Update dependency google-crc32c to v1.3.0
2021-10-06 13:58:47 +02:00
Renovate Bot
d0f4820baa
Update dependency google-crc32c to v1.3.0 2021-10-06 00:32:00 +00:00
Christian Mäder
b0261e8cc6
Merge pull request from cimnine/GroupBuildOutput
Group the build output in GitHub Action
2021-10-05 11:33:03 +02:00
Christian Mäder
30a7aa0e9c Group the build output in GitHub Action 2021-10-05 11:08:16 +02:00
Christian Mäder
5f0b7467d1
Merge pull request from cimnine/FixEdge
Implicit openssl-dev dependency resolution (fixes alpine:edge)
2021-10-05 10:55:55 +02:00
Christian Mäder
24363b653f Remove openssl-dev from Dockerfile
It is pulled by postgresql-dev anyway
In the upcoming alpine, openssl v3 will be
the default, but postgresql-dev will still
require openssl v1.x.
This creates a conflict, which can be resolved
if postgresql-dev can choose the openssl version
it depends on.
2021-10-05 09:47:55 +02:00
Christian Mäder
21a3048b96
Merge pull request from cimnine/IssueForms
Use issue template form instead of text template
2021-10-05 09:26:48 +02:00
Tobias Genannt
5679ab435f Use user name instead of userid
Nginx unit needs the user and group parameter as names.
2021-09-24 08:16:07 +02:00
Christian Mäder
c9b3edd0f1
Merge pull request from netbox-community/renovate/google-crc32c-1.x
Update dependency google-crc32c to v1.2.0
2021-09-21 08:22:15 +02:00
Renovate Bot
31e6e42a30
Update dependency google-crc32c to v1.2.0 2021-09-20 20:43:14 +00:00
Christian Mäder
1a868c6847
Merge pull request from cimnine/NBDoVersionTag
Add project version to Docker tag
2021-09-20 13:35:24 +02:00
cimnine
a9d6f1fefe Use issue template form instead of template 2021-09-17 20:10:15 +02:00
cimnine
dbfcd5b58c Add project version to Docker tag 2021-09-17 19:02:18 +02:00
Tobias Genannt
6a52a48b71
Merge pull request from netbox-community/develop
Version 1.4.0
2021-09-17 11:35:56 +02:00
Tobias Genannt
e31492a9b4
Merge branch 'release' into develop 2021-09-17 11:08:31 +02:00
Tobias Genannt
f2dbc4f717 Preparation for 1.4.0 2021-09-17 10:56:50 +02:00
Tobias Genannt
1d040ad64d
Merge pull request from tobiasge/drop-privileges
Drops privileges to user 101 and group 0
2021-09-17 10:53:08 +02:00
Tobias Genannt
8703749292
Merge pull request from tobiasge/house
Added container for Netbox housekeeping command
2021-09-17 10:52:28 +02:00
Tobias Genannt
d432a84c42
Merge pull request from mk-fg/develop
Print last line of django db connection error while waiting for db to start
2021-09-17 10:50:31 +02:00
Tobias Genannt
c00492cad0
Merge pull request from tobiasge/check-remote
Check if remote branch exists before checkout
2021-09-13 23:42:47 +02:00
Tobias Genannt
c4d545a256
Improved check
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-09-13 22:50:06 +02:00
Tobias Genannt
d0c429c8a1 Check if remote branch exists before checkout 2021-09-13 09:27:28 +02:00
Tobias Genannt
a8b6883183 Changed entrypoint to "tini". 2021-09-13 08:51:23 +02:00
Tobias Genannt
5590b32c93
Merge pull request from netbox-community/renovate/google-crc32c-1.x
Update dependency google-crc32c to v1.1.5
2021-09-08 08:47:17 +02:00
Renovate Bot
97e7022121
Update dependency google-crc32c to v1.1.5 2021-09-07 22:27:44 +00:00
Tobias Genannt
2926d1a11d
Quote variable
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-09-07 09:47:38 +02:00
Tobias Genannt
58debafa8a Added container for Netbox housekeeping command
Adds an additional container in which the new "housekeeping" command from
Netbox v3.0.0 is run.
2021-09-03 12:48:30 +02:00
Tobias Genannt
e021390568
Merge pull request from netbox-community/develop
Version 1.3.1
2021-09-03 10:57:05 +02:00
Tobias Genannt
389e68f6ba
Merge branch 'release' into develop 2021-09-03 10:34:55 +02:00
Tobias Genannt
7eeb2ea7e6 Prepare version 1.3.1 2021-09-03 10:21:43 +02:00
Christian Mäder
954bddeb64
Merge pull request from cimnine/FixCRC32
Build and install libcrc32c
2021-09-03 10:16:13 +02:00
Christian Mäder
9255afd060 Improves google-cloud-storage performance
And also fixes the build by providing a 'alpine version'
of the google/crc32c library, which google-crc32c and
google-cloud-storage and ultimately django-storages[google]
depend on.
2021-09-03 09:15:41 +02:00
Daniel Metzler
a0a32b930e
Fixed port issue with latest docker version. ()
Co-authored-by: Tobias Genannt <t.genannt@scanplus.de>
2021-09-03 08:03:27 +02:00
Mike Kazantsev
fc4b78f74a Print last line of django db connection error while waiting for db to start
Fixes 
2021-09-02 20:22:03 +05:00
Tobias Genannt
9e063a6e6f
Merge pull request from tobiasge/google-crc32c
Workaround for build error in google-crc32c 1.1.3
2021-08-31 16:29:40 +02:00
Tobias Genannt
54823b41e1 Workaround for build error in google-crc32c 1.1.3 2021-08-31 16:04:48 +02:00
Tobias Genannt
6c5434ee20
Merge pull request from netbox-community/develop
Version 1.3.0: Compatibility with Netbox v3
2021-08-30 21:29:25 +02:00
Tobias Genannt
8e0c795791 Prepare version 1.3.0 2021-08-30 21:07:01 +02:00
Tobias Genannt
1fd8d105e6
Merge pull request from tobiasge/prepare-3.0.0
Prepare for Netbox v3.0.0
2021-08-30 18:05:54 +02:00
Christian Mäder
fe4df4f70a
Merge pull request from netbox-community/disableDependencyDashboard 2021-08-30 12:54:31 +02:00
Christian Mäder
650e62f44f
Disable Renovate's "Dependency Dashboard" 2021-08-30 12:31:36 +02:00
Tobias Genannt
f8451b0c0a
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.16
2021-08-29 15:51:02 +02:00
Renovate Bot
3af075e039
Update dependency ruamel.yaml to v0.17.16 2021-08-29 13:05:16 +00:00
Christian Mäder
26d45b1e85
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.14
2021-08-26 15:07:24 +02:00
Renovate Bot
9b6c476bf9
Update dependency ruamel.yaml to v0.17.14 2021-08-25 20:34:39 +00:00
Tobias Genannt
c5a1557800 Removed deprecated settings 2021-08-21 18:22:24 +02:00
Tobias Genannt
9d476fa9af Build documentation files in the image 2021-08-21 18:22:24 +02:00
Tobias Genannt
9142aaf78e django-cacheops has been removed from Netbox 3.0.0 2021-08-21 18:22:24 +02:00
Christian Mäder
b258b6578c
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x 2021-08-21 18:03:42 +02:00
Renovate Bot
289540f576
Update dependency ruamel.yaml to v0.17.13 2021-08-21 14:53:54 +00:00
Christian Mäder
26a3f5fcc0
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.11
2021-08-19 11:27:59 +02:00
Renovate Bot
18ea220102
Update dependency ruamel.yaml to v0.17.11 2021-08-19 06:45:17 +00:00
Tobias Genannt
03a1793208 Drops privileges to user 101 and group 0
When the container is started as root the default was to drop privileges to "unit:unit". This caused some problems with temporary files. Now the privileges are drop to "101:0".
When the container is started as a normal user unit prints a warning that changing the user and group is not possible. This warning is safe to ignore.
2021-07-30 21:42:05 +02:00
Christian Mäder
3c01985e20
Merge pull request from netbox-community/renovate/django-auth-ldap-3.x
Update dependency django-auth-ldap to v3
2021-07-30 11:16:28 +02:00
Renovate Bot
275d2673b4
Update dependency django-auth-ldap to v3 2021-07-19 07:56:47 +00:00
Tobias Genannt
746aa9b4a6
Merge pull request from tobiasge/alpine-update
Alpine update to 3.14
2021-07-08 10:41:22 +02:00
Tobias Genannt
c13bec47b8
Merge pull request from insidieux/disable-server-side-cursors-option
Disable server side cursors option
2021-07-07 09:51:05 +02:00
Tobias Genannt
9953d11fd8
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.10
2021-07-07 09:47:56 +02:00
Tobias Genannt
b2ee468871 Alpine update to 3.14 2021-07-07 09:44:21 +02:00
Ageev Pavel
dd41d09b43 Add possibility to disable server side cursors 2021-06-24 18:21:08 +03:00
Renovate Bot
abfa6c989f
Update dependency ruamel.yaml to v0.17.10 2021-06-24 09:38:10 +00:00
Christian Mäder
bb3d964b89
Merge pull request from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.3.1
2021-06-23 21:47:32 +02:00
Renovate Bot
6bbc7a3a84
Update dependency napalm to v3.3.1 2021-06-18 12:29:27 +00:00
Christian Mäder
17b1a5022d
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.9
2021-06-10 17:19:06 +02:00
Renovate Bot
e38d646e8e
Update dependency ruamel.yaml to v0.17.9 2021-06-10 06:57:09 +00:00
Christian Mäder
bb298e7a01
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x 2021-06-09 20:01:41 +02:00
Renovate Bot
98840382b9
Update dependency ruamel.yaml to v0.17.8 2021-06-09 13:53:48 +00:00
Christian Mäder
b8ff0a1d43
Merge pull request from jlemesh/fix/initialize_tenants_before_sites
Initialize tenants before sites
2021-06-03 11:29:53 +02:00
Jelizaveta Lemeševa
15b097bd3e Add second tenant with group to site 2021-06-01 14:22:08 +03:00
Christian Mäder
e0b34b8c67
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.7
2021-06-01 09:45:02 +02:00
Renovate Bot
3aad44d68c
Update dependency ruamel.yaml to v0.17.7 2021-05-31 15:28:52 +00:00
Christian Mäder
6658d069fb
Merge pull request from cimnine/PinNetboxMinor 2021-05-31 11:26:51 +02:00
Christian Mäder
52f097d4a2
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x 2021-05-31 11:25:56 +02:00
Renovate Bot
f4e9ebcfb5
Update dependency ruamel.yaml to v0.17.6 2021-05-31 08:58:27 +00:00
Jelizaveta Lemeševa
057728b774 Allow sites to be initialized with tenants 2021-05-28 11:26:34 +03:00
Christian Mäder
5b618851c0 Pin the NetBox Docker version in the docker-compose.yml file 2021-05-26 19:05:37 +02:00
Christian Mäder
9f531ce0f7
Merge pull request from netbox-community/renovate/github-super-linter-4.x 2021-05-26 16:46:24 +02:00
Renovate Bot
dd732d7bc2
Update github/super-linter action to v4 2021-05-25 20:35:56 +00:00
Tobias Genannt
05bb40adb1
Merge pull request from netbox-community/renovate/napalm-3.x
Update dependency napalm to v3.3.0
2021-05-19 09:02:18 +02:00
Renovate Bot
240326ef37
Update dependency napalm to v3.3.0 2021-05-18 13:30:10 +00:00
Tobias Genannt
c49fa313ed
Merge pull request from tobiasge/ttf-ubuntu
Remove 'ttf-ubuntu-font-family' from image
2021-05-18 14:23:32 +02:00
Tobias Genannt
ff6bd95fce
Merge pull request from tobiasge/remove-secret-initializers
Secrets are removed in Netbox 2.12
2021-05-18 14:23:07 +02:00
Tobias Genannt
0def662e53
Merge pull request from netbox-community/renovate/postgres-13.x
Update postgres Docker tag to v13
2021-05-18 14:22:45 +02:00
Renovate Bot
49b7c267b9
Update postgres Docker tag to v13 2021-05-18 08:03:10 +00:00
Tobias Genannt
02f30f3a68 'ttf-ubuntu-font-family' was remove from Alpine 2021-05-18 09:34:44 +02:00
Tobias Genannt
e2cc9386fb Secrets are removed in Netbox 2.12 2021-05-18 09:32:48 +02:00
Tobias Genannt
43b8b36951
Merge pull request from tobiasge/run-update-when-needed
Optimise migrations on startup
2021-05-18 08:55:31 +02:00
Tobias Genannt
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
Tobias Genannt
676ca798cd
Merge pull request from netbox-community/develop
Release 1.2.0
2021-04-27 09:47:38 +02:00
Christian Mäder
60428d5639
Merge pull request from tobiasge/build-feature-branch
Build feature branch
2021-04-27 09:16:06 +02:00
Tobias Genannt
fd55ec220c
Merge pull request from ryanmerolle/startup-scripts-2.10+
user, group, & permissions fix
2021-04-27 09:05:14 +02:00
Christian Mäder
73b07a7181
Merge pull request from ryanmerolle/python-formatting
Python formatting Startup Scripts
2021-04-26 16:32:49 +02:00
ryanmerolle
1f3d9463f9 apply black formating to all startup_scripts 2021-04-26 10:26:10 -04:00
ryanmerolle
8678ad92ce update permission user & group lookup as suggested 2021-04-26 09:17:25 -04:00
Tobias Genannt
5b34df1471 Build feature branch
The branch for the next version of Netbox is now called "feature".
2021-04-26 09:44:52 +02:00
Christian Mäder
3d063a4b35
Merge branch 'ryanmerolle-plugins-and-logging' into develop 2021-04-26 08:55:41 +02:00
Christian Mäder
f924e76adf
Formatting 2021-04-26 08:55:22 +02:00
Christian Mäder
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
ryanmerolle
96545135cb remove example evn var for logging 2021-04-25 16:38:03 -04:00
ryanmerolle
474ca9e78f fully working object permissions 2021-04-25 16:31:50 -04:00
ryanmerolle
12401f2a3f correct black formatting for object_permissions.py 2021-04-25 12:13:27 -04:00
ryanmerolle
528bc17eb8 correct flake8 in object_permissions.py 2021-04-25 11:59:13 -04:00
ryanmerolle
4e31218ce6 update object permission conditionals 2021-04-25 11:15:46 -04:00
Christian Mäder
d1b70ba2d4
Merge pull request from ryanmerolle/ldap-example-var-name 2021-04-24 23:58:30 +02:00
ryanmerolle
ff0bc9757a correct ldap example var name case 2021-04-24 10:57:15 -04:00
ryanmerolle
a1e0c52825 revert startup scripts to use key for object name 2021-04-24 10:41:06 -04:00
ryanmerolle
45889c3811 commented out the logging 2021-04-23 22:38:38 -04:00
ryanmerolle
71d8ac10ac correct issues with users.yml spacing 2021-04-21 12:59:30 -04:00
ryanmerolle
744ed91e2a permissions script cleanup 2021-04-21 12:33:35 -04:00
ryanmerolle
b1bcfcbc4e fix isort on groups & permissions scripts 2021-04-21 08:27:20 -04:00
ryanmerolle
a7a5d13637 updated given linting feedback 2021-04-20 18:05:47 -04:00
ryanmerolle
5d4ecb7f9e user, group, & permissions fix 2021-04-20 17:47:49 -04:00
ryanmerolle
69dd87689c switch plugin example to netbox_bgp 2021-04-20 07:55:12 -04:00
ryanmerolle
9fab9a3434 mention plugin wiki page in plugins.py comment 2021-04-20 07:52:08 -04:00
ryanmerolle
b69a97d2ca add LOGLEVEL into netbox.env 2021-04-20 07:48:41 -04:00
ryanmerolle
8176ef8499 Add expample logging configuration 2021-04-20 07:46:39 -04:00
ryanmerolle
eb5cc88b25 Add expample plugin configuration 2021-04-20 07:46:29 -04:00
Christian Mäder
f2731d3fe6
Merge pull request from ryanmerolle/develop
AUTH_LDAP_MIRROR_GROUPS ldap_config tweak
2021-04-20 10:15:52 +02:00
ryanmerolle
6f4d025cb7 backed out ldap_config changes 2021-04-20 03:38:20 -04:00
ryanmerolle
222ede2c4b enahance ldap extra.py with more examples 2021-04-20 03:35:57 -04:00
Christian Mäder
5304c8f901
Merge pull request 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
Ryan Merolle
28a26288c9
Merge pull request from netbox-community/develop
pull in develop changes
2021-04-19 22:25:55 -04:00
Renovate Bot
53d759e263
Update dependency django-auth-ldap to v2.4.0 2021-04-19 13:13:02 +00:00
Tobias Genannt
6879412e2b
Merge pull request from tobiasge/no-random-port
Don't publish Netbox on random port
2021-04-19 11:33:23 +02:00
Tobias Genannt
a89d2e035c Don't publish Netbox on random port 2021-04-17 10:16:40 +02:00
Tobias Genannt
d5c92e9a7d Preparation for 1.2.0 2021-04-16 20:27:33 +02:00
Tobias Genannt
c7df608696
Merge pull request from tobiasge/prepare-2.11
Initializer updates for Netbox 2.11
2021-04-16 20:00:35 +02:00
Christian Mäder
eee07f703a
Merge pull request from jhujhiti/upstreaming
Fix quoting of exec argument in the entrypoint script
2021-04-16 08:42:15 +02:00
Erick Turnquist
6e7d5a6f59 Fix quoting of exec argument in the entrypoint script 2021-04-15 17:36:14 -04:00
Tobias Genannt
752f592e58
Fixed Python f-string
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-04-13 15:50:23 +02:00
Tobias Genannt
f637de88f0 Improved error logging 2021-04-13 14:38:52 +02:00
Christian Mäder
a5da38203f
Merge pull request from Daimler/custom-link-error-fix
Fixes : Custom Links initialiser breaks if content_type is invalid
2021-04-13 09:33:41 +02:00
Christian Mäder
14c0d17704
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.4
2021-04-12 17:12:05 +02:00
Renovate Bot
a572d5f5de
Update dependency ruamel.yaml to v0.17.4 2021-04-07 20:52:56 +00:00
Tobias Genannt
3673196c16 Fields in Custom links have been renamed 2021-04-07 15:19:14 +02:00
Tobias Genannt
9874cef369 VLAN Groups can be scoped to multiple types 2021-04-07 15:18:33 +02:00
Tobias Genannt
1c4b6741ac Fixed isort issues 2021-04-07 11:01:01 +02:00
Tobias Genannt
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
Tobias Genannt
45824ba4f3 Devices can be added to locations 2021-04-07 09:57:59 +02:00
Tobias Genannt
5944086435 Rack groups have been renamed to locations 2021-04-07 09:40:58 +02:00
Marcus Crane
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
Christian Mäder
9ab202f921
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x 2021-03-29 19:25:17 +02:00
Renovate Bot
cca79b5dbd
Update dependency ruamel.yaml to v0.17.2 2021-03-29 17:03:30 +00:00
Christian Mäder
61eecdd343
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.0
2021-03-26 18:16:33 +01:00
Renovate Bot
ce6fe5cb83
Update dependency ruamel.yaml to v0.17.0 2021-03-26 11:37:33 +00:00
Christian Mäder
8f119ede13
Merge pull request from cimnine/Sponsoring
Sponsor Message
2021-03-12 18:31:53 +01:00
Christian Mäder
edb61f3d90 Sponsor Message 2021-03-11 19:06:49 +01:00
Christian Mäder
cb5ffa0354
Merge pull request from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.16.13
2021-03-05 15:31:33 +01:00
Renovate Bot
ff1eed3cf0
Update dependency ruamel.yaml to v0.16.13 2021-03-05 09:58:42 +00:00
Christian Mäder
53d593de25 Preparation for 1.1.0 2021-03-04 12:07:21 +01:00
Christian Mäder
8111da308b
Merge pull request from cimnine/NewSlack
New Slack
2021-03-04 12:04:02 +01:00
Christian Mäder
0125ab4849 New Slack and wording improvements in templates 2021-03-04 09:59:05 +01:00
Christian Mäder
ad0c04985b
Merge pull request from cimnine/ReleaseScript
Release Script
2021-03-01 08:52:17 +01:00
Christian Mäder
793393fe0f Fix DEFAULT_REPO in release.sh 2021-03-01 08:27:24 +01:00
Christian Mäder
59995a8719 Add release script 2021-02-27 15:05:05 +01:00
Ryan Merolle
f19d650412
Merge pull request from netbox-community/develop
Merge upstream changes
2021-02-25 12:14:16 -05:00
Christian Mäder
6cd156f7d5
Merge pull request from netbox-community/FilterMainConfig
Fix loading main_config again during discovery of dynamic configurations
2021-02-24 08:21:18 +01:00
Christian Mäder
95976f4cf4 Don't load main config twice
Before, the main_config (e.g. 'configuration.py' or 'ldap_config.py') were loaded twice.
The first load was hard-coded and correct.
The second load was during the discovery phase for dynamic configurations.
This has now been fixed. During the discovery for dynamic configurations,
the main_config file is now excluded.

Thanks @tobiasge for discovering this bug.
2021-02-23 22:50:16 +01:00
Ryan Merolle
0dec4d8df4
Add extra.py example for ldap config 2021-02-22 16:00:08 -05:00
ryanmerolle
22186b267d do not set AUTH_LDAP_MIRROR_GROUPS if not defined 2021-02-22 15:55:40 -05:00
ryanmerolle
020e0adeb4 update .gitignore to keep extra.py in ldap config 2021-02-22 15:53:02 -05:00
Christian Mäder
009eb1fc6d
Merge pull request from netbox-community/RemoveMicroBadger
Remove MicroBadger Badges
2021-02-19 08:52:06 +01:00
Christian Mäder
989c250a82 Remove MicroBadger Badges
The service will shutdown in 2021:
https://microbadger.com/shutdown
2021-02-18 16:57:51 +01:00
Christian Mäder
3ee231bdd8
Merge pull request from netbox-community/renovate/django-auth-ldap-2.x
Update dependency django-auth-ldap to v2.3.0
2021-02-16 08:54:57 +01:00
Renovate Bot
3338cdc9d7
Update dependency django-auth-ldap to v2.3.0 2021-02-16 00:06:58 +00:00
Christian Mäder
c80fb19507
Merge pull request from netbox-community/develop
Version 1.0.2
2021-02-10 13:15:49 +01:00
Christian Mäder
74543ec272 Preparation for 1.0.2 2021-02-10 12:47:54 +01:00
Christian Mäder
9ccf0ac921
Merge pull request from netbox-community/VersionsToWiki
Move Documentation about Version to Wiki
2021-02-10 12:47:09 +01:00
Christian Mäder
8aed79363a Move Documentation about Version to Wiki
See https://github.com/netbox-community/netbox-docker/wiki/Version.
2021-02-10 12:45:37 +01:00
Christian Mäder
f7337ed1e9
Merge pull request from netbox-community/AddEditorconfig
Introduce Linting-Step in Build
2021-02-10 12:35:48 +01:00
Christian Mäder
4c8435e874 fixup! Lint the syntax of changes 2021-02-10 10:48:45 +01:00
Christian Mäder
a37f1592fc Sort env files 2021-02-08 18:56:30 +01:00
Christian Mäder
04ac3d5f4b Format shell scripts with shfmt 2021-02-08 18:56:30 +01:00
Christian Mäder
c6df6a040a Fix shellcheck complaint 2021-02-08 18:56:30 +01:00
Christian Mäder
28e4ae44fb Lint the syntax of changes 2021-02-08 18:56:30 +01:00
Christian Mäder
493fc60401 Use black as formatter for python files 2021-02-08 18:24:29 +01:00
Christian Mäder
0d25aff744 Add editorconfig 2021-02-08 18:24:29 +01:00
Christian Mäder
f33c647f24 Merge branch 'MajesticFalcon-feature' into develop 2021-02-08 10:37:04 +01:00
Christian Mäder
16ae063321 Adjust to repository standards 2021-02-08 10:36:50 +01:00
Schylar Utley
e4e2c788a9 Update 290_webhooks.py
Move to a more standard method of object handling
2021-02-08 10:09:55 +01:00
Schylar Utley
2e5d84612d Update initializers/custom_links.yml
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
744f0e57ad Update initializers/webhooks.yml
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
52c51b5f99 Update initializers/custom_links.yml
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
f88f4e1579 Update startup_scripts/290_webhooks.py
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
95f4d7856a Update startup_scripts/280_custom_links.py
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
07a0b1d7ef Update startup_scripts/280_custom_links.py
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-02-08 10:09:55 +01:00
Schylar Utley
fe811f37bd replace loop with list comprehension 2021-02-08 10:09:55 +01:00
Schylar Utleye
8321449cc0 add icons to help messages 2021-02-08 10:09:55 +01:00
Schylar Utleye
618feff63a add error handling for webhook and custom links. fix initializer comments 2021-02-08 10:09:55 +01:00
Schylar Utleye
a3cf645dc5 fix webhook initializer yaml and webhook startup script to work with latest netbox release 2021-02-08 10:09:55 +01:00
Schylar Utleye
d0c786e831 Update webhooks.yml
fix comment
2021-02-08 10:09:54 +01:00
Schylar Utleye
7112a88359 add webhook initializer 2021-02-08 10:09:54 +01:00
Schylar Utleye
187ae4b2a1 add custom link initializers 2021-02-08 10:09:54 +01:00
Christian Mäder
3a0b3fe133
Merge pull request from netbox-community/FixBuild
Dependencies to build 'cryptography' Python package
2021-02-08 09:55:12 +01:00
Christian Mäder
5343eaae65 Fix building cryptography pip 2021-02-08 09:03:33 +01:00
Christian Mäder
83a0d5d12f
Merge pull request from ypid/fix/branding
NetBox should always be referred to as NetBox
2021-02-04 22:17:29 +01:00
Robin Schneider
ee40e339c8
NetBox should always be referred to as NetBox
Fix all instances of "Netbox".

```Shell
git ls-files -z . | xargs --null -I '{}' find './{}' -type f -print0 | xargs --null sed --in-place --regexp-extended 's#Netbox#NetBox#g;'
```

Ref: https://netbox.readthedocs.io/en/stable/development/style-guide/#branding
2021-02-04 21:48:08 +01:00
Tobias Genannt
04e0b3d3ca
Merge pull request from tobiasge/django-storages-backends
Provide backends for django-storages in our images
2021-02-04 19:36:21 +01:00
Christian Mäder
fa70e0b761
Merge pull request from netbox-community/ImprovedIssueTemplate
Change the phrasing of the alternative issue options
2021-02-03 21:59:42 +01:00
Christian Mäder
88b35eb48e Change the phrasing of the alternative options 2021-02-03 21:46:11 +01:00
Tobias Genannt
5644254113 Provide backends for django-storages in our images 2021-02-03 20:01:36 +01:00
Christian Mäder
4dd7a51c7d
Merge pull request from netbox-community/develop
Version 1.0.1
2021-02-03 15:30:31 +01:00
Christian Mäder
c7e259e116 Merge branch 'release' into develop 2021-02-03 15:01:11 +01:00
Christian Mäder
3cbe07cb0e Preparation for 1.0.1 2021-02-03 14:52:21 +01:00
Tobias Genannt
70b38d52b9
Merge pull request from tobiasge/fix-412
Is greater than or equal to is "-ge" and not "-gte".
2021-01-31 21:38:49 +01:00
Tobias Genannt
a21d146b60 Is greater than or equal to is "-ge" and not "-gte". 2021-01-31 16:39:45 +01:00
Christian Mäder
6e7a64bd81
Merge pull request from netbox-community/renovate/django-storages-1.x
Update dependency django-storages to v1.11.1
2021-01-31 16:07:40 +01:00
Renovate Bot
f8360ba6aa
Update dependency django-storages to v1.11.1 2021-01-31 14:42:24 +00:00
Christian Mäder
bab8373f66
Merge pull request from netbox-community/renovate/actions-checkout-2.x
Update actions/checkout action to v2
2021-01-31 15:41:41 +01:00
Renovate Bot
ad93c99f46
Update actions/checkout action to v2 2021-01-31 11:55:20 +00:00
Christian Mäder
ed6256172f
Merge pull request from netbox-community/develop
Prepare version 1.0.0
2021-01-29 10:48:29 +01:00
Christian Mäder
5109e340ca Prepare for Version 1.0.0 2021-01-28 10:22:48 +01:00
Christian Mäder
62d31fda58
Merge pull request from netbox-community/updateYAML
Update of ruamel.yaml
2021-01-20 16:08:03 +01:00
Tobias Genannt
ed141c8a4e
Merge pull request from tobiasge/prevent-edge-from-failing
Prevent "alpine:edge" from failling the workflow
2021-01-20 13:14:09 +01:00
Christian Mäder
4d8d02e35a
Merge pull request from netbox-community/SkipStartupScriptsForUnitTests
Skip Startup Scripts in Unit Tests
2021-01-20 13:08:25 +01:00
Tobias Genannt
96132e1dcc Prevent "alpine:edge" from failling the workflow
Alpine is releases a new version once a year. Therefore our workflow
runs don't need to be marked as failed when run on alpine:edge
2021-01-20 10:43:07 +01:00
Christian Mäder
896651ed97 Update of ruamel.yaml 2021-01-20 09:50:00 +01:00
Christian Mäder
f810d0342d Skip Startup Scripts in Unit Tests 2021-01-20 09:36:13 +01:00
Christian Mäder
323e18278a Merge branch 'MajesticFalcon-iss365' into develop 2021-01-20 09:03:31 +01:00
Schylar Utley
a0f7737916 rebase and fix script order 2021-01-20 09:03:04 +01:00
Schylar Utley
7f8cc76af6 address issue 2021-01-20 09:03:04 +01:00
Christian Mäder
21bd7f426c
Merge pull request from MajesticFalcon/vm_init_bug
Bugfix - Allow primary device IP without virtual machine initialization
2021-01-20 08:54:13 +01:00
Christian Mäder
3758bc805a
Merge pull request from netbox-community/renovate/configure
Configure Renovate
2021-01-20 08:26:35 +01:00
Christian Mäder
72859ca71a Configure Renovate 2021-01-20 08:24:47 +01:00
Renovate Bot
0022392f03 Add renovate.json 2021-01-20 08:24:28 +01:00
Schylar Utley
385c66e30d
Update startup_scripts/270_primary_ips.py
Ah, of course.. I would agree. :)

Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2021-01-19 12:54:52 -06:00
Christian Mäder
65023a7dd4
Merge pull request from ryanmerolle/develop
Expand Initialization Support
2021-01-19 18:59:49 +01:00
Tobias Genannt
426adb2333 Preparation for 0.28.0 2021-01-18 08:38:44 +01:00
Schylar Utley
584566b0f0 allow simultaneous virtual machine and device primary ip initialization 2021-01-15 23:44:10 -06:00
Schylar Utley
5399f8c890 Update 270_primary_ips.py
fix issue where user has no virtual machines defined, but startup script still tries to iterate over empty file.
2021-01-15 23:42:26 -06:00
ryanmerolle
2372c1eeff remove site from power_feeds 2021-01-15 15:02:01 -05:00
ryanmerolle
788aeacd9b correct missing required sites in power_feeds 2021-01-15 14:25:42 -05:00
ryanmerolle
00fa1793d0 update services examples 2021-01-15 14:14:07 -05:00
ryanmerolle
4260e9b864 more comment corrections 2021-01-15 09:26:09 -05:00
ryanmerolle
02713e1465 showcase protcol options in services initializer 2021-01-15 09:23:21 -05:00
ryanmerolle
728a16c93d correct initializers commenting 2021-01-15 09:19:21 -05:00
Tobias Genannt
742560c571
Merge pull request from tobiasge/nginx-unit
Use Nginx Unit to serve the application
2021-01-15 13:33:55 +01:00
Tobias Genannt
d273391773 Gunicorn is replaced with nginx-unit
We now serve Netbox with an nginx-unit instance instead of Gunicorn.
This allows us to get rid of the extra Nginx container because Unit is
also serving the static files. The static files are now collected at container
buildtime instead of every startup.
2021-01-15 09:22:22 +01:00
Christian Mäder
380cb77080
Merge pull request from netbox-community/LinksForIssues
Links for issues
2021-01-12 11:08:50 +01:00
Christian Mäder
92b6608403
Create config.yml for ISSUE_TEMPLATE
This commit adds links to the _New Issue_ section of Github.
The intention is to provide more hints where to get help and
further reduce the amount of Github issues that can not be
acted upon.
2021-01-07 14:08:06 +01:00
ryanmerolle
94509f86d7 added route_targets startup_script 2020-12-30 19:11:09 -05:00
ryanmerolle
818266ace1 added services startup_script 2020-12-30 19:10:46 -05:00
ryanmerolle
dfb0327340 Added power startup_scripts 2020-12-30 19:10:30 -05:00
ryanmerolle
e3946af27c added tenant to example aggregates.yml 2020-12-30 19:09:27 -05:00
ryanmerolle
8d8c58df54 optional assoc to cluster & circuit startup_script 2020-12-30 19:09:08 -05:00
ryanmerolle
cbaaffc589 add extra space after ▶️ to remove text overlap 2020-12-30 18:23:12 -05:00
ryanmerolle
0f1cc9eea0 add tenant to aggregate startup_script 2020-12-30 18:22:12 -05:00
ryanmerolle
90018fc6d7 add cluster group startup script 2020-12-29 22:10:19 -05:00
ryanmerolle
621fa12934 comment out secret roles 2020-12-29 22:09:31 -05:00
ryanmerolle
3094665092 add tags & secret roles 2020-12-29 19:36:58 -05:00
ryanmerolle
31f52041f8 correct circuit model startup scripts 2020-12-29 18:27:41 -05:00
ryanmerolle
6ab38472be circuits model startup_scripts 2020-12-29 16:24:16 -05:00
Christian Mäder
aa4d630a0f
Merge pull request from netbox-community/develop
Version 0.27.0
2020-12-15 09:53:01 +01:00
Christian Mäder
4e8588accf Preparation for 0.27.0 2020-12-15 08:59:42 +01:00
Christian Mäder
07469b2b72
Merge pull request from netbox-community/GettingHelp
Introducing our Github Community
2020-12-15 08:54:30 +01:00
Christian Mäder
a7c1d9f550
Merge pull request from netbox-community/AddQuayIo
Add quay.io as fallback registry
2020-12-15 08:53:35 +01:00
Christian Mäder
5605b9b218 Introduce our Github Community 2020-12-15 00:50:02 +01:00
Christian Mäder
b92c652d99 Add quay.io as fallback registry 2020-12-15 00:41:01 +01:00
Christian Mäder
d77b3c1222
Merge pull request from netbox-community/Fix337
Prepare for Netbox v2.10.x
2020-12-14 22:51:24 +01:00
Christian Mäder
e383fd42bd Fix custom fields initializer 2020-12-14 22:11:01 +01:00
Christian Mäder
234baa40a5 Remove redundant assignment in for loop 2020-12-14 20:58:50 +01:00
Christian Mäder
77d3dcded0 Fix leftover from testing in test.sh 2020-12-14 20:58:50 +01:00
Christian Mäder
349e269356 Remove the legacy select_field from the samples
This was only used for testing.
2020-12-14 20:58:50 +01:00
Christian Mäder
5c9bea8b50 Update Custom Field logic for Netbox v2.10.x 2020-12-14 20:58:43 +01:00
Christian Mäder
036f94a450 Simplify test script for manual tests 2020-12-14 20:54:19 +01:00
Christian Mäder
9d51762161
Merge pull request from devon-mar/login-timeout-fix
Fix TypeError when using LOGIN_TIMEOUT
2020-11-13 15:36:16 +01:00
devon-mar
4276c941eb
Change LOGIN_TIMEOUT default to int
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2020-11-03 14:57:12 -08:00
Christian Mäder
3cbdf26773
Merge pull request from timrabl/enviroment-changes
Enviroment changes
2020-11-03 18:44:44 +01:00
devon-mar
fbfce46ce5 Fix TypeError when using LOGIN_TIMEOUT 2020-11-02 22:39:06 -08:00
Tim Oliver Rabl
255889288c Rename SESSION_FILE_PATH default environment variable in configration.py 2020-10-30 23:06:42 +01:00
Tobias Genannt
c068db1751
Merge pull request from tobiasge/python-upgrade
Upgrade Python image to 3.9-alpine
2020-10-29 17:12:24 +01:00
Christian Mäder
378784a19c
Merge pull request from pruiz/pruiz/make-ldap-group-settings-optional
Allow disabling LDAP-group related settings when AUTH_LDAP_*_GROUP environment variables are not defined
2020-10-29 16:24:17 +01:00
Pablo Ruiz
dcb3b5495d Remove now unneeded os. prefix from environ calls. 2020-10-29 14:57:34 +01:00
Pablo Ruiz
60f4e8b2ed Allow disabling LDAP-group related settings when AUTH_LDAP_*_GROUP environment variables are not defined. This is required in order to work with Google's Secure LDAP, due to some limitations on django-auth-ldap plugin (see: https://github.com/django-auth-ldap/django-auth-ldap/issues/201) 2020-10-29 14:56:35 +01:00
Christian Mäder
a51ad36801
Merge pull request from netbox-community/develop
Version 0.26.2
2020-10-27 16:41:48 +01:00
Christian Mäder
953ee09b0c Preparation for 0.26.2 2020-10-27 16:24:10 +01:00
Christian Mäder
94047d60ed
Merge branch 'release' into develop 2020-10-27 16:22:59 +01:00
Christian Mäder
80bfd98000
Merge pull request from comphilip/release
Fix ldap configuration in /etc/netbox/config/ldap/*.py not loaded
2020-10-27 16:11:55 +01:00
comphilip
7694fd320a
use extend method for simplification.
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2020-10-27 21:12:26 +08:00
Christian Mäder
097bea8702
Merge pull request from netbox-community/develop
Version 0.26.1
2020-10-27 12:32:43 +01:00
comphilip
a3c21ae0ac
Fix ldap configuration in /etc/netbox/config/ldap/*.py not loaded 2020-10-27 19:27:51 +08:00
Christian Mäder
074960327b Preparation for 0.26.1 2020-10-27 10:30:55 +01:00
Christian Mäder
e1462d9ca4
Merge pull request from netbox-community/RevertPrometheusPreps
Revert changes to 'gunicorn_config.py'
2020-10-27 10:29:07 +01:00
Christian Mäder
a5aa1bfd3b Revert changes to 'gunicorn_config.py' 2020-10-27 09:31:47 +01:00
Christian Mäder
cb02450783
Merge pull request from comphilip/release
Fix "'NoneType' object has no attribute 'lower'" when no AUTH_LDAP_MI…
2020-10-27 09:29:34 +01:00
comphilip
8307560c88
Fix "'NoneType' object has no attribute 'lower'" when no AUTH_LDAP_MIRROR_GROUPS defined 2020-10-27 15:51:12 +08:00
Christian Mäder
43aea3a1dd
Merge pull request from netbox-community/develop
Version 0.26.0
2020-10-26 16:55:21 +01:00
Tobias Genannt
bb2ac7bd71 Disable tests for Python 3.10-rc
Some of the dependencies of Netbox can't be built with Python 3.10.
2020-10-26 16:47:38 +01:00
Tobias Genannt
30a98c5009 Upgrade Python image to 3.9-alpine
Upgrade the default base image to Python 3.9 and start testing on Python 3.10-rc
2020-10-26 16:25:38 +01:00
Christian Mäder
a52a5547be Preparation for 0.26.0 2020-10-26 16:21:47 +01:00
Tobias Genannt
120a605d35
Merge pull request from tobiasge/python-final
Use release version of Python 3.9 in tests
2020-10-26 16:06:12 +01:00
Christian Mäder
e51f9cbc18
Merge pull request from netbox-community/Prometheus
Prepare for Monitoring with Prometheus
2020-10-26 15:58:52 +01:00
Tobias Genannt
071401b771
Merge pull request from tobiasge/fix-action-warning
Fix warning in Github Actions
2020-10-26 15:48:50 +01:00
Tobias Genannt
911488242f Use release version of Python 3.9 in tests 2020-10-26 15:42:31 +01:00
Christian Mäder
5512ea68b3 Ignore prometheus.yml 2020-10-26 15:40:22 +01:00
Christian Mäder
7d055fbcaf Mention monitoring in README 2020-10-26 15:29:41 +01:00
Tobias Genannt
3d244a1946 Fix warning in Github Actions
Our build script is using "set-env" which has been deprecated by Github.
See this bolg entry:
https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/
2020-10-26 15:23:17 +01:00
Christian Mäder
e18d6c53b3 Revert most changes 2020-10-26 15:22:56 +01:00
Christian Mäder
48decdeb0e Monitoring parts to docker-compose.monitorin.yml 2020-10-26 15:22:56 +01:00
Christian Mäder
6ac65a64c9 Fix test 2020-10-26 15:22:56 +01:00
Christian Mäder
f46d8a7782 Adds Prometheus/Grafana monitoring infrastructure 2020-10-26 15:22:52 +01:00
Christian Mäder
64d82b5e42
Merge pull request from netbox-community/DynamicVariables
Dynamic Configuration
2020-10-26 15:21:42 +01:00
Christian Mäder
58050e5287 Merge core functionality into configuration.py
Which is the file `docker/configuration.docker.py` in our repo.
The common code is then imported by `docker/ldap_config.docker.py`.
2020-10-26 14:43:11 +01:00
Christian Mäder
2dba2b8811 Fix default for secret_key in configuration.py 2020-10-20 21:45:37 +02:00
Christian Mäder
d0c7b87925 Improve order in configuration.py 2020-10-20 21:40:14 +02:00
Christian Mäder
ec3fd8a790 Revert accidential change to _read_secret order 2020-10-20 21:36:40 +02:00
Christian Mäder
75554ef5b4 Consistency in namespace name 2020-10-20 21:29:08 +02:00
Christian Mäder
dad0608834 Rename example.py to extra.py
And add some comments to the the file that hopefully guide the user.
2020-10-20 20:51:43 +02:00
Christian Mäder
dc77f1a0b1 Ignore non-default configuration files 2020-10-20 20:51:43 +02:00
Christian Mäder
16b567939c Dot character has special meaning in module names
Therefore we esacpe it using the underscore character.
2020-10-20 20:51:43 +02:00
Christian Mäder
20820e10c2 Optimize Imports in ldap_config.py 2020-10-20 20:51:35 +02:00
Christian Mäder
553c8ea470 Update configuration.py 2020-10-20 20:49:59 +02:00
Christian Mäder
811618b359 Lower gunicorn default loglevel 2020-10-20 20:46:43 +02:00
Christian Mäder
7429835970 Sample dynamic configuration file 2020-10-20 20:46:43 +02:00
Christian Mäder
43c05d816d Dynamically load configuration files 2020-10-20 20:46:43 +02:00
Christian Mäder
fd3d3d11d1 Tiny refactoring 2020-10-20 20:46:43 +02:00
Christian Mäder
121c3f800d Merge branch 'eemil-develop' into develop 2020-10-20 19:23:11 +02:00
Christian Mäder
9287995df4 Update to latest configuration 2020-10-20 19:22:52 +02:00
eemil
85fbb0af70 fix typo
Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2020-10-20 19:20:29 +02:00
eemil
6bada6660a Prefer secret to env variable if both are configured 2020-10-20 19:20:29 +02:00
Christian Mäder
df3ab69c0f
Merge pull request from shuichiro-makigaki/add-remote-auth
Add REMOTE_AUTH_* configs
2020-10-20 09:02:27 +02:00
Shuichiro MAKIGAKI
38f4474b14 Add REMOTE_AUTH_* support 2020-10-20 11:11:32 +09:00
Christian Mäder
51331621ab
Merge pull request from netbox-community/enable_sponsoring
Enable Sponsoring Button
2020-10-19 17:13:34 +02:00
Christian Mäder
156681f68d
Merge pull request from madnutter56/mirror_ldap_groups
add option to mirror ldap groups into netbox
2020-10-19 17:06:51 +02:00
Alex Houlton
9f4a9f528c add option to mirror ldap groups into netbox
this commit allows ldap assigned groups to be mirrored into
netbox users.

The default is None as this is not the primary way to do this
change.
2020-10-19 07:50:33 -07:00
Christian Mäder
cad803ed31
Create FUNDING.yml to enable sponsoring 2020-10-19 16:50:04 +02:00
Christian Mäder
9efaccadf7 Merge branch 'Tassatux-develop' into develop 2020-10-18 11:41:03 +02:00
Christian Mäder
f553d17655 Change log message 2020-10-18 11:31:48 +02:00
Christian Mäder
2b361c4541 Merge branch 'develop' of https://github.com/Tassatux/netbox-docker into Tassatux-develop 2020-10-18 11:24:51 +02:00
Christian Mäder
c744603a85
Merge pull request from ericgeldmacher/develop
Fix sites.yml initializer
2020-09-21 21:04:39 +02:00
Eric Geldmacher
1133ef50de Fix sites.yml initializer 2020-09-15 15:38:24 -05:00
Tobias Genannt
b33a509e25
Merge pull request from tobiasge/python-3.8
Move default source image to Python 3.8
2020-09-01 15:35:17 +02:00
Tobias Genannt
79f0b997f3
Merge pull request from tobiasge/image-deps
Update images in docker-compose
2020-09-01 14:04:21 +02:00
Tobias Genannt
32cef1dcf8
Enable test on Python 3.9 2020-09-01 13:52:01 +02:00
Tobias Genannt
74833a9b21 Update images in docker-compose 2020-09-01 13:34:42 +02:00
Tobias Genannt
a68f315acb Move default source image to Python 3.8 2020-09-01 12:27:39 +02:00
Tobias Genannt
00022e7d79
Merge pull request from netbox-community/develop
Develop
2020-09-01 11:05:25 +02:00
Tobias Genannt
dd490605ca Preparation for 0.25.0 2020-09-01 10:40:16 +02:00
Tobias Genannt
e2711ca205
Merge pull request from tobiasge/fix-startup-2.9
Fixes for Netbox 2.9
2020-09-01 10:37:37 +02:00
Tobias Genannt
a87f2b3331
Merge pull request from tdorsey/patch-1
Fix typo in Readme
2020-08-31 08:03:33 +02:00
tdorsey
f174749f98
chore: fix typo 2020-08-30 22:06:20 -04:00
Tobias Genannt
b02a93904e Fixed IP address creation for Netbox 2.9 2020-08-24 14:20:35 +02:00
Tobias Genannt
3ace32dfc2 Fixed creation of passwords for Netbox 2.9 2020-08-24 11:08:28 +02:00
Tobias Genannt
9fae2b0f74 Fixed VM interface creation for Netbox 2.9 2020-08-24 11:08:23 +02:00
Christian Mäder
23c3240863
Merge pull request from jamiereid/release
Update README.md
2020-07-14 09:09:20 +02:00
Jamie Reid
3f9e874d77
Update README.md
fix spelling mistake
2020-07-14 11:19:49 +10:00
Christian Mäder
4b0f158852
Merge pull request from jgcasd/jgcasd-patch-1
Add optional LOGIN_TIMEOUT to configuration.py
2020-06-17 15:26:16 +02:00
John G
51490d0039
Added LOGIN_TIMEOUT option to configuration.py
Added LOGIN_TIMEOUT option to configuration.py. The option is already available in standard Netbox configuration.
2020-06-16 11:27:59 -07:00
Aurélien Dunand
df72d6bbb5 Handle primary IPs on devices and VMs 2020-06-05 13:12:27 +02:00
Christian Mäder
688672de26
Merge pull request from netbox-community/XForwardedProto
Remove the 'X-Forwarded-Proto' line from the nginx config
2020-06-05 11:57:23 +02:00
Christian Mäder
5624ecc65e Remove the 'X-Forwarded-Proto' line from the nginx config
The reason is that in the default configuration nginx is only serving 'http' traffic.
So if an upstream proxy sets the 'X-Forwarded-Proto' header, because it is terminating
TLS, then nginx will overwrite it to 'http'. This will cause django to think the page
is served via 'http' and it will not create 'https://...' URLs.

Related to 
2020-06-02 16:06:52 +02:00
Christian Mäder
7f93b328af
Merge pull request from netbox-community/FixFileMatching
Don't try to run non-python files
2020-06-02 14:42:58 +02:00
Christian Mäder
ccad15ecf7 Don't try to run non-python files 2020-06-02 13:37:57 +02:00
Tobias Genannt
e9a9d9b70b
Merge pull request from netbox-community/develop
Preparation for 0.24.1
2020-05-29 14:41:15 +02:00
Tobias Genannt
03b36058cd Preparation for 0.24.1 2020-05-29 10:09:08 +02:00
Tobias Genannt
9e06a38d41
Merge pull request from tobiasge/fix-303
Fix  for Netbox v2.8.5
2020-05-29 10:03:22 +02:00
Tobias Genannt
b7ad18afb0 Fix for Netbox v2.8.5
In this Netbox version the ColorChoices where moved to utilities.choiceFix  for Netbox v2.8.5

In this Netbox version the ColorChoices where moved to utilities.choicess
2020-05-27 09:10:24 +02:00
Aurélien Dunand
a9232e4f30 Add optional primary_ip on virtual machines initializer 2020-05-22 17:40:11 +02:00
Tobias Genannt
93a3784295
Merge pull request from netbox-community/develop
Release 0.24.0
2020-05-16 18:56:06 +02:00
Tobias Genannt
45f7823a17 Preparation for 0.24.0 2020-05-15 13:59:45 +02:00
Tobias Genannt
a6584d2874
Merge pull request from tobiasge/optimise-builds
Optimise builds
2020-05-15 13:57:43 +02:00
Tobias Genannt
fd87c7cb98
Merge pull request from netbox-community/Fix284
Fix : Fixes the bug that initializers with no data stopped the execution of the later initializers
2020-05-15 13:57:23 +02:00
Christian Mäder
1f38ca0a86
Merge pull request from minitriga/#293_ssl_tls_env
Implement SSL and TLS Config
2020-05-15 09:29:02 +02:00
Alexander GITTINGS
efec435ba0 fix some issues 2020-05-14 15:37:47 +00:00
Alexander GITTINGS
ab8ff04852 2020-05-14 15:09:25 +00:00
Christian Mäder
77feec30a0 Don't stop when startup_scripts quit
Fixes 
2020-05-14 16:59:30 +02:00
mbchristoff
bed40b0d05
Add STARTTLS option. ()
* Add STARTTLS option.
2020-05-14 16:41:42 +02:00
Christian Mäder
24f0545bc6 Merge branch 'ryanmerolle-develop' into develop 2020-05-14 16:20:07 +02:00
Christian Mäder
1bc1ab2a0a Preserve compatibility 2020-05-14 16:19:38 +02:00
Christian Mäder
bfa69dc0e9 Merge branch 'develop' of https://github.com/ryanmerolle/netbox-docker into ryanmerolle-develop 2020-05-14 16:17:59 +02:00
Christian Mäder
6c8042b63d
Merge pull request from weisdd/bugfix/devices.py.example
Fixes : Non-working devices.py.example
2020-05-14 15:35:34 +02:00
Tobias Genannt
795e82be46 Fix shellcheck error 2020-05-14 13:54:40 +02:00
Tobias Genannt
d8a6c321a1
Update build.sh
Include suggestion from cimnine

Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2020-05-14 13:49:19 +02:00
ibeljakov
1ecf4853b8 Fixed devices.py.example report 2020-05-11 16:46:10 +03:00
Tobias Genannt
5cb8e97e65
Merge pull request from weisdd/bugfix/dockerfile-media-permissions
Dockerfile: Fixed file permissions for media
2020-05-06 18:40:00 +02:00
Christian Mäder
98e131fa30
Merge pull request from hoanhan101/release
Fix typo in overriding docker-compose config
2020-04-22 22:51:44 +02:00
Hoanh An
d6323ce40f
Fix typo in overriding docker-compose config 2020-04-22 16:24:34 -04:00
ibeljakov
1c65f7af10 Dockerfile: Fixed file permissions for media 2020-04-18 17:08:42 +03:00
Tobias Genannt
7fb78b3fd2 Fixed script in case no branch for next exists
Build now prints a message when no devlop-* branch is found instead of crashing
2020-04-13 21:44:18 +02:00
Christian Mäder
aa9f01a778
Merge pull request from cimnine/NoResponse
No response
2020-04-09 21:17:42 +02:00
Tobias Genannt
786f9b50d2 Fixes build when DOCKER_FROM is set but empty
The DOCKER_FROM is set to an empty value in the push tests.
This expands the check to catch this test case
2020-04-09 10:26:21 +02:00
Tobias Genannt
5909670690 Fixed "latest" tag
The variable for the latest tag didn't contain all the needed values.
2020-04-09 09:04:20 +02:00
Tobias Genannt
231de236e0 Removed Travis CI configuration and script
We are no longer building the images with Travis CI.
2020-04-09 08:47:07 +02:00
Christian Mäder
9ea95950b9 probot/no-response configuration 2020-04-09 08:30:30 +02:00
Tobias Genannt
d84c399c00 Let "latest" tag follow the highest version
Latest tag is now added to the new version when it is release by Netbox.
2020-04-09 08:17:05 +02:00
Tobias Genannt
a217ce8ffd Changed "build-branches.sh" to "build-next.sh"
The old version of "build-branches.sh" skipped the pushing of images when one of
them didn't change its sources. When looking at the Netbox branches I noticed
that the "master" branch only changes when there is a new release. Because we
build the new releases anyway in "build-latest.sh" that leaves "develop" and
"develop-*" which change regularly. The new script "build-next.sh" is responsible
for building "develop-*" as the next major release of Netbox. The build of
"develop" is moved to the Github Action build matrix. This has the additional
advantage of being faster because more builds are done in parallel.
2020-04-08 22:11:37 +02:00
Tobias Genannt
794fb45e0e Fix shellcheck items found by shellcheck 0.7.1 2020-04-08 16:06:55 +02:00
Tobias Genannt
8e34f46bad Add checks to verifiy if a new build is needed
This checks if the source materials (python image, Netbox commit,
netbox-docker commit) have changed since the last build. This check is done
by comparing the digest and commit ids from the previous image with the
given tag to the current values taken from the Git and Docker repositories.

The checks are only performed for builds by the automated builds on Github.
2020-04-08 15:50:06 +02:00
Tobias Genannt
ed0d099df7
Merge pull request from tobiasge/labels-in-build
Add labels for all variants
2020-04-05 13:14:48 +02:00
Tobias Genannt
26d08302e3 Add labels for all variants
When we don't set the --label argument on the commandline for all
build variants we lose them in the image.
This also prints out the labes on image push.
2020-04-05 09:29:31 +02:00
Ryan Merolle
64b763429f
update configuration.py for netbox 2.7.11 REDIS config
update configuration.py to use REDIS config referencing `tasks` in place of `webhooks`
2020-04-01 23:41:35 -04:00
Christian Mäder
5769684c98
Merge pull request from netbox-community/develop
Release 0.23.0
2020-03-30 20:51:22 +02:00
Christian Mäder
23e2da52f8 Preparation for 0.23.0 2020-03-30 15:15:30 +02:00
Christian Mäder
edba1a22fc
Merge pull request from general-programming/RELEASE_CHECK_URL
Add RELEASE_CHECK_URL to configuration and default env.
2020-03-30 15:13:59 +02:00
nepeat
f87ffe7c33
Update configuration/configuration.py
Co-Authored-By: Christian Mäder <cimnine@users.noreply.github.com>
2020-03-29 01:40:08 -07:00
erin
8bc77c1bc0 Add RELEASE_CHECK_URL to configuration and default env. 2020-03-27 21:34:51 -07:00
Christian Mäder
7662d81efe
Merge pull request from netbox-community/readme_improvements
Readme improvements
2020-03-17 16:39:43 +01:00
Christian Mäder
7f489aa11d
Improved the README
- adjust the _Quick Start_ section to match the instructions in the _Getting Started_ guide on our wiki
- Adds a new _Getting Help_ section
- Improvements in explaining the tags of the published Docker image
2020-03-17 16:07:15 +01:00
Tobias Genannt
5c3eff0823
Merge pull request from minitriga/issue_253_docs_2
Fix embedded documents for Netbox version v2.7.10 and higher.
2020-03-11 12:16:48 +01:00
Alexander GITTINGS
5f90ad8c56 inlude docs in container 2020-03-11 10:40:10 +00:00
Tobias Genannt
5f1c241145
Merge pull request from ScanPlusGmbH/fix-configuration-inconsistencies
Fix configuration inconsistencies
2020-03-11 09:53:21 +01:00
Tobias Genannt
20c7461c7b Fixed test failures because of missing cache
When running tests with ´test.sh´ some errors where logged because now
redis-cache instance was running.
2020-02-14 12:38:05 +01:00
Tobias Genannt
b9c44b85cc The Redis cache container was using the wrong env
Our docker-compose.yml pointed the env file for the Redis cache to the
wrong file. Now the Redis cache password between the netbox.env and
redis-cache.env match.
2020-02-14 12:38:05 +01:00
Tobias Genannt
355ebadd10 Fixed configuration inconsistency for Redis cache
In the configuration.py we use database 1 as the default but in the .env
file we used 0. This sets both values to 1 as the default.
2020-02-14 12:38:05 +01:00
Tobias Genannt
880628876f
Merge pull request from ScanPlusGmbH/init-perms-function
Permission handling in external function
2020-02-13 08:15:27 +01:00
Tobias Genannt
8d3bd48c7a Permission handling in external function
This move the setting of user and group permissions in the startup
script to its own function.
2020-02-12 09:36:49 +01:00
Tobias Genannt
882f7bcaf2
Merge pull request from ScanPlusGmbH/remove-redundancy
Add function to load YAML files
2020-02-10 19:25:42 +01:00
Tobias Genannt
50ade7bce1 Add function to load YAML files
This commit starts to remove some code redundancy from the startup
scripts for easier maintenance.
2020-02-10 07:47:17 +01:00
Christian Mäder
80f514fa90
Merge pull request from netbox-community/develop
Release 0.22.0
2020-02-08 10:44:21 +01:00
Christian Mäder
c5822b9cec Merge pull request from netbox-community/prepare-0.22.0
Prepare v0.22.0
2020-02-08 10:10:51 +01:00
Christian Mäder
e99a222a70 Prepare v0.22.0 2020-02-03 17:56:14 +01:00
Christian Mäder
3717b7469a
Merge pull request from netbox-community/LBegnaud-master
Permission Wildcards
2020-02-03 17:55:22 +01:00
Christian Mäder
3d80cc5a72 Tiny code refactoring 2020-02-02 09:48:02 +01:00
Christian Mäder
69ef7b7827 Removed the eval from the code
... and changed it to make it work with the latest Netbox version.
2020-01-31 11:39:05 +01:00
Christian Mäder
ba3176f140 Added missing keywords to the yaml
... and moved some documentatory comments to the beginning of the file.
2020-01-31 11:37:05 +01:00
Christian Mäder
a2c06026d5 Ajdust indents in __main__.py
... so that the match the style of the other python code in this project
2020-01-31 11:35:25 +01:00
Les Begnaud
f4e243d5ad update example to note yaml restriction 2020-01-31 09:27:34 +01:00
Les Begnaud
aa0d2a6e01 simplify yml definitions to use wildcard syntax 2020-01-31 09:27:34 +01:00
Les Begnaud
cce4370d41 add permission example 2020-01-31 09:27:34 +01:00
Les Begnaud
927a545f41 adjust groups and users startup scripts to allow custom codename filter 2020-01-31 09:27:34 +01:00
Christian Mäder
0574ffc571
Merge pull request from newlandk/patch-1
update ldap caching configuration
2020-01-31 09:25:45 +01:00
Christian Mäder
ce74e94cbb
Merge pull request from netbox-community/test-pr
Enable push workflow for PRs
2020-01-31 09:18:31 +01:00
Christian Mäder
778f7546b8 Enable push workflow for PRs 2020-01-30 15:48:01 +01:00
Kevin Newland
74eaae6bc8
Update ldap_config.py 2020-01-28 17:43:35 -06:00
Kevin Newland
00986573d9
Update LDAP Caching Options
Update LDAP caching configuration to match changes made to django-auth-ldap in 1.6.0

Django social auth now uses different cache configuration options: https://github.com/django-auth-ldap/django-auth-ldap/blob/master/django_auth_ldap/backend.py#L1041-L1056

NetBox settings.py reference: https://github.com/netbox-community/netbox/blob/master/netbox/netbox/settings.py#L360
2020-01-28 17:36:45 -06:00
Christian Mäder
b0b20aa6ba
Merge pull request from netbox-community/develop
Release 0.21.1
2020-01-23 18:08:29 +01:00
Christian Mäder
f3a858811a
Merge pull request from netbox-community/prepare-0.21.1
Preparation for 0.21.1
2020-01-23 15:50:54 +01:00
Christian Mäder
1eb40d1774 Preparation for 0.21.1 2020-01-23 15:34:22 +01:00
Christian Mäder
1f25fba671
Merge pull request from netbox-community/fix_shields
Readme Cleanup
2020-01-23 15:32:41 +01:00
Christian Mäder
f525351cfe
Merge pull request from netbox-community/green_tests
Disable python 3.9 tests once more
2020-01-23 15:31:46 +01:00
Christian Mäder
0e625a3b5c Disable python 3.9 tests once more 2020-01-23 10:44:02 +01:00
Christian Mäder
f0b00ee104 Update docker inspect command in bug_report template 2020-01-23 10:40:28 +01:00
Christian Mäder
1c8d695fc2 Remove references to the old build system 2020-01-23 10:36:13 +01:00
Christian Mäder
653321994a Fix link 2020-01-23 10:26:21 +01:00
Christian Mäder
132ab6fcca Fix typo in PR template 2020-01-23 10:09:56 +01:00
Christian Mäder
9229b45dc2 Fix build status badge 2020-01-23 09:35:30 +01:00
Christian Mäder
d058b7bc93
Merge pull request from netbox-community/develop
Release 0.21.0
2020-01-23 08:59:05 +01:00
Christian Mäder
a0f5a11ff1 Merge branch 'release' into develop
This is to allow automatic merging on Github from develop->release
2020-01-20 11:32:56 +01:00
Christian Mäder
05b9431ecb
Merge pull request from netbox-community/prepare-0.21.0
Prepare 0.21.0
2020-01-20 11:28:13 +01:00
Christian Mäder
e179616db4 Preparation for 0.21.0 2020-01-20 10:36:15 +01:00
Christian Mäder
b92fbdc50d Update mentioned Netbox version to 2.7.1 2020-01-20 10:36:15 +01:00
Christian Mäder
f26df57bfd
Merge pull request from netbox-community/updated-pullrequest-template
Check that `develop` is the base branch in new PRs
2020-01-20 10:35:51 +01:00
Christian Mäder
8892ea9936 Ask for a release note entry 2020-01-20 10:28:08 +01:00
Christian Mäder
1bad9b4fa8 Fix typo in pull request template 2020-01-20 10:28:08 +01:00
Christian Mäder
2b21e14c2c Check that develop is target in PR
This is an update to the PR template.
It mostly adds text and some checks related to how good the template
is filled in and whether the `develop` branch was selected as base.
2020-01-20 10:28:08 +01:00
Christian Mäder
8caf755914
Merge pull request from netbox-community/2.7-prep
Prepare for Netbox 2.7
2020-01-20 10:26:50 +01:00
Christian Mäder
27f671e41a Update IP Initializer for Netbox 2.7
The ip address database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your ip_addresses.yml
file as follows:

- Make sure the status is written in lower case.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
74a0e2cf6e Update Interfaces Initializer for Netbox 2.7
The interface database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your dcim_interfaces.yml
file as follows:

- Make sure the type is a value out of the possible choices.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
f3403cd0f5 Update VM Initializer for Netbox 2.7
The vm database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your virtual_machines.yml
file as follows:

- Make sure the status is spelled lowercase.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
8d8b9a157e Update VLAN Initializer for Netbox 2.7
The VLAN database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your vlans.yml file as follows:

- Make sure the status is spelled lowercase.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
4a58676647 Update Device Initializer for Netbox 2.7
The device database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your devices.yml file as
follows:

- Make sure the rack face is spelled lowercase.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
7b914d31d6 Update Rack Initializer for Netbox 2.7
The rack database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your racks.yml file as follows:

- Rack types must match one of the 5 rack types given, e.g.
  '4-post-cabinet'.
- Rack width must match one of the 2 rack widths given, i.e. '19' or
  '23'.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
c001626b85 Update Custom Fields Initializer for Netbox 2.7
The custom field database model has changed in Netbox 2.7.
Therefore the initializer code, that was used before, broke.
As a user, you will need to update your custom_fields.yml file as
follows:

- type must be lowercase
  - the `selection` type was changed to `select`
- the filter_logic must be lower case

This is to achieve compatibility with the naming schema that
Netbox uses internally. It allows us to become forward compatible
in case Netbox ever introduces a new type for custom fields.

See the diff of this commit for further information how this is meant.
2020-01-20 08:39:26 +01:00
Christian Mäder
355f9d4cf7 Prepare for Netbox 2.7 2020-01-20 08:39:26 +01:00
Christian Mäder
40ef427336
Merge pull request from netbox-community/fix-github-action
Fix Github Action
2020-01-20 08:38:40 +01:00
Christian Mäder
e16b009a7f
Merge pull request from netbox-community/improve-test.sh
Improve test.sh
2020-01-20 08:37:48 +01:00
Christian Mäder
25671d42a5 Re-enable Netbox unit tests 2020-01-20 08:37:18 +01:00
Christian Mäder
dd0aee081a Fix failing GH Action 2020-01-17 18:46:30 +01:00
Christian Mäder
cfbd037f79 Enable tests with Python 3.9 2020-01-17 17:44:07 +01:00
Christian Mäder
3b56c827f9 Improve test.sh
Don't move the original initializers directory, but rather use the one
with the modified initializers in it.
2020-01-17 17:23:15 +01:00
Christian Mäder
870b44fdbc
Merge pull request from cimnine/github-action
Use Github Actions to build Netbox Docker
2020-01-17 14:26:40 +01:00
Christian Mäder
79a10dd445 Preparation for 0.20.0 2020-01-17 14:11:28 +01:00
Christian Mäder
57afeec94f Netbox is not yet compatible with Python 3.9 2019-12-29 22:09:32 +01:00
Christian Mäder
b118cd5812 Building the Docker image with Github Actions 2019-12-23 18:21:08 +01:00
Christian Mäder
7863e5902e Preparation for 0.20.0 2019-12-21 15:20:33 +01:00
Christian Mäder
0a9991de96
Merge pull request from netbox-community/non-root
Non root
2019-12-20 14:21:34 +01:00
Christian Mäder
28c786c2a6
Merge pull request from netbox-community/update-postgres
Update PostgreSQL to 11
2019-12-20 11:43:17 +01:00
Christian Mäder
1c899b55eb
Merge pull request from netbox-community/fix_docker_build
Fix variables for Dockerhub build
2019-12-20 11:42:59 +01:00
Christian Mäder
7af88388bb
Merge pull request from netbox-community/prepare_184
Prepares scripts and documentation for 
2019-12-20 11:42:41 +01:00
Christian Mäder
51df2cbbaa
Merge pull request from netbox-community/test-initializers
Adds a test that validates the initializer yml files
2019-12-20 11:42:30 +01:00
Christian Mäder
b48de9f87e
Merge pull request from netbox-community/speedup_startup_scripts
Massive speedup in executing startup_scripts
2019-12-16 12:17:21 +01:00
Christian Mäder
85065005d4
Merge pull request from netbox-community/pull-request-template
Pull Request Template Suggestion
2019-12-16 12:16:53 +01:00
Christian Mäder
0696ecb037
Merge pull request from netbox-community/reduce_docker_context
Reduce the Docker Context
2019-12-16 12:16:37 +01:00
Christian Mäder
05d32ae705 Massive speedup in executing startup_scripts 2019-12-14 18:16:31 +01:00
Christian Mäder
fd955544af
Merge pull request from jsimonetti/rackgroup_initialiser
Add rack group initialiser
2019-12-14 17:31:38 +01:00
Christian Mäder
0a77c3d81e
Merge pull request from mattolenik/fix-197
Remove use of GNU date extensions when labeling images
2019-12-14 17:20:36 +01:00
Matt Olenik
66e90428b5 Remove use of GNU date extensions when labeling images
Fixes 
2019-12-13 16:06:18 -08:00
Christian Mäder
310cda1f18 Reduce the Docker Context 2019-12-11 13:58:33 +01:00
Christian Mäder
daaf72962f Adds a test that validates the initializer yml files 2019-12-11 11:48:29 +01:00
Jeroen Simonetti
93dee74459 Add rack group initialiser
Fixes 

Signed-off-by: Jeroen Simonetti <jeroen@simonetti.nl>
2019-12-11 10:57:14 +01:00
Christian Mäder
1064696c96 N/A when there's no issue 2019-12-10 23:16:11 +01:00
Christian Mäder
7df5da38bf Pull request template suggestion 2019-12-10 23:09:43 +01:00
Christian Mäder
e4e0a63e17 Better safe than sorry, keep PostgreSQL at 11 for now. 2019-12-10 22:41:57 +01:00
Christian Mäder
bf2a21ddea
Merge pull request from sdktr/patch-2
Add SSLMODE to database connection settings
2019-12-10 22:39:53 +01:00
Christian Mäder
6a07527632
Merge pull request from netbox-community/update-redis
Update Redis to Version 5
2019-12-10 22:35:55 +01:00
Christian Mäder
0f7675c792
Merge pull request from netbox-community/revert-180
Revert "Fix  'libc not found'"
2019-12-10 22:35:39 +01:00
Christian Mäder
f3bbfdc34c
Merge pull request from netbox-community/GettingStarted
Adds a link to the Getting Started wiki section to the README
2019-12-10 22:35:17 +01:00
Christian Mäder
a4186c1031 Prepares scripts and documentation for 2019-12-10 21:44:11 +01:00
Christian Mäder
809570f4bc Fix variables for Dockerhub build 2019-12-10 21:25:36 +01:00
Stefan de Kooter
135199e597
Merge branch 'master' into patch-2 2019-12-09 22:54:30 +01:00
Christian Mäder
8a92640d10 Re-wording of dependencies check paragraph 2019-11-26 12:28:43 +01:00
Christian Mäder
788804627e Fix typo 2019-11-26 12:27:25 +01:00
Christian Mäder
150f35ea3b update postgres to 12 2019-11-26 12:23:16 +01:00
Christian Mäder
1ce99cf02f update redis 2019-11-26 12:14:51 +01:00
Christian Mäder
5e92352b0a set umask in entrypoint 2019-11-26 12:09:26 +01:00
Christian Mäder
8664e42233 Revert "Fix 'libc not found'"
This reverts commit feb810ab27.
2019-11-26 11:40:10 +01:00
Christian Mäder
7942e9edbe Remove the named user, change permissions to 'g+w' 2019-11-26 11:24:12 +01:00
Christian Mäder
01c4137dc9 Adds netbox user 2019-11-26 11:24:12 +01:00
Christian Mäder
c083baf640 Preparation for 0.19.4 2019-11-25 17:12:29 +01:00
Christian Mäder
d1d71e1256 Merge branch 'mattolenik-fix-skip-git' 2019-11-25 17:11:10 +01:00
Christian Mäder
6c762a7755 Merge branch 'fix-skip-git' of https://github.com/mattolenik/netbox-docker into mattolenik-fix-skip-git 2019-11-25 17:11:03 +01:00
Christian Mäder
946a503a25 Merge branch 'edenpark59-master' 2019-11-25 17:10:33 +01:00
Christian Mäder
6a8ffc1f02 Merge branch 'master' of https://github.com/edenpark59/netbox-docker into edenpark59-master 2019-11-25 17:10:22 +01:00
Christian Mäder
ca2b875ab9 Merge branch 'markhoney-patch-1' 2019-11-25 17:09:49 +01:00
Christian Mäder
29185fb9fd reorganized docker ignore file
.. and added some more files to it.
2019-11-25 17:09:37 +01:00
Christian Mäder
df7241ac5c Merge branch 'patch-1' of https://github.com/markhoney/netbox-docker into markhoney-patch-1 2019-11-25 17:07:12 +01:00
Christian Mäder
52d67f6b60 Merge branch 'labelling' 2019-11-25 17:06:43 +01:00
Matt Olenik
34ce5be006 Respect SKIP_GIT environment variable when building
Fixes issue 
2019-11-21 08:09:01 -08:00
Christian Mäder
f2fd7dbbe7 Adds a link to the Getting Started wiki section to the README 2019-11-20 11:09:37 +01:00
EdenPark59
08cda559a3
Update docker-compose.yml 2019-11-20 11:00:09 +01:00
sylvain.petit
02a5171e37 Update Nginx 1.17.6-alpine docker-compose.yml 2019-11-20 10:09:02 +01:00
Mark Honeychurch
552676cc9d
Ignore local override file
Adding an ignore rule for docker-compose.override.yml should allow people to clone this repo and use an override file to match their environment, without that file causing issues every time they pull a new version of the repo.
2019-11-18 12:20:39 +13:00
Christian Mäder
caaa68234c Adds more labels to the Dockerfile
It also updates the README and the bug_report template to reflect
the changes. Additionally, in the README some relevant shields from
shields.io are added.

The labels follow [label-schema.org][lsorg] and the [OpenContainer
image spec, section annotations][ocis], specifications.

[lsorg]: http://label-schema.org/rc1/
[ocis]: https://github.com/opencontainers/image-spec/blob/master/annotations.md
2019-11-17 17:13:29 +01:00
Christian Mäder
eddc308055
Merge pull request from netbox-community/feature-request-template
A new issue category for feature/change requests
2019-11-16 22:14:31 +01:00
Christian Mäder
0e2c50c374
A new issue category for feature/change requests 2019-11-12 11:56:22 +01:00
Tobias Genannt
c790ce5953 Preparation for 0.19.3 2019-11-11 10:27:55 +01:00
Tobias Genannt
cf7aef31e2
Merge pull request from ScanPlusGmbH/fix-179
Fix  'libc not found'
2019-11-11 10:21:32 +01:00
Tobias Genannt
feb810ab27 Fix 'libc not found'
Gunicorn version 20 crashes in this docker image. So for now use a
version <20.
2019-11-11 08:53:11 +01:00
Tobias Genannt
3f2fe54bfd
Merge pull request from sdktr/patch-1
Add CONN_MAX_AGE to database connection settings
2019-11-11 08:29:47 +01:00
Stefan de Kooter
6568dff8e1
Add SSLMODE to database connection properties
Defaulting to SSLMODE=prefer, optional override using environment variable: DB_SSLMODE
2019-11-06 10:26:29 +01:00
Stefan de Kooter
773ec630b4
Add CONN_MAX_AGE to database connection settings
Defaulting to 300 seconds for the database connection to avoid new connection setup roundtrip on consecutive requests
2019-11-06 10:24:15 +01:00
Tobias Genannt
8d71d2f973
Merge pull request from ScanPlusGmbH/optimze-pip-install
Optimize pip install command
2019-11-01 14:20:20 +01:00
Tobias Genannt
f9662a1e4b Optimize pip install command
As mentioned by @sdktr the "--install-option" is redundant. The added
"--no-warn-script-location" is used to silence warnings when installing
into a directory that is not on $PATH.
2019-10-31 10:11:33 +01:00
Christian Mäder
f7b526eacd Prepare Version 0.19.2 2019-10-24 17:03:14 +02:00
Christian Mäder
e32bb272b2 Merge branch 'ScanPlusGmbH-fix-170' 2019-10-24 17:02:47 +02:00
Tobias Genannt
e3f632d77f Fixes - "drf-yasg" installed into wrong dir
With the new multistage build the pip install command put some packages
in the wrong directory. This resuled in them not being copied into the
runtime images. This commit add the additional "--prefix" option to the
install command. After that all test run and we no longer get the error
"ModuleNotFoundError: No module named 'drf_yasg'".
2019-10-24 17:02:23 +02:00
Christian Mäder
63174f85ae
Merge pull request from tovin07/remove-trailing-space
Remove trailing space in Dockerfile
2019-10-24 16:47:50 +02:00
Nguyễn Trọng Vĩnh
eb0f704ebe Remove trailing space in Dockerfile 2019-10-23 11:46:26 +07:00
Christian Mäder
b69a38015c
Delete issue_template.md 2019-10-17 17:40:27 +02:00
Christian Mäder
41f6a80c91 Update issue templates 2019-10-17 17:40:01 +02:00
Christian Mäder
79f0670f7e Prepare Version 0.19.1 2019-10-15 12:29:35 +02:00
Christian Mäder
313d1a3aae Merge branch 'ScanPlusGmbH-custom-scripts' 2019-10-15 12:28:32 +02:00
Christian Mäder
8428b9cdbd Merge branch 'custom-scripts' of https://github.com/ScanPlusGmbH/netbox-docker into ScanPlusGmbH-custom-scripts 2019-10-15 12:28:22 +02:00
Christian Mäder
de1e3676eb Fix push 2019-10-15 12:28:04 +02:00
Christian Mäder
de1e5edd02 Prepare Version 0.19.0 2019-10-15 11:48:25 +02:00
Christian Mäder
ef989284c2
Merge pull request from netbox-community/multistage-build
Refactor to multistage builds
2019-10-15 11:47:09 +02:00
Christian Mäder
e060f86b9a Corrections for shellcheck warnings 2019-10-15 10:03:39 +02:00
Christian Mäder
0a38220497 Update purpose text in build.sh 2019-10-15 01:00:21 +02:00
Christian Mäder
fb60841047 Only test 'latest' in PRs
Because it's the only tag being built
2019-10-15 00:56:37 +02:00
Christian Mäder
0f4a872082 More tests 2019-10-15 00:47:19 +02:00
Christian Mäder
26b1f59d66 Improve formating and fix typo 2019-10-15 00:40:48 +02:00
Christian Mäder
064908397e Improved Build Job descriptions 2019-10-15 00:34:15 +02:00
Christian Mäder
42642c94c3 Only push on 'main' branch 2019-10-15 00:34:15 +02:00
Christian Mäder
123fd981e9 Fix build
The Docker Hub build system runs on Ubuntu Xenial containers.
Xenial's git is 2.7.4, which does not know the `-P` flag yet.
2019-10-15 00:34:15 +02:00
Christian Mäder
20109c3392 Checkout the repository with git
This changes the build process even further. Instead
f using `wget` to fetch the current code, `git` is used.
This allows for faster switching between branches,
because only the differences between them have to be
fetched from the server.

But the main advantage is that the build cache can
finally be used as designed by Docker. Repetitive
builds are very fast now. This is also true between
branches and tags, as long as the `requirements.txt`
file doesn't change.
2019-10-15 00:34:15 +02:00
Christian Mäder
f3b9c34e3b externalize netbox download with wget 2019-10-15 00:34:15 +02:00
Christian Mäder
ab4b8720d1 Fix caching in build.sh 2019-10-15 00:34:15 +02:00
Christian Mäder
052b53aa5c Fix apt-get detection 2019-10-15 00:34:15 +02:00
Christian Mäder
fadac8c5c3 Only build the master branch to speed up the test 2019-10-15 00:34:15 +02:00
Christian Mäder
d0c9dfe2e5 Try to get PR builds working 2019-10-15 00:34:15 +02:00
Christian Mäder
d0ebb34432 Refactor to multistage builds
This commit introduces a huge change in the build process.

What changed:

- Dockerfile.ldap was integrated into Dockerfile as a seperate
  [build stage][multistage-build].
- All the build scripts were refactored according to this.
- The `docker-compose.yml` file was adjusted likewise.
- The main build script, `/build.sh`, now always builds all
  targets (formerly called variants).
- The minimal requirements for Docker and docker-compose
  have increased.
- The build on hub.docker.com must be adjusted.

This change should also fix  permanently.

[multistage-build]: https://docs.docker.com/develop/develop-images/multistage-build/
2019-10-15 00:34:15 +02:00
Tobias Genannt
db04deca0d Add support for custom scripts
Custom scripts were added to Netbox in version 2.6.3. This adds a new
directory to the image where custom scripts can be placed.
2019-10-14 09:50:05 +02:00
Christian Mäder
c148d3ceb9 Prepare Version 0.18.2 2019-10-14 09:20:22 +02:00
Christian Mäder
42826ae133 Fix 2019-10-14 09:17:32 +02:00
Christian Mäder
19728fa3e6 prepare 0.18.1 2019-10-13 14:03:56 +02:00
Christian Mäder
e1f054b6b5 Merge branch 'fix-160' 2019-10-13 14:03:34 +02:00
Christian Mäder
79d349133e fix typo 2019-10-13 14:03:22 +02:00
Christian Mäder
cb8007e41d
Adds a hyperlink for the #netbox-docker channel 2019-10-12 15:16:17 +02:00
Christian Mäder
b790796f9b Prepare Version 0.18.0 2019-10-12 14:56:03 +02:00
Christian Mäder
20c234a96e Introduce $SKIP_SUPERUSER
This adds a new variable to skip the creation of the superuser.
That is useful for LDAP and for production environments.

Fixes 
2019-10-12 14:49:40 +02:00
Christian Mäder
5ae5977717 Merge branch 'axarriola-master' 2019-10-12 14:27:11 +02:00
Christian Mäder
e894cdaa06 Reformat initializers and add some IPv6 examples 2019-10-12 14:23:41 +02:00
Christian Mäder
5defc38294 Add missing break 2019-10-12 14:23:11 +02:00
Christian Mäder
61c0a9b519 Merge branch 'master' of https://github.com/axarriola/netbox-docker into axarriola-master 2019-10-12 14:02:35 +02:00
Alvaro Arriola
992a8f1d5f More typos. Tested all changes. 2019-10-11 18:08:22 +02:00
Alvaro Arriola
2d25907cba Fixing typos. 2019-10-11 17:30:38 +02:00
Alvaro Arriola
8a40c6e0a3 Merge branch 'master' of https://github.com/netbox-community/netbox-docker 2019-10-11 17:06:18 +02:00
Christian Mäder
ed8e339bfe
Merge pull request from netbox-community/cleanup
Remove debug statement
2019-10-11 16:32:07 +02:00
Christian Mäder
4b1514f8d3
Remove debug statement 2019-10-11 16:31:56 +02:00
Christian Mäder
2044f685cf
Merge pull request from netbox-community/fix-platform-initializer
Updating the initializer platform examples
2019-10-11 16:15:19 +02:00
Christian Mäder
86de0d850b
Updating the initializer platform examples
rpc client was removed from netbox
2019-10-11 16:15:03 +02:00
Alvaro Arriola
4e1ac2392d Added newline and breaks. 2019-10-11 15:46:32 +02:00
Christian Mäder
723d4744a4 Merge branch 'master' of https://github.com/axarriola/netbox-docker into axarriola-master 2019-10-11 14:31:29 +02:00
Alvaro Arriola
821d6c8672 Fixed further requirements. 2019-10-10 17:35:06 +02:00
Alvaro Arriola
0b5214d247 Fixed aesthetics. 2019-10-10 16:52:29 +02:00
Christian Mäder
aca448d180 Merge branch 'bootc-helm-chart' 2019-10-09 12:42:01 +02:00
Christian Mäder
6051092a59 Move large parts of the documentation in the README to the wiki 2019-10-09 12:40:40 +02:00
Christian Mäder
03b52f9074 Merge branch 'helm-chart' of https://github.com/bootc/netbox-docker into bootc-helm-chart 2019-10-09 12:40:29 +02:00
Christian Mäder
ce9158eb07
Update README.md 2019-07-30 13:45:08 +02:00
Christian Mäder
74000645dc Make patch version 2019-07-30 13:36:22 +02:00
Christian Mäder
ef0755b9cf
Merge pull request from takumin/fix_attribute_error
fix AttributeError for ruamel.yaml
2019-07-30 13:34:48 +02:00
takumin
7f22d21d5d fix AttributeError for ruamel.yaml 2019-07-30 20:09:02 +09:00
Christian Mäder
e349c239fe Release 0.17.0 2019-07-30 10:47:56 +02:00
Christian Mäder
28ba0e56e7
Merge pull request from ScanPlusGmbH/update-base-image
Update base image
2019-07-30 10:44:44 +02:00
Christian Mäder
b0287e344e
Merge pull request from LBegnaud/master
adjusts users and groups startup scripts to accomdate non-uniqueness
2019-07-30 10:44:03 +02:00
Les Begnaud
e6e7647f32 adjusts users and groups startup scripts to accomdate non-uniqueness 2019-07-26 14:13:15 -05:00
Chris Boot
3e1f688f78 Add a link to my Helm chart
I've written and will continue to maintain a Helm chart to aid in
deploying NetBox on Kubernetes. This adds a link to the README file so
that people who may be interested in it can find it.
2019-07-20 16:51:51 -03:00
Tobias Genannt
135d29e06f Update base image
This updates the base image to Alpine 3.10 with Python 3.7
2019-07-05 08:22:25 +02:00
Alvaro Arriola
4cb5b9f20d Added more startup_scripts and initializers examples. 2019-07-04 14:10:56 +02:00
Christian Mäder
5a4e9d7a14 Merge branch 'miso231-patch-1' 2019-07-02 21:33:54 +02:00
Christian Mäder
89b9c22252 Merge branch 'patch-1' of https://github.com/miso231/netbox-docker into miso231-patch-1 2019-07-02 21:33:36 +02:00
Christian Mäder
dc3db2d9fd %s/digitalocean/netbox-community/gi
Thank you Digitalocean for sponsoring Netbox!
And thank you for letting it grow up and move out ;)
2019-07-02 21:32:58 +02:00
Michal Petko
0270fc2dca
Retype REDIS_PORT to int 2019-07-01 17:29:58 +02:00
Christian Mäder
aed5126279 Provides necessary changes for v2.6 compatibility
Fixes 
2019-06-21 22:48:23 +02:00
Christian Mäder
9c45e4d5e1 Prepare Version 0.14.0 2019-06-12 17:56:52 +02:00
Christian Mäder
dfd30f5eae Explain caching strategy in Dockerfile comments 2019-06-12 17:53:35 +02:00
Christian Mäder
a5537b18a4 Merge branch 'improved_build_speed' of https://github.com/rje6459/netbox-docker 2019-06-12 17:45:40 +02:00
Christian Mäder
9601cb1e54 Merge branch 'master' into improved_build_speed 2019-06-12 17:28:52 +02:00
Christian Mäder
54ac5dc2ab Merge branch 'mryauch-master' 2019-06-12 17:18:48 +02:00
Robert Ellegate
a086c2fc22
Changing REF_URL to use HEAD/TAG agnostic API
Per [dicsuccion](https://github.com/netbox-community/netbox-docker/pull/137#issuecomment-495667921) with @cimnine, changing the API endpoint to one that retains functionality of previous URL while supporting both HEADS and TAGS
2019-05-28 10:45:10 -04:00
Robert Ellegate
e33a2d2c0a
Adding REF to GitHub repo HEAD for cache busting
After installing requirements, check if  HEAD has changed and bust cache for RUN instruction for wget  archive
2019-05-23 11:20:39 -04:00
Christian Mäder
821fb5f36e Caching of requirements.txt
After [a discussion][1] with rje6459 on the networktocode Slack
in the #netbox-docker channel we've come up with a small improvement
to those that regularly have to build netbox docker locally.

It fetches the "requirements.txt" from the desired branch before
downloading netbox itself.

[1]: https://networktocode.slack.com/archives/CD23LP8BC/p1558537080023200
2019-05-22 18:05:54 +02:00
Matthew Yauch
7362e275b0 Add AUTH_LDAP_GROUP_TYPE env variable support
Dynamically imports the correct class/subclass from django_auth_ldap.config based on the AUTH_LDAP_GROUP_TYPE environment variable.
2019-05-09 07:47:28 -07:00
Christian Mäder
6c3db3deff Update django to 2.2 2019-05-09 09:57:01 +02:00
Christian Mäder
2f8ea89d54 Prepare Version 0.13.0 2019-05-08 12:00:57 +02:00
Christian Mäder
7008c03bcb Merge branch 'mryauch-mryauch-patch-1' 2019-05-08 11:57:50 +02:00
Christian Mäder
8f39034014 Merge branch 'mryauch-patch-1' of https://github.com/mryauch/netbox-docker into mryauch-mryauch-patch-1 2019-05-08 11:57:43 +02:00
Christian Mäder
98833e20c8 Prepare Version 0.12.0 2019-05-08 11:43:29 +02:00
Christian Mäder
a5e51dfb47 Merge branch 'ajknv-master' 2019-05-08 11:38:31 +02:00
Christian Mäder
936d868582 Merge branch 'master' of https://github.com/ajknv/netbox-docker into ajknv-master 2019-05-08 11:38:22 +02:00
Matthew Yauch
96924736df
Updated README.md to reflect AUTH_LDAP_BIND_PASSWORD secret support 2019-05-01 08:14:26 -07:00
Matthew Yauch
5107fb7c6b
AUTH_LDAP_BIND_PASSWORD secret file support 2019-04-30 14:24:22 -07:00
Alexander Kinneer
5beb3093db Add support for using SSL connections to Redis. 2019-03-19 11:35:45 -05:00
87 changed files with 2602 additions and 2091 deletions

View file

@ -1,4 +1,10 @@
.git
.github
.travis.yml
*.md
env
build*
*.env
docker-compose.override.yml
.netbox/.git*
.netbox/.travis.yml
.netbox/scripts

23
.ecrc Normal file
View file

@ -0,0 +1,23 @@
{
"Verbose": false,
"Debug": false,
"IgnoreDefaults": false,
"SpacesAftertabs": false,
"NoColor": false,
"Exclude": [
"LICENSE",
"\\.initializers",
"\\.vscode"
],
"AllowedContentTypes": [],
"PassedFiles": [],
"Disable": {
// set these options to true to disable specific checks
"EndOfLine": false,
"Indentation": false,
"InsertFinalNewline": false,
"TrimTrailingWhitespace": false,
"IndentSize": true,
"MaxLineLength": false
}
}

11
.editorconfig Normal file
View file

@ -0,0 +1,11 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
[*.py]
indent_size = 4

7
.flake8 Normal file
View file

@ -0,0 +1,7 @@
[flake8]
max-line-length = 100
extend-ignore = E203, W503
per-file-ignores =
configuration/*:E131,E251,E266,E302,E305,E501,E722
startup_scripts/startup_script_utils/__init__.py:F401
docker/*:E266,E722

14
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,14 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
- cimnine
- tobiasge
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

148
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View file

@ -0,0 +1,148 @@
name: Bug report
description: Create a report about a malfunction of the Docker setup
body:
- type: markdown
attributes:
value: |
Please only raise an issue if you're certain that you've found a bug.
Else, see these other means to get help:
- See our troubleshooting section:
https://github.com/netbox-community/netbox-docker/wiki/Troubleshooting
- Have a look at the rest of the wiki:
https://github.com/netbox-community/netbox-docker/wiki
- Check the release notes:
https://github.com/netbox-community/netbox-docker/releases
- Look through the issues already resolved:
https://github.com/netbox-community/netbox-docker/issues?q=is%3Aclosed
If you did not find what you're looking for,
try the help of our community:
- Post to Github Discussions:
https://github.com/netbox-community/netbox-docker/discussions
- Join the `#netbox-docker` channel on our Slack:
https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
- Ask on the NetBox mailing list:
https://groups.google.com/d/forum/netbox-discuss
Please don't open an issue to open a PR.
Just submit the PR, that's good enough.
- type: textarea
id: current-behavior
attributes:
label: Current Behavior
description: Please describe what you did and how you think it misbehaved
placeholder: I tried to … by doing …, but it …
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
description: Please describe what you expected instead
placeholder: I expected that … when I do …
validations:
required: true
- type: input
id: docker-compose-version
attributes:
label: Docker Compose Version
description: Please paste the output of `docker-compose version`
placeholder: Docker Compose version vX.Y.Z
validations:
required: true
- type: textarea
id: docker-version
attributes:
label: Docker Version
description: Please paste the output of `docker version`
render: text
placeholder: |
Client:
Cloud integration: 1.0.17
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:20 2021
OS/Arch: darwin/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.8
API version: 1.41 (minimum version 1.12)
Go version: go1.16.6
Git commit: 75249d8
Built: Fri Jul 30 19:52:10 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.9
GitCommit: e25210fe30a0a703442421b0f60afac609f950a3
runc:
Version: 1.0.1
GitCommit: v1.0.1-0-g4144b63
docker-init:
Version: 0.19.0
GitCommit: de40ad0
validations:
required: true
- type: input
id: git-rev
attributes:
label: The git Revision
description: Please paste the output of `git rev-parse HEAD`
validations:
required: true
- type: textarea
id: git-status
attributes:
label: The git Status
description: Please paste the output of `git status`
render: text
placeholder: |
On branch main
nothing to commit, working tree clean
validations:
required: true
- type: input
id: run-command
attributes:
label: Startup Command
description: Please specify the command you used to start the project
placeholder: docker compose up
validations:
required: true
- type: textarea
id: netbox-logs
attributes:
label: NetBox Logs
description: Please paste the output of `docker-compose logs netbox` (or `docker compose logs netbox`)
render: text
placeholder: |
netbox_1 | ⚙️ Applying database migrations
netbox_1 | 🧬 loaded config '/etc/netbox/config/configuration.py'
netbox_1 | 🧬 loaded config '/etc/netbox/config/a.py'
netbox_1 | 🧬 loaded config '/etc/netbox/config/extra.py'
netbox_1 | 🧬 loaded config '/etc/netbox/config/logging.py'
netbox_1 | 🧬 loaded config '/etc/netbox/config/plugins.py'
...
validations:
required: true
- type: textarea
id: docker-compose-override-yml
attributes:
label: Content of docker-compose.override.yml
description: Please paste the output of `cat docker-compose.override.yml`
render: yaml
placeholder: |
version: '3.4'
services:
netbox:
ports:
- '8080:8080'
validations:
required: true

15
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,15 @@
blank_issues_enabled: false
contact_links:
- name: Question
url: https://github.com/netbox-community/netbox-docker/discussions
about: The Github Discussions are the right place to ask questions about how to use or do certain things with NetBox Docker.
- name: Chat
url: https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
about: 'Usually the quickest way to seek help with small issues is to join our #netbox-docker Slack channel.'
- name: Community Wiki
url: https://github.com/netbox-community/netbox-docker/wiki
about: |
Our wiki contains information for common problems and tips for operating NetBox Docker in production.
It's maintained by our excellent community.

View file

@ -0,0 +1,68 @@
name: Feature or Change Request
description: Request a new feature or a change of the current behavior
body:
- type: markdown
attributes:
value: |
This issue type is to propose new features for the Docker setup.
To just spin an idea, see the Github Discussions section, please.
Before asking for help, see these links first:
- See our troubleshooting section:
https://github.com/netbox-community/netbox-docker/wiki/Troubleshooting
- Have a look at the rest of the wiki:
https://github.com/netbox-community/netbox-docker/wiki
- Check the release notes:
https://github.com/netbox-community/netbox-docker/releases
- Look through the issues already resolved:
https://github.com/netbox-community/netbox-docker/issues?q=is%3Aclosed
If you did not find what you're looking for,
try the help of our community:
- Post to Github Discussions:
https://github.com/netbox-community/netbox-docker/discussions
- Join the `#netbox-docker` channel on our Slack:
https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
- Ask on the NetBox mailing list:
https://groups.google.com/d/forum/netbox-discuss
Please don't open an issue to open a PR.
Just submit the PR, that's good enough.
- type: textarea
id: desired-behavior
attributes:
label: Desired Behavior
description: Please describe the desired behavior
placeholder: To me, it would be useful, if … because …
validations:
required: true
- type: textarea
id: contrast-to-current
attributes:
label: Contrast to Current Behavior
description: Please describe how the desired behavior is different from the current behavior
placeholder: The current behavior is …, but this lacks …
validations:
required: true
- type: textarea
id: required-changes
attributes:
label: Required Changes
description: If you can, please elaborate what changes will be required to implement the desired behavior
placeholder: I suggest to change the file …
validations:
required: false
- type: textarea
id: discussion
attributes:
label: 'Discussion: Benefits and Drawbacks'
description: |
Please make your case here:
- Why do you think this project and the community will benefit from your suggestion?
- What are the drawbacks of this change? Is it backwards-compatible?
- Anything else that you think is relevant to the discussion of this feature/change request.
placeholder: I suggest to change the file …
validations:
required: false

View file

@ -1,55 +0,0 @@
<!--
Before raising an issue here, answer the following questions for yourself, please:
* Did you read through the troubleshooting section? (https://github.com/netbox-community/netbox-docker/#troubleshooting)
* Have you updated to the latest version and tried again? (i.e. `git pull` and `docker-compose pull`)
* Have you reset the project and tried again? (i.e. `docker-compose down -v`)
* Are you confident that your problem is related to the Docker or Docker Compose setup this project provides?
(Otherwise ask on the Netbox mailing list, please: https://groups.google.com/d/forum/netbox-discuss)
* Have you looked through the issues already resolved?
Please try this means to get help before opening an issue here:
* On the networktocode Slack in the #netbox-docker channel: http://slack.networktocode.com/
* On the networktocode Slack in the #netbox channel: http://slack.networktocode.com/
* On the Netbox mailing list: https://groups.google.com/d/forum/netbox-discuss
-->
## Current Behavior
<!-- describe what you did and how it misbehaved -->
...
## Expected Behavior
<!-- describe what you expected instead -->
...
## Debug Information
<!-- please fill in the following information that might helps us debug your problem more quickly -->
The output of `docker-compose version`: `XXXXX`
The output of `docker version`: `XXXXX`
The output of `git rev-parse HEAD`: `XXXXX`
The command you used to start the project: `XXXXX`
The output of `docker-compose logs netbox`:
<!--
If your log is very long, create a Gist instead (and post the link to it): https://gist.github.com
-->
```
LOG LOG LOG
```
The output of `docker-compose logs nginx`:
<!--
Only if you have gotten a 5xx http error, else delete this section.
If your log is very long, create a Gist instead (and post the link to it): https://gist.github.com
-->
```
LOG LOG LOG
```

10
.github/no-response.yml vendored Normal file
View file

@ -0,0 +1,10 @@
# Configuration for probot-no-response - https://github.com/probot/no-response
# Number of days of inactivity before an Issue is closed for lack of response
daysUntilClose: 30
# Label requiring a response
responseRequiredLabel: awaiting answer
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
closeComment: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author.

85
.github/pull_request_template.md vendored Normal file
View file

@ -0,0 +1,85 @@
<!--
#########################################################################
Thank you for sharing your work and for opening a PR.
(!) IMPORTANT (!):
First make sure that you point your PR to the `develop` branch!
Now please read the comments carefully and try to provide information
on all relevant titles.
#########################################################################
-->
<!--
Please don't open an extra issue when submitting a PR.
But if there is already a related issue, please put it's number here.
E.g. #123 or N/A
-->
Related Issue:
## New Behavior
<!--
Please describe in a few words the intentions of your PR.
-->
...
## Contrast to Current Behavior
<!--
Please describe in a few words how the new behavior is different
from the current behavior.
-->
...
## Discussion: Benefits and Drawbacks
<!--
Please make your case here:
- Why do you think this project and the community will benefit from your
proposed change?
- What are the drawbacks of this change?
- Is it backwards-compatible?
- Anything else that you think is relevant to the discussion of this PR.
(No need to write a huge article here. Just a few sentences that give some
additional context about the motivations for the change.)
-->
...
## Changes to the Wiki
<!--
If the README.md must be updated, please include the changes in the PR.
If the Wiki must be updated, please make a suggestion below.
-->
...
## Proposed Release Note Entry
<!--
Please provide a short summary of your PR that we can copy & paste
into the release notes.
-->
...
## Double Check
<!--
Please put an x into the brackets (like `[x]`) if you've completed that task.
-->
* [ ] I have read the comments and followed the PR template.
* [ ] I have explained my PR according to the information in the comments.
* [ ] My PR targets the `develop` branch.

80
.github/workflows/push.yml vendored Normal file
View file

@ -0,0 +1,80 @@
---
name: push
on:
push:
branches-ignore:
- release
pull_request:
branches-ignore:
- release
jobs:
lint:
runs-on: ubuntu-latest
name: Checks syntax of our code
steps:
- uses: actions/checkout@v3
with:
# Full git history is needed to get a proper
# list of changed files within `super-linter`
fetch-depth: 0
- uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Lint Code Base
uses: github/super-linter@v4
env:
DEFAULT_BRANCH: develop
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SUPPRESS_POSSUM: true
LINTER_RULES_PATH: /
VALIDATE_ALL_CODEBASE: false
VALIDATE_DOCKERFILE: false
VALIDATE_GITLEAKS: false
FILTER_REGEX_EXCLUDE: (.*/)?(LICENSE|configuration/.*)
EDITORCONFIG_FILE_NAME: .ecrc
DOCKERFILE_HADOLINT_FILE_NAME: .hadolint.yaml
MARKDOWN_CONFIG_FILE: .markdown-lint.yml
PYTHON_BLACK_CONFIG_FILE: pyproject.toml
PYTHON_FLAKE8_CONFIG_FILE: .flake8
PYTHON_ISORT_CONFIG_FILE: pyproject.toml
YAML_CONFIG_FILE: .yamllint.yaml
build:
continue-on-error: ${{ matrix.build_cmd != './build-latest.sh' }}
strategy:
matrix:
build_cmd:
- ./build-latest.sh
- PRERELEASE=true ./build-latest.sh
- ./build.sh feature
- ./build.sh develop
platform:
- linux/amd64
- linux/arm64
fail-fast: false
env:
GH_ACTION: enable
IMAGE_NAMES: docker.io/netboxcommunity/netbox
runs-on: ubuntu-latest
name: Builds new NetBox Docker Images
steps:
- id: git-checkout
name: Checkout
uses: actions/checkout@v3
- id: qemu-setup
name: Set up QEMU
uses: docker/setup-qemu-action@v2
- id: buildx-setup
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- id: docker-build
name: Build the image for '${{ matrix.platform }}' with '${{ matrix.build_cmd }}'
run: ${{ matrix.build_cmd }}
env:
BUILDX_PLATFORM: ${{ matrix.platform }}
BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}
- id: docker-test
name: Test the image
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
if: steps.docker-build.outputs.skipped != 'true'

83
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,83 @@
---
name: release
on:
release:
types:
- published
schedule:
- cron: '45 5 * * *'
workflow_dispatch:
jobs:
build:
strategy:
matrix:
build_cmd:
- ./build-latest.sh
- PRERELEASE=true ./build-latest.sh
- ./build.sh feature
- ./build.sh develop
platform:
- linux/amd64,linux/arm64
fail-fast: false
runs-on: ubuntu-latest
name: Builds new NetBox Docker Images
env:
GH_ACTION: enable
IMAGE_NAMES: docker.io/netboxcommunity/netbox quay.io/netboxcommunity/netbox ghcr.io/netbox-community/netbox
steps:
- id: source-checkout
name: Checkout
uses: actions/checkout@v3
- id: set-netbox-docker-version
name: Get Version of NetBox Docker
run: echo "::set-output name=version::$(cat VERSION)"
shell: bash
- id: qemu-setup
name: Set up QEMU
uses: docker/setup-qemu-action@v2
- id: buildx-setup
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- id: docker-build
name: Build the image with '${{ matrix.build_cmd }}'
run: ${{ matrix.build_cmd }}
- id: test-image
name: Test the image
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
if: steps.docker-build.outputs.skipped != 'true'
# docker.io
- id: docker-io-login
name: Login to docker.io
uses: docker/login-action@v2
with:
registry: docker.io
username: ${{ secrets.dockerhub_username }}
password: ${{ secrets.dockerhub_password }}
if: steps.docker-build.outputs.skipped != 'true'
# quay.io
- id: quay-io-login
name: Login to Quay.io
uses: docker/login-action@v2
with:
registry: quay.io
username: ${{ secrets.quayio_username }}
password: ${{ secrets.quayio_password }}
if: steps.docker-build.outputs.skipped != 'true'
# ghcr.io
- id: ghcr-io-login
name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
if: steps.docker-build.outputs.skipped != 'true'
- id: build-and-push
name: Push the image
run: ${{ matrix.build_cmd }} --push
if: steps.docker-build.outputs.skipped != 'true'
env:
BUILDX_PLATFORM: ${{ matrix.platform }}
BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}

14
.gitignore vendored
View file

@ -1 +1,15 @@
*.sql.gz
.netbox
.initializers
docker-compose.override.yml
*.pem
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

4
.hadolint.yaml Normal file
View file

@ -0,0 +1,4 @@
ignored:
- DL3006
- DL3008
- DL3003

2
.markdown-lint.yml Normal file
View file

@ -0,0 +1,2 @@
MD013: false
MD041: false

View file

@ -1,32 +0,0 @@
sudo: required
language: python
env:
- BUILD=release
- BUILD=prerelease
- BUILD=branches
- BUILD=special
git:
depth: 5
services:
- docker
install:
- docker-compose pull --parallel
- docker-compose build
script:
- docker-compose run netbox ./manage.py test
after_script:
- docker-compose down
after_success:
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
- ./build-all.sh --push
notifications:
slack:
secure: F3VsWcvU/XYyjGjU8ZAVGpREe7F1NjKq6LuMRzhQORbXUvanxDQtLzEe0Y5zm/6+gHkx6t8cX/v2PiCI+v46pkapYMUimd+QEOL1WxbUdnw2kQxcgw/R3wX34l2FHXbG3/a+TmH3euqbSCTIrPy9ufju948i+Q0E0u0fyInmozl8qOT23C4joQOpVAq7y+wHxTxsEg46ZzL2Ties+dmqjMsvHocv7mPI2IWzAWA8SJZxS82Amoapww++QjgEmoY+tMimLkdeXCRgeoj41UGHDg54rbEXh/PTaWiuzyzTr1WLmsGRScC57fDRivp3mSM37/MlNxsRj1z+j4zrvWFQgNfJ2yMjBHroc1jOX/uCY4dwbpSPqUCpc4idMGCGZFItgzTQ3lAPYAsom0C6n8C08Xk8EsNKWwXrDSd4ZUhIwptkNPCFK+kXbLFsMzSApnaBYW0T+wba57nZdiWjOPYmvJr49MDm5NHv2KaRBX2gpw7t7ZLhTgwGEWcZvcDebiLneXcXY5hZ7v2NHJkx/2x1yNXo85xZDy0wK1FGoOOHwPhvqOB+pcQZ/pUOSPTKqGw5l/CexoRm1shFsK+19FnSgimqTHjcuCo4lFW3JlEvlFhtfFXIte2Wjp1ALZgTrSq8zSD5rRxYCUKmM7b3EJwdaIgbvKWPdS4sCXlXU1bHx0g=

5
.yamllint.yaml Normal file
View file

@ -0,0 +1,5 @@
---
rules:
line-length:
max: 120

View file

@ -1,66 +0,0 @@
# cloud.docker.com Configuration
The automatic build is configured in cloud.docker.com.
The following build configuration is expected:
```yaml
Source Repository: github.com/netbox-community/netbox-docker
Build Location: Build on Docker Hub's infrastructure
Autotest: Internal and External Pull Requests
Repository Links: Enable for Base Image
Build Rules:
- Source Type: Branch
Source: master
Docker Tag: branches-main
Dockerfile location: Dockerfile
- Source Type: Branch
Source: master
Docker Tag: branches-ldap
Dockerfile location: Dockerfile.ldap
- Source Type: Branch
Source: master
Docker Tag: prerelease-main
Dockerfile location: Dockerfile
- Source Type: Branch
Source: master
Docker Tag: prerelease-ldap
Dockerfile location: Dockerfile.ldap
- Source Type: Branch
Source: master
Docker Tag: release-main
Dockerfile location: Dockerfile
- Source Type: Branch
Source: master
Docker Tag: release-ldap
Dockerfile location: Dockerfile.ldap
Build Environment Variables:
# Create an app on Github and use it's OATH credentials here
- Key: GITHUB_OAUTH_CLIENT_ID
Value: <secret>
- Key: GITHUB_OAUTH_CLIENT_SECRET
Value: <secret>
Build Triggers:
- Name: Cron Trigger
# Use this trigger in combination with e.g. https://cron-job.org in order to regularly schedule builds
```
## Background Knowledge
The build system of cloud.docker.com is not made for this kind of project.
But we found a way to make it work, and this is how:
1. The docker hub build system [allows to overwrite the scripts that get executed
for `build`, `test` and `push`](overwrite). See `hooks/*`.
2. Shared functionality of the scripts `build`, `test` and `push` is extracted to `hooks/common`.
3. The `build` script runs `run_build()` from `hooks/common`.
This triggers either `build-branches.sh`, `build-latest.sh` or directly `build.sh`.
4. The `test` script just invokes `docker-compose` commands.
5. The `push` script runs `run_build()` from `hooks/common` with a `--push-only` flag.
This causes the `build.sh` script to not re-build the Docker image, but just the just built image.
The _Docker Tag_ configuration setting is misused to select the type (_release_, _prerelease_, _branches_) of the build as well as the variant (_main_, _ldap_).
The _Dockerfile location_ configuration setting is completely ignored by the build scripts.
[overwrite]: https://docs.docker.com/docker-hub/builds/advanced/#override-build-test-or-push-commands

View file

@ -1,59 +1,117 @@
FROM python:3.6-alpine3.9
ARG FROM
FROM ${FROM} as builder
RUN apk add --no-cache \
bash \
build-base \
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update -qq \
&& apt-get upgrade \
--yes -qq --no-install-recommends \
&& apt-get install \
--yes -qq --no-install-recommends \
build-essential \
ca-certificates \
cyrus-sasl-dev \
graphviz \
jpeg-dev \
libffi-dev \
libldap-dev \
libpq-dev \
libsasl2-dev \
libssl-dev \
libxml2-dev \
libxml2-dev \
libxmlsec1 \
libxmlsec1-dev \
libxmlsec1-openssl \
libxslt-dev \
openldap-dev \
postgresql-dev \
ttf-ubuntu-font-family \
wget
pkg-config \
python3-dev \
python3-pip \
python3-venv \
&& python3 -m venv /opt/netbox/venv \
&& /opt/netbox/venv/bin/python3 -m pip install --upgrade \
pip \
setuptools \
wheel
RUN pip install \
# gunicorn is used for launching netbox
gunicorn \
# napalm is used for gathering information from network devices
napalm \
# ruamel is used in startup_scripts
ruamel.yaml \
# pinning django to the version required by netbox
# adding it here, to install the correct version of
# django-rq
'Django>=2.1.5,<2.2' \
# django-rq is used for webhooks
django-rq
ARG NETBOX_PATH
COPY ${NETBOX_PATH}/requirements.txt requirements-container.txt /
RUN sed -i -e '/psycopg2-binary/d' requirements.txt && \
/opt/netbox/venv/bin/pip install \
-r /requirements.txt \
-r /requirements-container.txt
WORKDIR /opt
###
# Main stage
###
ARG BRANCH=master
ARG URL=https://github.com/digitalocean/netbox/archive/$BRANCH.tar.gz
RUN wget -q -O - "${URL}" | tar xz \
&& mv netbox* netbox
ARG FROM
FROM ${FROM} as main
WORKDIR /opt/netbox
RUN pip install -r requirements.txt
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update -qq \
&& apt-get upgrade \
--yes -qq --no-install-recommends \
&& apt-get install \
--yes -qq --no-install-recommends \
bzip2 \
ca-certificates \
curl \
libldap-common \
libpq5 \
libxmlsec1-openssl \
openssl \
python3 \
python3-distutils \
tini \
&& curl -sL https://nginx.org/keys/nginx_signing.key \
> /etc/apt/trusted.gpg.d/nginx.asc && \
echo "deb https://packages.nginx.org/unit/ubuntu/ jammy unit" \
> /etc/apt/sources.list.d/unit.list \
&& apt-get update -qq \
&& apt-get install \
--yes -qq --no-install-recommends \
unit=1.27.0-1~jammy \
unit-python3.10=1.27.0-1~jammy \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /opt/netbox/venv /opt/netbox/venv
ARG NETBOX_PATH
COPY ${NETBOX_PATH} /opt/netbox
COPY docker/configuration.docker.py /opt/netbox/netbox/netbox/configuration.py
COPY configuration/gunicorn_config.py /etc/netbox/config/
COPY docker/nginx.conf /etc/netbox-nginx/nginx.conf
COPY docker/docker-entrypoint.sh docker-entrypoint.sh
COPY startup_scripts/ /opt/netbox/startup_scripts/
COPY initializers/ /opt/netbox/initializers/
COPY configuration/configuration.py /etc/netbox/config/configuration.py
COPY docker/ldap_config.docker.py /opt/netbox/netbox/netbox/ldap_config.py
COPY docker/docker-entrypoint.sh /opt/netbox/docker-entrypoint.sh
COPY docker/housekeeping.sh /opt/netbox/housekeeping.sh
COPY docker/launch-netbox.sh /opt/netbox/launch-netbox.sh
COPY configuration/ /etc/netbox/config/
COPY docker/nginx-unit.json /etc/unit/
WORKDIR /opt/netbox/netbox
ENTRYPOINT [ "/opt/netbox/docker-entrypoint.sh" ]
# Must set permissions for '/opt/netbox/netbox/media' directory
# to g+w so that pictures can be uploaded to netbox.
RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \
&& chown -R unit:root media /opt/unit/ \
&& chmod -R g+w media /opt/unit/ \
&& cd /opt/netbox/ && SECRET_KEY="dummy" /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
CMD ["gunicorn", "-c /etc/netbox/config/gunicorn_config.py", "netbox.wsgi"]
ENV LANG=C.UTF-8 PATH=/opt/netbox/venv/bin:$PATH
ENTRYPOINT [ "/usr/bin/tini", "--" ]
LABEL SRC_URL="$URL"
CMD [ "/opt/netbox/docker-entrypoint.sh", "/opt/netbox/launch-netbox.sh" ]
ARG NETBOX_DOCKER_PROJECT_VERSION=snapshot
LABEL NETBOX_DOCKER_PROJECT_VERSION="$NETBOX_DOCKER_PROJECT_VERSION"
LABEL netbox.original-tag="" \
netbox.git-branch="" \
netbox.git-ref="" \
netbox.git-url="" \
# See https://github.com/opencontainers/image-spec/blob/master/annotations.md#pre-defined-annotation-keys
org.opencontainers.image.created="" \
org.opencontainers.image.title="NetBox Docker" \
org.opencontainers.image.description="A container based distribution of NetBox, the free and open IPAM and DCIM solution." \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.authors="The netbox-docker contributors." \
org.opencontainers.image.vendor="The netbox-docker contributors." \
org.opencontainers.image.url="https://github.com/netbox-community/netbox-docker" \
org.opencontainers.image.documentation="https://github.com/netbox-community/netbox-docker/wiki" \
org.opencontainers.image.source="https://github.com/netbox-community/netbox-docker.git" \
org.opencontainers.image.revision="" \
org.opencontainers.image.version=""

View file

@ -1,9 +0,0 @@
ARG DOCKER_ORG=netboxcommunity
ARG DOCKER_REPO=netbox
ARG FROM_TAG=latest
FROM $DOCKER_ORG/$DOCKER_REPO:$FROM_TAG
RUN pip install django_auth_ldap
COPY docker/ldap_config.docker.py /opt/netbox/netbox/netbox/ldap_config.py
COPY configuration/ldap_config.py /etc/netbox/config/ldap_config.py

514
README.md
View file

@ -1,426 +1,158 @@
# netbox-docker
[The Github repository](netbox-docker-github) houses the components needed to build Netbox as a Docker container.
Images are built using this code are released to [Docker Hub][netbox-dockerhub] every night.
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/netbox-community/netbox-docker)][github-release]
[![GitHub stars](https://img.shields.io/github/stars/netbox-community/netbox-docker)][github-stargazers]
![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed-raw/netbox-community/netbox-docker)
![Github release workflow](https://img.shields.io/github/workflow/status/netbox-community/netbox-docker/release)
![Docker Pulls](https://img.shields.io/docker/pulls/netboxcommunity/netbox)
[![GitHub license](https://img.shields.io/github/license/netbox-community/netbox-docker)][netbox-docker-license]
Questions? Before opening an issue on Github, please join the [Network To Code][ntc-slack] Slack and ask for help in our `#netbox-docker` channel.
[The GitHub repository][netbox-docker-github] houses the components needed to build NetBox as a container.
Images are built regularly using the code in that repository and are pushed to [Docker Hub][netbox-dockerhub], [Quay.io][netbox-quayio] and [GitHub Container Registry][netbox-ghcr].
[netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/tags/
[netbox-docker-github]: https://github.com/netbox-community/netbox-docker/
[ntc-slack]: http://slack.networktocode.com/
Do you have any questions?
Before opening an issue on Github,
please join [our Slack][netbox-docker-slack] and ask for help in the [`#netbox-docker`][netbox-docker-slack-channel] channel.
[github-stargazers]: https://github.com/netbox-community/netbox-docker/stargazers
[github-release]: https://github.com/netbox-community/netbox-docker/releases
[netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/
[netbox-quayio]: https://quay.io/repository/netboxcommunity/netbox
[netbox-ghcr]: https://github.com/netbox-community/netbox-docker/pkgs/container/netbox
[netbox-docker-github]: https://github.com/netbox-community/netbox-docker/
[netbox-docker-slack]: https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
[netbox-docker-slack-channel]: https://netdev-community.slack.com/archives/C01P0GEVBU7
[netbox-slack-channel]: https://netdev-community.slack.com/archives/C01P0FRSXRV
[netbox-docker-license]: https://github.com/netbox-community/netbox-docker/blob/release/LICENSE
## Quickstart
To get Netbox up and running:
To get _NetBox Docker_ up and running run the following commands.
There is a more complete [_Getting Started_ guide on our wiki][wiki-getting-started] which explains every step.
```
$ git clone -b master https://github.com/netbox-community/netbox-docker.git
$ cd netbox-docker
$ docker-compose pull
$ docker-compose up -d
```bash
git clone -b release https://github.com/netbox-community/netbox-docker.git
cd netbox-docker
tee docker-compose.override.yml <<EOF
version: '3.4'
services:
netbox:
ports:
- 8000:8080
EOF
docker-compose pull
docker-compose up
```
The application will be available after a few minutes.
Use `docker-compose port nginx 8080` to find out where to connect to.
```
$ echo "http://$(docker-compose port nginx 8080)/"
http://0.0.0.0:32768/
# Open netbox in your default browser on macOS:
$ open "http://$(docker-compose port nginx 8080)/"
# Open netbox in your default browser on (most) linuxes:
$ xdg-open "http://$(docker-compose port nginx 8080)/" &>/dev/null &
```
Alternatively, use something like [Reception][docker-reception] to connect to _docker-compose_ projects.
Default credentials:
The whole application will be available after a few minutes.
Open the URL `http://0.0.0.0:8000/` in a web-browser.
You should see the NetBox homepage.
In the top-right corner you can login.
The default credentials are:
* Username: **admin**
* Password: **admin**
* API Token: **0123456789abcdef0123456789abcdef01234567**
[docker-reception]: https://github.com/nxt-engineering/reception
[wiki-getting-started]: https://github.com/netbox-community/netbox-docker/wiki/Getting-Started
## Container Image Tags
New container images are built and published automatically every ~24h.
> We recommend to use either the `vX.Y.Z-a.b.c` tags or the `vX.Y-a.b.c` tags in production!
* `vX.Y.Z-a.b.c`, `vX.Y-a.b.c`:
These are release builds containing _NetBox version_ `vX.Y.Z`.
They contain the support files of _NetBox Docker version_ `a.b.c`.
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
These images are automatically built from [the corresponding releases of NetBox][netbox-releases].
* `latest-a.b.c`:
These are release builds, containing the latest stable version of NetBox.
They contain the support files of _NetBox Docker version_ `a.b.c`.
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
These images are automatically built from [the `master` branch of NetBox][netbox-master].
* `snapshot-a.b.c`:
These are prerelease builds.
They contain the support files of _NetBox Docker version_ `a.b.c`.
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
These images are automatically built from the [`develop` branch of NetBox][netbox-develop].
For each of the above tag, there is an extra tag:
* `vX.Y.Z`, `vX.Y`:
This is the same version as `vX.Y.Z-a.b.c` (or `vX.Y-a.b.c`, respectively).
It always points to the latest version of _NetBox Docker_.
* `latest`
This is the same version as `latest-a.b.c`.
It always points to the latest version of _NetBox Docker_.
* `snapshot`
This is the same version as `snapshot-a.b.c`.
It always points to the latest version of _NetBox Docker_.
[netbox-releases]: https://github.com/netbox-community/netbox/releases
[netbox-master]: https://github.com/netbox-community/netbox/tree/master
[netbox-develop]: https://github.com/netbox-community/netbox/tree/develop
## Documentation
Please refer [to our wiki on GitHub][netbox-docker-wiki] for further information on how to use the NetBox Docker image properly.
The wiki covers advanced topics such as using files for secrets, configuring TLS, deployment to Kubernetes, monitoring and configuring NAPALM and LDAP.
Our wiki is a community effort.
Feel free to correct errors, update outdated information or provide additional guides and insights.
[netbox-docker-wiki]: https://github.com/netbox-community/netbox-docker/wiki/
## Getting Help
Feel free to ask questions in our [GitHub Community][netbox-community]
or [join our Slack][netbox-docker-slack] and ask [in our channel `#netbox-docker`][netbox-docker-slack-channel],
which is free to use and where there are almost always people online that can help you in the Slack channel.
If you need help with using NetBox or developing for it or against it's API
you may find [the `#netbox` channel][netbox-slack-channel] on the same Slack instance very helpful.
[netbox-community]: https://github.com/netbox-community/netbox-docker/discussions
## Dependencies
This project relies only on *Docker* and *docker-compose* meeting this requirements:
This project relies only on _Docker_ and _docker-compose_ meeting these requirements:
* The *Docker version* must be at least `1.13.0`.
* The *docker-compose version* must be at least `1.10.0`.
* The _Docker version_ must be at least `20.10.10`.
* The _containerd version_ must be at least `1.5.6`.
* The _docker-compose version_ must be at least `1.28.0`.
To ensure this, compare the output of `docker --version` and `docker-compose --version` with the requirements above.
To check the version installed on your system run `docker --version` and `docker-compose --version`.
## Configuration
## Updating
You can configure the app using environment variables.
These are defined in `netbox.env`.
Read [Environment Variables in Compose][compose-env] to understand about the various possibilities to overwrite these variables.
(The easiest solution being simply adjusting that file.)
Please read [the release notes][releases] carefully when updating to a new image version.
Note that the version of the NetBox Docker container image must stay in sync with the code.
To find all possible variables, have a look at the [configuration.py][docker-config] and [docker-entrypoint.sh][entrypoint] files.
Generally, the environment variables are called the same as their respective Netbox configuration variables.
Variables which are arrays are usually composed by putting all the values into the same environment variables with the values separated by a whitespace ("` `").
For example defining `ALLOWED_HOSTS=localhost ::1 127.0.0.1` would allows access to Netbox through `http://localhost:8080`, `http://[::1]:8080` and `http://127.0.0.1:8080`.
If you update for the first time, be sure [to follow our _How To Update NetBox Docker_ guide in the wiki][netbox-docker-wiki-updating].
[compose-env]: https://docs.docker.com/compose/environment-variables/
[releases]: https://github.com/netbox-community/netbox-docker/releases
[netbox-docker-wiki-updating]: https://github.com/netbox-community/netbox-docker/wiki/Updating
### Production
## Rebuilding the Image
The default settings are optimized for (local) development environments.
You should therefore adjust the configuration for production setups, at least the following variables:
`./build.sh` can be used to rebuild the container image. See `./build.sh --help` for more information.
* `ALLOWED_HOSTS`: Add all URLs that lead to your Netbox instance, space separated. E.g. `ALLOWED_HOSTS=netbox.mycorp.com server042.mycorp.com 2a02:123::42 10.0.0.42 localhost ::1 127.0.0.1` (It's good advice to always allow localhost connections for easy debugging, i.e. `localhost ::1 127.0.0.1`.)
* `DB_*`: Use your own persistent database. Don't use the default passwords!
* `EMAIL_*`: Use your own mailserver.
* `MAX_PAGE_SIZE`: Use the recommended default of 1000.
* `SUPERUSER_*`: Only define those variables during the initial setup, and drop them once the DB is set up. Don't use the default passwords!
* `REDIS_*`: Use your own persistent redis. Don't use the default passwords!
For more details on custom builds [consult our wiki][netbox-docker-wiki-build].
### Running on Docker Swarm / Kubernetes / OpenShift
You may run this image in a cluster such as Docker Swarm, Kubernetes or OpenShift, but this is advanced level.
In this case, we encourage you to statically configure Netbox by starting from [Netbox's example config file][default-config], and mounting it into your container in the directory `/etc/netbox/config/` using the mechanism provided by your container platform (i.e. [Docker Swarm configs][swarm-config], [Kubernetes ConfigMap][k8s-config], [OpenShift ConfigMaps][openshift-config]).
But if you rather continue to configure your application through environment variables, you may continue to use [the built-in configuration file][
].
We discourage storing secrets in environment variables, as environment variable are passed on to all sub-processes and may leak easily into other systems, e.g. error collecting tools that often collect all environment variables whenever an error occurs.
Therefore we *strongly advise* to make use of the secrets mechanism provided by your container platform (i.e. [Docker Swarm secrets][swarm-secrets], [Kubernetes secrets][k8s-secrets], [OpenShift secrets][openshift-secrets]).
[The configuration file][docker-config] and [the entrypoint script][entrypoint] try to load the following secrets from the respective files.
If a secret is defined by an environment variable and in the respective file at the same time, then the value from the environment variable is used.
* `SUPERUSER_PASSWORD`: `/run/secrets/superuser_password`
* `SUPERUSER_API_TOKEN`: `/run/secrets/superuser_api_token`
* `DB_PASSWORD`: `/run/secrets/db_password`
* `SECRET_KEY`: `/run/secrets/secret_key`
* `EMAIL_PASSWORD`: `/run/secrets/email_password`
* `NAPALM_PASSWORD`: `/run/secrets/napalm_password`
* `REDIS_PASSWORD`: `/run/secrets/redis_password`
Please also consider [the advice about running Netbox in production](#production) above!
[docker-config]: https://github.com/netbox-community/netbox-docker/blob/master/configuration/configuration.py
[default-config]: https://github.com/digitalocean/netbox/blob/develop/netbox/netbox/configuration.example.py
[entrypoint]: https://github.com/netbox-community/netbox-docker/blob/master/docker/docker-entrypoint.sh
[swarm-config]: https://docs.docker.com/engine/swarm/configs/
[swarm-secrets]: https://docs.docker.com/engine/swarm/secrets/
[openshift-config]: https://docs.openshift.org/latest/dev_guide/configmaps.html
[openshift-secrets]: https://docs.openshift.org/latest/dev_guide/secrets.html
[k8s-secrets]: https://kubernetes.io/docs/concepts/configuration/secret/
[k8s-config]: https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
### NAPALM Configuration
Since v2.1.0 NAPALM has been tightly integrated into Netbox.
NAPALM allows Netbox to fetch live data from devices and return it to a requester via its REST API.
To learn more about what NAPALM is and how it works, please see the documentation from the [libary itself][napalm-doc] or the documentation from [Netbox][netbox-napalm-doc] on how it is integrated.
To enable this functionality, simply complete the following lines in `netbox.env` (or appropriate secrets mechanism) :
* `NAPALM_USERNAME`: A common username that can be utilized for connecting to network devices in your environment.
* `NAPALM_PASSWORD`: The password to use in combintation with the username to connect to network devices.
* `NAPALM_TIMEOUT`: A value to use for when an attempt to connect to a device will timeout if no response has been recieved.
However, if you don't need this functionality, leave these blank.
[napalm-doc]: http://napalm.readthedocs.io/en/latest/index.html
[netbox-napalm-doc]: https://netbox.readthedocs.io/en/latest/configuration/optional-settings/#napalm_username
### Customizable Reporting
Netbox includes [customized reporting][netbox-reports-doc] that allows the user to write Python code and determine the validity of the data within Netbox.
The `REPORTS_ROOT` variable is setup as a mapped directory within this Docker container to `/reports/` and includes the example directly from the documentation for `devices.py`.
However, it has been renamed to `devices.py.example` which prevents Netbox from recognizing it as a valid report.
This was done to avoid unnessary issues from being opened when the default does not work for someone's expectations.
To re-enable this default report, simply rename `devices.py.example` to `devices.py` and browse within the WebUI to `/extras/reports/`.
You can also dynamically add any other report to this same directory and Netbox will be able to see it without restarting the container.
[netbox-reports-doc]: https://netbox.readthedocs.io/en/stable/additional-features/reports/
### Custom Initialization Code (e.g. Automatically Setting Up Custom Fields)
When using `docker-compose`, all the python scripts present in `/opt/netbox/startup_scripts` will automatically be executed after the application boots in the context of `./manage.py`.
The execution of the startup scripts can be prevented by setting the environment variable `SKIP_STARTUP_SCRIPTS` to `true`, e.g. in the file `env/netbox.env`.
That mechanism can be used for many things, e.g. to create Netbox custom fields:
```python
# docker/startup_scripts/load_custom_fields.py
from django.contrib.contenttypes.models import ContentType
from extras.models import CF_TYPE_TEXT, CustomField
from dcim.models import Device
from dcim.models import DeviceType
device = ContentType.objects.get_for_model(Device)
device_type = ContentType.objects.get_for_model(DeviceType)
my_custom_field, created = CustomField.objects.get_or_create(
type=CF_TYPE_TEXT,
name='my_custom_field',
description='My own custom field'
)
if created:
my_custom_field.obj_type.add(device)
my_custom_field.obj_type.add(device_type)
```
#### Initializers
Initializers are built-in startup scripts for defining Netbox custom fields, groups, users and many other resources.
All you need to do is to mount you own `initializers` folder ([see `docker-compose.yml`][netbox-docker-compose]).
Look at the [`initializers` folder][netbox-docker-initializers] to learn how the files must look like.
Here's an example for defining a custom field:
```yaml
# initializers/custom_fields.yml
text_field:
type: text
label: Custom Text
description: Enter text in a text field.
required: false
filter_logic: loose
weight: 0
on_objects:
- dcim.models.Device
- dcim.models.Rack
- ipam.models.IPAddress
- ipam.models.Prefix
- tenancy.models.Tenant
- virtualization.models.VirtualMachine
```
[netbox-docker-initializers]: https://github.com/netbox-community/netbox-docker/tree/master/initializers
[netbox-docker-compose]: https://github.com/netbox-community/netbox-docker/blob/master/docker-compose.yml
##### Available Groups for User/Group initializers
To get an up-to-date list about all the available permissions, run the following command.
```bash
# Make sure the 'netbox' container is already running! If unsure, run `docker-compose up -d`
echo "from django.contrib.auth.models import Permission\nfor p in Permission.objects.all():\n print(p.codename);" | docker-compose exec -T netbox ./manage.py shell
```
#### Custom Docker Image
You can also build your own Netbox Docker image containing your own startup scripts, custom fields, users and groups
like this:
```
ARG VERSION=latest
FROM netboxcommunity/netbox:$VERSION
COPY startup_scripts/ /opt/netbox/startup_scripts/
COPY initializers/ /opt/netbox/initializers/
```
## Netbox Version
The `docker-compose.yml` file is prepared to run a specific version of Netbox.
To use this feature, set the environment-variable `VERSION` before launching `docker-compose`, as shown below.
`VERSION` may be set to the name of
[any tag of the `netboxcommunity/netbox` Docker image on Docker Hub][netbox-dockerhub].
```
$ export VERSION=v2.2.6
$ docker-compose pull netbox
$ docker-compose up -d
```
You can also build a specific version of the Netbox image. This time, `VERSION` indicates any valid
[Git Reference][git-ref] declared on [the 'digitalocean/netbox' Github repository][netbox-github].
Most commonly you will specify a tag or branch name.
```
$ export VERSION=develop
$ docker-compose build --no-cache netbox
$ docker-compose up -d
```
Hint: If you're building a specific version by tag name, the `--no-cache` argument is not strictly necessary.
This can increase the build speed if you're just adjusting the config, for example.
[git-ref]: https://git-scm.com/book/en/v2/Git-Internals-Git-References
[netbox-github]: https://github.com/digitalocean/netbox/releases
### LDAP enabled variant
The images tagged with "-ldap" contain anything necessary to authenticate against an LDAP or Active Directory server.
The default configuration `ldap_config.py` is prepared for use with an Active Directory server.
Custom values can be injected using environment variables, similar to the main configuration mechanisms.
## Troubleshooting
This section is a collection of some common issues and how to resolve them.
If your issue is not here, look through [the existing issues][issues] and eventually create a new issue.
[issues]: (https://github.com/netbox-community/netbox-docker/issues)
### Docker Compose basics
* You can see all running containers belonging to this project using `docker-compose ps`.
* You can see the logs by running `docker-compose logs -f`.
Running `docker-compose logs -f netbox` will just show the logs for netbox.
* You can stop everything using `docker-compose stop`.
* You can clean up everything using `docker-compose down -v --remove-orphans`. **This will also remove any related data.**
* You can enter the shell of the running Netbox container using `docker-compose exec netbox /bin/bash`. Now you have access to `./manage.py`, e.g. to reset a password.
* To access the database run `docker-compose exec postgres sh -c 'psql -U $POSTGRES_USER $POSTGRES_DB'`
* To create a database backup run `docker-compose exec postgres sh -c 'pg_dump -cU $POSTGRES_USER $POSTGRES_DB' | gzip > db_dump.sql.gz`
* To restore that database backup run `gunzip -c db_dump.sql.gz | docker exec -i $(docker-compose ps -q postgres) sh -c 'psql -U $POSTGRES_USER $POSTGRES_DB'`.
### Nginx doesn't start
As a first step, stop your docker-compose setup.
Then locate the `netbox-nginx-config` volume and remove it:
```bash
# Stop your local netbox-docker installation
$ docker-compose down
# Find the volume
$ docker volume ls | grep netbox-nginx-config
local netbox-docker_netbox-nginx-config
# Remove the volume
$ docker volume rm netbox-docker_netbox-nginx-config
netbox-docker_netbox-nginx-config
```
Now start everything up again.
If this didn't help, try to see if there's anything in the logs indicating why nginx doesn't start:
```bash
$ docker-compose logs -f nginx
```
### Getting a "Bad Request (400)"
> When connecting to the Netbox instance, I get a "Bad Request (400)" error.
This usually happens when the `ALLOWED_HOSTS` variable is not set correctly.
### How to upgrade
> How do I update to a newer version of netbox?
It should be sufficient to pull the latest image from Docker Hub, stopping the container and starting it up again:
```bash
docker-compose pull netbox
docker-compose stop netbox netbox-worker
docker-compose rm -f netbox netbox-worker
docker-compose up -d netbox netbox-worker
```
### Webhooks don't work
First make sure that the webhooks feature is enabled in your Netbox configuration and that a redis host is defined.
Check `netbox.env` if the following variables are defined:
```
WEBHOOKS_ENABLED=true
REDIS_HOST=redis
```
Then make sure that the `redis` container and at least one `netbox-worker` are running.
```
# check the container status
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------
netbox-docker_netbox-worker_1 /opt/netbox/docker-entrypo ... Up
netbox-docker_netbox_1 /opt/netbox/docker-entrypo ... Up
netbox-docker_nginx_1 nginx -c /etc/netbox-nginx ... Up 80/tcp, 0.0.0.0:32776->8080/tcp
netbox-docker_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
netbox-docker_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
# connect to redis and send PING command:
$ docker-compose run --rm -T redis sh -c 'redis-cli -h redis -a $REDIS_PASSWORD ping'
Warning: Using a password with '-a' option on the command line interface may not be safe.
PONG
```
If `redis` and the `netbox-worker` are not available, make sure you have updated your `docker-compose.yml` file!
Everything's up and running? Then check the log of `netbox-worker` and/or `redis`:
```bash
docker-compose logs -f netbox-worker
docker-compose logs -f redis
```
Still no clue? You can connect to the `redis` container and have it report any command that is currently executed on the server:
```bash
docker-compose run --rm -T redis sh -c 'redis-cli -h redis -a $REDIS_PASSWORD monitor'
# Hit CTRL-C a few times to leave
```
If you don't see anything happening after you triggered a webhook, double-check the configuration of the `netbox` and the `netbox-worker` containers and also check the configuration of your webhook in the admin interface of Netbox.
### Breaking Changes
From time to time it might become necessary to re-engineer the structure of this setup.
Things like the `docker-compose.yml` file or your Kubernetes or OpenShift configurations have to be adjusted as a consequence.
Since April 2018 each image built from this repo contains a `NETBOX_DOCKER_PROJECT_VERSION` label.
You can check the label of your local image by running `docker inspect netboxcommunity/netbox:v2.3.1 --format "{{json .ContainerConfig.Labels}}"`.
Compare the version with the list below to check whether a breaking change was introduced with that version.
The following is a list of breaking changes of the `netbox-docker` project:
* 0.11.0: The docker-compose file now marks volumes as shared (`:z`). This should prevent SELinux problems [#131][131]
* 0.9.0: Upgrade to at least 2.1.5
* 0.8.0: Alpine linux was upgraded to 3.9 [#126][126]
* 0.7.0: The value of the `MAX_PAGE_SIZE` environment variable was changed to `1000`, which is the default of Netbox.
* 0.6.0: The naming of the default startup_scripts were changed.
If you overwrite them, you may need to adjust these scripts.
* 0.5.0: Alpine was updated to 3.8, `*.env` moved to `/env` folder
* 0.4.0: In order to use Netbox webhooks you need to add Redis and a netbox-worker to your docker-compose.yml.
* 0.3.0: Field `filterable: <boolean` was replaced with field `filter_logic: loose/exact/disabled`. It will default to `CF_FILTER_LOOSE=loose` when not defined.
* 0.2.0: Re-organized paths: `/etc/netbox -> /etc/netbox/config` and `/etc/reports -> /etc/netbox/reports`. Fixes [#54][54].
* 0.1.0: Introduction of the `NETBOX_DOCKER_PROJECT_VERSION`. (Not a breaking change per se.)
[54]: https://github.com/netbox-community/netbox-docker/issues/54
[126]: https://github.com/netbox-community/netbox-docker/pull/126
[131]: https://github.com/netbox-community/netbox-docker/pull/131
## Rebuilding & Publishing images
`./build.sh` can be used to rebuild the Docker image. See `./build.sh --help` for more information.
### Publishing Docker Images
New Docker images are built and published every 24h on the [Docker Build Infrastructure][docker-build-infra].
`DOCKER_HUB.md` contains more information about the build infrastructure.
[docker-build-infra]: https://hub.docker.com/r/netboxcommunity/netbox/builds/
[netbox-docker-wiki-build]: https://github.com/netbox-community/netbox-docker/wiki/Build
## Tests
To run the tests coming with Netbox, use the `docker-compose.yml` file as such:
We have a test script.
It runs NetBox's own unit tests and ensures that all initializers work:
```
$ docker-compose run netbox ./manage.py test
```bash
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 @@
0.11.0
2.4.0

View file

@ -1,84 +0,0 @@
#!/bin/bash
# Builds all Docker images this project provides
# Arguments:
# BUILD: The release to build.
# Allowed: release, prerelease, branches, special
# Default: undefined
echo "▶️ $0 $*"
ALL_BUILDS=("release" "prerelease" "branches" "special")
BUILDS=("${BUILD:-"${ALL_BUILDS[@]}"}")
echo "⚙️ Configured builds: ${BUILDS[*]}"
VARIANTS=("main" "ldap")
if [ -n "${DEBUG}" ]; then
export DEBUG
fi
ERROR=0
# Don't build if not on `master` and don't build if on a pull request,
# but build when DEBUG is not empty
for VARIANT in "${VARIANTS[@]}"; do
export VARIANT
# Checking which VARIANT to build
if [ "${VARIANT}" == "main" ]; then
DOCKERFILE="${DOCKERFILE_PATH-Dockerfile}"
else
DOCKERFILE="${DOCKERFILE_PATH-Dockerfile}.${VARIANT}"
# Fail fast
if [ ! -f "${DOCKERFILE}" ]; then
echo "🚨 The Dockerfile '${DOCKERFILE}' for variant '${VARIANT}' doesn't exist."
ERROR=1
if [ -z "$DEBUG" ]; then
continue
else
echo "⚠️ Would skip this, but DEBUG is enabled."
fi
fi
fi
for BUILD in "${BUILDS[@]}"; do
echo "🛠 Building '$BUILD' from '$DOCKERFILE'"
case $BUILD in
release)
# build the latest release
# shellcheck disable=SC2068
./build-latest.sh $@ || ERROR=1
;;
prerelease)
# build the latest pre-release
# shellcheck disable=SC2068
PRERELEASE=true ./build-latest.sh $@ || ERROR=1
;;
branches)
# build all branches
# shellcheck disable=SC2068
./build-branches.sh $@ || ERROR=1
;;
special)
# special build
# shellcheck disable=SC2068
#SRC_ORG=lampwins TAG=webhooks-backend ./build.sh "feature/webhooks-backend" $@ || ERROR=1
echo "✅ No special builds today."
;;
*)
echo "🚨 Unrecognized build '$BUILD'."
if [ -z "$DEBUG" ]; then
exit 1
else
echo "⚠️ Would exit here with code '1', but DEBUG is enabled."
fi
;;
esac
done
done
exit $ERROR

View file

@ -1,28 +0,0 @@
#!/bin/bash
# Builds develop, develop-* and master branches
echo "▶️ $0 $*"
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
ORIGINAL_GITHUB_REPO="${SRC_ORG-digitalocean}/${SRC_REPO-netbox}"
GITHUB_REPO="${GITHUB_REPO-$ORIGINAL_GITHUB_REPO}"
URL_RELEASES="https://api.github.com/repos/${GITHUB_REPO}/branches?${GITHUB_OAUTH_PARAMS}"
CURL="curl -sS"
BRANCHES=$($CURL "${URL_RELEASES}" | jq -r 'map(.name) | .[] | scan("^[^v].+") | match("^(master|develop).*") | .string')
ERROR=0
for BRANCH in $BRANCHES; do
# shellcheck disable=SC2068
./build.sh "${BRANCH}" $@ || ERROR=1
done
exit $ERROR

View file

@ -0,0 +1,82 @@
#!/bin/bash
# Retrieves image configuration from public images in DockerHub
# Functions from https://gist.github.com/cirocosta/17ea17be7ac11594cb0f290b0a3ac0d1
# Optimised for our use case
get_image_label() {
local label=$1
local image=$2
local tag=$3
local token
token=$(_get_token "$image")
local digest
digest=$(_get_digest "$image" "$tag" "$token")
local retval="null"
if [ "$digest" != "null" ]; then
retval=$(_get_image_configuration "$image" "$token" "$digest" "$label")
fi
echo "$retval"
}
get_image_layers() {
local image=$1
local tag=$2
local token
token=$(_get_token "$image")
_get_layers "$image" "$tag" "$token"
}
get_image_last_layer() {
local image=$1
local tag=$2
local token
token=$(_get_token "$image")
local layers
mapfile -t layers < <(_get_layers "$image" "$tag" "$token")
echo "${layers[-1]}"
}
_get_image_configuration() {
local image=$1
local token=$2
local digest=$3
local label=$4
curl \
--silent \
--location \
--header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/blobs/$digest" |
jq -r ".config.Labels.\"$label\""
}
_get_token() {
local image=$1
curl \
--silent \
"https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" |
jq -r '.token'
}
_get_digest() {
local image=$1
local tag=$2
local token=$3
curl \
--silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/manifests/$tag" |
jq -r '.config.digest'
}
_get_layers() {
local image=$1
local tag=$2
local token=$3
curl \
--silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/manifests/$tag" |
jq -r '.layers[].digest'
}

View file

@ -0,0 +1,21 @@
#!/bin/bash
###
# A regular echo, that only prints if ${GH_ACTION} is defined.
###
gh_echo() {
if [ -n "${GH_ACTION}" ]; then
echo "${@}"
fi
}
###
# Prints the output to the file defined in ${GITHUB_ENV}.
# Only executes if ${GH_ACTION} is defined.
# Example Usage: gh_env "FOO_VAR=bar_value"
###
gh_env() {
if [ -n "${GH_ACTION}" ]; then
echo "${@}" >>"${GITHUB_ENV}"
fi
}

View file

@ -3,6 +3,18 @@
echo "▶️ $0 $*"
###
# Check for the jq library needed for parsing JSON
###
if ! command -v jq; then
echo "⚠️ jq command missing from \$PATH!"
exit 1
fi
###
# 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}"
@ -11,17 +23,38 @@ else
GITHUB_OAUTH_PARAMS=""
fi
ORIGINAL_GITHUB_REPO="digitalocean/netbox"
###
# Checking if PRERELEASE is either unset, 'true' or 'false'
###
if [ -n "${PRERELEASE}" ] &&
{ [ "${PRERELEASE}" != "true" ] && [ "${PRERELEASE}" != "false" ]; }; then
if [ -z "${DEBUG}" ]; then
echo "⚠️ PRERELEASE must be either unset, 'true' or 'false', but was '${PRERELEASE}'!"
exit 1
else
echo "⚠️ Would exit here with code '1', but DEBUG is enabled."
fi
fi
###
# Calling Github to get the latest version
###
ORIGINAL_GITHUB_REPO="netbox-community/netbox"
GITHUB_REPO="${GITHUB_REPO-$ORIGINAL_GITHUB_REPO}"
URL_RELEASES="https://api.github.com/repos/${GITHUB_REPO}/releases?${GITHUB_OAUTH_PARAMS}"
# Composing the JQ commans to extract the most recent version number
JQ_LATEST="group_by(.prerelease) | .[] | sort_by(.published_at) | reverse | .[0] | select(.prerelease==${PRERELEASE-false}) | .tag_name"
CURL="curl -sS"
# Querying the Github API to fetch the most recent version number
VERSION=$($CURL "${URL_RELEASES}" | jq -r "${JQ_LATEST}")
###
# Check if the prerelease version is actually higher than stable version
###
if [ "${PRERELEASE}" == "true" ]; then
JQ_STABLE="group_by(.prerelease) | .[] | sort_by(.published_at) | reverse | .[0] | select(.prerelease==false) | .tag_name"
STABLE_VERSION=$($CURL "${URL_RELEASES}" | jq -r "${JQ_STABLE}")
@ -35,10 +68,17 @@ if [ "${PRERELEASE}" == "true" ]; then
# shellcheck disable=SC2003
MINOR_UNSTABLE=$(expr match "${VERSION}" 'v[0-9]\+\.\([0-9]\+\)')
if ( [ "$MAJOR_STABLE" -eq "$MAJOR_UNSTABLE" ] && [ "$MINOR_STABLE" -ge "$MINOR_UNSTABLE" ] ) \
|| [ "$MAJOR_STABLE" -gt "$MAJOR_UNSTABLE" ]; then
echo "❎ Latest unstable version ('$VERSION') is not higher than the latest stable version ('$STABLE_VERSION')."
if {
[ "${MAJOR_STABLE}" -eq "${MAJOR_UNSTABLE}" ] &&
[ "${MINOR_STABLE}" -ge "${MINOR_UNSTABLE}" ]
} || [ "${MAJOR_STABLE}" -gt "${MAJOR_UNSTABLE}" ]; then
echo "❎ Latest unstable version '${VERSION}' is not higher than the latest stable version '$STABLE_VERSION'."
if [ -z "$DEBUG" ]; then
if [ -n "${GH_ACTION}" ]; then
echo "::set-output name=skipped::true"
fi
exit 0
else
echo "⚠️ Would exit here with code '0', but DEBUG is enabled."
@ -46,32 +86,6 @@ if [ "${PRERELEASE}" == "true" ]; then
fi
fi
# Check if that version is not already available on docker hub:
ORIGINAL_DOCKERHUB_REPO="${DOCKER_ORG-netboxcommunity}/${DOCKER_REPO-netbox}"
DOCKERHUB_REPO="${DOCKERHUB_REPO-$ORIGINAL_DOCKERHUB_REPO}"
URL_DOCKERHUB_TOKEN="https://auth.docker.io/token?service=registry.docker.io&scope=repository:${DOCKERHUB_REPO}:pull"
BEARER_TOKEN="$($CURL "${URL_DOCKERHUB_TOKEN}" | jq -r .token)"
URL_DOCKERHUB_TAG="https://registry.hub.docker.com/v2/${DOCKERHUB_REPO}/tags/list"
AUTHORIZATION_HEADER="Authorization: Bearer ${BEARER_TOKEN}"
if [ -z "$VARIANT" ] || [ "$VARIANT" == "main" ]; then
DOCKER_TAG="${VERSION}"
else
DOCKER_TAG="${VERSION}-${VARIANT}"
fi
ALREADY_BUILT="$($CURL -H "${AUTHORIZATION_HEADER}" "${URL_DOCKERHUB_TAG}" | jq -e ".tags | any(.==\"${DOCKER_TAG}\")")"
if [ -n "$DEBUG" ] || [ "$ALREADY_BUILT" == "false" ]; then
if [ -n "$DEBUG" ]; then
echo "⚠️ Would not build, because ${DOCKER_TAG} already exists on https://hub.docker.com/r/${DOCKERHUB_REPO}, but DEBUG is enabled."
fi
# shellcheck disable=SC2068
./build.sh "${VERSION}" $@
exit $?
else
echo "${DOCKER_TAG} already exists on https://hub.docker.com/r/${DOCKERHUB_REPO}"
exit 0
fi
# shellcheck disable=SC2068
./build.sh "${VERSION}" $@
exit $?

567
build.sh
View file

@ -1,73 +1,134 @@
#!/bin/bash
# Builds the Dockerfile[.variant] and injects tgz'ed Netbox code from Github
# Clones the NetBox repository with git from Github and builds the Dockerfile
echo "▶️ $0 $*"
set -e
if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
echo "Usage: ${0} <branch> [--push|--push-only]"
echo " branch The branch or tag to build. Required."
echo " --push Pushes built the Docker image to the registry."
echo " --push-only Does not build. Only pushes the Docker image to the registry."
echo ""
echo "You can use the following ENV variables to customize the build:"
echo " DEBUG If defined, the script does not stop when certain checks are unsatisfied."
echo " DRY_RUN Prints all build statements instead of running them."
echo " DOCKER_OPTS Add parameters to Docker."
echo " Default:"
echo " When <TAG> starts with 'v': \"\""
echo " Else: \"--no-cache\""
echo " BRANCH The branch to build."
echo " Also used for tagging the image."
echo " TAG The version part of the docker tag."
echo " Default:"
echo " When <BRANCH>=master: latest"
echo " When <BRANCH>=develop: snapshot"
echo " Else: same as <BRANCH>"
echo " DOCKER_ORG The Docker registry (i.e. hub.docker.com/r/<DOCKER_ORG>/<DOCKER_REPO>) "
echo " Also used for tagging the image."
echo " Default: netboxcommunity"
echo " DOCKER_REPO The Docker registry (i.e. hub.docker.com/r/<DOCKER_ORG>/<DOCKER_REPO>) "
echo " Also used for tagging the image."
echo " Default: netbox"
echo " DOCKER_TAG The name of the tag which is applied to the image."
echo " Useful for pushing into another registry than hub.docker.com."
echo " Default: <DOCKER_ORG>/<DOCKER_REPO>:<BRANCH>"
echo " DOCKER_SHORT_TAG The name of the short tag which is applied to the image."
echo " This is used to tag all patch releases to their containing version e.g. v2.5.1 -> v2.5"
echo " Default: <DOCKER_ORG>/<DOCKER_REPO>:\$MAJOR.\$MINOR"
echo " SRC_ORG Which fork of netbox to use (i.e. github.com/<SRC_ORG>/<SRC_REPO>)."
echo " Default: digitalocean"
echo " SRC_REPO The name of the netbox for to use (i.e. github.com/<SRC_ORG>/<SRC_REPO>)."
echo " Default: netbox"
echo " URL Where to fetch the package from."
echo " Must be a tar.gz file of the source code."
echo " Default: https://github.com/<SRC_ORG>/<SRC_REPO>/archive/\$BRANCH.tar.gz"
echo " VARIANT The variant to build."
echo " The value will be used as a suffix to the \$TAG and for the Dockerfile"
echo " selection. The TAG being build must exist for the base variant and"
echo " corresponding Dockerfile must start with the following lines:"
echo " ARG DOCKER_ORG=netboxcommunity"
echo " ARG DOCKER_REPO=netbox"
echo " ARG FROM_TAG=latest"
echo " FROM \$DOCKER_ORG/\$DOCKER_REPO:\$FROM_TAG"
echo " Example: VARIANT=ldap will result in the tag 'latest-ldap' and the"
echo " Dockerfile './Dockerfile.ldap' being used."
echo " Exception: VARIANT=main will use the './Dockerfile' Dockerfile"
echo " Default: main"
echo " HTTP_PROXY The proxy to use for http requests."
echo " Example: http://proxy.domain.tld:3128"
echo " Default: empty"
echo " HTTPS_PROXY The proxy to use for https requests."
echo " Example: http://proxy.domain.tld:3128"
echo " Default: empty"
echo " FTP_PROXY The proxy to use for ftp requests."
echo " Example: http://proxy.domain.tld:3128"
echo " Default: empty"
echo " NO_PROXY Comma-separated list of domain extensions proxy should not be used for."
echo " Example: .domain1.tld,.domain2.tld"
echo " Default: empty"
_BOLD=$(tput bold)
_GREEN=$(tput setaf 2)
_CYAN=$(tput setaf 6)
_CLEAR=$(tput sgr0)
cat <<END_OF_HELP
${_BOLD}Usage:${_CLEAR} ${0} <branch> [--push]
branch The branch or tag to build. Required.
--push Pushes the built container image to the registry.
${_BOLD}You can use the following ENV variables to customize the build:${_CLEAR}
SRC_ORG Which fork of netbox to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO}).
${_GREEN}Default:${_CLEAR} netbox-community
SRC_REPO The name of the repository to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO}).
${_GREEN}Default:${_CLEAR} netbox
URL Where to fetch the code from.
Must be a git repository. Can be private.
${_GREEN}Default:${_CLEAR} https://github.com/\${SRC_ORG}/\${SRC_REPO}.git
NETBOX_PATH The path where netbox will be checkout out.
Must not be outside of the netbox-docker repository (because of Docker)!
${_GREEN}Default:${_CLEAR} .netbox
SKIP_GIT If defined, git is not invoked and \${NETBOX_PATH} will not be altered.
This may be useful, if you are manually managing the NETBOX_PATH.
${_GREEN}Default:${_CLEAR} undefined
TAG The version part of the image tag.
${_GREEN}Default:${_CLEAR}
When <branch>=master: latest
When <branch>=develop: snapshot
Else: same as <branch>
IMAGE_NAMES The names used for the image including the registry
Used for tagging the image.
${_GREEN}Default:${_CLEAR} docker.io/netboxcommunity/netbox
${_CYAN}Example:${_CLEAR} 'docker.io/netboxcommunity/netbox quay.io/netboxcommunity/netbox'
DOCKER_TAG The name of the tag which is applied to the image.
Useful for pushing into another registry than hub.docker.com.
${_GREEN}Default:${_CLEAR} \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:\${TAG}
DOCKER_SHORT_TAG The name of the short tag which is applied to the
image. This is used to tag all patch releases to their
containing version e.g. v2.5.1 -> v2.5
${_GREEN}Default:${_CLEAR} \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:<MAJOR>.<MINOR>
DOCKERFILE The name of Dockerfile to use.
${_GREEN}Default:${_CLEAR} Dockerfile
DOCKER_FROM The base image to use.
${_GREEN}Default:${_CLEAR} 'ubuntu:22.04'
BUILDX_PLATFORMS
Specifies the platform(s) to build the image for.
${_CYAN}Example:${_CLEAR} 'linux/amd64,linux/arm64'
${_GREEN}Default:${_CLEAR} 'linux/amd64'
BUILDX_BUILDER_NAME
If defined, the image build will be assigned to the given builder.
If you specify this variable, make sure that the builder exists.
If this value is not defined, a new builx builder with the directory name of the
current directory (i.e. '$(basename "${PWD}")') is created."
${_CYAN}Example:${_CLEAR} 'clever_lovelace'
${_GREEN}Default:${_CLEAR} undefined
BUILDX_REMOVE_BUILDER
If defined (and only if BUILDX_BUILDER_NAME is undefined),
then the buildx builder created by this script will be removed after use.
This is useful if you build NetBox Docker on an automated system that does
not manage the builders for you.
${_CYAN}Example:${_CLEAR} 'on'
${_GREEN}Default:${_CLEAR} undefined
HTTP_PROXY The proxy to use for http requests.
${_CYAN}Example:${_CLEAR} http://proxy.domain.tld:3128
${_GREEN}Default:${_CLEAR} undefined
NO_PROXY Comma-separated list of domain extensions proxy should not be used for.
${_CYAN}Example:${_CLEAR} .domain1.tld,.domain2.tld
${_GREEN}Default:${_CLEAR} undefined
DEBUG If defined, the script does not stop when certain checks are unsatisfied.
${_GREEN}Default:${_CLEAR} undefined
DRY_RUN Prints all build statements instead of running them.
${_GREEN}Default:${_CLEAR} undefined
GH_ACTION If defined, special 'echo' statements are enabled that set the
following environment variables in Github Actions:
- FINAL_DOCKER_TAG: The final value of the DOCKER_TAG env variable
${_GREEN}Default:${_CLEAR} undefined
${_BOLD}Examples:${_CLEAR}
${0} master
This will fetch the latest 'master' branch, build a Docker Image and tag it
'netboxcommunity/netbox:latest'.
${0} develop
This will fetch the latest 'develop' branch, build a Docker Image and tag it
'netboxcommunity/netbox:snapshot'.
${0} v2.6.6
This will fetch the 'v2.6.6' tag, build a Docker Image and tag it
'netboxcommunity/netbox:v2.6.6' and 'netboxcommunity/netbox:v2.6'.
${0} develop-2.7
This will fetch the 'develop-2.7' branch, build a Docker Image and tag it
'netboxcommunity/netbox:develop-2.7'.
SRC_ORG=cimnine ${0} feature-x
This will fetch the 'feature-x' branch from https://github.com/cimnine/netbox.git,
build a Docker Image and tag it 'netboxcommunity/netbox:feature-x'.
SRC_ORG=cimnine DOCKER_ORG=cimnine ${0} feature-x
This will fetch the 'feature-x' branch from https://github.com/cimnine/netbox.git,
build a Docker Image and tag it 'cimnine/netbox:feature-x'.
END_OF_HELP
if [ "${1}x" == "x" ]; then
exit 1
@ -76,122 +137,322 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
fi
fi
# read the project version and trim it
# see https://stackoverflow.com/a/3232433/172132
NETBOX_DOCKER_PROJECT_VERSION="${NETBOX_DOCKER_PROJECT_VERSION-$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' VERSION)}"
source ./build-functions/gh-functions.sh
# variables for fetching the source
SRC_ORG="${SRC_ORG-digitalocean}"
SRC_REPO="${SRC_REPO-netbox}"
BRANCH="${1}"
URL="${URL-https://github.com/${SRC_ORG}/${SRC_REPO}/archive/$BRANCH.tar.gz}"
IMAGE_NAMES="${IMAGE_NAMES-docker.io/netboxcommunity/netbox}"
IFS=' ' read -ra IMAGE_NAMES <<<"${IMAGE_NAMES}"
# Checking which VARIANT to build
VARIANT="${VARIANT-main}"
if [ "$VARIANT" == "main" ]; then
DOCKERFILE="Dockerfile"
###
# Enabling dry-run mode
###
if [ -z "${DRY_RUN}" ]; then
DRY=""
else
DOCKERFILE="Dockerfile.${VARIANT}"
echo "⚠️ DRY_RUN MODE ON ⚠️"
DRY="echo"
fi
# Fail fast
if [ ! -f "${DOCKERFILE}" ]; then
echo "🚨 The Dockerfile ${DOCKERFILE} for variant '${VARIANT}' doesn't exist."
gh_echo "::group::⤵️ Fetching the NetBox source code"
if [ -z "$DEBUG" ]; then
###
# Variables for fetching the NetBox source
###
SRC_ORG="${SRC_ORG-netbox-community}"
SRC_REPO="${SRC_REPO-netbox}"
NETBOX_BRANCH="${1}"
URL="${URL-https://github.com/${SRC_ORG}/${SRC_REPO}.git}"
NETBOX_PATH="${NETBOX_PATH-.netbox}"
###
# Fetching the NetBox source
###
if [ "${2}" != "--push-only" ] && [ -z "${SKIP_GIT}" ]; then
REMOTE_EXISTS=$(git ls-remote --heads --tags "${URL}" "${NETBOX_BRANCH}" | wc -l)
if [ "${REMOTE_EXISTS}" == "0" ]; then
echo "❌ Remote branch '${NETBOX_BRANCH}' not found in '${URL}'; Nothing to do"
gh_echo "::set-output name=skipped::true"
exit 0
fi
echo "🌐 Checking out '${NETBOX_BRANCH}' of NetBox from the url '${URL}' into '${NETBOX_PATH}'"
if [ ! -d "${NETBOX_PATH}" ]; then
$DRY git clone -q --depth 10 -b "${NETBOX_BRANCH}" "${URL}" "${NETBOX_PATH}"
fi
(
$DRY cd "${NETBOX_PATH}"
# shellcheck disable=SC2030
if [ -n "${HTTP_PROXY}" ]; then
git config http.proxy "${HTTP_PROXY}"
fi
$DRY git remote set-url origin "${URL}"
$DRY git fetch -qp --depth 10 origin "${NETBOX_BRANCH}"
$DRY git checkout -qf FETCH_HEAD
$DRY git prune
)
echo "✅ Checked out NetBox"
fi
gh_echo "::endgroup::"
gh_echo "::group::🧮 Calculating Values"
###
# Determining the value for DOCKERFILE
# and checking whether it exists
###
DOCKERFILE="${DOCKERFILE-Dockerfile}"
if [ ! -f "${DOCKERFILE}" ]; then
echo "🚨 The Dockerfile ${DOCKERFILE} doesn't exist."
if [ -z "${DEBUG}" ]; then
exit 1
else
echo "⚠️ Would exit here with code '1', but DEBUG is enabled."
fi
fi
# variables for tagging the docker image
DOCKER_ORG="${DOCKER_ORG-netboxcommunity}"
DOCKER_REPO="${DOCKER_REPO-netbox}"
case "${BRANCH}" in
master)
TAG="${TAG-latest}";;
develop)
TAG="${TAG-snapshot}";;
*)
TAG="${TAG-$BRANCH}";;
esac
DOCKER_TAG="${DOCKER_TAG-${DOCKER_ORG}/${DOCKER_REPO}:${TAG}}"
if [ "$VARIANT" != "main" ]; then
DOCKER_TAG="${DOCKER_TAG}-${VARIANT}"
###
# Determining the value for DOCKER_FROM
###
if [ -z "$DOCKER_FROM" ]; then
DOCKER_FROM="ubuntu:22.04"
fi
###
# Variables for labelling the docker image
###
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M+00:00')"
if [ -d ".git" ] && [ -z "${SKIP_GIT}" ]; then
GIT_REF="$(git rev-parse HEAD)"
fi
# Read the project version from the `VERSION` file and trim it, see https://stackoverflow.com/a/3232433/172132
PROJECT_VERSION="${PROJECT_VERSION-$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' VERSION)}"
# Get the Git information from the netbox directory
if [ -d "${NETBOX_PATH}/.git" ] && [ -z "${SKIP_GIT}" ]; then
NETBOX_GIT_REF=$(
cd "${NETBOX_PATH}"
git rev-parse HEAD
)
NETBOX_GIT_BRANCH=$(
cd "${NETBOX_PATH}"
git rev-parse --abbrev-ref HEAD
)
NETBOX_GIT_URL=$(
cd "${NETBOX_PATH}"
git remote get-url origin
)
fi
###
# Variables for tagging the docker image
###
DOCKER_REGISTRY="${DOCKER_REGISTRY-docker.io}"
DOCKER_ORG="${DOCKER_ORG-netboxcommunity}"
DOCKER_REPO="${DOCKER_REPO-netbox}"
case "${NETBOX_BRANCH}" in
master)
TAG="${TAG-latest}"
;;
develop)
TAG="${TAG-snapshot}"
;;
*)
TAG="${TAG-$NETBOX_BRANCH}"
;;
esac
###
# composing the final TARGET_DOCKER_TAG
###
TARGET_DOCKER_TAG="${DOCKER_TAG-${TAG}}"
TARGET_DOCKER_TAG_PROJECT="${TARGET_DOCKER_TAG}-${PROJECT_VERSION}"
###
# composing the additional DOCKER_SHORT_TAG,
# i.e. "v2.6.1" becomes "v2.6",
# which is only relevant for version tags
# Also let "latest" follow the highest version
###
if [[ "${TAG}" =~ ^v([0-9]+)\.([0-9]+)\.[0-9]+$ ]]; then
MAJOR=${BASH_REMATCH[1]}
MINOR=${BASH_REMATCH[2]}
DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-${DOCKER_ORG}/${DOCKER_REPO}:v${MAJOR}.${MINOR}}"
TARGET_DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-v${MAJOR}.${MINOR}}"
TARGET_DOCKER_LATEST_TAG="latest"
TARGET_DOCKER_SHORT_TAG_PROJECT="${TARGET_DOCKER_SHORT_TAG}-${PROJECT_VERSION}"
TARGET_DOCKER_LATEST_TAG_PROJECT="${TARGET_DOCKER_LATEST_TAG}-${PROJECT_VERSION}"
fi
if [ "$VARIANT" != "main" ]; then
DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG}-${VARIANT}"
IMAGE_NAME_TAGS=()
for IMAGE_NAME in "${IMAGE_NAMES[@]}"; do
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG}")
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG_PROJECT}")
done
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then
for IMAGE_NAME in "${IMAGE_NAMES[@]}"; do
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_SHORT_TAG}")
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_SHORT_TAG_PROJECT}")
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_LATEST_TAG}")
IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_LATEST_TAG_PROJECT}")
done
fi
gh_env "FINAL_DOCKER_TAG=${IMAGE_NAME_TAGS[0]}"
###
# Checking if the build is necessary,
# meaning build only if one of those values changed:
# - base image digest
# - netbox git ref (Label: netbox.git-ref)
# - netbox-docker git ref (Label: org.opencontainers.image.revision)
###
# Load information from registry (only for docker.io)
SHOULD_BUILD="false"
BUILD_REASON=""
if [ -z "${GH_ACTION}" ]; then
# Asuming non Github builds should always proceed
SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} interactive"
elif [[ "${IMAGE_NAME_TAGS[0]}" = docker.io* ]]; then
source ./build-functions/get-public-image-config.sh
IFS=':' read -ra DOCKER_FROM_SPLIT <<<"${DOCKER_FROM}"
if ! [[ ${DOCKER_FROM_SPLIT[0]} =~ .*/.* ]]; then
# Need to use "library/..." for images the have no two part name
DOCKER_FROM_SPLIT[0]="library/${DOCKER_FROM_SPLIT[0]}"
fi
fi
IFS='/' read -ra ORG_REPO <<<"${IMAGE_NAMES[0]}"
echo "Checking labels for '${ORG_REPO[1]}' and '${ORG_REPO[2]}'"
BASE_LAST_LAYER=$(get_image_last_layer "${DOCKER_FROM_SPLIT[0]}" "${DOCKER_FROM_SPLIT[1]}")
mapfile -t IMAGES_LAYERS_OLD < <(get_image_layers "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
NETBOX_GIT_REF_OLD=$(get_image_label netbox.git-ref "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
GIT_REF_OLD=$(get_image_label org.opencontainers.image.revision "${ORG_REPO[1]}"/"${ORG_REPO[2]}" "${TAG}")
DOCKER_OPTS=("${DOCKER_OPTS[@]}")
# caching is only ok for version tags
case "${TAG}" in
v*) ;;
*) DOCKER_OPTS+=( "--no-cache" ) ;;
esac
DOCKER_OPTS+=( "--pull" )
# Build args
DOCKER_BUILD_ARGS=(
--build-arg "NETBOX_DOCKER_PROJECT_VERSION=${NETBOX_DOCKER_PROJECT_VERSION}"
--build-arg "FROM_TAG=${TAG}"
--build-arg "BRANCH=${BRANCH}"
--build-arg "URL=${URL}"
--build-arg "DOCKER_ORG=${DOCKER_ORG}"
--build-arg "DOCKER_REPO=${DOCKER_REPO}"
)
if [ -n "$HTTP_PROXY" ]; then
DOCKER_BUILD_ARGS+=( --build-arg "http_proxy=${HTTP_PROXY}" )
fi
if [ -n "$HTTPS_PROXY" ]; then
DOCKER_BUILD_ARGS+=( --build-arg "https_proxy=${HTTPS_PROXY}" )
fi
if [ -n "$FTP_PROXY" ]; then
DOCKER_BUILD_ARGS+=( --build-arg "ftp_proxy=${FTP_PROXY}" )
fi
if [ -n "$NO_PROXY" ]; then
DOCKER_BUILD_ARGS+=( --build-arg "no_proxy=${NO_PROXY}" )
fi
if [ -z "$DRY_RUN" ]; then
DOCKER_CMD="docker"
if ! printf '%s\n' "${IMAGES_LAYERS_OLD[@]}" | grep -q -P "^${BASE_LAST_LAYER}\$"; then
SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} debian"
fi
if [ "${NETBOX_GIT_REF}" != "${NETBOX_GIT_REF_OLD}" ]; then
SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} netbox"
fi
if [ "${GIT_REF}" != "${GIT_REF_OLD}" ]; then
SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} netbox-docker"
fi
else
echo "⚠️ DRY_RUN MODE ON ⚠️"
DOCKER_CMD="echo docker"
SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} no-check"
fi
if [ "${2}" != "--push-only" ] ; then
echo "🐳 Building the Docker image '${DOCKER_TAG}' from the url '${URL}'."
$DOCKER_CMD build -t "${DOCKER_TAG}" "${DOCKER_BUILD_ARGS[@]}" "${DOCKER_OPTS[@]}" -f "${DOCKERFILE}" .
echo "✅ Finished building the Docker images '${DOCKER_TAG}'"
if [ "${SHOULD_BUILD}" != "true" ]; then
echo "Build skipped because sources didn't change"
echo "::set-output name=skipped::true"
exit 0 # Nothing to do -> exit
else
gh_echo "::set-output name=skipped::false"
fi
gh_echo "::endgroup::"
if [ -n "$DOCKER_SHORT_TAG" ]; then
echo "🐳 Tagging image '${DOCKER_SHORT_TAG}'."
$DOCKER_CMD tag "${DOCKER_TAG}" "${DOCKER_SHORT_TAG}"
echo "✅ Tagged image '${DOCKER_SHORT_TAG}'"
fi
###
# Build the image
###
gh_echo "::group::🏗 Building the image"
###
# Composing all arguments for `docker build`
###
DOCKER_BUILD_ARGS=(
--pull
--target main
-f "${DOCKERFILE}"
)
for IMAGE_NAME in "${IMAGE_NAME_TAGS[@]}"; do
DOCKER_BUILD_ARGS+=(-t "${IMAGE_NAME}")
done
# --label
DOCKER_BUILD_ARGS+=(
--label "netbox.original-tag=${TARGET_DOCKER_TAG_PROJECT}"
--label "org.opencontainers.image.created=${BUILD_DATE}"
--label "org.opencontainers.image.version=${PROJECT_VERSION}"
)
if [ -d ".git" ] && [ -z "${SKIP_GIT}" ]; then
DOCKER_BUILD_ARGS+=(
--label "org.opencontainers.image.revision=${GIT_REF}"
)
fi
if [ -d "${NETBOX_PATH}/.git" ] && [ -z "${SKIP_GIT}" ]; then
DOCKER_BUILD_ARGS+=(
--label "netbox.git-branch=${NETBOX_GIT_BRANCH}"
--label "netbox.git-ref=${NETBOX_GIT_REF}"
--label "netbox.git-url=${NETBOX_GIT_URL}"
)
fi
if [ -n "${BUILD_REASON}" ]; then
BUILD_REASON=$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' <<<"$BUILD_REASON")
DOCKER_BUILD_ARGS+=(--label "netbox.build-reason=${BUILD_REASON}")
fi
if [ "${2}" == "--push" ] || [ "${2}" == "--push-only" ] ; then
echo "⏫ Pushing '${DOCKER_TAG}"
$DOCKER_CMD push "${DOCKER_TAG}"
echo "✅ Finished pushing the Docker image '${DOCKER_TAG}'."
# --build-arg
DOCKER_BUILD_ARGS+=(--build-arg "NETBOX_PATH=${NETBOX_PATH}")
if [ -n "$DOCKER_SHORT_TAG" ]; then
echo "⏫ Pushing '${DOCKER_SHORT_TAG}'"
$DOCKER_CMD push "${DOCKER_SHORT_TAG}"
echo "✅ Finished pushing the Docker image '${DOCKER_SHORT_TAG}'."
fi
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}")
fi
if [ -n "${NO_PROXY}" ]; then
DOCKER_BUILD_ARGS+=(--build-arg "no_proxy=${NO_PROXY}")
fi
DOCKER_BUILD_ARGS+=(--platform "${BUILDX_PLATFORM-linux/amd64}")
if [ "${2}" == "--push" ]; then
# output type=docker does not work with pushing
DOCKER_BUILD_ARGS+=(
--output=type=image
--push
)
else
DOCKER_BUILD_ARGS+=(
--output=type=docker
)
fi
###
# Building the docker image
###
if [ -z "${BUILDX_BUILDER_NAME}" ]; then
BUILDX_BUILDER_NAME="$(basename "${PWD}")"
fi
if ! docker buildx ls | grep --quiet --word-regexp "${BUILDX_BUILDER_NAME}"; then
echo "👷 Creating new Buildx Builder '${BUILDX_BUILDER_NAME}'"
$DRY docker buildx create --name "${BUILDX_BUILDER_NAME}"
BUILDX_BUILDER_CREATED="yes"
fi
echo "🐳 Building the Docker image '${TARGET_DOCKER_TAG_PROJECT}'."
echo " Build reason set to: ${BUILD_REASON}"
$DRY docker buildx \
--builder "${BUILDX_BUILDER_NAME}" \
build \
"${DOCKER_BUILD_ARGS[@]}" \
.
echo "✅ Finished building the Docker images"
gh_echo "::endgroup::" # End group for Build
gh_echo "::group::🏗 Image Labels"
echo "🔎 Inspecting labels on '${IMAGE_NAME_TAGS[0]}'"
$DRY docker inspect "${IMAGE_NAME_TAGS[0]}" --format "{{json .Config.Labels}}" | jq
gh_echo "::endgroup::"
gh_echo "::group::🏗 Clean up"
if [ -n "${BUILDX_REMOVE_BUILDER}" ] && [ "${BUILDX_BUILDER_CREATED}" == "yes" ]; then
echo "👷 Removing Buildx Builder '${BUILDX_BUILDER_NAME}'"
$DRY docker buildx rm "${BUILDX_BUILDER_NAME}"
fi
gh_echo "::endgroup::"

View file

@ -1,20 +1,51 @@
import os
import socket
####
## We recommend to not edit this file.
## Create separate files to overwrite the settings.
## See `extra.py` as an example.
####
# For reference see http://netbox.readthedocs.io/en/latest/configuration/mandatory-settings/
# Based on https://github.com/digitalocean/netbox/blob/develop/netbox/netbox/configuration.example.py
import re
from os import environ
from os.path import abspath, dirname, join
from typing import Any, Callable, Tuple
# For reference see https://docs.netbox.dev/en/stable/configuration/
# Based on https://github.com/netbox-community/netbox/blob/develop/netbox/netbox/configuration_example.py
###
# NetBox-Docker Helper functions
###
# Read secret from file
def read_secret(secret_name):
def _read_secret(secret_name: str, default: str | None = None) -> str | None:
try:
f = open('/run/secrets/' + secret_name, 'r', encoding='utf-8')
except EnvironmentError:
return ''
return default
else:
with f:
return f.readline().strip()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# If the `map_fn` isn't defined, then the value that is read from the environment (or the default value if not found) is returned.
# If the `map_fn` is defined, then `map_fn` is invoked and the value (that was read from the environment or the default value if not found)
# is passed to it as a parameter. The value returned from `map_fn` is then the return value of this function.
# The `map_fn` is not invoked, if the value (that was read from the environment or the default value if not found) is None.
def _environ_get_and_map(variable_name: str, default: str | None = None, map_fn: Callable[[str], Any | None] = None) -> Any | None:
env_value = environ.get(variable_name, default)
if env_value == None:
return env_value
if not map_fn:
return env_value
return map_fn(env_value)
_AS_BOOL = lambda value : value.lower() == 'true'
_AS_INT = lambda value : int(value)
_AS_LIST = lambda value : list(filter(None, value.split(' ')))
_BASE_DIR = dirname(dirname(abspath(__file__)))
#########################
# #
@ -26,23 +57,53 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name.
#
# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local']
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '*').split(' ')
ALLOWED_HOSTS = environ.get('ALLOWED_HOSTS', '*').split(' ')
# PostgreSQL database configuration.
# PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
# https://docs.djangoproject.com/en/stable/ref/settings/#databases
DATABASE = {
'NAME': os.environ.get('DB_NAME', 'netbox'), # Database name
'USER': os.environ.get('DB_USER', ''), # PostgreSQL username
'PASSWORD': os.environ.get('DB_PASSWORD', read_secret('db_password')),
# PostgreSQL password
'HOST': os.environ.get('DB_HOST', 'localhost'), # Database server
'PORT': os.environ.get('DB_PORT', ''), # Database port (leave blank for default)
'NAME': environ.get('DB_NAME', 'netbox'), # Database name
'USER': environ.get('DB_USER', ''), # PostgreSQL username
'PASSWORD': _read_secret('db_password', environ.get('DB_PASSWORD', '')),
# PostgreSQL password
'HOST': environ.get('DB_HOST', 'localhost'), # Database server
'PORT': environ.get('DB_PORT', ''), # Database port (leave blank for default)
'OPTIONS': {'sslmode': environ.get('DB_SSLMODE', 'prefer')},
# Database connection SSLMODE
'CONN_MAX_AGE': _environ_get_and_map('DB_CONN_MAX_AGE', '300', _AS_INT),
# Max database connection age
'DISABLE_SERVER_SIDE_CURSORS': _environ_get_and_map('DB_DISABLE_SERVER_SIDE_CURSORS', 'False', _AS_BOOL),
# 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
# configuration exists for each. Full connection details are required in both sections, and it is strongly recommended
# to use two separate database IDs.
REDIS = {
'tasks': {
'HOST': environ.get('REDIS_HOST', 'localhost'),
'PORT': _environ_get_and_map('REDIS_PORT', 6379, _AS_INT),
'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')),
'DATABASE': _environ_get_and_map('REDIS_DATABASE', 0, _AS_INT),
'SSL': _environ_get_and_map('REDIS_SSL', 'False', _AS_BOOL),
'INSECURE_SKIP_TLS_VERIFY': _environ_get_and_map('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False', _AS_BOOL),
},
'caching': {
'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')),
'PORT': _environ_get_and_map('REDIS_CACHE_PORT', environ.get('REDIS_PORT', '6379'), _AS_INT),
'PASSWORD': _read_secret('redis_cache_password', environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))),
'DATABASE': _environ_get_and_map('REDIS_CACHE_DATABASE', '1', _AS_INT),
'SSL': _environ_get_and_map('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False'), _AS_BOOL),
'INSECURE_SKIP_TLS_VERIFY': _environ_get_and_map('REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY', environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False'), _AS_BOOL),
},
}
# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file.
# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and
# symbols. NetBox will not run without this defined. For more information, see
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SECRET_KEY
SECRET_KEY = os.environ.get('SECRET_KEY', read_secret('secret_key'))
# https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SECRET_KEY
SECRET_KEY = _read_secret('secret_key', environ.get('SECRET_KEY', ''))
#########################
# #
@ -50,116 +111,226 @@ SECRET_KEY = os.environ.get('SECRET_KEY', read_secret('secret_key'))
# #
#########################
# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
# application errors (assuming correct email settings are provided).
ADMINS = [
# ['John Doe', 'jdoe@example.com'],
]
# # Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
# # application errors (assuming correct email settings are provided).
# ADMINS = [
# # ['John Doe', 'jdoe@example.com'],
# ]
if 'ALLOWED_URL_SCHEMES' in environ:
ALLOWED_URL_SCHEMES = _environ_get_and_map('ALLOWED_URL_SCHEMES', None, _AS_LIST)
# Optionally display a persistent banner at the top and/or bottom of every page. HTML is allowed. To display the same
# content in both banners, define BANNER_TOP and set BANNER_BOTTOM = BANNER_TOP.
BANNER_TOP = os.environ.get('BANNER_TOP', '')
BANNER_BOTTOM = os.environ.get('BANNER_BOTTOM', '')
if 'BANNER_TOP' in environ:
BANNER_TOP = environ.get('BANNER_TOP', None)
if 'BANNER_BOTTOM' in environ:
BANNER_BOTTOM = environ.get('BANNER_BOTTOM', None)
# Text to include on the login page above the login form. HTML is allowed.
BANNER_LOGIN = os.environ.get('BANNER_LOGIN', '')
if 'BANNER_LOGIN' in environ:
BANNER_LOGIN = environ.get('BANNER_LOGIN', None)
# Base URL path if accessing NetBox within a directory. For example, if installed at http://example.com/netbox/, set:
# BASE_PATH = 'netbox/'
BASE_PATH = os.environ.get('BASE_PATH', '')
BASE_PATH = environ.get('BASE_PATH', '')
# Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90)
if 'CHANGELOG_RETENTION' in environ:
CHANGELOG_RETENTION = _environ_get_and_map('CHANGELOG_RETENTION', None, _AS_INT)
# Maximum number of days to retain job results (scripts and reports). Set to 0 to retain job results in the database indefinitely. (Default: 90)
if 'JOBRESULT_RETENTION' in environ:
JOBRESULT_RETENTION = _environ_get_and_map('JOBRESULT_RETENTION', None, _AS_INT)
# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
CORS_ORIGIN_ALLOW_ALL = os.environ.get('CORS_ORIGIN_ALLOW_ALL', 'False').lower() == 'true'
CORS_ORIGIN_WHITELIST = os.environ.get('CORS_ORIGIN_WHITELIST', '').split(' ')
CORS_ORIGIN_REGEX_WHITELIST = [
# r'^(https?://)?(\w+\.)?example\.com$',
]
CORS_ORIGIN_ALLOW_ALL = _environ_get_and_map('CORS_ORIGIN_ALLOW_ALL', 'False', _AS_BOOL)
CORS_ORIGIN_WHITELIST = _environ_get_and_map('CORS_ORIGIN_WHITELIST', 'https://localhost', _AS_LIST)
CORS_ORIGIN_REGEX_WHITELIST = [re.compile(r) for r in _environ_get_and_map('CORS_ORIGIN_REGEX_WHITELIST', '', _AS_LIST)]
# Set to True to enable server debugging. WARNING: Debugging introduces a substantial performance penalty and may reveal
# sensitive information about your installation. Only enable debugging while performing testing. Never enable debugging
# on a production system.
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'
# sensitive information about your installation. Only enable debugging while performing testing.
# Never enable debugging on a production system.
DEBUG = _environ_get_and_map('DEBUG', 'False', _AS_BOOL)
# This parameter serves as a safeguard to prevent some potentially dangerous behavior,
# such as generating new database schema migrations.
# Set this to True only if you are actively developing the NetBox code base.
DEVELOPER = _environ_get_and_map('DEVELOPER', 'False', _AS_BOOL)
# Email settings
EMAIL = {
'SERVER': os.environ.get('EMAIL_SERVER', 'localhost'),
'PORT': int(os.environ.get('EMAIL_PORT', 25)),
'USERNAME': os.environ.get('EMAIL_USERNAME', ''),
'PASSWORD': os.environ.get('EMAIL_PASSWORD', read_secret('email_password')),
'TIMEOUT': int(os.environ.get('EMAIL_TIMEOUT', 10)), # seconds
'FROM_EMAIL': os.environ.get('EMAIL_FROM', ''),
'SERVER': environ.get('EMAIL_SERVER', 'localhost'),
'PORT': _environ_get_and_map('EMAIL_PORT', 25, _AS_INT),
'USERNAME': environ.get('EMAIL_USERNAME', ''),
'PASSWORD': _read_secret('email_password', environ.get('EMAIL_PASSWORD', '')),
'USE_SSL': _environ_get_and_map('EMAIL_USE_SSL', 'False', _AS_BOOL),
'USE_TLS': _environ_get_and_map('EMAIL_USE_TLS', 'False', _AS_BOOL),
'SSL_CERTFILE': environ.get('EMAIL_SSL_CERTFILE', ''),
'SSL_KEYFILE': environ.get('EMAIL_SSL_KEYFILE', ''),
'TIMEOUT': _environ_get_and_map('EMAIL_TIMEOUT', 10, _AS_INT), # seconds
'FROM_EMAIL': environ.get('EMAIL_FROM', ''),
}
# Enforcement of unique IP space can be toggled on a per-VRF basis.
# To enforce unique IP space within the global table (all prefixes and IP addresses not assigned to a VRF),
# set ENFORCE_GLOBAL_UNIQUE to True.
ENFORCE_GLOBAL_UNIQUE = os.environ.get('ENFORCE_GLOBAL_UNIQUE', 'False').lower() == 'true'
# Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce unique IP space within the global table
# (all prefixes and IP addresses not assigned to a VRF), set ENFORCE_GLOBAL_UNIQUE to True.
if 'ENFORCE_GLOBAL_UNIQUE' in environ:
ENFORCE_GLOBAL_UNIQUE = _environ_get_and_map('ENFORCE_GLOBAL_UNIQUE', None, _AS_BOOL)
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
# https://docs.djangoproject.com/en/1.11/topics/logging/
LOGGING = {}
# Exempt certain models from the enforcement of view permissions. Models listed here will be viewable by all users and
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
EXEMPT_VIEW_PERMISSIONS = _environ_get_and_map('EXEMPT_VIEW_PERMISSIONS', '', _AS_LIST)
# HTTP proxies NetBox should use when sending outbound HTTP requests (e.g. for webhooks).
# HTTP_PROXIES = {
# 'http': 'http://10.10.1.10:3128',
# 'https': 'http://10.10.1.10:1080',
# }
# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing
# NetBox from an internal IP.
INTERNAL_IPS = _environ_get_and_map('INTERNAL_IPS', '127.0.0.1 ::1', _AS_LIST)
# Enable GraphQL API.
if 'GRAPHQL_ENABLED' in environ:
GRAPHQL_ENABLED = _environ_get_and_map('GRAPHQL_ENABLED', None, _AS_BOOL)
# # Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
# # https://docs.djangoproject.com/en/stable/topics/logging/
# LOGGING = {}
# Automatically reset the lifetime of a valid session upon each authenticated request. Enables users to remain
# authenticated to NetBox indefinitely.
LOGIN_PERSISTENCE = _environ_get_and_map('LOGIN_PERSISTENCE', 'False', _AS_BOOL)
# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users
# are permitted to access most data in NetBox (excluding secrets) but not make any changes.
LOGIN_REQUIRED = os.environ.get('LOGIN_REQUIRED', 'False').lower() == 'true'
LOGIN_REQUIRED = _environ_get_and_map('LOGIN_REQUIRED', 'False', _AS_BOOL)
# The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to
# re-authenticate. (Default: 1209600 [14 days])
LOGIN_TIMEOUT = _environ_get_and_map('LOGIN_TIMEOUT', 1209600, _AS_INT)
# Setting this to True will display a "maintenance mode" banner at the top of every page.
MAINTENANCE_MODE = os.environ.get('MAINTENANCE_MODE', 'False').lower() == 'true'
if 'MAINTENANCE_MODE' in environ:
MAINTENANCE_MODE = _environ_get_and_map('MAINTENANCE_MODE', None, _AS_BOOL)
# Maps provider
if 'MAPS_URL' in environ:
MAPS_URL = environ.get('MAPS_URL', None)
# An API consumer can request an arbitrary number of objects =by appending the "limit" parameter to the URL (e.g.
# "?limit=1000"). This setting defines the maximum limit. Setting it to 0 or None will allow an API consumer to request
# all objects by specifying "?limit=0".
MAX_PAGE_SIZE = int(os.environ.get('MAX_PAGE_SIZE', 1000))
if 'MAX_PAGE_SIZE' in environ:
MAX_PAGE_SIZE = _environ_get_and_map('MAX_PAGE_SIZE', None, _AS_INT)
# The file path where uploaded media such as image attachments are stored. A trailing slash is not needed. Note that
# the default value of this setting is derived from the installed location.
MEDIA_ROOT = os.environ.get('MEDIA_ROOT', os.path.join(BASE_DIR, 'media'))
MEDIA_ROOT = environ.get('MEDIA_ROOT', join(_BASE_DIR, 'media'))
# Credentials that NetBox will use to access live devices.
NAPALM_USERNAME = os.environ.get('NAPALM_USERNAME', '')
NAPALM_PASSWORD = os.environ.get('NAPALM_PASSWORD', read_secret('napalm_password'))
# Expose Prometheus monitoring metrics at the HTTP endpoint '/metrics'
METRICS_ENABLED = _environ_get_and_map('METRICS_ENABLED', 'False', _AS_BOOL)
# Credentials that NetBox will uses to authenticate to devices when connecting via NAPALM.
if 'NAPALM_USERNAME' in environ:
NAPALM_USERNAME = environ.get('NAPALM_USERNAME', None)
if 'NAPALM_PASSWORD' in environ:
NAPALM_PASSWORD = _read_secret('napalm_password', environ.get('NAPALM_PASSWORD', None))
# NAPALM timeout (in seconds). (Default: 30)
NAPALM_TIMEOUT = int(os.environ.get('NAPALM_TIMEOUT', 30))
if 'NAPALM_TIMEOUT' in environ:
NAPALM_TIMEOUT = _environ_get_and_map('NAPALM_TIMEOUT', None, _AS_INT)
# NAPALM optional arguments (see http://napalm.readthedocs.io/en/latest/support/#optional-arguments). Arguments must
# be provided as a dictionary.
NAPALM_ARGS = {}
# # NAPALM optional arguments (see http://napalm.readthedocs.io/en/latest/support/#optional-arguments). Arguments must
# # be provided as a dictionary.
# NAPALM_ARGS = None
# Determine how many objects to display per page within a list. (Default: 50)
PAGINATE_COUNT = int(os.environ.get('PAGINATE_COUNT', 50))
if 'PAGINATE_COUNT' in environ:
PAGINATE_COUNT = _environ_get_and_map('PAGINATE_COUNT', None, _AS_INT)
# # Enable installed plugins. Add the name of each plugin to the list.
# PLUGINS = []
# # Plugins configuration settings. These settings are used by various plugins that the user may have installed.
# # Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
# PLUGINS_CONFIG = {
# }
# When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to
# prefer IPv4 instead.
PREFER_IPV4 = os.environ.get('PREFER_IPV4', 'False').lower() == 'true'
if 'PREFER_IPV4' in environ:
PREFER_IPV4 = _environ_get_and_map('PREFER_IPV4', None, _AS_BOOL)
# The Webhook event backend is disabled by default. Set this to True to enable it. Note that this requires a Redis
# database be configured and accessible by NetBox (see `REDIS` below).
WEBHOOKS_ENABLED = os.environ.get('WEBHOOKS_ENABLED', 'False').lower() == 'true'
# The default value for the amperage field when creating new power feeds.
if 'POWERFEED_DEFAULT_AMPERAGE' in environ:
POWERFEED_DEFAULT_AMPERAGE = _environ_get_and_map('POWERFEED_DEFAULT_AMPERAGE', None, _AS_INT)
# Redis database settings (optional). A Redis database is required only if the webhooks backend is enabled.
REDIS = {
'HOST': os.environ.get('REDIS_HOST', 'localhost'),
'PORT': os.environ.get('REDIS_PORT', 6379),
'PASSWORD': os.environ.get('REDIS_PASSWORD', read_secret('redis_password')),
'DATABASE': os.environ.get('REDIS_DATABASE', '0'),
'DEFAULT_TIMEOUT': os.environ.get('REDIS_TIMEOUT', '300'),
}
# The default value (percentage) for the max_utilization field when creating new power feeds.
if 'POWERFEED_DEFAULT_MAX_UTILIZATION' in environ:
POWERFEED_DEFAULT_MAX_UTILIZATION = _environ_get_and_map('POWERFEED_DEFAULT_MAX_UTILIZATION', None, _AS_INT)
# The default value for the voltage field when creating new power feeds.
if 'POWERFEED_DEFAULT_VOLTAGE' in environ:
POWERFEED_DEFAULT_VOLTAGE = _environ_get_and_map('POWERFEED_DEFAULT_VOLTAGE', None, _AS_INT)
# Rack elevation size defaults, in pixels. For best results, the ratio of width to height should be roughly 10:1.
if 'RACK_ELEVATION_DEFAULT_UNIT_HEIGHT' in environ:
RACK_ELEVATION_DEFAULT_UNIT_HEIGHT = _environ_get_and_map('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT', None, _AS_INT)
if 'RACK_ELEVATION_DEFAULT_UNIT_WIDTH' in environ:
RACK_ELEVATION_DEFAULT_UNIT_WIDTH = _environ_get_and_map('RACK_ELEVATION_DEFAULT_UNIT_WIDTH', None, _AS_INT)
# Remote authentication support
REMOTE_AUTH_ENABLED = _environ_get_and_map('REMOTE_AUTH_ENABLED', 'False', _AS_BOOL)
REMOTE_AUTH_BACKEND = environ.get('REMOTE_AUTH_BACKEND', 'netbox.authentication.RemoteUserBackend')
REMOTE_AUTH_HEADER = environ.get('REMOTE_AUTH_HEADER', 'HTTP_REMOTE_USER')
REMOTE_AUTH_AUTO_CREATE_USER = _environ_get_and_map('REMOTE_AUTH_AUTO_CREATE_USER', 'True', _AS_BOOL)
REMOTE_AUTH_DEFAULT_GROUPS = _environ_get_and_map('REMOTE_AUTH_DEFAULT_GROUPS', '', _AS_LIST)
# REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
# 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.
RELEASE_CHECK_URL = environ.get('RELEASE_CHECK_URL', None)
# RELEASE_CHECK_URL = 'https://api.github.com/repos/netbox-community/netbox/releases'
# The file path where custom reports will be stored. A trailing slash is not needed. Note that the default value of
# this setting is derived from the installed location.
REPORTS_ROOT = os.environ.get('REPORTS_ROOT', '/etc/netbox/reports')
REPORTS_ROOT = environ.get('REPORTS_ROOT', '/etc/netbox/reports')
# Maximum execution time for background tasks, in seconds.
RQ_DEFAULT_TIMEOUT = _environ_get_and_map('RQ_DEFAULT_TIMEOUT', 300, _AS_INT)
# The file path where custom scripts will be stored. A trailing slash is not needed. Note that the default value of
# this setting is derived from the installed location.
SCRIPTS_ROOT = environ.get('SCRIPTS_ROOT', '/etc/netbox/scripts')
# The name to use for the csrf token cookie.
CSRF_COOKIE_NAME = environ.get('CSRF_COOKIE_NAME', 'csrftoken')
# Cross-Site-Request-Forgery-Attack settings. If Netbox is sitting behind a reverse proxy, you might need to set the CSRF_TRUSTED_ORIGINS flag.
# Django 4.0 requires to specify the URL Scheme in this setting. An example environment variable could be specified like:
# CSRF_TRUSTED_ORIGINS=https://demo.netbox.dev http://demo.netbox.dev
CSRF_TRUSTED_ORIGINS = _environ_get_and_map('CSRF_TRUSTED_ORIGINS', '', _AS_LIST)
# The name to use for the session cookie.
SESSION_COOKIE_NAME = environ.get('SESSION_COOKIE_NAME', 'sessionid')
# By default, NetBox will store session data in the database. Alternatively, a file path can be specified here to use
# local file storage instead. (This can be useful for enabling authentication on a standby instance with read-only
# database access.) Note that the user as which NetBox runs must have read and write permissions to this path.
SESSION_FILE_PATH = environ.get('SESSION_FILE_PATH', environ.get('SESSIONS_ROOT', None))
# Time zone (default: UTC)
TIME_ZONE = os.environ.get('TIME_ZONE', 'UTC')
TIME_ZONE = environ.get('TIME_ZONE', 'UTC')
# Date/time formatting. See the following link for supported formats:
# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = os.environ.get('DATE_FORMAT', 'N j, Y')
SHORT_DATE_FORMAT = os.environ.get('SHORT_DATE_FORMAT', 'Y-m-d')
TIME_FORMAT = os.environ.get('TIME_FORMAT', 'g:i a')
SHORT_TIME_FORMAT = os.environ.get('SHORT_TIME_FORMAT', 'H:i:s')
DATETIME_FORMAT = os.environ.get('DATETIME_FORMAT', 'N j, Y g:i a')
SHORT_DATETIME_FORMAT = os.environ.get('SHORT_DATETIME_FORMAT', 'Y-m-d H:i')
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
DATE_FORMAT = environ.get('DATE_FORMAT', 'N j, Y')
SHORT_DATE_FORMAT = environ.get('SHORT_DATE_FORMAT', 'Y-m-d')
TIME_FORMAT = environ.get('TIME_FORMAT', 'g:i a')
SHORT_TIME_FORMAT = environ.get('SHORT_TIME_FORMAT', 'H:i:s')
DATETIME_FORMAT = environ.get('DATETIME_FORMAT', 'N j, Y g:i a')
SHORT_DATETIME_FORMAT = environ.get('SHORT_DATETIME_FORMAT', 'Y-m-d H:i')

55
configuration/extra.py Normal file
View file

@ -0,0 +1,55 @@
####
## This file contains extra configuration options that can't be configured
## directly through environment variables.
####
## Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
## application errors (assuming correct email settings are provided).
# ADMINS = [
# # ['John Doe', 'jdoe@example.com'],
# ]
## URL schemes that are allowed within links in NetBox
# ALLOWED_URL_SCHEMES = (
# 'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp',
# )
## NAPALM optional arguments (see http://napalm.readthedocs.io/en/latest/support/#optional-arguments). Arguments must
## be provided as a dictionary.
# NAPALM_ARGS = {}
## Enable installed plugins. Add the name of each plugin to the list.
# from netbox.configuration.configuration import PLUGINS
# PLUGINS.append('my_plugin')
## Plugins configuration settings. These settings are used by various plugins that the user may have installed.
## Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
# from netbox.configuration.configuration import PLUGINS_CONFIG
# PLUGINS_CONFIG['my_plugin'] = {
# 'foo': 'bar',
# 'buzz': 'bazz'
# }
## Remote authentication support
# REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
## By default uploaded media is stored on the local filesystem. Using Django-storages is also supported. Provide the
## class path of the storage driver in STORAGE_BACKEND and any configuration options in STORAGE_CONFIG. For example:
# STORAGE_BACKEND = 'storages.backends.s3boto3.S3Boto3Storage'
# STORAGE_CONFIG = {
# 'AWS_ACCESS_KEY_ID': 'Key ID',
# 'AWS_SECRET_ACCESS_KEY': 'Secret',
# 'AWS_STORAGE_BUCKET_NAME': 'netbox',
# 'AWS_S3_REGION_NAME': 'eu-west-1',
# }
## This file can contain arbitrary Python code, e.g.:
# from datetime import datetime
# now = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
# BANNER_TOP = f'<marquee width="200px">This instance started on {now}.</marquee>'

View file

@ -1,8 +0,0 @@
command = '/usr/bin/gunicorn'
pythonpath = '/opt/netbox/netbox'
bind = '0.0.0.0:8001'
workers = 3
errorlog = '-'
accesslog = '-'
capture_output = False
loglevel = 'debug'

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"]

View file

@ -0,0 +1,103 @@
from importlib import import_module
from os import environ
import ldap
from django_auth_ldap.config import LDAPSearch
# Read secret from file
def _read_secret(secret_name, default=None):
try:
f = open('/run/secrets/' + secret_name, 'r', encoding='utf-8')
except EnvironmentError:
return default
else:
with f:
return f.readline().strip()
# Import and return the group type based on string name
def _import_group_type(group_type_name):
mod = import_module('django_auth_ldap.config')
try:
return getattr(mod, group_type_name)()
except:
return None
# Server URI
AUTH_LDAP_SERVER_URI = environ.get('AUTH_LDAP_SERVER_URI', '')
# The following may be needed if you are binding to Active Directory.
AUTH_LDAP_CONNECTION_OPTIONS = {
ldap.OPT_REFERRALS: 0
}
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = environ.get('AUTH_LDAP_BIND_AS_AUTHENTICATING_USER', 'False').lower() == 'true'
# Set the DN and password for the NetBox service account if needed.
if not AUTH_LDAP_BIND_AS_AUTHENTICATING_USER:
AUTH_LDAP_BIND_DN = environ.get('AUTH_LDAP_BIND_DN', '')
AUTH_LDAP_BIND_PASSWORD = _read_secret('auth_ldap_bind_password', environ.get('AUTH_LDAP_BIND_PASSWORD', ''))
# Set a string template that describes any users distinguished name based on the username.
AUTH_LDAP_USER_DN_TEMPLATE = environ.get('AUTH_LDAP_USER_DN_TEMPLATE', None)
# Enable STARTTLS for ldap authentication.
AUTH_LDAP_START_TLS = environ.get('AUTH_LDAP_START_TLS', 'False').lower() == 'true'
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
# Note that this is a NetBox-specific setting which sets:
# ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
LDAP_IGNORE_CERT_ERRORS = environ.get('LDAP_IGNORE_CERT_ERRORS', 'False').lower() == 'true'
# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
# Note that this is a NetBox-specific setting which sets:
# ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
LDAP_CA_CERT_DIR = environ.get('LDAP_CA_CERT_DIR', None)
# Include this setting if you want to validate the LDAP server certificates against your own CA.
# Note that this is a NetBox-specific setting which sets:
# ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, LDAP_CA_CERT_FILE)
LDAP_CA_CERT_FILE = environ.get('LDAP_CA_CERT_FILE', None)
AUTH_LDAP_USER_SEARCH_BASEDN = environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '')
AUTH_LDAP_USER_SEARCH_ATTR = environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName')
AUTH_LDAP_USER_SEARCH = LDAPSearch(
AUTH_LDAP_USER_SEARCH_BASEDN,
ldap.SCOPE_SUBTREE,
"(" + AUTH_LDAP_USER_SEARCH_ATTR + "=%(user)s)"
)
# This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group
# heirarchy.
AUTH_LDAP_GROUP_SEARCH_BASEDN = environ.get('AUTH_LDAP_GROUP_SEARCH_BASEDN', '')
AUTH_LDAP_GROUP_SEARCH_CLASS = environ.get('AUTH_LDAP_GROUP_SEARCH_CLASS', 'group')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(AUTH_LDAP_GROUP_SEARCH_BASEDN, ldap.SCOPE_SUBTREE,
"(objectClass=" + AUTH_LDAP_GROUP_SEARCH_CLASS + ")")
AUTH_LDAP_GROUP_TYPE = _import_group_type(environ.get('AUTH_LDAP_GROUP_TYPE', 'GroupOfNamesType'))
# Define a group required to login.
AUTH_LDAP_REQUIRE_GROUP = environ.get('AUTH_LDAP_REQUIRE_GROUP_DN')
# Define special user types using groups. Exercise great caution when assigning superuser status.
AUTH_LDAP_USER_FLAGS_BY_GROUP = {}
if AUTH_LDAP_REQUIRE_GROUP is not None:
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": environ.get('AUTH_LDAP_REQUIRE_GROUP_DN', ''),
"is_staff": environ.get('AUTH_LDAP_IS_ADMIN_DN', ''),
"is_superuser": environ.get('AUTH_LDAP_IS_SUPERUSER_DN', '')
}
# For more granular permissions, we can map LDAP groups to Django groups.
AUTH_LDAP_FIND_GROUP_PERMS = environ.get('AUTH_LDAP_FIND_GROUP_PERMS', 'True').lower() == 'true'
AUTH_LDAP_MIRROR_GROUPS = environ.get('AUTH_LDAP_MIRROR_GROUPS', '').lower() == 'true'
# Cache groups for one hour to reduce LDAP traffic
AUTH_LDAP_CACHE_TIMEOUT = int(environ.get('AUTH_LDAP_CACHE_TIMEOUT', 3600))
# Populate the Django user from the LDAP directory.
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": environ.get('AUTH_LDAP_ATTR_FIRSTNAME', 'givenName'),
"last_name": environ.get('AUTH_LDAP_ATTR_LASTNAME', 'sn'),
"email": environ.get('AUTH_LDAP_ATTR_MAIL', 'mail')
}

View file

@ -1,62 +0,0 @@
import ldap
import os
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
# Server URI
AUTH_LDAP_SERVER_URI = os.environ.get('AUTH_LDAP_SERVER_URI', '')
# The following may be needed if you are binding to Active Directory.
AUTH_LDAP_CONNECTION_OPTIONS = {
ldap.OPT_REFERRALS: 0
}
# Set the DN and password for the NetBox service account.
AUTH_LDAP_BIND_DN = os.environ.get('AUTH_LDAP_BIND_DN', '')
AUTH_LDAP_BIND_PASSWORD = os.environ.get('AUTH_LDAP_BIND_PASSWORD', '')
# Set a string template that describes any users distinguished name based on the username.
AUTH_LDAP_USER_DN_TEMPLATE = os.environ.get('AUTH_LDAP_USER_DN_TEMPLATE', None)
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
# Note that this is a NetBox-specific setting which sets:
# ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
LDAP_IGNORE_CERT_ERRORS = os.environ.get('LDAP_IGNORE_CERT_ERRORS', 'False').lower() == 'true'
AUTH_LDAP_USER_SEARCH_BASEDN = os.environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '')
AUTH_LDAP_USER_SEARCH_ATTR = os.environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName')
AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER_SEARCH_BASEDN,
ldap.SCOPE_SUBTREE,
"(" + AUTH_LDAP_USER_SEARCH_ATTR + "=%(user)s)")
# This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group
# heirarchy.
AUTH_LDAP_GROUP_SEARCH_BASEDN = os.environ.get('AUTH_LDAP_GROUP_SEARCH_BASEDN', '')
AUTH_LDAP_GROUP_SEARCH_CLASS = os.environ.get('AUTH_LDAP_GROUP_SEARCH_CLASS', 'group')
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(AUTH_LDAP_GROUP_SEARCH_BASEDN, ldap.SCOPE_SUBTREE,
"(objectClass=" + AUTH_LDAP_GROUP_SEARCH_CLASS + ")")
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
# Define a group required to login.
AUTH_LDAP_REQUIRE_GROUP = os.environ.get('AUTH_LDAP_REQUIRE_GROUP_DN', '')
# Define special user types using groups. Exercise great caution when assigning superuser status.
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": os.environ.get('AUTH_LDAP_REQUIRE_GROUP_DN', ''),
"is_staff": os.environ.get('AUTH_LDAP_IS_ADMIN_DN', ''),
"is_superuser": os.environ.get('AUTH_LDAP_IS_SUPERUSER_DN', '')
}
# For more granular permissions, we can map LDAP groups to Django groups.
AUTH_LDAP_FIND_GROUP_PERMS = os.environ.get('AUTH_LDAP_FIND_GROUP_PERMS', 'True').lower() == 'true'
# Cache groups for one hour to reduce LDAP traffic
AUTH_LDAP_CACHE_GROUPS = os.environ.get('AUTH_LDAP_CACHE_GROUPS', 'True').lower() == 'true'
AUTH_LDAP_GROUP_CACHE_TIMEOUT = int(os.environ.get('AUTH_LDAP_GROUP_CACHE_TIMEOUT', 3600))
# Populate the Django user from the LDAP directory.
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": os.environ.get('AUTH_LDAP_ATTR_FIRSTNAME', 'givenName'),
"last_name": os.environ.get('AUTH_LDAP_ATTR_LASTNAME', 'sn'),
"email": os.environ.get('AUTH_LDAP_ATTR_MAIL', 'mail')
}

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:
- 127.0.0.1:44156:8080

View file

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

44
docker-compose.test.yml Normal file
View file

@ -0,0 +1,44 @@
version: '3.4'
services:
netbox:
image: ${IMAGE-netboxcommunity/netbox:latest}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
redis-cache:
condition: service_started
env_file: env/netbox.env
user: 'unit:root'
volumes:
- ./configuration:/etc/netbox/config:z,ro
- ./test-configuration/logging.py:/etc/netbox/config/logging.py:z,ro
- ./reports:/etc/netbox/reports:z,ro
- ./scripts:/etc/netbox/scripts:z,ro
- netbox-media-files:/opt/netbox/netbox/media:z
postgres:
image: postgres:15-alpine
env_file: env/postgres.env
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
- redis-server --appendonly yes --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
env_file: env/redis.env
redis-cache:
image: redis:7-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
- redis-server --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
env_file: env/redis-cache.env
volumes:
netbox-media-files:
driver: local

View file

@ -1,50 +1,60 @@
version: '3'
version: '3.4'
services:
netbox: &netbox
build:
context: .
args:
- BRANCH=${VERSION-master}
image: netboxcommunity/netbox:${VERSION-latest}
image: netboxcommunity/netbox:${VERSION-v3.4-2.4.0}
depends_on:
- postgres
- redis
- netbox-worker
- redis-cache
env_file: env/netbox.env
user: 'unit:root'
healthcheck:
start_period: 60s
timeout: 3s
interval: 15s
test: "curl -f http://localhost:8080/api/ || exit 1"
volumes:
- ./startup_scripts:/opt/netbox/startup_scripts:z,ro
- ./initializers:/opt/netbox/initializers:z,ro
- ./configuration:/etc/netbox/config:z,ro
- ./reports:/etc/netbox/reports:z,ro
- netbox-nginx-config:/etc/netbox-nginx:z
- netbox-static-files:/opt/netbox/netbox/static:z
- ./scripts:/etc/netbox/scripts:z,ro
- netbox-media-files:/opt/netbox/netbox/media:z
netbox-worker:
<<: *netbox
depends_on:
- redis
entrypoint:
- python3
- /opt/netbox/netbox/manage.py
netbox:
condition: service_healthy
command:
- /opt/netbox/venv/bin/python
- /opt/netbox/netbox/manage.py
- rqworker
nginx:
command: nginx -c /etc/netbox-nginx/nginx.conf
image: nginx:1.15-alpine
healthcheck:
start_period: 20s
timeout: 3s
interval: 15s
test: "ps -aux | grep -v grep | grep -q rqworker || exit 1"
netbox-housekeeping:
<<: *netbox
depends_on:
- netbox
ports:
- 8080
volumes:
- netbox-static-files:/opt/netbox/netbox/static:ro
- netbox-nginx-config:/etc/netbox-nginx/:ro
netbox:
condition: service_healthy
command:
- /opt/netbox/housekeeping.sh
healthcheck:
start_period: 20s
timeout: 3s
interval: 15s
test: "ps -aux | grep -v grep | grep -q housekeeping || exit 1"
# postgres
postgres:
image: postgres:10.4-alpine
image: postgres:15-alpine
env_file: env/postgres.env
volumes:
- netbox-postgres-data:/var/lib/postgresql/data
# redis
redis:
image: redis:4-alpine
image: redis:7-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
@ -52,16 +62,22 @@ services:
env_file: env/redis.env
volumes:
- netbox-redis-data:/data
redis-cache:
image: redis:7-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
- redis-server --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
env_file: env/redis-cache.env
volumes:
- netbox-redis-cache-data:/data
volumes:
netbox-static-files:
driver: local
netbox-nginx-config:
driver: local
netbox-media-files:
driver: local
netbox-report-files:
driver: local
netbox-postgres-data:
driver: local
netbox-redis-data:
driver: local
netbox-redis-cache-data:
driver: local

View file

@ -1,10 +1,91 @@
## Generic Parts
# These functions are providing the functionality to load
# arbitrary configuration files.
#
# They can be imported by other code (see `ldap_config.py` for an example).
import importlib.util
import sys
from os import scandir
from os.path import abspath, isfile
try:
spec = importlib.util.spec_from_file_location('configuration', '/etc/netbox/config/configuration.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules['netbox.configuration'] = module
except:
raise ImportError('')
def _filename(f):
return f.name
def _import(module_name, path, loaded_configurations):
spec = importlib.util.spec_from_file_location("", path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[module_name] = module
loaded_configurations.insert(0, module)
print(f"🧬 loaded config '{path}'")
def read_configurations(config_module, config_dir, main_config):
loaded_configurations = []
main_config_path = abspath(f"{config_dir}/{main_config}.py")
if isfile(main_config_path):
_import(f"{config_module}.{main_config}", main_config_path, loaded_configurations)
else:
print(f"⚠️ Main configuration '{main_config_path}' not found.")
with scandir(config_dir) as it:
for f in sorted(it, key=_filename):
if not f.is_file():
continue
if f.name.startswith("__"):
continue
if not f.name.endswith(".py"):
continue
if f.name == f"{main_config}.py":
continue
if f.name == f"{config_dir}.py":
continue
module_name = f"{config_module}.{f.name[:-len('.py')]}".replace(".", "_")
_import(module_name, f.path, loaded_configurations)
if len(loaded_configurations) == 0:
print(f"‼️ No configuration files found in '{config_dir}'.")
raise ImportError(f"No configuration files found in '{config_dir}'.")
return loaded_configurations
## Specific Parts
# This section's code actually loads the various configuration files
# into the module with the given name.
# It contains the logic to resolve arbitrary configuration options by
# levaraging dynamic programming using `__getattr__`.
_loaded_configurations = read_configurations(
config_dir="/etc/netbox/config/",
config_module="netbox.configuration",
main_config="configuration",
)
def __getattr__(name):
for config in _loaded_configurations:
try:
return getattr(config, name)
except:
pass
raise AttributeError
def __dir__():
names = []
for config in _loaded_configurations:
names.extend(config.__dir__())
return names

View file

@ -1,37 +1,75 @@
#!/bin/bash
# Runs on every start of the NetBox Docker container
# Stop when an error occures
set -e
# wait shortly and then run db migrations (retry on error)
while ! ./manage.py migrate 2>&1; do
echo "⏳ Waiting on DB..."
sleep 3
done
# Allows NetBox to be run as non-root users
umask 002
# create superuser silently
if [ -z ${SUPERUSER_NAME+x} ]; then
SUPERUSER_NAME='admin'
fi
if [ -z ${SUPERUSER_EMAIL+x} ]; then
SUPERUSER_EMAIL='admin@example.com'
fi
if [ -z ${SUPERUSER_PASSWORD+x} ]; then
if [ -f "/run/secrets/superuser_password" ]; then
SUPERUSER_PASSWORD="$(< /run/secrets/superuser_password)"
# Load correct Python3 env
# shellcheck disable=SC1091
source /opt/netbox/venv/bin/activate
# Try to connect to the DB
DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3}
MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30}
CUR_DB_WAIT_TIME=0
while [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do
# Read and truncate connection error tracebacks to last line by default
exec {psfd}< <(./manage.py showmigrations 2>&1)
read -rd '' DB_ERR <&$psfd || :
exec {psfd}<&-
wait $! && break
if [ -n "$DB_WAIT_DEBUG" ]; then
echo "$DB_ERR"
else
readarray -tn 0 DB_ERR_LINES <<<"$DB_ERR"
echo "${DB_ERR_LINES[@]: -1}"
echo "[ Use DB_WAIT_DEBUG=1 in netbox.env to print full traceback for errors here ]"
fi
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))
done
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
echo "↩️ Skip creating the superuser"
else
if [ -z ${SUPERUSER_NAME+x} ]; then
SUPERUSER_NAME='admin'
fi
if [ -z ${SUPERUSER_EMAIL+x} ]; then
SUPERUSER_EMAIL='admin@example.com'
fi
if [ -f "/run/secrets/superuser_password" ]; then
SUPERUSER_PASSWORD="$(</run/secrets/superuser_password)"
elif [ -z ${SUPERUSER_PASSWORD+x} ]; then
SUPERUSER_PASSWORD='admin'
fi
fi
if [ -z ${SUPERUSER_API_TOKEN+x} ]; then
if [ -f "/run/secrets/superuser_api_token" ]; then
SUPERUSER_API_TOKEN="$(< /run/secrets/superuser_api_token)"
else
SUPERUSER_API_TOKEN="$(</run/secrets/superuser_api_token)"
elif [ -z ${SUPERUSER_API_TOKEN+x} ]; then
SUPERUSER_API_TOKEN='0123456789abcdef0123456789abcdef01234567'
fi
fi
echo "💡 Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}"
./manage.py shell --interface python << END
./manage.py shell --interface python <<END
from django.contrib.auth.models import User
from users.models import Token
if not User.objects.filter(username='${SUPERUSER_NAME}'):
@ -39,20 +77,11 @@ if not User.objects.filter(username='${SUPERUSER_NAME}'):
Token.objects.create(user=u, key='${SUPERUSER_API_TOKEN}')
END
if [ "$SKIP_STARTUP_SCRIPTS" == "true" ]; then
echo "☇ Skipping startup scripts"
else
for script in /opt/netbox/startup_scripts/*.py; do
echo "⚙️ Executing '$script'"
./manage.py shell --interface python < "${script}"
done
echo "💡 Superuser Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}"
fi
# copy static files
./manage.py collectstatic --no-input
echo "✅ Initialisation is done."
# launch whatever is passed by docker
# Launch whatever is passed by docker
# (i.e. the RUN instruction in the Dockerfile)
exec ${@}
exec "$@"

8
docker/housekeeping.sh Executable file
View file

@ -0,0 +1,8 @@
#!/bin/bash
SLEEP_SECONDS=${HOUSEKEEPING_INTERVAL:=86400}
echo "Interval set to ${SLEEP_SECONDS} seconds"
while true; do
date
/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py housekeeping
sleep "${SLEEP_SECONDS}s"
done

56
docker/launch-netbox.sh Executable file
View file

@ -0,0 +1,56 @@
#!/bin/bash
UNIT_CONFIG="${UNIT_CONFIG-/etc/unit/nginx-unit.json}"
UNIT_SOCKET="/opt/unit/unit.sock"
load_configuration() {
MAX_WAIT=10
WAIT_COUNT=0
while [ ! -S $UNIT_SOCKET ]; do
if [ $WAIT_COUNT -ge $MAX_WAIT ]; then
echo "⚠️ No control socket found; configuration will not be loaded."
return 1
fi
WAIT_COUNT=$((WAIT_COUNT + 1))
echo "⏳ Waiting for control socket to be created... (${WAIT_COUNT}/${MAX_WAIT})"
sleep 1
done
# even when the control socket exists, it does not mean unit has finished initialisation
# this curl call will get a reply once unit is fully launched
curl --silent --output /dev/null --request GET --unix-socket $UNIT_SOCKET http://localhost/
echo "⚙️ Applying configuration from $UNIT_CONFIG"
RESP_CODE=$(
curl \
--silent \
--output /dev/null \
--write-out '%{http_code}' \
--request PUT \
--data-binary "@${UNIT_CONFIG}" \
--unix-socket $UNIT_SOCKET \
http://localhost/config
)
if [ "$RESP_CODE" != "200" ]; then
echo "⚠️ Could no load Unit configuration"
kill "$(cat /opt/unit/unit.pid)"
return 1
fi
echo "✅ Unit configuration loaded successfully"
}
load_configuration &
exec unitd \
--no-daemon \
--control unix:$UNIT_SOCKET \
--pid /opt/unit/unit.pid \
--log /dev/stdout \
--state /opt/unit/state/ \
--tmp /opt/unit/tmp/ \
--user unit \
--group root

View file

@ -1,10 +1,23 @@
import importlib.util
import sys
from .configuration import read_configurations
try:
spec = importlib.util.spec_from_file_location('ldap_config', '/etc/netbox/config/ldap_config.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules['netbox.ldap_config'] = module
except:
raise ImportError('')
_loaded_configurations = read_configurations(
config_dir="/etc/netbox/config/ldap/",
config_module="netbox.configuration.ldap",
main_config="ldap_config",
)
def __getattr__(name):
for config in _loaded_configurations:
try:
return getattr(config, name)
except:
pass
raise AttributeError
def __dir__():
names = []
for config in _loaded_configurations:
names.extend(config.__dir__())
return names

43
docker/nginx-unit.json Normal file
View file

@ -0,0 +1,43 @@
{
"listeners": {
"0.0.0.0:8080": {
"pass": "routes"
},
"[::]:8080": {
"pass": "routes"
}
},
"routes": [
{
"match": {
"uri": "/static/*"
},
"action": {
"share": "/opt/netbox/netbox${uri}"
}
},
{
"action": {
"pass": "applications/netbox"
}
}
],
"applications": {
"netbox": {
"type": "python 3",
"path": "/opt/netbox/netbox/",
"module": "netbox.wsgi",
"home": "/opt/netbox/venv",
"processes": {
"max": 4,
"spare": 1,
"idle_timeout": 120
}
}
},
"access_log": "/dev/stdout"
}

View file

@ -1,36 +0,0 @@
daemon off;
worker_processes 1;
error_log /dev/stderr info;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
server_tokens off;
client_max_body_size 10M;
server {
listen 8080;
access_log off;
location /static/ {
alias /opt/netbox/netbox/static/;
}
location / {
proxy_pass http://netbox:8001;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
}

45
env/netbox.env vendored
View file

@ -1,23 +1,38 @@
DB_NAME=netbox
DB_USER=netbox
DB_PASSWORD=J5brHrAXFLQSif0K
CORS_ORIGIN_ALLOW_ALL=True
DB_HOST=postgres
EMAIL_SERVER=localhost
EMAIL_PORT=25
EMAIL_USERNAME=netbox
EMAIL_PASSWORD=
EMAIL_TIMEOUT=5
DB_NAME=netbox
DB_PASSWORD=J5brHrAXFLQSif0K
DB_USER=netbox
EMAIL_FROM=netbox@bar.com
EMAIL_PASSWORD=
EMAIL_PORT=25
EMAIL_SERVER=localhost
EMAIL_SSL_CERTFILE=
EMAIL_SSL_KEYFILE=
EMAIL_TIMEOUT=5
EMAIL_USERNAME=netbox
# EMAIL_USE_SSL and EMAIL_USE_TLS are mutually exclusive, i.e. they can't both be `true`!
EMAIL_USE_SSL=false
EMAIL_USE_TLS=false
GRAPHQL_ENABLED=true
HOUSEKEEPING_INTERVAL=86400
MEDIA_ROOT=/opt/netbox/netbox/media
NAPALM_USERNAME=
NAPALM_PASSWORD=
NAPALM_TIMEOUT=10
MAX_PAGE_SIZE=1000
METRICS_ENABLED=false
REDIS_CACHE_DATABASE=1
REDIS_CACHE_HOST=redis-cache
REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY=false
REDIS_CACHE_PASSWORD=t4Ph722qJ5QHeQ1qfu36
REDIS_CACHE_SSL=false
REDIS_DATABASE=0
REDIS_HOST=redis
REDIS_INSECURE_SKIP_TLS_VERIFY=false
REDIS_PASSWORD=H733Kdjndks81
REDIS_SSL=false
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
SECRET_KEY=r8OwDznj!!dci#P9ghmRfdu1Ysxm0AiPeDCQhKE+N_rClfWNj
SUPERUSER_NAME=admin
SUPERUSER_EMAIL=admin@example.com
SUPERUSER_PASSWORD=admin
SKIP_SUPERUSER=false
SUPERUSER_API_TOKEN=0123456789abcdef0123456789abcdef01234567
SUPERUSER_EMAIL=admin@example.com
SUPERUSER_NAME=admin
SUPERUSER_PASSWORD=admin
WEBHOOKS_ENABLED=true

4
env/postgres.env vendored
View file

@ -1,3 +1,3 @@
POSTGRES_USER=netbox
POSTGRES_PASSWORD=J5brHrAXFLQSif0K
POSTGRES_DB=netbox
POSTGRES_PASSWORD=J5brHrAXFLQSif0K
POSTGRES_USER=netbox

1
env/redis-cache.env vendored Normal file
View file

@ -0,0 +1 @@
REDIS_PASSWORD=t4Ph722qJ5QHeQ1qfu36

View file

@ -1,5 +0,0 @@
#!/bin/bash
. hooks/common
run_build

View file

@ -1,82 +0,0 @@
#!/bin/bash
ensure_jq() {
echo "🛠🛠🛠 Installing JQ via apt-get"
[ -x "$(command -v jq)" ] || ( apt-get update && apt-get install -y jq )
}
ensure_dockerfile_present() {
if [ "${VARIANT}" == "main" ]; then
DOCKERFILE="Dockerfile"
else
DOCKERFILE="Dockerfile.${VARIANT}"
# Fail fast
if [ ! -f "${DOCKERFILE}" ]; then
echo "🚨 The Dockerfile '${DOCKERFILE}' for variant '${VARIANT}' doesn't exist."
if [ -z "$DEBUG" ]; then
exit 1
else
echo "⚠️ Would skip this, but DEBUG is enabled."
fi
fi
if [ "${DOCKERFILE}" != "${DOCKERFILE_PATH}" ]; then
echo "⚠️ The specified Dockerfile '${DOCKERFILE_PATH}' does not match the expected Dockerfile '${DOCKERFILE}'."
echo " This script will use '${DOCKERFILE}' and ignore '${DOCKERFILE_PATH}'."
fi
fi
}
# Passes args to the scripts
run_build() {
echo "🐳🐳🐳 Building '${BUILD}' images, the '${VARIANT:-main}' variant"
case $BUILD in
release)
# build the latest release
# shellcheck disable=SC2068
./build-latest.sh $@
;;
prerelease)
# build the latest pre-release
# shellcheck disable=SC2068
PRERELEASE=true ./build-latest.sh $@
;;
branches)
# build all branches
# shellcheck disable=SC2068
./build-branches.sh $@
;;
special)
# special build
# shellcheck disable=SC2068
#SRC_ORG=lampwins TAG=webhooks-backend ./build.sh "feature/webhooks-backend" $@
echo "✅ No special builds today."
;;
*)
echo "🚨 Unrecognized build '$BUILD'."
if [ -z "$DEBUG" ]; then
exit 1
else
echo "⚠️ Would exit here with code '1', but DEBUG is enabled."
fi
;;
esac
}
echo "🤖🤖🤖 Preparing build"
export DOCKER_ORG="index.docker.io/netboxcommunity"
export DOCKER_REPO=netbox
export DOCKERHUB_REPO=netboxcommunity/netbox
# mis-using the "${DOCKER_TAG}" variable as "branch to build"
export BUILD="${DOCKER_TAG%-*}"
export VARIANT="${DOCKER_TAG#*-}"
unset DOCKER_TAG
ensure_dockerfile_present
ensure_jq

View file

@ -1,5 +0,0 @@
#!/bin/bash
. hooks/common
run_build --push-only

View file

@ -1,12 +0,0 @@
#!/bin/bash
. hooks/common
if [ "${VARIANT}" == "main" ] && [ "${BUILD}" == "BRANCHES" ]; then
echo "🐳🐳🐳 Testing"
docker-compose pull --parallel
docker-compose build
docker-compose run netbox ./manage.py test
else
echo "🐳🐳🐳 No tests are implemented for build '${BUILD}' with variant '${VARIANT}'."
fi

View file

@ -1,82 +0,0 @@
# text_field:
# type: text
# label: Custom Text
# description: Enter text in a text field.
# required: false
# weight: 0
# on_objects:
# - dcim.models.Device
# - dcim.models.Rack
# - dcim.models.Site
# - dcim.models.DeviceType
# - ipam.models.IPAddress
# - ipam.models.Prefix
# - tenancy.models.Tenant
# - virtualization.models.VirtualMachine
# integer_field:
# type: integer
# label: Custom Number
# description: Enter numbers into an integer field.
# required: true
# filter_logic: loose
# weight: 10
# on_objects:
# - tenancy.models.Tenant
# selection_field:
# type: selection
# label: Choose between items
# required: false
# filter_logic: exact
# weight: 30
# on_objects:
# - dcim.models.Device
# choices:
# - value: First Item
# weight: 10
# - value: Second Item
# weight: 20
# - value: Third Item
# weight: 30
# - value: Fifth Item
# weight: 50
# - value: Fourth Item
# weight: 40
# selection_field_auto_weight:
# type: selection
# label: Choose between items
# required: false
# filter_logic: loose
# weight: 30
# on_objects:
# - dcim.models.Device
# choices:
# - value: A
# - value: B
# - value: C
# - value: "D like deprecated"
# weight: 999
# - value: E
# boolean_field:
# type: boolean
# label: Yes Or No?
# required: true
# filter_logic: loose
# default: "false" # important: but "false" in quotes!
# weight: 90
# on_objects:
# - dcim.models.Device
# url_field:
# type: url
# label: Hyperlink
# description: Link to something nice.
# required: true
# filter_logic: disabled
# on_objects:
# - tenancy.models.Tenant
# date_field:
# type: date
# label: Important Date
# required: false
# filter_logic: disabled
# on_objects:
# - dcim.models.Device

View file

@ -1,15 +0,0 @@
# - name: switch
# slug: switch
# color: Grey
# - name: router
# slug: router
# color: Cyan
# - name: load-balancer
# slug: load-balancer
# color: Red
# - name: server
# slug: server
# color: Blue
# - name: patchpanel
# slug: patchpanel
# color: Black

View file

@ -1,23 +0,0 @@
# - model: Model 1
# manufacturer: Manufacturer 1
# slug: model-1
# u_height: 2
# custom_fields:
# text_field: Description
# - model: Model 2
# manufacturer: Manufacturer 1
# slug: model-2
# custom_fields:
# text_field: Description
# - model: Model 3
# manufacturer: Manufacturer 1
# slug: model-3
# is_full_depth: false
# u_height: 0
# custom_fields:
# text_field: Description
# - model: Other
# manufacturer: NoName
# slug: other
# custom_fields:
# text_field: Description

View file

@ -1,27 +0,0 @@
# - name: server01
# device_role: server
# device_type: Other
# site: AMS 1
# rack: rack-01
# face: Front
# position: 1
# custom_fields:
# text_field: Description
# - name: server02
# device_role: server
# device_type: Other
# site: AMS 2
# rack: rack-02
# face: Front
# position: 2
# custom_fields:
# text_field: Description
# - name: server03
# device_role: server
# device_type: Other
# site: SING 1
# rack: rack-03
# face: Front
# position: 3
# custom_fields:
# text_field: Description

View file

@ -1,16 +0,0 @@
# applications:
# users:
# - technical_user
# readers:
# users:
# - reader
# writers:
# users:
# - writer
# permissions:
# - add_device
# - change_device
# - delete_device
# - add_virtualmachine
# - change_virtualmachine
# - delete_virtualmachine

View file

@ -1,6 +0,0 @@
# - name: Manufacturer 1
# slug: manufacturer-1
# - name: Manufacturer 2
# slug: manufacturer-2
# - name: NoName
# slug: noname

View file

@ -1,19 +0,0 @@
# # Allowed rpc clients are: juniper-junos, cisco-ios, opengear
# - name: Platform 1
# slug: platform-1
# manufacturer: Manufacturer 1
# napalm_driver: driver1
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"
# rpc_client: juniper-junos
# - name: Platform 2
# slug: platform-2
# manufacturer: Manufacturer 2
# napalm_driver: driver2
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"
# rpc_client: opengear
# - name: Platform 3
# slug: platform-3
# manufacturer: NoName
# napalm_driver: driver3
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"
# rpc_client: juniper-junos

View file

@ -1,12 +0,0 @@
# - name: Role 1
# slug: role-1
# color: Pink
# - name: Role 2
# slug: role-2
# color: Cyan
# - name: Role 3
# slug: role-3
# color: Grey
# - name: Role 4
# slug: role-4
# color: Teal

View file

@ -1,24 +0,0 @@
# - site: AMS 1
# name: rack-01
# role: Role 1
# type: 4-post cabinet
# width: 19 inches
# u_height: 47
# custom_fields:
# text_field: Description
# - site: AMS 2
# name: rack-02
# role: Role 2
# type: 4-post cabinet
# width: 19 inches
# u_height: 47
# custom_fields:
# text_field: Description
# - site: SING 1
# name: rack-03
# role: Role 3
# type: 4-post cabinet
# width: 19 inches
# u_height: 47
# custom_fields:
# text_field: Description

View file

@ -1,10 +0,0 @@
# - name: Singapore
# slug: singapore
# - name: Amsterdam
# slug: amsterdam
# - name: Downtown
# slug: downtown
# parent: Amsterdam
# - name: Suburbs
# slug: suburbs
# parent: Amsterdam

View file

@ -1,32 +0,0 @@
# - name: AMS 1
# slug: ams1
# region: Downtown
# status: 1
# facility: Amsterdam 1
# asn: 12345
# custom_fields:
# text_field: Description
# - name: AMS 2
# slug: ams2
# region: Downtown
# status: 1
# facility: Amsterdam 2
# asn: 54321
# custom_fields:
# text_field: Description
# - name: AMS 3
# slug: ams3
# region: Suburbs
# status: 1
# facility: Amsterdam 3
# asn: 67890
# custom_fields:
# text_field: Description
# - name: SING 1
# slug: sing1
# region: Singapore
# status: 1
# facility: Singapore 1
# asn: 09876
# custom_fields:
# text_field: Description

View file

@ -1,13 +0,0 @@
# technical_user:
# api_token: 0123456789technicaluser789abcdef01234567 # must be looooong!
# reader:
# password: reader
# writer:
# password: writer
# permissions:
# - add_device
# - change_device
# - delete_device
# - add_virtualmachine
# - change_virtualmachine
# - delete_virtualmachine

26
pyproject.toml Normal file
View file

@ -0,0 +1,26 @@
[tool.black]
line_length = 100
target-version = ['py38']
include = '\.pyi?$'
exclude = '''
(
/(
\.git
| \.venv
| \.netbox
| \.vscode
| configuration
)/
)
'''
[tool.isort]
profile = "black"
multi_line_output = 3
line_length = 100
[tool.pylint.messages_control]
disable = "C0330, C0326"
[tool.pylint.format]
max-line-length = "100"

188
release.sh Executable file
View file

@ -0,0 +1,188 @@
#!/bin/bash
DEFAULT_REPO=netbox-community/netbox-docker
REPO="${REPO-${DEFAULT_REPO}}"
echomoji() {
EMOJI=${1}
TEXT=${2}
shift 2
if [ -z "$DISABLE_EMOJI" ]; then
echo "${EMOJI}" "${@}"
else
echo "${TEXT}" "${@}"
fi
}
echo_nok() {
echomoji "❌" "!" "${@}"
}
echo_ok() {
echomoji "✅" "-" "${@}"
}
echo_hint() {
echomoji "👉" ">" "${@}"
}
# check errors shall exit with code 1
check_clean_repo() {
changes=$(git status --porcelain 2>/dev/null)
if [ ${?} ] && [ -n "$changes" ]; then
echo_nok "There are git changes pending:"
echo "$changes"
echo_hint "Please clean the repository before continueing: git stash --include-untracked"
exit 1
fi
echo_ok "Repository has no pending changes."
}
check_branch() {
expected_branch="${1}"
actual_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [ ${?} ] && [ "${actual_branch}" != "${expected_branch}" ]; then
echo_nok "Current branch should be '${expected_branch}', but is '${actual_branch}'."
echo_hint "Please change to the '${expected_branch}' branch: git checkout ${expected_branch}"
exit 1
fi
echo_ok "The current branch is '${actual_branch}'."
}
check_upstream() {
expected_upstream_branch="origin/${1}"
actual_upstream_branch=$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)
if [ ${?} ] && [ "${actual_upstream_branch}" != "${expected_upstream_branch}" ]; then
echo_nok "Current upstream branch should be '${expected_upstream_branch}', but is '${actual_upstream_branch}'."
echo_hint "Please set '${expected_upstream_branch}' as the upstream branch: git branch --set-upstream-to=${expected_upstream_branch}"
exit 1
fi
echo_ok "The current upstream branch is '${actual_upstream_branch}'."
}
check_origin() {
expected_origin="git@github.com:${REPO}.git"
actual_origin=$(git remote get-url origin 2>/dev/null)
if [ ${?} ] && [ "${actual_origin}" != "${expected_origin}" ]; then
echo_nok "The url of origin is '${actual_origin}', but '${expected_origin}' is expected."
echo_hint "Please set '${expected_origin}' as the url for origin: git origin set-url '${expected_origin}'"
exit 1
fi
echo_ok "The current origin url is '${actual_origin}'."
}
check_latest() {
git fetch --tags origin
local_head_commit=$(git rev-parse HEAD 2>/dev/null)
remote_head_commit=$(git rev-parse FETCH_HEAD 2>/dev/null)
if [ "${local_head_commit}" != "${remote_head_commit}" ]; then
echo_nok "HEAD is at '${local_head_commit}', but FETCH_HEAD is at '${remote_head_commit}'."
echo_hint "Please ensure that you have pushed and pulled all the latest chanegs: git pull --prune --rebase origin; git push origin"
exit 1
fi
echo_ok "HEAD and FETCH_HEAD both point to '${local_head_commit}'."
}
check_tag() {
local tag
tag=$(<VERSION)
if git rev-parse "${tag}" 2>/dev/null >/dev/null; then
echo_nok "The tag '${tag}' already points to '$(git rev-parse "${tag}" 2>/dev/null)'."
echo_hint "Please ensure that the 'VERSION' file has been updated before trying to release: echo X.Y.Z > VERSION"
exit 1
fi
echo_ok "The tag '${tag}' does not exist yet."
}
check_develop() {
echomoji 📋 "?" "Checking 'develop' branch"
check_branch develop
check_upstream develop
check_clean_repo
check_latest
}
check_release() {
echomoji 📋 "?" "Checking 'release' branch"
check_upstream release
check_clean_repo
check_latest
}
# git errors shall exit with code 2
git_switch() {
echomoji 🔀 "≈" "Switching to '${1}' branch…"
if ! git checkout "${1}" >/dev/null; then
echo_nok "It was not possible to switch to the branch '${1}'."
exit 2
fi
echo_ok "The branch is now '${1}'."
}
git_tag() {
echomoji 🏷 "X" "Tagging version '${1}'…"
if ! git tag "${1}"; then
echo_nok "The tag '${1}' was not created because of an error."
exit 2
fi
echo_ok "The tag '$(<VERSION)' was created."
}
git_push() {
echomoji ⏩ "»" "Pushing the tag '${2}' to '${1}'…"
if ! git push "${1}" "${2}"; then
echo_nok "The tag '${2}' could not be pushed to '${1}'."
exit 2
fi
echo_ok "The tag '${2}' was pushed."
}
git_merge() {
echomoji ⏩ "»" "Merging '${1}'…"
if ! git merge --no-ff "${1}"; then
echo_nok "The branch '${1}' could not be merged."
exit 2
fi
echo_ok "The branch '${2}' was merged."
}
git_merge() {
echomoji ⏩ "»" "Rebasing onto '${1}'…"
if ! git rebase "${1}"; then
echo_nok "Could not rebase onto '${1}'."
exit 2
fi
echo_ok "Rebased onto '${2}'."
}
###
# MAIN
###
echomoji 📋 "▶︎" "Checking pre-requisites for releasing '$(<VERSION)'"
check_origin
check_develop
check_tag
git_switch release
check_release
echomoji 📋 "▶︎" "Releasing '$(<VERSION)'"
git_merge develop
check_tag
git_tag "$(<VERSION)"
git_push "origin" release
git_push "origin" "$(<VERSION)"
git_switch develop
git_rebase release
echomoji ✅ "◼︎" "The release of '$(<VERSION)' is complete."

14
renovate.json Normal file
View file

@ -0,0 +1,14 @@
{
"extends": [
"config:base",
":disableDependencyDashboard"
],
"enabled": true,
"labels": ["maintenance"],
"baseBranches": ["develop"],
"pip_requirements": {
"fileMatch": [
"requirements-container.txt"
]
}
}

View file

@ -1,4 +1,4 @@
from dcim.constants import CONNECTION_STATUS_PLANNED, DEVICE_STATUS_ACTIVE
from dcim.choices import DeviceStatusChoices
from dcim.models import ConsolePort, Device, PowerPort
from extras.reports import Report
@ -9,13 +9,14 @@ class DeviceConnectionsReport(Report):
def test_console_connection(self):
# Check that every console port for every active device has a connection defined.
for console_port in ConsolePort.objects.select_related('device').filter(device__status=DEVICE_STATUS_ACTIVE):
active = DeviceStatusChoices.STATUS_ACTIVE
for console_port in ConsolePort.objects.prefetch_related('device').filter(device__status=active):
if console_port.connected_endpoint is None:
self.log_failure(
console_port.device,
"No console connection defined for {}".format(console_port.name)
)
elif console_port.connection_status == CONNECTION_STATUS_PLANNED:
elif not console_port.connection_status:
self.log_warning(
console_port.device,
"Console connection for {} marked as planned".format(console_port.name)
@ -26,12 +27,12 @@ class DeviceConnectionsReport(Report):
def test_power_connections(self):
# Check that every active device has at least two connected power supplies.
for device in Device.objects.filter(status=DEVICE_STATUS_ACTIVE):
for device in Device.objects.filter(status=DeviceStatusChoices.STATUS_ACTIVE):
connected_ports = 0
for power_port in PowerPort.objects.filter(device=device):
if power_port.connected_endpoint is not None:
connected_ports += 1
if power_port.connection_status == CONNECTION_STATUS_PLANNED:
if not power_port.connection_status:
self.log_warning(
device,
"Power connection for {} marked as planned".format(power_port.name)
@ -43,4 +44,3 @@ class DeviceConnectionsReport(Report):
)
else:
self.log_success(device)

View file

@ -0,0 +1,6 @@
django-auth-ldap==4.1.0
django-storages[azure,boto3,dropbox,google,libcloud,sftp]==1.13.1
napalm==4.0.0
psycopg2==2.9.5
python3-saml==1.14.0
social-auth-core[all]==4.3.0

0
scripts/__init__.py Normal file
View file

View file

@ -1,34 +0,0 @@
from django.contrib.auth.models import Permission, Group, User
from users.models import Token
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/users.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml=YAML(typ='safe')
users = yaml.load(stream)
if users is not None:
for username, user_details in users.items():
if not User.objects.filter(username=username):
user = User.objects.create_user(
username = username,
password = user_details.get('password', 0) or User.objects.make_random_password)
print("👤 Created user ",username)
if user_details.get('api_token', 0):
Token.objects.create(user=user, key=user_details['api_token'])
user_permissions = user_details.get('permissions', [])
if user_permissions:
user.user_permissions.clear()
for permission_codename in user_details.get('permissions', []):
permission = Permission.objects.get(codename=permission_codename)
user.user_permissions.add(permission)
user.save()

View file

@ -1,33 +0,0 @@
from django.contrib.auth.models import Permission, Group, User
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/groups.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml=YAML(typ='safe')
groups = yaml.load(stream)
if groups is not None:
for groupname, group_details in groups.items():
group, created = Group.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)
if user:
user.groups.add(group)
group_permissions = group_details.get('permissions', [])
if group_permissions:
group.permissions.clear()
print("Permissions:", group.permissions.all())
for permission_codename in group_details.get('permissions', []):
permission = Permission.objects.get(codename=permission_codename)
group.permissions.add(permission)

View file

@ -1,75 +0,0 @@
from extras.constants import CF_TYPE_TEXT, CF_TYPE_INTEGER, CF_TYPE_BOOLEAN, CF_TYPE_DATE, CF_TYPE_URL, CF_TYPE_SELECT, CF_FILTER_CHOICES
from extras.models import CustomField, CustomFieldChoice
from ruamel.yaml import YAML
from pathlib import Path
import sys
text_to_fields = {
'boolean': CF_TYPE_BOOLEAN,
'date': CF_TYPE_DATE,
'integer': CF_TYPE_INTEGER,
'selection': CF_TYPE_SELECT,
'text': CF_TYPE_TEXT,
'url': CF_TYPE_URL,
}
def get_class_for_class_path(class_path):
import importlib
from django.contrib.contenttypes.models import ContentType
module_name, class_name = class_path.rsplit(".", 1)
module = importlib.import_module(module_name)
clazz = getattr(module, class_name)
return ContentType.objects.get_for_model(clazz)
file = Path('/opt/netbox/initializers/custom_fields.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
customfields = yaml.load(stream)
if customfields is not None:
for cf_name, cf_details in customfields.items():
custom_field, created = CustomField.objects.get_or_create(name = cf_name)
if created:
if cf_details.get('default', 0):
custom_field.default = cf_details['default']
if cf_details.get('description', 0):
custom_field.description = cf_details['description']
# If no filter_logic is specified then it will default to 'Loose'
if cf_details.get('filter_logic', 0):
for choice_id, choice_text in CF_FILTER_CHOICES:
if choice_text.lower() == cf_details['filter_logic']:
custom_field.filter_logic = choice_id
if cf_details.get('label', 0):
custom_field.label = cf_details['label']
for object_type in cf_details.get('on_objects', []):
custom_field.obj_type.add(get_class_for_class_path(object_type))
if cf_details.get('required', 0):
custom_field.required = cf_details['required']
if cf_details.get('type', 0):
custom_field.type = text_to_fields[cf_details['type']]
if cf_details.get('weight', 0):
custom_field.weight = cf_details['weight']
custom_field.save()
for idx, choice_details in enumerate(cf_details.get('choices', [])):
choice, _ = CustomFieldChoice.objects.get_or_create(
field=custom_field,
value=choice_details['value'],
defaults={'weight': idx * 10}
)
print("🔧 Created custom field", cf_name)

View file

@ -1,31 +0,0 @@
from dcim.models import Region
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/regions.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml=YAML(typ='safe')
regions = yaml.load(stream)
optional_assocs = {
'parent': (Region, 'name')
}
if regions is not None:
for params in regions:
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)
region, created = Region.objects.get_or_create(**params)
if created:
print("🌐 Created region", region.name)

View file

@ -1,46 +0,0 @@
from dcim.models import Region, Site
from extras.models import CustomField, CustomFieldValue
from tenancy.models import Tenant
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/sites.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
sites = yaml.load(stream)
optional_assocs = {
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
if sites is not None:
for params in sites:
custom_fields = params.pop('custom_fields', None)
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)
site, created = Site.objects.get_or_create(**params)
if created:
if custom_fields is not None:
for cf_name, cf_value in custom_fields.items():
custom_field = CustomField.objects.get(name=cf_name)
custom_field_value = CustomFieldValue.objects.create(
field=custom_field,
obj=site,
value=cf_value
)
site.custom_field_values.add(custom_field_value)
print("📍 Created site", site.name)

View file

@ -1,19 +0,0 @@
from dcim.models import Manufacturer
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/manufacturers.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
manufacturers = yaml.load(stream)
if manufacturers is not None:
for params in manufacturers:
manufacturer, created = Manufacturer.objects.get_or_create(**params)
if created:
print("🏭 Created Manufacturer", manufacturer.name)

View file

@ -1,56 +0,0 @@
from dcim.models import DeviceType, Manufacturer, Region
from tenancy.models import Tenant
from extras.models import CustomField, CustomFieldValue
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/device_types.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
device_types = yaml.load(stream)
required_assocs = {
'manufacturer': (Manufacturer, 'name')
}
optional_assocs = {
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
if device_types is not None:
for params in device_types:
custom_fields = params.pop('custom_fields', 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_type, created = DeviceType.objects.get_or_create(**params)
if created:
if custom_fields is not None:
for cf_name, cf_value in custom_fields.items():
custom_field = CustomField.objects.get(name=cf_name)
custom_field_value = CustomFieldValue.objects.create(
field=custom_field,
obj=device_type,
value=cf_value
)
device_type.custom_field_values.add(custom_field_value)
print("🔡 Created device type", device_type.manufacturer, device_type.model)

View file

@ -1,28 +0,0 @@
from dcim.models import RackRole
from ruamel.yaml import YAML
from utilities.forms import COLOR_CHOICES
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/rack_roles.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml=YAML(typ='safe')
rack_roles = yaml.load(stream)
if rack_roles is not None:
for params in rack_roles:
if 'color' in params:
color = params.pop('color')
for color_tpl in COLOR_CHOICES:
if color in color_tpl:
params['color'] = color_tpl[0]
rack_role, created = RackRole.objects.get_or_create(**params)
if created:
print("🎨 Created rack role", rack_role.name)

View file

@ -1,66 +0,0 @@
from dcim.models import Site, RackRole, Rack, RackGroup
from tenancy.models import Tenant
from extras.models import CustomField, CustomFieldValue
from dcim.constants import RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/racks.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
racks = yaml.load(stream)
required_assocs = {
'site': (Site, 'name')
}
optional_assocs = {
'role': (RackRole, 'name'),
'tenant': (Tenant, 'name'),
'group': (RackGroup, 'name')
}
if racks is not None:
for params in racks:
custom_fields = params.pop('custom_fields', 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)
for rack_type in RACK_TYPE_CHOICES:
if params['type'] in rack_type:
params['type'] = rack_type[0]
for rack_width in RACK_WIDTH_CHOICES:
if params['width'] in rack_width:
params['width'] = rack_width[0]
rack, created = Rack.objects.get_or_create(**params)
if created:
if custom_fields is not None:
for cf_name, cf_value in custom_fields.items():
custom_field = CustomField.objects.get(name=cf_name)
custom_field_value = CustomFieldValue.objects.create(
field=custom_field,
obj=rack,
value=cf_value
)
rack.custom_field_values.add(custom_field_value)
print("🔳 Created rack", rack.site, rack.name)

View file

@ -1,29 +0,0 @@
from dcim.models import DeviceRole
from ruamel.yaml import YAML
from utilities.forms import COLOR_CHOICES
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/device_roles.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml=YAML(typ='safe')
device_roles = yaml.load(stream)
if device_roles is not None:
for params in device_roles:
if 'color' in params:
color = params.pop('color')
for color_tpl in COLOR_CHOICES:
if color in color_tpl:
params['color'] = color_tpl[0]
device_role, created = DeviceRole.objects.get_or_create(**params)
if created:
print("🎨 Created device role", device_role.name)

View file

@ -1,32 +0,0 @@
from dcim.models import Manufacturer, Platform
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/platforms.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
platforms = yaml.load(stream)
optional_assocs = {
'manufacturer': (Manufacturer, 'name'),
}
if platforms is not None:
for params in platforms:
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)
platform, created = Platform.objects.get_or_create(**params)
if created:
print("💾 Created platform", platform.name)

View file

@ -1,71 +0,0 @@
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform
from dcim.constants import RACK_FACE_CHOICES
from ipam.models import IPAddress
from virtualization.models import Cluster
from tenancy.models import Tenant
from extras.models import CustomField, CustomFieldValue
from ruamel.yaml import YAML
from pathlib import Path
import sys
file = Path('/opt/netbox/initializers/devices.yml')
if not file.is_file():
sys.exit()
with file.open('r') as stream:
yaml = YAML(typ='safe')
devices = yaml.load(stream)
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'),
'primary_ip4': (IPAddress, 'address'),
'primary_ip6': (IPAddress, 'address')
}
if devices is not None:
for params in devices:
custom_fields = params.pop('custom_fields', 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)
if 'face' in params:
for rack_face in RACK_FACE_CHOICES:
if params['face'] in rack_face:
params['face'] = rack_face[0]
device, created = Device.objects.get_or_create(**params)
if created:
if custom_fields is not None:
for cf_name, cf_value in custom_fields.items():
custom_field = CustomField.objects.get(name=cf_name)
custom_field_value = CustomFieldValue.objects.create(
field=custom_field,
obj=device,
value=cf_value
)
device.custom_field_values.add(custom_field_value)
print("🖥️ Created device", device.name)

View file

@ -0,0 +1,4 @@
LOGGING = {
'version': 1,
'disable_existing_loggers': True
}

72
test.sh Executable file
View file

@ -0,0 +1,72 @@
#!/bin/bash
# Runs the original NetBox unit tests and tests whether all initializers work.
# Usage:
# ./test.sh latest
# ./test.sh v2.9.7
# ./test.sh develop-2.10
# IMAGE='netboxcommunity/netbox:latest' ./test.sh
# IMAGE='netboxcommunity/netbox:v2.9.7' ./test.sh
# IMAGE='netboxcommunity/netbox:develop-2.10' ./test.sh
# export IMAGE='netboxcommunity/netbox:latest'; ./test.sh
# export IMAGE='netboxcommunity/netbox:v2.9.7'; ./test.sh
# export IMAGE='netboxcommunity/netbox:develop-2.10'; ./test.sh
# exit when a command exits with an exit code != 0
set -e
# IMAGE is used by `docker-compose.yml` do determine the tag
# of the Docker Image that is to be used
if [ "${1}x" != "x" ]; then
# Use the command line argument
export IMAGE="netboxcommunity/netbox:${1}"
else
export IMAGE="${IMAGE-netboxcommunity/netbox:latest}"
fi
# Ensure that an IMAGE is defined
if [ -z "${IMAGE}" ]; then
echo "⚠️ No image defined"
if [ -z "${DEBUG}" ]; then
exit 1
else
echo "⚠️ Would 'exit 1' here, but DEBUG is '${DEBUG}'."
fi
fi
# The docker compose command to use
doco="docker compose --file docker-compose.test.yml --project-name netbox_docker_test"
test_setup() {
echo "🏗 Setup up test environment"
$doco up --detach --quiet-pull --wait --force-recreate --renew-anon-volumes --no-start
$doco start postgres
$doco start redis
$doco start redis-cache
}
test_netbox_unit_tests() {
echo "⏱ Running NetBox Unit Tests"
$doco run --rm netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py test
}
test_compose_db_setup() {
echo "⏱ Running NetBox DB migrations"
$doco run --rm netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py migrate
}
test_cleanup() {
echo "💣 Cleaning Up"
$doco down --volumes
}
echo "🐳🐳🐳 Start testing '${IMAGE}'"
# Make sure the cleanup script is executed
trap test_cleanup EXIT ERR
test_setup
test_netbox_unit_tests
test_compose_db_setup
echo "🐳🐳🐳 Done testing '${IMAGE}'"