Compare commits

...

368 Commits
1.0.0 ... 2.2.0

Author SHA1 Message Date
Tobias Genannt
3f1e45f636 Merge pull request #839 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 #836 from tobiasge/fix-for-811
Installed bzip2
2022-08-31 15:14:41 +02:00
Tobias Genannt
5ea3008f82 Merge pull request #835 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 #831 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 #825 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 #822 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 #820 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 #809 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 #808 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 #786 from rjmidau/oidc
Add requirements for OIDC SSO
2022-07-19 13:58:48 +02:00
Tobias Genannt
c53ae2afa0 Merge pull request #805 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 #802 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 #803 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 #797 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 #778 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 #796 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 #791 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 #780 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
Tobias Genannt
f80cc70d76 Merge pull request #776 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 #775 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 #753 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 #759 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 #768 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 #774 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 #765 -- SKIP_GIT will skip other git operations 2022-05-25 10:43:23 -04:00
Tobias Genannt
6c9d4aebac Merge pull request #757 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 #754 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 #750 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 #728 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 #736 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 #744 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 #742 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 #738 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 #729 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 #730 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 #734 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 #733 from tobiasge/remove-tzdata
tzdata is already required in Netbox
2022-04-06 09:03:28 +02:00
Tobias Genannt
d61470d6ef Merge pull request #725 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 #711 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 #708 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 #705 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 #701 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 #700 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 #665 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 (#691)
* Cleanup & Reorg startup scripts
2022-02-03 17:10:39 +01:00
Tobias Genannt
b9dff0d22e Merge pull request #697 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 #695 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 #685 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 #681 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 #668 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 #660 from tobiasge/fix-link
Fixed GHCR link
2021-12-11 12:12:13 +01:00
Tobias Genannt
0b622361f3 Merge pull request #661 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 #659 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 #658 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 #657 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 #656 from tobiasge/fix-653
Add __dir__ to configuration file
2021-11-30 11:48:11 +01:00
Tobias Genannt
f183603bc0 Fix #653: Add missing __dir__ to configuration.py 2021-11-30 11:19:49 +01:00
Tobias Genannt
544a58325d Merge pull request #640 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 #637 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 #632 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 #633 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 #630 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 #625 from cimnine/UpdateReadme 2021-10-19 17:49:28 +02:00
Christian Mäder
6c49d4fef5 Merge pull request #594 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 #622 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 #621 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 #620 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 #607 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 #606 from netbox-community/develop
Version 1.4.1
2021-10-14 07:45:50 +02:00
Christian Mäder
68401caf1c Merge pull request #608 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 #589 from tobiasge/user-unit
Fix #586: 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 #605 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 #603 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 #602 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 #601 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 #587 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 #583 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 #582 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 #546 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 #571 from tobiasge/house
Added container for Netbox housekeeping command
2021-09-17 10:52:28 +02:00
Tobias Genannt
d432a84c42 Merge pull request #565 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 #579 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 #576 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 #568 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 #570 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. (#538)
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 #562
2021-09-02 20:22:03 +05:00
Tobias Genannt
9e063a6e6f Merge pull request #560 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 #557 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 #543 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 #556 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 #555 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.16
2021-08-29 15:51:02 +02:00
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 #554 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.14
2021-08-26 15:07:24 +02:00
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 #552 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 #551 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.11
2021-08-19 11:27:59 +02:00
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 #542 from netbox-community/renovate/django-auth-ldap-3.x
Update dependency django-auth-ldap to v3
2021-07-30 11:16:28 +02:00
Renovate Bot
275d2673b4 Update dependency django-auth-ldap to v3 2021-07-19 07:56:47 +00:00
Tobias Genannt
746aa9b4a6 Merge pull request #534 from tobiasge/alpine-update
Alpine update to 3.14
2021-07-08 10:41:22 +02:00
Tobias Genannt
c13bec47b8 Merge pull request #537 from insidieux/disable-server-side-cursors-option
Disable server side cursors option
2021-07-07 09:51:05 +02:00
Tobias Genannt
9953d11fd8 Merge pull request #536 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.10
2021-07-07 09:47:56 +02:00
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 #533 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 #531 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.9
2021-06-10 17:19:06 +02:00
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 #530 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 #524 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 #527 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.7
2021-06-01 09:45:02 +02:00
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 #520 from cimnine/PinNetboxMinor 2021-05-31 11:26:51 +02:00
Christian Mäder
52f097d4a2 Merge pull request #525 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 #518 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 #511 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 #514 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 #513 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 #508 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 #507 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 #493 from netbox-community/develop
Release 1.2.0
2021-04-27 09:47:38 +02:00
Christian Mäder
60428d5639 Merge pull request #498 from tobiasge/build-feature-branch
Build feature branch
2021-04-27 09:16:06 +02:00
Tobias Genannt
fd55ec220c Merge pull request #497 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 #500 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 #499 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 #448 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 #483 from netbox-community/renovate/django-auth-ldap-2.x
Update dependency django-auth-ldap to v2.4.0
2021-04-20 09:24:20 +02:00
Ryan Merolle
28a26288c9 Merge pull request #3 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 #495 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 #485 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 #492 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 #482 from Daimler/custom-link-error-fix
Fixes #480: Custom Links initialiser breaks if content_type is invalid
2021-04-13 09:33:41 +02:00
Christian Mäder
14c0d17704 Merge pull request #486 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.4
2021-04-12 17:12:05 +02:00
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 #479 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 #477 from netbox-community/renovate/ruamel.yaml-0.x
Update dependency ruamel.yaml to v0.17.0
2021-03-26 18:16:33 +01:00
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 #469 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 #460 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 #455 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 #452 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 #1 from netbox-community/develop
Merge upstream changes
2021-02-25 12:14:16 -05:00
Christian Mäder
6cd156f7d5 Merge pull request #450 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 #444 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 #438 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 #432 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 #431 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 #427 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 #426 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 #425 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 #421 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 #423 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 #419 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 #413 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 #410 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 #411 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
130 changed files with 1412 additions and 2854 deletions

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

View File

@@ -1,67 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!--
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/wiki/Troubleshooting)
* Have you had a look at the rest of the wiki? (https://github.com/netbox-community/netbox-docker/wiki)
* 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 image or Docker Compose file 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
Please don't open an issue when you have a PR ready. Just submit the PR, that's good enough.
-->
## 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`
<!-- adjust the `latest` tag to the version you're using -->
The output of `docker inspect netboxcommunity/netbox:latest --format "{{json .Config.Labels}}"`:
```json
{
"JSON JSON JSON":
"--> Please paste formatted json. (Use e.g. `jq` or https://jsonformatter.curiousconcept.com/)"
}
```
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
-->
```text
LOG LOG LOG
```

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

View File

@@ -1,13 +1,15 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: The \#netbox-docker Slack channel - name: Question
url: http://slack.networktocode.com/
about: It's usually the quickest way to seek help when you're in trouble with regards to Netbox Docker.
- name: Github Discussions
url: https://github.com/netbox-community/netbox-docker/discussions url: https://github.com/netbox-community/netbox-docker/discussions
about: This is the right place to ask questions about how to use or do certain things with Netbox Docker. about: The Github Discussions are the right place to ask questions about how to use or do certain things with NetBox Docker.
- name: Have you had a look at our Wiki? - 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 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. 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

@@ -1,54 +0,0 @@
---
name: Feature or Change Request
about: Request a new feature or a change of the current behavior
title: ''
labels: ''
assignees: ''
---
<!--
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/wiki/Troubleshooting)
* Have you had a look at the rest of the wiki? (https://github.com/netbox-community/netbox-docker/wiki)
* Have you read the release notes recently (https://github.com/netbox-community/netbox-docker/releases)
* Are you confident that your feature/change request is related to the Docker image or Docker Compose file 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
Please don't open an issue when you have a PR ready. Just submit the PR, that's good enough.
-->
## Desired Behavior
<!-- please describe the behavior you desire -->
...
## Contrast to Current Behavior
<!-- please describe how the desired behavior is different from the current behavior -->
...
## Changes Required
<!-- if you can, please elaborate what changes would exactly be required -->
...
## Discussion: Benefits and Drawbacks
<!--
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.
-->
...

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,3 +1,4 @@
---
name: push name: push
on: on:
@@ -9,31 +10,69 @@ on:
- release - release
jobs: 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
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: build:
continue-on-error: ${{ matrix.docker_from == 'alpine:edge' }} continue-on-error: ${{ matrix.build_cmd != './build-latest.sh' }}
strategy: strategy:
matrix: matrix:
build_cmd: build_cmd:
- ./build-latest.sh - ./build-latest.sh
- PRERELEASE=true ./build-latest.sh - PRERELEASE=true ./build-latest.sh
- ./build-next.sh - ./build.sh feature
- ./build.sh develop - ./build.sh develop
docker_from: platform:
- '' # use the default of the build script - linux/amd64
- alpine:edge - linux/arm64
fail-fast: false fail-fast: false
env:
GH_ACTION: enable
IMAGE_NAMES: docker.io/netboxcommunity/netbox
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Builds new Netbox Docker Images name: Builds new NetBox Docker Images
steps: steps:
- id: git-checkout - id: git-checkout
name: Checkout name: Checkout
uses: actions/checkout@v1 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 - id: docker-build
name: Build the image from '${{ matrix.docker_from }}' with '${{ matrix.build_cmd }}' name: Build the image for '${{ matrix.platform }}' with '${{ matrix.build_cmd }}'
run: ${{ matrix.build_cmd }} run: ${{ matrix.build_cmd }}
env: env:
DOCKER_FROM: ${{ matrix.docker_from }} BUILDX_PLATFORM: ${{ matrix.platform }}
GH_ACTION: enable BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}
- id: docker-test - id: docker-test
name: Test the image name: Test the image
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh

View File

@@ -1,11 +1,13 @@
---
name: release name: release
on: on:
push: release:
branches: types:
- release - published
schedule: schedule:
- cron: '45 5 * * *' - cron: '45 5 * * *'
workflow_dispatch:
jobs: jobs:
build: build:
@@ -14,70 +16,68 @@ jobs:
build_cmd: build_cmd:
- ./build-latest.sh - ./build-latest.sh
- PRERELEASE=true ./build-latest.sh - PRERELEASE=true ./build-latest.sh
- ./build-next.sh - ./build.sh feature
- ./build.sh develop - ./build.sh develop
platform:
- linux/amd64,linux/arm64
fail-fast: false fail-fast: false
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Builds new Netbox Docker Images 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: steps:
- id: git-checkout - id: source-checkout
name: Checkout name: Checkout
uses: actions/checkout@v2 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 - id: docker-build
name: Build the image with '${{ matrix.build_cmd }}' name: Build the image with '${{ matrix.build_cmd }}'
run: ${{ matrix.build_cmd }} run: ${{ matrix.build_cmd }}
env: - id: test-image
GH_ACTION: enable
- id: docker-test
name: Test the image name: Test the image
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
if: steps.docker-build.outputs.skipped != 'true' if: steps.docker-build.outputs.skipped != 'true'
- id: registry-login # docker.io
name: Login to the Docker Registry - id: docker-io-login
run: | name: Login to docker.io
echo "::add-mask::$DOCKERHUB_USERNAME" uses: docker/login-action@v2
echo "::add-mask::$DOCKERHUB_PASSWORD" with:
docker login -u "$DOCKERHUB_USERNAME" --password "${DOCKERHUB_PASSWORD}" "${DOCKER_REGISTRY}" registry: docker.io
env: username: ${{ secrets.dockerhub_username }}
DOCKERHUB_USERNAME: ${{ secrets.dockerhub_username }} password: ${{ secrets.dockerhub_password }}
DOCKERHUB_PASSWORD: ${{ secrets.dockerhub_password }}
if: steps.docker-build.outputs.skipped != 'true' if: steps.docker-build.outputs.skipped != 'true'
- id: registry-push # 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 name: Push the image
run: ${{ matrix.build_cmd }} --push-only run: ${{ matrix.build_cmd }} --push
if: steps.docker-build.outputs.skipped != 'true' if: steps.docker-build.outputs.skipped != 'true'
- id: registry-logout
name: Logout of the Docker Registry
run: docker logout "${DOCKER_REGISTRY}"
if: steps.docker-build.outputs.skipped != 'true'
# Quay.io
- id: quayio-docker-build
name: Build the image with '${{ matrix.build_cmd }}'
run: ${{ matrix.build_cmd }}
env: env:
DOCKER_REGISTRY: quay.io BUILDX_PLATFORM: ${{ matrix.platform }}
GH_ACTION: enable BUILDX_BUILDER_NAME: ${{ steps.buildx-setup.outputs.name }}
- id: quayio-registry-login
name: Login to the Quay.io Registry
run: |
echo "::add-mask::$QUAYIO_USERNAME"
echo "::add-mask::$QUAYIO_PASSWORD"
docker login -u "$QUAYIO_USERNAME" --password "${QUAYIO_PASSWORD}" "${DOCKER_REGISTRY}"
env:
DOCKER_REGISTRY: quay.io
QUAYIO_USERNAME: ${{ secrets.quayio_username }}
QUAYIO_PASSWORD: ${{ secrets.quayio_password }}
if: steps.docker-build.outputs.skipped != 'true'
- id: quayio-registry-push
name: Push the image
run: ${{ matrix.build_cmd }} --push-only
env:
DOCKER_REGISTRY: quay.io
if: steps.docker-build.outputs.skipped != 'true'
- id: quayio-registry-logout
name: Logout of the Docker Registry
run: docker logout "${DOCKER_REGISTRY}"
env:
DOCKER_REGISTRY: quay.io
if: steps.docker-build.outputs.skipped != 'true'

4
.gitignore vendored
View File

@@ -7,5 +7,9 @@ configuration/*
!configuration/configuration.py !configuration/configuration.py
!configuration/extra.py !configuration/extra.py
configuration/ldap/* configuration/ldap/*
!configuration/ldap/extra.py
!configuration/ldap/ldap_config.py !configuration/ldap/ldap_config.py
!configuration/logging.py
!configuration/plugins.py
prometheus.yml 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

5
.yamllint.yaml Normal file
View File

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

View File

@@ -1,26 +1,32 @@
ARG FROM ARG FROM
FROM ${FROM} as builder FROM ${FROM} as builder
RUN apk add --no-cache \ RUN export DEBIAN_FRONTEND=noninteractive \
bash \ && apt-get update -qq \
build-base \ && apt-get upgrade \
--yes -qq --no-install-recommends \
&& apt-get install \
--yes -qq --no-install-recommends \
build-essential \
ca-certificates \ ca-certificates \
cyrus-sasl-dev \ libldap-dev \
graphviz \ libpq-dev \
jpeg-dev \ libsasl2-dev \
libevent-dev \ libssl-dev \
libffi-dev \
libxslt-dev \
openldap-dev \
postgresql-dev \
py3-pip \
python3-dev \ python3-dev \
python3-pip \
python3-venv \
&& python3 -m venv /opt/netbox/venv \ && python3 -m venv /opt/netbox/venv \
&& /opt/netbox/venv/bin/python3 -m pip install --upgrade pip setuptools && /opt/netbox/venv/bin/python3 -m pip install --upgrade \
pip \
setuptools \
wheel
ARG NETBOX_PATH ARG NETBOX_PATH
COPY ${NETBOX_PATH}/requirements.txt requirements-container.txt / COPY ${NETBOX_PATH}/requirements.txt requirements-container.txt /
RUN /opt/netbox/venv/bin/pip install -r /requirements.txt -r /requirements-container.txt RUN /opt/netbox/venv/bin/pip install \
-r /requirements.txt \
-r /requirements-container.txt
### ###
# Main stage # Main stage
@@ -29,24 +35,31 @@ RUN /opt/netbox/venv/bin/pip install -r /requirements.txt -r /requirements-conta
ARG FROM ARG FROM
FROM ${FROM} as main FROM ${FROM} as main
RUN apk add --no-cache \ RUN export DEBIAN_FRONTEND=noninteractive \
bash \ && apt-get update -qq \
&& apt-get upgrade \
--yes -qq --no-install-recommends \
&& apt-get install \
--yes -qq --no-install-recommends \
bzip2 \
ca-certificates \ ca-certificates \
curl \ curl \
graphviz \ libldap-common \
libevent \ libpq5 \
libffi \ openssl \
libjpeg-turbo \
libressl \
libxslt \
postgresql-libs \
python3 \ python3 \
py3-pip \ python3-distutils \
ttf-ubuntu-font-family \ tini \
unit \ && curl -sL https://nginx.org/keys/nginx_signing.key \
unit-python3 > /etc/apt/trusted.gpg.d/nginx.asc && \
echo "deb https://packages.nginx.org/unit/ubuntu/ jammy unit" \
WORKDIR /opt > /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 COPY --from=builder /opt/netbox/venv /opt/netbox/venv
@@ -54,10 +67,10 @@ ARG NETBOX_PATH
COPY ${NETBOX_PATH} /opt/netbox COPY ${NETBOX_PATH} /opt/netbox
COPY docker/configuration.docker.py /opt/netbox/netbox/netbox/configuration.py COPY docker/configuration.docker.py /opt/netbox/netbox/netbox/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/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 docker/launch-netbox.sh /opt/netbox/launch-netbox.sh
COPY startup_scripts/ /opt/netbox/startup_scripts/
COPY initializers/ /opt/netbox/initializers/
COPY configuration/ /etc/netbox/config/ COPY configuration/ /etc/netbox/config/
COPY docker/nginx-unit.json /etc/unit/ COPY docker/nginx-unit.json /etc/unit/
@@ -66,33 +79,25 @@ WORKDIR /opt/netbox/netbox
# Must set permissions for '/opt/netbox/netbox/media' directory # Must set permissions for '/opt/netbox/netbox/media' directory
# to g+w so that pictures can be uploaded to netbox. # to g+w so that pictures can be uploaded to netbox.
RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \ RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \
&& chown -R unit:root media /opt/unit/ \
&& chmod -R g+w 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 && SECRET_KEY="dummy" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input
ENTRYPOINT [ "/opt/netbox/docker-entrypoint.sh" ] ENV LANG=C.UTF-8 PATH=/opt/netbox/venv/bin:$PATH
ENTRYPOINT [ "/usr/bin/tini", "--" ]
CMD [ "/opt/netbox/launch-netbox.sh" ] CMD [ "/opt/netbox/docker-entrypoint.sh", "/opt/netbox/launch-netbox.sh" ]
LABEL ORIGINAL_TAG="" \ LABEL netbox.original-tag="" \
NETBOX_GIT_BRANCH="" \ netbox.git-branch="" \
NETBOX_GIT_REF="" \ netbox.git-ref="" \
NETBOX_GIT_URL="" \ netbox.git-url="" \
# See http://label-schema.org/rc1/#build-time-labels
# Also https://microbadger.com/labels
org.label-schema.schema-version="1.0" \
org.label-schema.build-date="" \
org.label-schema.name="Netbox Docker" \
org.label-schema.description="A container based distribution of Netbox, the free and open IPAM and DCIM solution." \
org.label-schema.vendor="The netbox-docker contributors." \
org.label-schema.url="https://github.com/netbox-community/netbox-docker" \
org.label-schema.usage="https://github.com/netbox-community/netbox-docker/wiki" \
org.label-schema.vcs-url="https://github.com/netbox-community/netbox-docker.git" \
org.label-schema.vcs-ref="" \
org.label-schema.version="snapshot" \
# See https://github.com/opencontainers/image-spec/blob/master/annotations.md#pre-defined-annotation-keys # See https://github.com/opencontainers/image-spec/blob/master/annotations.md#pre-defined-annotation-keys
org.opencontainers.image.created="" \ org.opencontainers.image.created="" \
org.opencontainers.image.title="Netbox Docker" \ 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.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.licenses="Apache-2.0" \
org.opencontainers.image.authors="The netbox-docker contributors." \ org.opencontainers.image.authors="The netbox-docker contributors." \
org.opencontainers.image.vendor="The netbox-docker contributors." \ org.opencontainers.image.vendor="The netbox-docker contributors." \
@@ -100,17 +105,4 @@ LABEL ORIGINAL_TAG="" \
org.opencontainers.image.documentation="https://github.com/netbox-community/netbox-docker/wiki" \ 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.source="https://github.com/netbox-community/netbox-docker.git" \
org.opencontainers.image.revision="" \ org.opencontainers.image.revision="" \
org.opencontainers.image.version="snapshot" org.opencontainers.image.version=""
#####
## LDAP specific configuration
#####
FROM main as ldap
RUN apk add --no-cache \
libsasl \
libldap \
util-linux
COPY docker/ldap_config.docker.py /opt/netbox/netbox/netbox/ldap_config.py

152
README.md
View File

@@ -5,49 +5,29 @@
![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed-raw/netbox-community/netbox-docker) ![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) ![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) ![Docker Pulls](https://img.shields.io/docker/pulls/netboxcommunity/netbox)
[![MicroBadger Layers](https://img.shields.io/microbadger/layers/netboxcommunity/netbox)][netbox-docker-microbadger]
[![MicroBadger Size](https://img.shields.io/microbadger/image-size/netboxcommunity/netbox)][netbox-docker-microbadger]
[![GitHub license](https://img.shields.io/github/license/netbox-community/netbox-docker)][netbox-docker-license] [![GitHub license](https://img.shields.io/github/license/netbox-community/netbox-docker)][netbox-docker-license]
[The Github repository](netbox-docker-github) houses the components needed to build Netbox as a Docker container. [The GitHub repository][netbox-docker-github] houses the components needed to build NetBox as a container.
Images are built using this code and are released to [Docker Hub][netbox-dockerhub] and [Quay.io][netbox-quayio] once a day. 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].
Do you have any questions? Do you have any questions?
Before opening an issue on Github, please join the [Network To Code][ntc-slack] Slack and ask for help in our [`#netbox-docker`][netbox-docker-slack] channel. 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-stargazers]: https://github.com/netbox-community/netbox-docker/stargazers
[github-release]: https://github.com/netbox-community/netbox-docker/releases [github-release]: https://github.com/netbox-community/netbox-docker/releases
[netbox-docker-microbadger]: https://microbadger.com/images/netboxcommunity/netbox
[netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/ [netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/
[netbox-docker-github]: https://github.com/netbox-community/netbox-docker/
[ntc-slack]: http://slack.networktocode.com/
[netbox-docker-slack]: https://slack.com/app_redirect?channel=netbox-docker&team=T09LQ7E9E
[netbox-docker-license]: https://github.com/netbox-community/netbox-docker/blob/release/LICENSE
[netbox-quayio]: https://quay.io/repository/netboxcommunity/netbox [netbox-quayio]: https://quay.io/repository/netboxcommunity/netbox
[netbox-ghcr]: https://github.com/netbox-community/netbox-docker/pkgs/container/netbox
## Docker Tags [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
* `vX.Y.Z`: These are release builds, automatically built from [the corresponding releases of Netbox][netbox-releases]. [netbox-docker-slack-channel]: https://netdev-community.slack.com/archives/C01P0GEVBU7
* `latest`: These are release builds, automatically built from [the `master` branch of Netbox][netbox-master]. [netbox-slack-channel]: https://netdev-community.slack.com/archives/C01P0FRSXRV
* `snapshot`: These are pre-release builds, automatically built from the [`develop` branch of Netbox][netbox-develop]. [netbox-docker-license]: https://github.com/netbox-community/netbox-docker/blob/release/LICENSE
* `develop-X.Y`: These are pre-release builds, automatically built from the corresponding [branch of Netbox][netbox-branches].
Then there is currently one extra tags for each of the above tags:
* `-ldap`: Contains additional dependencies and configurations for connecting Netbox to an LDAP directory.
[Learn more about that in our wiki][netbox-docker-ldap].
New images are built and published automatically every ~24h.
[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
[netbox-branches]: https://github.com/netbox-community/netbox/branches
[netbox-docker-ldap]: https://github.com/netbox-community/netbox-docker/wiki/LDAP
## Quickstart ## Quickstart
To get Netbox Docker up and running run the following commands. 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. There is a more complete [_Getting Started_ guide on our wiki][wiki-getting-started] which explains every step.
```bash ```bash
@@ -66,7 +46,7 @@ docker-compose up
The whole application will be available after a few minutes. The whole application will be available after a few minutes.
Open the URL `http://0.0.0.0:8000/` in a web-browser. Open the URL `http://0.0.0.0:8000/` in a web-browser.
You should see the Netbox homepage. You should see the NetBox homepage.
In the top-right corner you can login. In the top-right corner you can login.
The default credentials are: The default credentials are:
@@ -75,74 +55,89 @@ The default credentials are:
* API Token: **0123456789abcdef0123456789abcdef01234567** * API Token: **0123456789abcdef0123456789abcdef01234567**
[wiki-getting-started]: https://github.com/netbox-community/netbox-docker/wiki/Getting-Started [wiki-getting-started]: https://github.com/netbox-community/netbox-docker/wiki/Getting-Started
[docker-reception]: https://github.com/nxt-engineering/reception
## 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 ## Documentation
Please refer [to our wiki on Github][netbox-docker-wiki] for further information on how to use this Netbox Docker image properly. Please refer [to our wiki on GitHub][netbox-docker-wiki] for further information on how to use the NetBox Docker image properly.
It covers advanced topics such as using files for secrets, deployment to Kubernetes, monitoring and configuring NAPALM or LDAP. 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/ [netbox-docker-wiki]: https://github.com/netbox-community/netbox-docker/wiki/
## Getting Help ## Getting Help
Feel free to ask questions in our [Github Community][netbox-community] or join [our Slack channel `#netbox-docker`][netbox-docker-slack] on the [Network To Code Slack][ntc-slack], 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. 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 on the same Slack instance very helpful. 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 [netbox-community]: https://github.com/netbox-community/netbox-docker/discussions
## Dependencies ## Dependencies
This project relies only on *Docker* and *docker-compose* meeting these requirements: This project relies only on _Docker_ and _docker-compose_ meeting these requirements:
* The *Docker version* must be at least `17.05`. * The _Docker version_ must be at least `20.10.10`.
* The *docker-compose version* must be at least `1.17.0`. * The _containerd version_ must be at least `1.5.6`.
* The _docker-compose version_ must be at least `1.28.0`.
To check the version installed on your system run `docker --version` and `docker-compose --version`. To check the version installed on your system run `docker --version` and `docker-compose --version`.
## Use a Specific Netbox Version ## Updating
The `docker-compose.yml` file is prepared to run a specific version of Netbox, instead of `latest`.
To use this feature, set and export 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] or [Quay.io][netbox-quayio].
```bash
export VERSION=v2.7.1
docker-compose pull netbox
docker-compose up -d
```
You can also build a specific version of the Netbox Docker image yourself.
`VERSION` can be any valid [git ref][git-ref] in that case.
```bash
export VERSION=v2.7.1
./build.sh $VERSION
docker-compose up -d
```
[git-ref]: https://git-scm.com/book/en/v2/Git-Internals-Git-References
[netbox-github]: https://github.com/netbox-community/netbox/releases
## 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 November 2019 each image built from this repo contains a `org.opencontainers.image.version` label.
(The images contained labels since April 2018, although in November 2019 the labels' names changed.)
You can check the label of your local image by running `docker inspect netboxcommunity/netbox:v2.7.1 --format "{{json .Config.Labels}}"`.
Please read [the release notes][releases] carefully when updating to a new image version. 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.
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].
[releases]: https://github.com/netbox-community/netbox-docker/releases [releases]: https://github.com/netbox-community/netbox-docker/releases
[netbox-docker-wiki-updating]: https://github.com/netbox-community/netbox-docker/wiki/Updating
## Rebuilding the Image ## Rebuilding the Image
`./build.sh` can be used to rebuild the Docker image. See `./build.sh --help` for more information. `./build.sh` can be used to rebuild the container image. See `./build.sh --help` for more information.
For more details on custom builds [consult our wiki][netbox-docker-wiki-build]. For more details on custom builds [consult our wiki][netbox-docker-wiki-build].
@@ -151,14 +146,13 @@ For more details on custom builds [consult our wiki][netbox-docker-wiki-build].
## Tests ## Tests
We have a test script. We have a test script.
It runs Netbox's own unit tests and ensures that all initializers work: It runs NetBox's own unit tests and ensures that all initializers work:
```bash ```bash
IMAGE=netboxcommunity/netbox:latest ./test.sh IMAGE=netboxcommunity/netbox:latest ./test.sh
``` ```
## About ## Support
This repository is currently maintained and funded by [nxt][nxt]. This repository is currently maintained by the community.
Please consider sponsoring the maintainers of this project.
[nxt]: https://nxt.engineering/en/

View File

@@ -1 +1 @@
1.0.0 2.2.0

View File

@@ -1,8 +0,0 @@
#!/bin/bash
push_image_to_registry() {
local target_tag=$1
echo "⏫ Pushing '${target_tag}'"
$DRY docker push "${target_tag}"
echo "✅ Finished pushing the Docker image '${target_tag}'."
}

View File

@@ -45,16 +45,16 @@ _get_image_configuration() {
--silent \ --silent \
--location \ --location \
--header "Authorization: Bearer $token" \ --header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/blobs/$digest" \ "https://registry-1.docker.io/v2/$image/blobs/$digest" |
| jq -r ".config.Labels.\"$label\"" jq -r ".config.Labels.\"$label\""
} }
_get_token() { _get_token() {
local image=$1 local image=$1
curl \ curl \
--silent \ --silent \
"https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" \ "https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" |
| jq -r '.token' jq -r '.token'
} }
_get_digest() { _get_digest() {
@@ -65,8 +65,8 @@ _get_digest() {
--silent \ --silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $token" \ --header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/manifests/$tag" \ "https://registry-1.docker.io/v2/$image/manifests/$tag" |
| jq -r '.config.digest' jq -r '.config.digest'
} }
_get_layers() { _get_layers() {
@@ -77,6 +77,6 @@ _get_layers() {
--silent \ --silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \ --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $token" \ --header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/manifests/$tag" \ "https://registry-1.docker.io/v2/$image/manifests/$tag" |
| jq -r '.layers[].digest' 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,14 @@
echo "▶️ $0 $*" 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 # Checking for the presence of GITHUB_OAUTH_CLIENT_ID
# and GITHUB_OAUTH_CLIENT_SECRET # and GITHUB_OAUTH_CLIENT_SECRET
@@ -60,8 +68,9 @@ if [ "${PRERELEASE}" == "true" ]; then
# shellcheck disable=SC2003 # shellcheck disable=SC2003
MINOR_UNSTABLE=$(expr match "${VERSION}" 'v[0-9]\+\.\([0-9]\+\)') MINOR_UNSTABLE=$(expr match "${VERSION}" 'v[0-9]\+\.\([0-9]\+\)')
if { [ "${MAJOR_STABLE}" -eq "${MAJOR_UNSTABLE}" ] \ if {
&& [ "${MINOR_STABLE}" -ge "${MINOR_UNSTABLE}" ]; [ "${MAJOR_STABLE}" -eq "${MAJOR_UNSTABLE}" ] &&
[ "${MINOR_STABLE}" -ge "${MINOR_UNSTABLE}" ]
} || [ "${MAJOR_STABLE}" -gt "${MAJOR_UNSTABLE}" ]; then } || [ "${MAJOR_STABLE}" -gt "${MAJOR_UNSTABLE}" ]; then
echo "❎ Latest unstable version '${VERSION}' is not higher than the latest stable version '$STABLE_VERSION'." echo "❎ Latest unstable version '${VERSION}' is not higher than the latest stable version '$STABLE_VERSION'."

View File

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

399
build.sh
View File

@@ -1,15 +1,14 @@
#!/bin/bash #!/bin/bash
# Clones the Netbox repository with git from Github and builds the Dockerfile # Clones the NetBox repository with git from Github and builds the Dockerfile
echo "▶️ $0 $*" echo "▶️ $0 $*"
set -e set -e
if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
echo "Usage: ${0} <branch> [--push|--push-only]" echo "Usage: ${0} <branch> [--push]"
echo " branch The branch or tag to build. Required." echo " branch The branch or tag to build. Required."
echo " --push Pushes the built Docker image to the registry." echo " --push Pushes the built Docker image to the registry."
echo " --push-only Only pushes the Docker image to the registry, but does not build it."
echo "" echo ""
echo "You can use the following ENV variables to customize the build:" echo "You can use the following ENV variables to customize the build:"
echo " SRC_ORG Which fork of netbox to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO})." echo " SRC_ORG Which fork of netbox to use (i.e. github.com/\${SRC_ORG}/\${SRC_REPO})."
@@ -30,15 +29,10 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
echo " When <branch>=master: latest" echo " When <branch>=master: latest"
echo " When <branch>=develop: snapshot" echo " When <branch>=develop: snapshot"
echo " Else: same as <branch>" echo " Else: same as <branch>"
echo " DOCKER_REGISTRY The Docker repository's registry (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')" echo " IMAGE_NAMES The names used for the image including the registry"
echo " Used for tagging the image." echo " Used for tagging the image."
echo " Default: docker.io" echo " Default: docker.io/netboxcommunity/netbox"
echo " DOCKER_ORG The Docker repository's organisation (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')" echo " Example: 'docker.io/netboxcommunity/netbox quay.io/netboxcommunity/netbox'"
echo " Used for tagging the image."
echo " Default: netboxcommunity"
echo " DOCKER_REPO The Docker repository's name (i.e. '\${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}'')"
echo " Used for tagging the image."
echo " Default: netbox"
echo " DOCKER_TAG The name of the tag which is applied to the image." 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 " Useful for pushing into another registry than hub.docker.com."
echo " Default: \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:\${TAG}" echo " Default: \${DOCKER_REGISTRY}/\${DOCKER_ORG}/\${DOCKER_REPO}:\${TAG}"
@@ -49,10 +43,25 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
echo " DOCKERFILE The name of Dockerfile to use." echo " DOCKERFILE The name of Dockerfile to use."
echo " Default: Dockerfile" echo " Default: Dockerfile"
echo " DOCKER_FROM The base image to use." echo " DOCKER_FROM The base image to use."
echo " Default: 'alpine:3.13'" echo " Default: 'ubuntu:22.04'"
echo " DOCKER_TARGET A specific target to build." echo " BUILDX_PLATFORMS"
echo " It's currently not possible to pass multiple targets." echo " Specifies the platform(s) to build the image for."
echo " Default: main ldap" echo " Example: 'linux/amd64,linux/arm64'"
echo " Default: 'linux/amd64'"
echo " BUILDX_BUILDER_NAME"
echo " If defined, the image build will be assigned to the given builder."
echo " If you specify this variable, make sure that the builder exists."
echo " If this value is not defined, a new builx builder with the directory name of the"
echo " current directory (i.e. '$(basename "${PWD}")') is created."
echo " Example: 'clever_lovelace'"
echo " Default: undefined"
echo " BUILDX_REMOVE_BUILDER"
echo " If defined (and only if BUILDX_BUILDER_NAME is undefined),"
echo " then the buildx builder created by this script will be removed after use."
echo " This is useful if you build NetBox Docker on an automated system that does"
echo " not manage the builders for you."
echo " Example: 'on'"
echo " Default: undefined"
echo " HTTP_PROXY The proxy to use for http requests." echo " HTTP_PROXY The proxy to use for http requests."
echo " Example: http://proxy.domain.tld:3128" echo " Example: http://proxy.domain.tld:3128"
echo " Default: undefined" echo " Default: undefined"
@@ -95,6 +104,11 @@ if [ "${1}x" == "x" ] || [ "${1}" == "--help" ] || [ "${1}" == "-h" ]; then
fi fi
fi fi
source ./build-functions/gh-functions.sh
IMAGE_NAMES="${IMAGE_NAMES-docker.io/netboxcommunity/netbox}"
IFS=' ' read -ra IMAGE_NAMES <<<"${IMAGE_NAMES}"
### ###
# Enabling dry-run mode # Enabling dry-run mode
### ###
@@ -105,8 +119,10 @@ else
DRY="echo" DRY="echo"
fi fi
gh_echo "::group::⤵️ Fetching the NetBox source code"
### ###
# Variables for fetching the Netbox source # Variables for fetching the NetBox source
### ###
SRC_ORG="${SRC_ORG-netbox-community}" SRC_ORG="${SRC_ORG-netbox-community}"
SRC_REPO="${SRC_REPO-netbox}" SRC_REPO="${SRC_REPO-netbox}"
@@ -115,17 +131,23 @@ URL="${URL-https://github.com/${SRC_ORG}/${SRC_REPO}.git}"
NETBOX_PATH="${NETBOX_PATH-.netbox}" NETBOX_PATH="${NETBOX_PATH-.netbox}"
### ###
# Fetching the Netbox source # Fetching the NetBox source
### ###
if [ "${2}" != "--push-only" ] && [ -z "${SKIP_GIT}" ] ; then if [ "${2}" != "--push-only" ] && [ -z "${SKIP_GIT}" ]; then
echo "🌐 Checking out '${NETBOX_BRANCH}' of Netbox from the url '${URL}' into '${NETBOX_PATH}'" 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 if [ ! -d "${NETBOX_PATH}" ]; then
$DRY git clone -q --depth 10 -b "${NETBOX_BRANCH}" "${URL}" "${NETBOX_PATH}" $DRY git clone -q --depth 10 -b "${NETBOX_BRANCH}" "${URL}" "${NETBOX_PATH}"
fi fi
( (
$DRY cd "${NETBOX_PATH}" $DRY cd "${NETBOX_PATH}"
# shellcheck disable=SC2030
if [ -n "${HTTP_PROXY}" ]; then if [ -n "${HTTP_PROXY}" ]; then
git config http.proxy "${HTTP_PROXY}" git config http.proxy "${HTTP_PROXY}"
fi fi
@@ -135,9 +157,12 @@ if [ "${2}" != "--push-only" ] && [ -z "${SKIP_GIT}" ] ; then
$DRY git checkout -qf FETCH_HEAD $DRY git checkout -qf FETCH_HEAD
$DRY git prune $DRY git prune
) )
echo "✅ Checked out Netbox" echo "✅ Checked out NetBox"
fi fi
gh_echo "::endgroup::"
gh_echo "::group::🧮 Calculating Values"
### ###
# Determining the value for DOCKERFILE # Determining the value for DOCKERFILE
# and checking whether it exists # and checking whether it exists
@@ -157,7 +182,7 @@ fi
# Determining the value for DOCKER_FROM # Determining the value for DOCKER_FROM
### ###
if [ -z "$DOCKER_FROM" ]; then if [ -z "$DOCKER_FROM" ]; then
DOCKER_FROM="alpine:3.13" DOCKER_FROM="ubuntu:22.04"
fi fi
### ###
@@ -165,7 +190,7 @@ fi
### ###
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M+00:00')" BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M+00:00')"
if [ -d ".git" ]; then if [ -d ".git" ] && [ -z "${SKIP_GIT}" ]; then
GIT_REF="$(git rev-parse HEAD)" GIT_REF="$(git rev-parse HEAD)"
fi fi
@@ -173,10 +198,19 @@ fi
PROJECT_VERSION="${PROJECT_VERSION-$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' VERSION)}" PROJECT_VERSION="${PROJECT_VERSION-$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' VERSION)}"
# Get the Git information from the netbox directory # Get the Git information from the netbox directory
if [ -d "${NETBOX_PATH}/.git" ]; then if [ -d "${NETBOX_PATH}/.git" ] && [ -z "${SKIP_GIT}" ]; then
NETBOX_GIT_REF=$(cd "${NETBOX_PATH}"; git rev-parse HEAD) NETBOX_GIT_REF=$(
NETBOX_GIT_BRANCH=$(cd "${NETBOX_PATH}"; git rev-parse --abbrev-ref HEAD) cd "${NETBOX_PATH}"
NETBOX_GIT_URL=$(cd "${NETBOX_PATH}"; git remote get-url origin) 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 fi
### ###
@@ -186,92 +220,86 @@ DOCKER_REGISTRY="${DOCKER_REGISTRY-docker.io}"
DOCKER_ORG="${DOCKER_ORG-netboxcommunity}" DOCKER_ORG="${DOCKER_ORG-netboxcommunity}"
DOCKER_REPO="${DOCKER_REPO-netbox}" DOCKER_REPO="${DOCKER_REPO-netbox}"
case "${NETBOX_BRANCH}" in case "${NETBOX_BRANCH}" in
master) master)
TAG="${TAG-latest}";; TAG="${TAG-latest}"
develop) ;;
TAG="${TAG-snapshot}";; develop)
*) TAG="${TAG-snapshot}"
TAG="${TAG-$NETBOX_BRANCH}";; ;;
*)
TAG="${TAG-$NETBOX_BRANCH}"
;;
esac esac
### ###
# Determine targets to build # composing the final TARGET_DOCKER_TAG
### ###
DEFAULT_DOCKER_TARGETS=("main" "ldap") TARGET_DOCKER_TAG="${DOCKER_TAG-${TAG}}"
DOCKER_TARGETS=( "${DOCKER_TARGET:-"${DEFAULT_DOCKER_TARGETS[@]}"}") TARGET_DOCKER_TAG_PROJECT="${TARGET_DOCKER_TAG}-${PROJECT_VERSION}"
echo "🏭 Building the following targets:" "${DOCKER_TARGETS[@]}"
### ###
# Build each target # 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
### ###
export DOCKER_BUILDKIT=${DOCKER_BUILDKIT-1} if [[ "${TAG}" =~ ^v([0-9]+)\.([0-9]+)\.[0-9]+$ ]]; then
for DOCKER_TARGET in "${DOCKER_TARGETS[@]}"; do
echo "🏗 Building the target '${DOCKER_TARGET}'"
###
# composing the final TARGET_DOCKER_TAG
###
TARGET_DOCKER_TAG="${DOCKER_TAG-${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:${TAG}}"
if [ "${DOCKER_TARGET}" != "main" ]; then
TARGET_DOCKER_TAG="${TARGET_DOCKER_TAG}-${DOCKER_TARGET}"
fi
if [ -n "${GH_ACTION}" ]; then
echo "FINAL_DOCKER_TAG=${TARGET_DOCKER_TAG}" >> $GITHUB_ENV
echo "::set-output name=skipped::false"
fi
###
# 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]} MAJOR=${BASH_REMATCH[1]}
MINOR=${BASH_REMATCH[2]} MINOR=${BASH_REMATCH[2]}
TARGET_DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:v${MAJOR}.${MINOR}}" TARGET_DOCKER_SHORT_TAG="${DOCKER_SHORT_TAG-v${MAJOR}.${MINOR}}"
TARGET_DOCKER_LATEST_TAG="${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_REPO}:latest" 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 [ "${DOCKER_TARGET}" != "main" ]; then IMAGE_NAME_TAGS=()
TARGET_DOCKER_SHORT_TAG="${TARGET_DOCKER_SHORT_TAG}-${DOCKER_TARGET}" for IMAGE_NAME in "${IMAGE_NAMES[@]}"; do
TARGET_DOCKER_LATEST_TAG="${TARGET_DOCKER_LATEST_TAG}-${DOCKER_TARGET}" IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG}")
fi IMAGE_NAME_TAGS+=("${IMAGE_NAME}:${TARGET_DOCKER_TAG_PROJECT}")
fi 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]}"
# Proceeding to buils stage, except if `--push-only` is passed
### ###
if [ "${2}" != "--push-only" ] ; then # Checking if the build is necessary,
### # meaning build only if one of those values changed:
# Checking if the build is necessary, # - base image digest
# meaning build only if one of those values changed: # - netbox git ref (Label: netbox.git-ref)
# - Python base image digest (Label: PYTHON_BASE_DIGEST) # - netbox-docker git ref (Label: org.opencontainers.image.revision)
# - netbox git ref (Label: NETBOX_GIT_REF) ###
# - netbox-docker git ref (Label: org.label-schema.vcs-ref) # Load information from registry (only for docker.io)
### SHOULD_BUILD="false"
# Load information from registry (only for docker.io) BUILD_REASON=""
SHOULD_BUILD="false" if [ -z "${GH_ACTION}" ]; then
BUILD_REASON=""
if [ -z "${GH_ACTION}" ]; then
# Asuming non Github builds should always proceed # Asuming non Github builds should always proceed
SHOULD_BUILD="true" SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} interactive" BUILD_REASON="${BUILD_REASON} interactive"
elif [ "$DOCKER_REGISTRY" = "docker.io" ]; then elif [[ "${IMAGE_NAME_TAGS[0]}" = docker.io* ]]; then
source ./build-functions/get-public-image-config.sh source ./build-functions/get-public-image-config.sh
IFS=':' read -ra DOCKER_FROM_SPLIT <<< "${DOCKER_FROM}" IFS=':' read -ra DOCKER_FROM_SPLIT <<<"${DOCKER_FROM}"
if ! [[ ${DOCKER_FROM_SPLIT[0]} =~ .*/.* ]]; then if ! [[ ${DOCKER_FROM_SPLIT[0]} =~ .*/.* ]]; then
# Need to use "library/..." for images the have no two part name # Need to use "library/..." for images the have no two part name
DOCKER_FROM_SPLIT[0]="library/${DOCKER_FROM_SPLIT[0]}" DOCKER_FROM_SPLIT[0]="library/${DOCKER_FROM_SPLIT[0]}"
fi fi
PYTHON_LAST_LAYER=$(get_image_last_layer "${DOCKER_FROM_SPLIT[0]}" "${DOCKER_FROM_SPLIT[1]}") IFS='/' read -ra ORG_REPO <<<"${IMAGE_NAMES[0]}"
mapfile -t IMAGES_LAYERS_OLD < <(get_image_layers "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}") echo "Checking labels for '${ORG_REPO[1]}' and '${ORG_REPO[2]}'"
NETBOX_GIT_REF_OLD=$(get_image_label NETBOX_GIT_REF "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}") BASE_LAST_LAYER=$(get_image_last_layer "${DOCKER_FROM_SPLIT[0]}" "${DOCKER_FROM_SPLIT[1]}")
GIT_REF_OLD=$(get_image_label org.label-schema.vcs-ref "${DOCKER_ORG}"/"${DOCKER_REPO}" "${TAG}") 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}")
if ! printf '%s\n' "${IMAGES_LAYERS_OLD[@]}" | grep -q -P "^${PYTHON_LAST_LAYER}\$"; then if ! printf '%s\n' "${IMAGES_LAYERS_OLD[@]}" | grep -q -P "^${BASE_LAST_LAYER}\$"; then
SHOULD_BUILD="true" SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} alpine" BUILD_REASON="${BUILD_REASON} debian"
fi fi
if [ "${NETBOX_GIT_REF}" != "${NETBOX_GIT_REF_OLD}" ]; then if [ "${NETBOX_GIT_REF}" != "${NETBOX_GIT_REF_OLD}" ]; then
SHOULD_BUILD="true" SHOULD_BUILD="true"
@@ -281,92 +309,117 @@ for DOCKER_TARGET in "${DOCKER_TARGETS[@]}"; do
SHOULD_BUILD="true" SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} netbox-docker" BUILD_REASON="${BUILD_REASON} netbox-docker"
fi fi
else else
SHOULD_BUILD="true" SHOULD_BUILD="true"
BUILD_REASON="${BUILD_REASON} no-check" BUILD_REASON="${BUILD_REASON} no-check"
fi fi
###
# Composing all arguments for `docker build`
###
DOCKER_BUILD_ARGS=(
--pull
--target "${DOCKER_TARGET}"
-f "${DOCKERFILE}"
-t "${TARGET_DOCKER_TAG}"
)
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then
DOCKER_BUILD_ARGS+=( -t "${TARGET_DOCKER_SHORT_TAG}" )
DOCKER_BUILD_ARGS+=( -t "${TARGET_DOCKER_LATEST_TAG}" )
fi
# --label if [ "${SHOULD_BUILD}" != "true" ]; then
DOCKER_BUILD_ARGS+=(
--label "ORIGINAL_TAG=${TARGET_DOCKER_TAG}"
--label "org.label-schema.build-date=${BUILD_DATE}"
--label "org.opencontainers.image.created=${BUILD_DATE}"
--label "org.label-schema.version=${PROJECT_VERSION}"
--label "org.opencontainers.image.version=${PROJECT_VERSION}"
)
if [ -d ".git" ]; then
DOCKER_BUILD_ARGS+=(
--label "org.label-schema.vcs-ref=${GIT_REF}"
--label "org.opencontainers.image.revision=${GIT_REF}"
)
fi
if [ -d "${NETBOX_PATH}/.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 "BUILD_REASON=${BUILD_REASON}" )
fi
# --build-arg
DOCKER_BUILD_ARGS+=( --build-arg "NETBOX_PATH=${NETBOX_PATH}" )
if [ -n "${DOCKER_FROM}" ]; then
DOCKER_BUILD_ARGS+=( --build-arg "FROM=${DOCKER_FROM}" )
fi
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
###
# Building the docker image
###
if [ "${SHOULD_BUILD}" == "true" ]; then
echo "🐳 Building the Docker image '${TARGET_DOCKER_TAG}'."
echo " Build reason set to: ${BUILD_REASON}"
$DRY docker build "${DOCKER_BUILD_ARGS[@]}" .
echo "✅ Finished building the Docker images '${TARGET_DOCKER_TAG}'"
echo "🔎 Inspecting labels on '${TARGET_DOCKER_TAG}'"
$DRY docker inspect "${TARGET_DOCKER_TAG}" --format "{{json .Config.Labels}}"
else
echo "Build skipped because sources didn't change" echo "Build skipped because sources didn't change"
echo "::set-output name=skipped::true" echo "::set-output name=skipped::true"
fi exit 0 # Nothing to do -> exit
fi else
gh_echo "::set-output name=skipped::false"
fi
gh_echo "::endgroup::"
### ###
# Pushing the docker images if either `--push` or `--push-only` are passed # Build the image
### ###
if [ "${2}" == "--push" ] || [ "${2}" == "--push-only" ] ; then gh_echo "::group::🏗 Building the image"
source ./build-functions/docker-functions.sh ###
push_image_to_registry "${TARGET_DOCKER_TAG}" # Composing all arguments for `docker build`
###
if [ -n "${TARGET_DOCKER_SHORT_TAG}" ]; then DOCKER_BUILD_ARGS=(
push_image_to_registry "${TARGET_DOCKER_SHORT_TAG}" --pull
push_image_to_registry "${TARGET_DOCKER_LATEST_TAG}" --target main
fi -f "${DOCKERFILE}"
fi )
for IMAGE_NAME in "${IMAGE_NAME_TAGS[@]}"; do
DOCKER_BUILD_ARGS+=(-t "${IMAGE_NAME}")
done 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
# --build-arg
DOCKER_BUILD_ARGS+=(--build-arg "NETBOX_PATH=${NETBOX_PATH}")
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

@@ -5,9 +5,8 @@
#### ####
import re import re
from os.path import dirname, abspath, join
from os import environ from os import environ
from os.path import abspath, dirname, join
# For reference see https://netbox.readthedocs.io/en/stable/configuration/ # For reference see https://netbox.readthedocs.io/en/stable/configuration/
# Based on https://github.com/netbox-community/netbox/blob/master/netbox/netbox/configuration.example.py # Based on https://github.com/netbox-community/netbox/blob/master/netbox/netbox/configuration.example.py
@@ -49,6 +48,8 @@ DATABASE = {
# Database connection SSLMODE # Database connection SSLMODE
'CONN_MAX_AGE': int(environ.get('DB_CONN_MAX_AGE', '300')), 'CONN_MAX_AGE': int(environ.get('DB_CONN_MAX_AGE', '300')),
# Max database connection age # Max database connection age
'DISABLE_SERVER_SIDE_CURSORS': environ.get('DB_DISABLE_SERVER_SIDE_CURSORS', 'False').lower() == 'true',
# Disable the use of server-side cursors transaction pooling
} }
# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate # Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate
@@ -61,6 +62,7 @@ REDIS = {
'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')), 'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')),
'DATABASE': int(environ.get('REDIS_DATABASE', 0)), 'DATABASE': int(environ.get('REDIS_DATABASE', 0)),
'SSL': environ.get('REDIS_SSL', 'False').lower() == 'true', 'SSL': environ.get('REDIS_SSL', 'False').lower() == 'true',
'INSECURE_SKIP_TLS_VERIFY': environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False').lower() == 'true',
}, },
'caching': { 'caching': {
'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')), 'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')),
@@ -68,6 +70,7 @@ REDIS = {
'PASSWORD': _read_secret('redis_cache_password', environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))), 'PASSWORD': _read_secret('redis_cache_password', environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))),
'DATABASE': int(environ.get('REDIS_CACHE_DATABASE', 1)), 'DATABASE': int(environ.get('REDIS_CACHE_DATABASE', 1)),
'SSL': environ.get('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False')).lower() == 'true', 'SSL': environ.get('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False')).lower() == 'true',
'INSECURE_SKIP_TLS_VERIFY': environ.get('REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY', environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False')).lower() == 'true',
}, },
} }
@@ -107,9 +110,6 @@ BANNER_LOGIN = environ.get('BANNER_LOGIN', '')
# BASE_PATH = 'netbox/' # BASE_PATH = 'netbox/'
BASE_PATH = environ.get('BASE_PATH', '') BASE_PATH = environ.get('BASE_PATH', '')
# Cache timeout in seconds. Set to 0 to dissable caching. Defaults to 900 (15 minutes)
CACHE_TIMEOUT = int(environ.get('CACHE_TIMEOUT', 900))
# Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90) # Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90)
CHANGELOG_RETENTION = int(environ.get('CHANGELOG_RETENTION', 90)) CHANGELOG_RETENTION = int(environ.get('CHANGELOG_RETENTION', 90))
@@ -120,6 +120,11 @@ CORS_ORIGIN_ALLOW_ALL = environ.get('CORS_ORIGIN_ALLOW_ALL', 'False').lower() ==
CORS_ORIGIN_WHITELIST = list(filter(None, environ.get('CORS_ORIGIN_WHITELIST', 'https://localhost').split(' '))) CORS_ORIGIN_WHITELIST = list(filter(None, environ.get('CORS_ORIGIN_WHITELIST', 'https://localhost').split(' ')))
CORS_ORIGIN_REGEX_WHITELIST = [re.compile(r) for r in list(filter(None, environ.get('CORS_ORIGIN_REGEX_WHITELIST', '').split(' ')))] CORS_ORIGIN_REGEX_WHITELIST = [re.compile(r) for r in list(filter(None, environ.get('CORS_ORIGIN_REGEX_WHITELIST', '').split(' ')))]
# 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 = list(filter(None, environ.get('CSRF_TRUSTED_ORIGINS', '').split(' ')))
# Set to True to enable server debugging. WARNING: Debugging introduces a substantial performance penalty and may reveal # 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 # sensitive information about your installation. Only enable debugging while performing testing. Never enable debugging
# on a production system. # on a production system.
@@ -147,6 +152,9 @@ ENFORCE_GLOBAL_UNIQUE = environ.get('ENFORCE_GLOBAL_UNIQUE', 'False').lower() ==
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models. # by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
EXEMPT_VIEW_PERMISSIONS = list(filter(None, environ.get('EXEMPT_VIEW_PERMISSIONS', '').split(' '))) EXEMPT_VIEW_PERMISSIONS = list(filter(None, environ.get('EXEMPT_VIEW_PERMISSIONS', '').split(' ')))
# Enable GraphQL API.
GRAPHQL_ENABLED = environ.get('GRAPHQL_ENABLED', 'True').lower() == 'true'
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs: # Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
# https://docs.djangoproject.com/en/stable/topics/logging/ # https://docs.djangoproject.com/en/stable/topics/logging/
LOGGING = {} LOGGING = {}
@@ -162,6 +170,9 @@ LOGIN_TIMEOUT = int(environ.get('LOGIN_TIMEOUT', 1209600))
# Setting this to True will display a "maintenance mode" banner at the top of every page. # Setting this to True will display a "maintenance mode" banner at the top of every page.
MAINTENANCE_MODE = environ.get('MAINTENANCE_MODE', 'False').lower() == 'true' MAINTENANCE_MODE = environ.get('MAINTENANCE_MODE', 'False').lower() == 'true'
# Maps provider
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. # 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 # "?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". # all objects by specifying "?limit=0".
@@ -211,9 +222,6 @@ REMOTE_AUTH_HEADER = environ.get('REMOTE_AUTH_HEADER', 'HTTP_REMOTE_USER')
REMOTE_AUTH_AUTO_CREATE_USER = environ.get('REMOTE_AUTH_AUTO_CREATE_USER', 'True').lower() == 'true' REMOTE_AUTH_AUTO_CREATE_USER = environ.get('REMOTE_AUTH_AUTO_CREATE_USER', 'True').lower() == 'true'
REMOTE_AUTH_DEFAULT_GROUPS = list(filter(None, environ.get('REMOTE_AUTH_DEFAULT_GROUPS', '').split(' '))) REMOTE_AUTH_DEFAULT_GROUPS = list(filter(None, environ.get('REMOTE_AUTH_DEFAULT_GROUPS', '').split(' ')))
# This determines how often the GitHub API is called to check the latest release of NetBox. Must be at least 1 hour.
RELEASE_CHECK_TIMEOUT = int(environ.get('RELEASE_CHECK_TIMEOUT', 24 * 3600))
# This repository is used to check whether there is a new release of NetBox available. Set to None to disable the # 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. # version check or use the URL below to check for release in the official NetBox repository.
# https://api.github.com/repos/netbox-community/netbox/releases # https://api.github.com/repos/netbox-community/netbox/releases

View File

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

View File

@@ -1,9 +1,10 @@
import ldap
from django_auth_ldap.config import LDAPSearch
from importlib import import_module from importlib import import_module
from os import environ from os import environ
import ldap
from django_auth_ldap.config import LDAPSearch
# Read secret from file # Read secret from file
def _read_secret(secret_name, default=None): def _read_secret(secret_name, default=None):
try: try:
@@ -47,9 +48,11 @@ LDAP_IGNORE_CERT_ERRORS = environ.get('LDAP_IGNORE_CERT_ERRORS', 'False').lower(
AUTH_LDAP_USER_SEARCH_BASEDN = environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '') 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_ATTR = environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName')
AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER_SEARCH_BASEDN, AUTH_LDAP_USER_SEARCH = LDAPSearch(
AUTH_LDAP_USER_SEARCH_BASEDN,
ldap.SCOPE_SUBTREE, ldap.SCOPE_SUBTREE,
"(" + AUTH_LDAP_USER_SEARCH_ATTR + "=%(user)s)") "(" + 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 # This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group
# heirarchy. # heirarchy.

55
configuration/logging.py Normal file
View File

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

13
configuration/plugins.py Normal file
View File

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

View File

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

View File

@@ -9,28 +9,25 @@ services:
env_file: env/netbox.env env_file: env/netbox.env
environment: environment:
SKIP_STARTUP_SCRIPTS: ${SKIP_STARTUP_SCRIPTS-false} SKIP_STARTUP_SCRIPTS: ${SKIP_STARTUP_SCRIPTS-false}
user: '101' user: 'unit:root'
volumes: volumes:
- ./startup_scripts:/opt/netbox/startup_scripts:z,ro
- ./${INITIALIZERS_DIR-initializers}:/opt/netbox/initializers:z,ro
- ./configuration:/etc/netbox/config:z,ro - ./configuration:/etc/netbox/config:z,ro
- ./test-configuration/logging.py:/etc/netbox/config/logging.py:z,ro
- ./reports:/etc/netbox/reports:z,ro - ./reports:/etc/netbox/reports:z,ro
- ./scripts:/etc/netbox/scripts:z,ro - ./scripts:/etc/netbox/scripts:z,ro
- netbox-media-files:/opt/netbox/netbox/media:z - netbox-media-files:/opt/netbox/netbox/media:z
ports:
- 8080
postgres: postgres:
image: postgres:12-alpine image: postgres:14-alpine
env_file: env/postgres.env env_file: env/postgres.env
redis: redis:
image: redis:6-alpine image: redis:7-alpine
command: command:
- sh - sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env - -c # this is to evaluate the $REDIS_PASSWORD from the env
- redis-server --appendonly yes --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
env_file: env/redis.env env_file: env/redis.env
redis-cache: redis-cache:
image: redis:6-alpine image: redis:7-alpine
command: command:
- sh - sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env - -c # this is to evaluate the $REDIS_PASSWORD from the env

View File

@@ -1,44 +1,46 @@
version: '3.4' version: '3.4'
services: services:
netbox: &netbox netbox: &netbox
image: netboxcommunity/netbox:${VERSION-latest} image: netboxcommunity/netbox:${VERSION-v3.3-2.2.0}
depends_on: depends_on:
- postgres - postgres
- redis - redis
- redis-cache - redis-cache
- netbox-worker - netbox-worker
env_file: env/netbox.env env_file: env/netbox.env
user: '101' user: 'unit:root'
volumes: volumes:
- ./startup_scripts:/opt/netbox/startup_scripts:z,ro
- ./initializers:/opt/netbox/initializers:z,ro
- ./configuration:/etc/netbox/config:z,ro - ./configuration:/etc/netbox/config:z,ro
- ./reports:/etc/netbox/reports:z,ro - ./reports:/etc/netbox/reports:z,ro
- ./scripts:/etc/netbox/scripts:z,ro - ./scripts:/etc/netbox/scripts:z,ro
- netbox-media-files:/opt/netbox/netbox/media:z - netbox-media-files:/opt/netbox/netbox/media:z
ports:
- "8080"
netbox-worker: netbox-worker:
<<: *netbox <<: *netbox
depends_on: depends_on:
- redis - redis
entrypoint: - postgres
command:
- /opt/netbox/venv/bin/python - /opt/netbox/venv/bin/python
- /opt/netbox/netbox/manage.py - /opt/netbox/netbox/manage.py
command:
- rqworker - rqworker
ports: [] netbox-housekeeping:
<<: *netbox
depends_on:
- redis
- postgres
command:
- /opt/netbox/housekeeping.sh
# postgres # postgres
postgres: postgres:
image: postgres:12-alpine image: postgres:14-alpine
env_file: env/postgres.env env_file: env/postgres.env
volumes: volumes:
- netbox-postgres-data:/var/lib/postgresql/data - netbox-postgres-data:/var/lib/postgresql/data
# redis # redis
redis: redis:
image: redis:6-alpine image: redis:7-alpine
command: command:
- sh - sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env - -c # this is to evaluate the $REDIS_PASSWORD from the env
@@ -47,7 +49,7 @@ services:
volumes: volumes:
- netbox-redis-data:/data - netbox-redis-data:/data
redis-cache: redis-cache:
image: redis:6-alpine image: redis:7-alpine
command: command:
- sh - sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env - -c # this is to evaluate the $REDIS_PASSWORD from the env

View File

@@ -4,10 +4,10 @@
# #
# They can be imported by other code (see `ldap_config.py` for an example). # They can be imported by other code (see `ldap_config.py` for an example).
from os.path import abspath, isfile
from os import scandir
import importlib.util import importlib.util
import sys import sys
from os import scandir
from os.path import abspath, isfile
def _filename(f): def _filename(f):
@@ -15,7 +15,7 @@ def _filename(f):
def _import(module_name, path, loaded_configurations): def _import(module_name, path, loaded_configurations):
spec = importlib.util.spec_from_file_location('', path) spec = importlib.util.spec_from_file_location("", path)
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
sys.modules[module_name] = module sys.modules[module_name] = module
@@ -28,9 +28,9 @@ def _import(module_name, path, loaded_configurations):
def read_configurations(config_module, config_dir, main_config): def read_configurations(config_module, config_dir, main_config):
loaded_configurations = [] loaded_configurations = []
main_config_path = abspath(f'{config_dir}/{main_config}.py') main_config_path = abspath(f"{config_dir}/{main_config}.py")
if isfile(main_config_path): if isfile(main_config_path):
_import(f'{config_module}.{main_config}', main_config_path, loaded_configurations) _import(f"{config_module}.{main_config}", main_config_path, loaded_configurations)
else: else:
print(f"⚠️ Main configuration '{main_config_path}' not found.") print(f"⚠️ Main configuration '{main_config_path}' not found.")
@@ -39,13 +39,16 @@ def read_configurations(config_module, config_dir, main_config):
if not f.is_file(): if not f.is_file():
continue continue
if f.name.startswith('__'): if f.name.startswith("__"):
continue continue
if not f.name.endswith('.py'): if not f.name.endswith(".py"):
continue continue
if f.name == f'{config_dir}.py': if f.name == f"{main_config}.py":
continue
if f.name == f"{config_dir}.py":
continue continue
module_name = f"{config_module}.{f.name[:-len('.py')]}".replace(".", "_") module_name = f"{config_module}.{f.name[:-len('.py')]}".replace(".", "_")
@@ -66,9 +69,10 @@ def read_configurations(config_module, config_dir, main_config):
_loaded_configurations = read_configurations( _loaded_configurations = read_configurations(
config_dir = '/etc/netbox/config/', config_dir="/etc/netbox/config/",
config_module = 'netbox.configuration', config_module="netbox.configuration",
main_config = 'configuration') main_config="configuration",
)
def __getattr__(name): def __getattr__(name):
@@ -78,3 +82,10 @@ def __getattr__(name):
except: except:
pass pass
raise AttributeError raise AttributeError
def __dir__():
names = []
for config in _loaded_configurations:
names.extend(config.__dir__())
return names

View File

@@ -1,28 +1,52 @@
#!/bin/bash #!/bin/bash
# Runs on every start of the Netbox Docker container # Runs on every start of the NetBox Docker container
# Stop when an error occures # Stop when an error occures
set -e set -e
# Allows Netbox to be run as non-root users # Allows NetBox to be run as non-root users
umask 002 umask 002
# Load correct Python3 env # Load correct Python3 env
# shellcheck disable=SC1091
source /opt/netbox/venv/bin/activate source /opt/netbox/venv/bin/activate
# Try to connect to the DB # Try to connect to the DB
DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3} DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3}
MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30} MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30}
CUR_DB_WAIT_TIME=0 CUR_DB_WAIT_TIME=0
while ! ./manage.py migrate 2>&1 && [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do 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)" echo "⏳ Waiting on DB... (${CUR_DB_WAIT_TIME}s / ${MAX_DB_WAIT_TIME}s)"
sleep "${DB_WAIT_TIMEOUT}" sleep "${DB_WAIT_TIMEOUT}"
CUR_DB_WAIT_TIME=$(( CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT )) CUR_DB_WAIT_TIME=$((CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT))
done done
if [ "${CUR_DB_WAIT_TIME}" -ge "${MAX_DB_WAIT_TIME}" ]; then 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." echo "❌ Waited ${MAX_DB_WAIT_TIME}s or more for the DB to become ready."
exit 1 exit 1
fi 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 # Create Superuser if required
if [ "$SKIP_SUPERUSER" == "true" ]; then if [ "$SKIP_SUPERUSER" == "true" ]; then
@@ -35,17 +59,17 @@ else
SUPERUSER_EMAIL='admin@example.com' SUPERUSER_EMAIL='admin@example.com'
fi fi
if [ -f "/run/secrets/superuser_password" ]; then if [ -f "/run/secrets/superuser_password" ]; then
SUPERUSER_PASSWORD="$(< /run/secrets/superuser_password)" SUPERUSER_PASSWORD="$(</run/secrets/superuser_password)"
elif [ -z ${SUPERUSER_PASSWORD+x} ]; then elif [ -z ${SUPERUSER_PASSWORD+x} ]; then
SUPERUSER_PASSWORD='admin' SUPERUSER_PASSWORD='admin'
fi fi
if [ -f "/run/secrets/superuser_api_token" ]; then if [ -f "/run/secrets/superuser_api_token" ]; then
SUPERUSER_API_TOKEN="$(< /run/secrets/superuser_api_token)" SUPERUSER_API_TOKEN="$(</run/secrets/superuser_api_token)"
elif [ -z ${SUPERUSER_API_TOKEN+x} ]; then elif [ -z ${SUPERUSER_API_TOKEN+x} ]; then
SUPERUSER_API_TOKEN='0123456789abcdef0123456789abcdef01234567' SUPERUSER_API_TOKEN='0123456789abcdef0123456789abcdef01234567'
fi fi
./manage.py shell --interface python << END ./manage.py shell --interface python <<END
from django.contrib.auth.models import User from django.contrib.auth.models import User
from users.models import Token from users.models import Token
if not User.objects.filter(username='${SUPERUSER_NAME}'): if not User.objects.filter(username='${SUPERUSER_NAME}'):
@@ -56,17 +80,17 @@ END
echo "💡 Superuser Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}" echo "💡 Superuser Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}"
fi fi
# Run the startup scripts (and initializers) # Print warning if startup scripts (and initializers) would've been run # Remove for next release
if [ "$SKIP_STARTUP_SCRIPTS" == "true" ]; then if [ "$SKIP_STARTUP_SCRIPTS" == "true" ]; then
echo "↩️ Skipping startup scripts" # Nothing to do
echo "" # Empty block not allowed
else else
echo "import runpy; runpy.run_path('../startup_scripts')" | ./manage.py shell --interface python echo "⚠️⚠️⚠️ WARNING: The initializers have been moved to a plugin. See release notes."
echo "⚠️⚠️⚠️ Set environment variable 'SKIP_STARTUP_SCRIPTS' to 'true' to remove this warning."
fi fi
echo "✅ Initialisation is done." echo "✅ Initialisation is done."
# Launch whatever is passed by docker # Launch whatever is passed by docker
# (i.e. the RUN instruction in the Dockerfile) # (i.e. the RUN instruction in the Dockerfile)
# exec "$@"
# shellcheck disable=SC2068
exec $@

8
docker/housekeeping.sh Executable file
View File

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

View File

@@ -7,7 +7,7 @@ load_configuration() {
MAX_WAIT=10 MAX_WAIT=10
WAIT_COUNT=0 WAIT_COUNT=0
while [ ! -S $UNIT_SOCKET ]; do while [ ! -S $UNIT_SOCKET ]; do
if [ $WAIT_COUNT -gte $MAX_WAIT ]; then if [ $WAIT_COUNT -ge $MAX_WAIT ]; then
echo "⚠️ No control socket found; configuration will not be loaded." echo "⚠️ No control socket found; configuration will not be loaded."
return 1 return 1
fi fi
@@ -22,9 +22,10 @@ load_configuration() {
# this curl call will get a reply once unit is fully launched # 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/ curl --silent --output /dev/null --request GET --unix-socket $UNIT_SOCKET http://localhost/
echo "⚙️ Applying configuration from $UNIT_CONFIG"; echo "⚙️ Applying configuration from $UNIT_CONFIG"
RESP_CODE=$(curl \ RESP_CODE=$(
curl \
--silent \ --silent \
--output /dev/null \ --output /dev/null \
--write-out '%{http_code}' \ --write-out '%{http_code}' \
@@ -50,4 +51,6 @@ exec unitd \
--pid /opt/unit/unit.pid \ --pid /opt/unit/unit.pid \
--log /dev/stdout \ --log /dev/stdout \
--state /opt/unit/state/ \ --state /opt/unit/state/ \
--tmp /opt/unit/tmp/ --tmp /opt/unit/tmp/ \
--user unit \
--group root

View File

@@ -1,9 +1,10 @@
from .configuration import read_configurations from .configuration import read_configurations
_loaded_configurations = read_configurations( _loaded_configurations = read_configurations(
config_dir = '/etc/netbox/config/ldap/', config_dir="/etc/netbox/config/ldap/",
config_module = 'netbox.configuration.ldap', config_module="netbox.configuration.ldap",
main_config = 'ldap_config') main_config="ldap_config",
)
def __getattr__(name): def __getattr__(name):
@@ -14,6 +15,7 @@ def __getattr__(name):
pass pass
raise AttributeError raise AttributeError
def __dir__(): def __dir__():
names = [] names = []
for config in _loaded_configurations: for config in _loaded_configurations:

View File

@@ -11,7 +11,7 @@
"uri": "/static/*" "uri": "/static/*"
}, },
"action": { "action": {
"share": "/opt/netbox/netbox" "share": "/opt/netbox/netbox${uri}"
} }
}, },

45
env/netbox.env vendored
View File

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

4
env/postgres.env vendored
View File

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

View File

@@ -1,7 +0,0 @@
# - prefix: 10.0.0.0/16
# rir: RFC1918
# tenant: tenant1
# - prefix: fd00:ccdd::/32
# rir: RFC4193 ULA
# - prefix: 2001:db8::/32
# rir: RFC3849

View File

@@ -1,6 +0,0 @@
# - name: VPLS
# slug: vpls
# - name: MPLS
# slug: mpls
# - name: Internet
# slug: internet

View File

@@ -1,7 +0,0 @@
# - cid: Circuit_ID-1
# provider: Provider1
# type: Internet
# tenant: tenant1
# - cid: Circuit_ID-2
# provider: Provider2
# type: MPLS

View File

@@ -1,4 +0,0 @@
# - name: Group 1
# slug: group-1
# - name: Group 2
# slug: group-2

View File

@@ -1,2 +0,0 @@
# - name: Hyper-V
# slug: hyper-v

View File

@@ -1,7 +0,0 @@
# - name: cluster1
# type: Hyper-V
# group: Group 1
# tenant: tenant1
# - name: cluster2
# type: Hyper-V
# site: SING 1

View File

@@ -1,93 +0,0 @@
## Possible Choices:
## type:
## - text
## - integer
## - boolean
## - date
## - url
## - select
## filter_logic:
## - disabled
## - loose
## - exact
##
## Examples:
# 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
# select_field:
# type: select
# label: Choose between items
# required: false
# filter_logic: exact
# weight: 30
# default: First Item
# on_objects:
# - dcim.models.Device
# choices:
# - First Item
# - Second Item
# - Third Item
# - Fifth Item
# - Fourth Item
# select_field_legacy_format:
# type: select
# label: Choose between items
# required: false
# filter_logic: loose
# weight: 30
# on_objects:
# - dcim.models.Device
# choices:
# - value: A # this is the deprecated format.
# - value: B # we only use it for the tests.
# - value: C # please see above for the new format.
# - value: "D like deprecated"
# weight: 999
# - value: E
# boolean_field:
# type: boolean
# label: Yes Or No?
# required: true
# filter_logic: loose
# default: "false" # important: put "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,18 +0,0 @@
## Possible Choices:
## type:
## - virtual
## - lag
## - 1000base-t
## - ... and many more. See for yourself:
## https://github.com/netbox-community/netbox/blob/295d4f0394b431351c0cb2c3ecc791df68c6c2fb/netbox/dcim/choices.py#L510
##
## Examples:
# - device: server01
# enabled: true
# type: virtual
# name: to-server02
# - device: server02
# enabled: true
# type: virtual
# name: to-server01

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_field_data:
# text_field: Description
# - model: Model 2
# manufacturer: Manufacturer 1
# slug: model-2
# custom_field_data:
# text_field: Description
# - model: Model 3
# manufacturer: Manufacturer 1
# slug: model-3
# is_full_depth: false
# u_height: 0
# custom_field_data:
# text_field: Description
# - model: Other
# manufacturer: No Name
# slug: other
# custom_field_data:
# text_field: Description

View File

@@ -1,44 +0,0 @@
## Possible Choices:
## face:
## - front
## - rear
## status:
## - offline
## - active
## - planned
## - staged
## - failed
## - inventory
## - decommissioning
##
## Examples:
# - name: server01
# device_role: server
# device_type: Other
# site: AMS 1
# rack: rack-01
# face: front
# position: 1
# custom_field_data:
# text_field: Description
# - name: server02
# device_role: server
# device_type: Other
# site: AMS 2
# rack: rack-02
# face: front
# position: 2
# primary_ip4: 10.1.1.2/24
# primary_ip6: 2001:db8:a000:1::2/64
# custom_field_data:
# text_field: Description
# - name: server03
# device_role: server
# device_type: Other
# site: SING 1
# rack: rack-03
# face: front
# position: 3
# custom_field_data:
# text_field: Description

View File

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

View File

@@ -1,44 +0,0 @@
## Possible Choices:
## status:
## - active
## - reserved
## - deprecated
## - dhcp
## role:
## - loopback
## - secondary
## - anycast
## - vip
## - vrrp
## - hsrp
## - glbp
## - carp
##
## Examples:
# - address: 10.1.1.1/24
# device: server01
# interface: to-server02
# status: active
# vrf: vrf1
# - address: 2001:db8:a000:1::1/64
# device: server01
# interface: to-server02
# status: active
# vrf: vrf1
# - address: 10.1.1.2/24
# device: server02
# interface: to-server01
# status: active
# - address: 2001:db8:a000:1::2/64
# device: server02
# interface: to-server01
# status: active
# - address: 10.1.1.10/24
# description: reserved IP
# status: reserved
# tenant: tenant1
# - address: 2001:db8:a000:1::10/64
# description: reserved IP
# status: reserved
# tenant: tenant1

View File

@@ -1,6 +0,0 @@
# - name: Manufacturer 1
# slug: manufacturer-1
# - name: Manufacturer 2
# slug: manufacturer-2
# - name: No Name
# slug: no-name

View File

@@ -1,15 +0,0 @@
# - name: Platform 1
# slug: platform-1
# manufacturer: Manufacturer 1
# napalm_driver: driver1
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"
# - name: Platform 2
# slug: platform-2
# manufacturer: Manufacturer 2
# napalm_driver: driver2
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"
# - name: Platform 3
# slug: platform-3
# manufacturer: No Name
# napalm_driver: driver3
# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}"

View File

@@ -1,14 +0,0 @@
# - name: power feed 1
# power_panel: power panel AMS 1
# voltage: 208
# amperage: 50
# max_utilization: 80
# phase: Single phase
# rack: rack-01
# - name: power feed 2
# power_panel: power panel SING 1
# voltage: 208
# amperage: 50
# max_utilization: 80
# phase: Three-phase
# rack: rack-03

View File

@@ -1,5 +0,0 @@
# - name: power panel AMS 1
# site: AMS 1
# - name: power panel SING 1
# site: SING 1
# rack_group: cage 101

View File

@@ -1,2 +0,0 @@
# - name: Main Management
# slug: main-management

View File

@@ -1,29 +0,0 @@
## Possible Choices:
## status:
## - container
## - active
## - reserved
## - deprecated
##
## Examples:
# - description: prefix1
# prefix: 10.1.1.0/24
# site: AMS 1
# status: active
# tenant: tenant1
# vlan: vlan1
# - description: prefix2
# prefix: 10.1.2.0/24
# site: AMS 2
# status: active
# tenant: tenant2
# vlan: vlan2
# is_pool: true
# vrf: vrf2
# - description: ipv6 prefix1
# prefix: 2001:db8:a000:1::/64
# site: AMS 2
# status: active
# tenant: tenant2
# vlan: vlan2

View File

@@ -1,6 +0,0 @@
# - name: Provider1
# slug: provider1
# asn: 121
# - name: Provider2
# slug: provider2
# asn: 122

View File

@@ -1,3 +0,0 @@
# - name: cage 101
# slug: cage-101
# site: SING 1

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,41 +0,0 @@
## Possible Choices:
## width:
## - 19
## - 23
## types:
## - 2-post-frame
## - 4-post-frame
## - 4-post-cabinet
## - wall-frame
## - wall-cabinet
## outer_unit:
## - mm
## - in
##
## Examples:
# - site: AMS 1
# name: rack-01
# role: Role 1
# type: 4-post-cabinet
# width: 19
# u_height: 47
# custom_field_data:
# text_field: Description
# - site: AMS 2
# name: rack-02
# role: Role 2
# type: 4-post-cabinet
# width: 19
# u_height: 47
# custom_field_data:
# text_field: Description
# - site: SING 1
# name: rack-03
# group: cage 101
# role: Role 3
# type: 4-post-cabinet
# width: 19
# u_height: 47
# custom_field_data:
# 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,9 +0,0 @@
# - is_private: true
# name: RFC1918
# slug: rfc1918
# - is_private: true
# name: RFC4193 ULA
# slug: rfc4193-ula
# - is_private: true
# name: RFC3849
# slug: rfc3849

View File

@@ -1,3 +0,0 @@
# - name: 65000:1001
# tenant: tenant1
# - name: 65000:1002

View File

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

View File

@@ -1,15 +0,0 @@
# - name: DNS
# protocol: TCP
# ports:
# - 53
# virtual_machine: virtual machine 1
# - name: DNS
# protocol: UDP
# ports:
# - 53
# virtual_machine: virtual machine 1
# - name: MISC
# protocol: UDP
# ports:
# - 4000
# device: server01

View File

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

View File

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

View File

@@ -1,4 +0,0 @@
# - name: Tenant Group 1
# slug: tenant-group-1
# - name: Tenant Group 2
# slug: tenant-group-2

View File

@@ -1,5 +0,0 @@
# - name: tenant1
# slug: tenant1
# - name: tenant2
# slug: tenant2
# group: Tenant Group 2

View File

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

View File

@@ -1,28 +0,0 @@
## Possible Choices:
## status:
## - active
## - offline
## - staged
##
## Examples:
# - cluster: cluster1
# comments: VM1
# disk: 200
# memory: 4096
# name: virtual machine 1
# platform: Platform 2
# status: active
# tenant: tenant1
# vcpus: 8
# - cluster: cluster1
# comments: VM2
# disk: 100
# memory: 2048
# name: virtual machine 2
# platform: Platform 2
# primary_ip4: 10.1.1.10/24
# primary_ip6: 2001:db8:a000:1::10/64
# status: active
# tenant: tenant1
# vcpus: 8

View File

@@ -1,12 +0,0 @@
# - description: Network Interface 1
# enabled: true
# mac_address: 00:77:77:77:77:77
# mtu: 1500
# name: Network Interface 1
# virtual_machine: virtual machine 1
# - description: Network Interface 2
# enabled: true
# mac_address: 00:55:55:55:55:55
# mtu: 1500
# name: Network Interface 2
# virtual_machine: virtual machine 1

View File

@@ -1,6 +0,0 @@
# - name: VLAN group 1
# site: AMS 1
# slug: vlan-group-1
# - name: VLAN group 2
# site: AMS 1
# slug: vlan-group-2

View File

@@ -1,19 +0,0 @@
## Possible Choices:
## status:
## - active
## - reserved
## - deprecated
##
## Examples:
# - name: vlan1
# site: AMS 1
# status: active
# vid: 5
# role: Main Management
# description: VLAN 5 for MGMT
# - group: VLAN group 2
# name: vlan2
# site: AMS 1
# status: active
# vid: 1300

View File

@@ -1,8 +0,0 @@
# - enforce_unique: true
# name: vrf1
# tenant: tenant1
# description: main VRF
# - enforce_unique: true
# name: vrf2
# rd: "6500:6500"
# tenant: tenant2

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

View File

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

View File

@@ -1,4 +1,5 @@
napalm==3.2.0 django-auth-ldap==4.1.0
ruamel.yaml==0.16.12 django-storages[azure,boto3,dropbox,google,libcloud,sftp]==1.13.1
django-auth-ldap==2.2.0 napalm==4.0.0
django-storages==1.10.1 psycopg2==2.9.3
social-auth-core[openidconnect]==4.3.0

View File

@@ -1,23 +0,0 @@
import sys
from django.contrib.auth.models import User
from startup_script_utils import load_yaml, set_permissions
from users.models import Token
users = load_yaml('/opt/netbox/initializers/users.yml')
if users is None:
sys.exit()
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'])
yaml_permissions = user_details.get('permissions', [])
set_permissions(user.user_permissions, yaml_permissions)

View File

@@ -1,23 +0,0 @@
import sys
from django.contrib.auth.models import Group, User
from startup_script_utils import load_yaml, set_permissions
groups = load_yaml('/opt/netbox/initializers/groups.yml')
if groups is None:
sys.exit()
for groupname, group_details in groups.items():
group, created = Group.objects.get_or_create(name=groupname)
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)
yaml_permissions = group_details.get('permissions', [])
set_permissions(group.permissions, yaml_permissions)

View File

@@ -1,58 +0,0 @@
import sys
from extras.models import CustomField
from startup_script_utils import load_yaml
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)
customfields = load_yaml('/opt/netbox/initializers/custom_fields.yml')
if customfields is None:
sys.exit()
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', False):
custom_field.default = cf_details['default']
if cf_details.get('description', False):
custom_field.description = cf_details['description']
if cf_details.get('label', False):
custom_field.label = cf_details['label']
for object_type in cf_details.get('on_objects', []):
custom_field.content_types.add(get_class_for_class_path(object_type))
if cf_details.get('required', False):
custom_field.required = cf_details['required']
if cf_details.get('type', False):
custom_field.type = cf_details['type']
if cf_details.get('weight', -1) >= 0:
custom_field.weight = cf_details['weight']
if cf_details.get('choices', False):
custom_field.choices = []
for choice_detail in cf_details.get('choices', []):
if isinstance(choice_detail, dict) and 'value' in choice_detail:
# legacy mode
print(f"⚠️ Please migrate the choice '{choice_detail['value']}' of '{cf_name}' to the new format, as 'weight' is no longer supported!")
custom_field.choices.append(choice_detail['value'])
else:
custom_field.choices.append(choice_detail)
custom_field.save()
print("🔧 Created custom field", cf_name)

View File

@@ -1,23 +0,0 @@
from extras.models import Tag
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys
tags = load_yaml('/opt/netbox/initializers/tags.yml')
if tags is None:
sys.exit()
for params in tags:
if 'color' in params:
color = params.pop('color')
for color_tpl in ColorChoices:
if color in color_tpl:
params['color'] = color_tpl[0]
tag, created = Tag.objects.get_or_create(**params)
if created:
print("🎨 Created Tag", tag.name)

View File

@@ -1,26 +0,0 @@
from dcim.models import Region
from startup_script_utils import load_yaml
import sys
regions = load_yaml('/opt/netbox/initializers/regions.yml')
if regions is None:
sys.exit()
optional_assocs = {
'parent': (Region, 'name')
}
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,32 +0,0 @@
import sys
from dcim.models import Region, Site
from startup_script_utils import *
from tenancy.models import Tenant
sites = load_yaml('/opt/netbox/initializers/sites.yml')
if sites is None:
sys.exit()
optional_assocs = {
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
for params in sites:
custom_field_data = pop_custom_fields(params)
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:
set_custom_fields_values(site, custom_field_data)
print("📍 Created site", site.name)

View File

@@ -1,14 +0,0 @@
from dcim.models import Manufacturer
from startup_script_utils import load_yaml
import sys
manufacturers = load_yaml('/opt/netbox/initializers/manufacturers.yml')
if manufacturers is None:
sys.exit()
for params in manufacturers:
manufacturer, created = Manufacturer.objects.get_or_create(**params)
if created:
print("🏭 Created Manufacturer", manufacturer.name)

View File

@@ -1,42 +0,0 @@
import sys
from dcim.models import DeviceType, Manufacturer, Region
from startup_script_utils import *
from tenancy.models import Tenant
device_types = load_yaml('/opt/netbox/initializers/device_types.yml')
if device_types is None:
sys.exit()
required_assocs = {
'manufacturer': (Manufacturer, 'name')
}
optional_assocs = {
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
for params in device_types:
custom_field_data = pop_custom_fields(params)
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:
set_custom_fields_values(device_type, custom_field_data)
print("🔡 Created device type", device_type.manufacturer, device_type.model)

View File

@@ -1,23 +0,0 @@
from dcim.models import RackRole
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys
rack_roles = load_yaml('/opt/netbox/initializers/rack_roles.yml')
if rack_roles is None:
sys.exit()
for params in rack_roles:
if 'color' in params:
color = params.pop('color')
for color_tpl in ColorChoices:
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,25 +0,0 @@
from dcim.models import Site,RackGroup
from startup_script_utils import load_yaml
import sys
rack_groups = load_yaml('/opt/netbox/initializers/rack_groups.yml')
if rack_groups is None:
sys.exit()
required_assocs = {
'site': (Site, 'name')
}
for params in rack_groups:
for assoc, details in required_assocs.items():
model, field = details
query = { field: params.pop(assoc) }
params[assoc] = model.objects.get(**query)
rack_group, created = RackGroup.objects.get_or_create(**params)
if created:
print("🎨 Created rack group", rack_group.name)

View File

@@ -1,43 +0,0 @@
import sys
from dcim.models import Site, RackRole, Rack, RackGroup
from startup_script_utils import *
from tenancy.models import Tenant
racks = load_yaml('/opt/netbox/initializers/racks.yml')
if racks is None:
sys.exit()
required_assocs = {
'site': (Site, 'name')
}
optional_assocs = {
'role': (RackRole, 'name'),
'tenant': (Tenant, 'name'),
'group': (RackGroup, 'name')
}
for params in racks:
custom_field_data = pop_custom_fields(params)
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)
rack, created = Rack.objects.get_or_create(**params)
if created:
set_custom_fields_values(rack, custom_field_data)
print("🔳 Created rack", rack.site, rack.name)

View File

@@ -1,24 +0,0 @@
from dcim.models import DeviceRole
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys
device_roles = load_yaml('/opt/netbox/initializers/device_roles.yml')
if device_roles is None:
sys.exit()
for params in device_roles:
if 'color' in params:
color = params.pop('color')
for color_tpl in ColorChoices:
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,26 +0,0 @@
from dcim.models import Manufacturer, Platform
from startup_script_utils import load_yaml
import sys
platforms = load_yaml('/opt/netbox/initializers/platforms.yml')
if platforms is None:
sys.exit()
optional_assocs = {
'manufacturer': (Manufacturer, 'name'),
}
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,14 +0,0 @@
from tenancy.models import TenantGroup
from startup_script_utils import load_yaml
import sys
tenant_groups = load_yaml('/opt/netbox/initializers/tenant_groups.yml')
if tenant_groups is None:
sys.exit()
for params in tenant_groups:
tenant_group, created = TenantGroup.objects.get_or_create(**params)
if created:
print("🔳 Created Tenant Group", tenant_group.name)

View File

@@ -1,30 +0,0 @@
import sys
from startup_script_utils import *
from tenancy.models import Tenant, TenantGroup
tenants = load_yaml('/opt/netbox/initializers/tenants.yml')
if tenants is None:
sys.exit()
optional_assocs = {
'group': (TenantGroup, 'name')
}
for params in tenants:
custom_field_data = pop_custom_fields(params)
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)
tenant, created = Tenant.objects.get_or_create(**params)
if created:
set_custom_fields_values(tenant, custom_field_data)
print("👩‍💻 Created Tenant", tenant.name)

View File

@@ -1,14 +0,0 @@
from virtualization.models import ClusterType
from startup_script_utils import load_yaml
import sys
cluster_types = load_yaml('/opt/netbox/initializers/cluster_types.yml')
if cluster_types is None:
sys.exit()
for params in cluster_types:
cluster_type, created = ClusterType.objects.get_or_create(**params)
if created:
print("🧰 Created Cluster Type", cluster_type.name)

View File

@@ -1,14 +0,0 @@
from virtualization.models import ClusterGroup
from startup_script_utils import load_yaml
import sys
cluster_groups = load_yaml('/opt/netbox/initializers/cluster_groups.yml')
if cluster_groups is None:
sys.exit()
for params in cluster_groups:
cluster_group, created = ClusterGroup.objects.get_or_create(**params)
if created:
print("🗄️ Created Cluster Group", cluster_group.name)

View File

@@ -1,44 +0,0 @@
import sys
from dcim.models import Site
from startup_script_utils import *
from virtualization.models import Cluster, ClusterType, ClusterGroup
from tenancy.models import Tenant
clusters = load_yaml('/opt/netbox/initializers/clusters.yml')
if clusters is None:
sys.exit()
required_assocs = {
'type': (ClusterType, 'name')
}
optional_assocs = {
'site': (Site, 'name'),
'group': (ClusterGroup, 'name'),
'tenant': (Tenant, 'name')
}
for params in clusters:
custom_field_data = pop_custom_fields(params)
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)
cluster, created = Cluster.objects.get_or_create(**params)
if created:
set_custom_fields_values(cluster, custom_field_data)
print("🗄️ Created cluster", cluster.name)

View File

@@ -1,44 +0,0 @@
import sys
from dcim.models import Site
from startup_script_utils import *
from virtualization.models import Cluster, ClusterType, ClusterGroup
from tenancy.models import Tenant
clusters = load_yaml('/opt/netbox/initializers/clusters.yml')
if clusters is None:
sys.exit()
required_assocs = {
'type': (ClusterType, 'name')
}
optional_assocs = {
'site': (Site, 'name'),
'group': (ClusterGroup, 'name'),
'tenant': (Tenant, 'name')
}
for params in clusters:
custom_field_data = pop_custom_fields(params)
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)
cluster, created = Cluster.objects.get_or_create(**params)
if created:
set_custom_fields_values(cluster, custom_field_data)
print("🗄️ Created cluster", cluster.name)

Some files were not shown because too many files have changed in this diff Show More