GithubHelp home page GithubHelp logo

netbox-community / device-type-library-import Goto Github PK

View Code? Open in Web Editor NEW
239.0 14.0 74.0 92 KB

This library is intended to assist with importing device and module types into NetBox from the NetBox Community DeviceType-Library

Home Page: https://github.com/netbox-community/devicetype-library

License: MIT License

Python 98.89% Dockerfile 1.11%
netbox netbox-devicetype-library

device-type-library-import's People

Contributors

basictheprogram avatar dalrrard avatar danner26 avatar dependabot[bot] avatar dmcken avatar en0rm avatar floeisen avatar florianheigl avatar gaby avatar jbemmel avatar k0rventen avatar ljarasius avatar lordwolf2004 avatar mayafox avatar minitriga avatar mtinberg avatar ndom91 avatar p-rintz avatar rmundel avatar rsp2k avatar suom1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

device-type-library-import's Issues

Missing wheel package

Missing wheel package in requirements.


Building wheels for collected packages: pynetbox, PyYAML
  Building wheel for pynetbox (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/frno/netbox-devices/Netbox-Device-Type-Library-Import/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pi
p-install-9upmjcmq/pynetbox/setup.py'"'"'; __file__='"'"'/tmp/pip-install-9upmjcmq/pynetbox/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__
);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-pnc61wpm
       cwd: /tmp/pip-install-9upmjcmq/pynetbox/
  Complete output (8 lines):
  WARNING: The wheel package is not available.
  WARNING: The wheel package is not available.
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help

  error: invalid command 'bdist_wheel'                                                                                                                        ----------------------------------------
  ERROR: Failed building wheel for pynetbox
  Running setup.py clean for pynetbox
  Building wheel for PyYAML (setup.py) ... error                                                                                                              ERROR: Command errored out with exit status 1:
   command: /home/frno/netbox-devices/Netbox-Device-Type-Library-Import/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-9upmjcmq/PyYAML/setup.py'"'"'; __file__='"'"'/tmp/pip-install-9upmjcmq/PyYAML/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);co
de=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-dsuyr1k0
       cwd: /tmp/pip-install-9upmjcmq/PyYAML/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help

  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for PyYAML
  Running setup.py clean for PyYAML
Failed to build pynetbox PyYAML

Fixed by doing pip install wheel

Docker Build Issue - conflict with urllib3

I rand the docker build and get the following results

docker build -t netbox-devicetype-import-library .
[+] Building 16.8s (9/11)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 334B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.9-alpine 2.4s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [1/6] FROM docker.io/library/python:3.9-alpine@sha256:7e6fd737db2c21a 1.9s
=> => resolve docker.io/library/python:3.9-alpine@sha256:7e6fd737db2c21a 0.0s
=> => sha256:7e6fd737db2c21aabba823d61e141f706fce21f47b7 1.65kB / 1.65kB 0.0s
=> => sha256:3e7e8a57a959c393797f0c90fa7b0fdbf7a40c4a274 1.37kB / 1.37kB 0.0s
=> => sha256:2af55166a4810d5124e4e879705be7ee6f51a2e3829 7.17kB / 7.17kB 0.0s
=> => sha256:5843afab387455b37944e709ee8c78d7520df80f8d0 2.81MB / 2.81MB 0.5s
=> => sha256:2dfaacf7024eb3bb4c2e67a960e5c65425a95a0 656.34kB / 656.34kB 0.2s
=> => sha256:2dbba127c6aabc2f949cd9713071cadc28e9702ef 11.47MB / 11.47MB 0.5s
=> => sha256:1a467efa2204a8af22ba6cf25e6fe11c6cf8be07b0b5adf 230B / 230B 0.4s
=> => sha256:8b09d69ece5fb7222ff7bd97f4d2d4a3c986974979f 2.36MB / 2.36MB 0.6s
=> => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f 0.2s
=> => extracting sha256:2dfaacf7024eb3bb4c2e67a960e5c65425a95a09a7a49298 0.1s
=> => extracting sha256:2dbba127c6aabc2f949cd9713071cadc28e9702ef6fdb427 0.5s
=> => extracting sha256:1a467efa2204a8af22ba6cf25e6fe11c6cf8be07b0b5adfa 0.0s
=> => extracting sha256:8b09d69ece5fb7222ff7bd97f4d2d4a3c986974979f8d81a 0.2s
=> [internal] load build context 0.0s
=> => transferring context: 16.76kB 0.0s
=> [2/6] COPY requirements.txt . 0.2s
=> [3/6] RUN apk add --no-cache git 1.4s
=> ERROR [4/6] RUN pip3 install -r requirements.txt 10.8s

[4/6] RUN pip3 install -r requirements.txt:
#9 2.109 Collecting certifi==2019.11.28
#9 2.312 Downloading certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
#9 2.388 Collecting chardet==3.0.4
#9 2.405 Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
#9 2.445 Collecting gitdb2==3.0.2
#9 2.493 Downloading gitdb2-3.0.2-py2.py3-none-any.whl (63 kB)
#9 2.566 Collecting GitPython==3.0.8
#9 2.586 Downloading GitPython-3.0.8-py3-none-any.whl (450 kB)
#9 2.642 Collecting idna==2.8
#9 2.659 Downloading idna-2.8-py2.py3-none-any.whl (58 kB)
#9 2.763 Collecting progressbar2==3.47.0
#9 2.780 Downloading progressbar2-3.47.0-py2.py3-none-any.whl (24 kB)
#9 2.868 Collecting pynetbox==4.2.5
#9 2.885 Downloading pynetbox-4.2.5.tar.gz (46 kB)
#9 4.059 Collecting python-utils==2.3.0
#9 4.102 Downloading python_utils-2.3.0-py2.py3-none-any.whl (12 kB)
#9 4.183 Collecting PyYAML==5.4
#9 4.201 Downloading PyYAML-5.4.tar.gz (174 kB)
#9 4.578 Installing build dependencies: started
#9 8.594 Installing build dependencies: finished with status 'done'
#9 8.597 Getting requirements to build wheel: started
#9 9.890 Getting requirements to build wheel: finished with status 'done'
#9 9.892 Preparing wheel metadata: started
#9 10.17 Preparing wheel metadata: finished with status 'done'
#9 10.25 Collecting requests==2.22.0
#9 10.26 Downloading requests-2.22.0-py2.py3-none-any.whl (57 kB)
#9 10.30 Collecting six==1.14.0
#9 10.32 Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
#9 10.35 Collecting smmap2==2.0.5
#9 10.36 Downloading smmap2-2.0.5-py2.py3-none-any.whl (24 kB)
#9 10.43 Collecting urllib3==1.26.5
#9 10.45 Downloading urllib3-1.26.5-py2.py3-none-any.whl (138 kB)
#9 10.51 Collecting python-dotenv==0.15.0
#9 10.52 Downloading python_dotenv-0.15.0-py2.py3-none-any.whl (18 kB)
#9 10.53 Requirement already satisfied: wheel==0.36.2 in /usr/local/lib/python3.9/site-packages (from -r requirements.txt (line 15)) (0.36.2)
#9 10.59 INFO: pip is looking at multiple versions of pyyaml to determine which version is compatible with other requirements. This could take a while.
#9 10.59 INFO: pip is looking at multiple versions of python-utils to determine which version is compatible with other requirements. This could take a while.
#9 10.59 INFO: pip is looking at multiple versions of pynetbox to determine which version is compatible with other requirements. This could take a while.
#9 10.59 INFO: pip is looking at multiple versions of progressbar2 to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of idna to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of gitpython to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of gitdb2 to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of chardet to determine which version is compatible with other requirements. This could take a while.
#9 10.60 INFO: pip is looking at multiple versions of certifi to determine which version is compatible with other requirements. This could take a while.
#9 10.60 ERROR: Cannot install -r requirements.txt (line 10) and urllib3==1.26.5 because these package versions have conflicting dependencies.
#9 10.60
#9 10.60 The conflict is caused by:
#9 10.60 The user requested urllib3==1.26.5
#9 10.60 requests 2.22.0 depends on urllib3!=1.25.0, !=1.25.1, <1.26 and >=1.21.1
#9 10.60
#9 10.60 To fix this you could try to:
#9 10.60 1. loosen the range of package versions you've specified
#9 10.60 2. remove package versions to allow pip attempt to solve the dependency conflict
#9 10.60
#9 10.60 ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies
#9 10.61 WARNING: You are using pip version 21.2.2; however, version 21.2.3 is available.
#9 10.61 You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.


executor failed running [/bin/sh -c pip3 install -r requirements.txt]: exit code: 1

FR create objects with a specific tag set

I would like to see the possibility to specify a NetBox tag on the command line that is then set on every object that gets created.
This way the imported device types etc are easily told apart from other device types etc.

Rasberry Pi not importing on scan

Anyone know why my rasberry pi 3B+ devices are not being recognised when scanning with netbox-device-discovery?
I have PC, Printers currenty adding correctly as my base test.

Any way i can troubleshoot?

README.md cd Netbox-Device-Type-Library-Import

After git clone https://github.com/netbox-community/Device-Type-Library-Import.git the readme lists cd Netbox-Device-Type-Library-Import.

It should be cd Device-Type-Library-Import.

Feature Request: only import/update specific devices?

I apologize if this isn't the preferred way to submit a feature request, but I didn't see any other method listed.
I'm not a developer or else I would probably attempt to add this myself...

Just looking for a way to only import specific devices, if possible. We only use a handful of vendors, and for several of those vendors we might only use 2-3 devices. For Cisco especially, I don't really want to import the entire library of Cisco gear to handle 2-3 switches.

Would be nice to be able to either specify one or more specific device names on the commandline, or perhaps read from a text file to get that list?

SSL self signed certificate issue

Yeah the same error as always, but I have changed bot options to false in settings.py and still get the following error:
image

I know is a very recurring error but I'm a bit lost, netbox 3.3.5

FR - Update Existing Device Types in NetBox

I'd like to propose a new feature which I believe could be quite useful.

I can see an issue where with the Device Library being updated with new information, it means people who have once previously imported those datasets can not take advantage of the new information.

I propose a setting which deletes all unused device types in NetBox (that do not have any associated devices), prior to then re-importing them. This means the new data is applied and ready for use going forward.

Perhaps this could lead the way to updating device types that are in use with delta changes or what not, but that's another discussion.

Invalid Syntax

I got these error when running the script:

python nb-dt-import.py
File "nb-dt-import.py", line 15
def update_package(path: str):
^
SyntaxError: invalid syntax

KeyError: 'slug' if you specify an argument in '--slugs'

If you run the script with the argument model-type
./nb-dt-import.py --slugs cisco-ws-c2960-24tc-l

Then I will get an error:

Traceback (most recent call last):
  File "/home/username/reps/Device-Type-Library-Import/./nb-dt-import.py", line 54, in <module>
    main()
  File "/home/username/reps/Device-Type-Library-Import/./nb-dt-import.py", line 32, in main
    module_types = sdr.parse_files(files, slugs=args.slugs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/username/reps/Device-Type-Library-Import/repo.py", line 101, in parse_files
    if slugs and True not in [True if s.casefold() in data['slug'].casefold() else False for s in slugs]:
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/username/reps/Device-Type-Library-Import/repo.py", line 101, in <listcomp>
    if slugs and True not in [True if s.casefold() in data['slug'].casefold() else False for s in slugs]:
                                                      ~~~~^^^^^^^^
KeyError: 'slug'

I think it's because of "module-types".
The files in it do not have the "slug" attribute.

doesn't import environment vars

didn't importing environment vars REPO_URL, NETBOX_URL
for smooth workflow additionally to give manual input() could be an option

Screenshot 2021-03-18 at 22 55 28

SSL Certificate issues

Hi
When running this script i get a ssl error:
**Max retries exceeded with url: /api/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: **CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))
I have tried setting IGNORE_SSL_ERRORS=True in the .env file, but i still get the same error.
i do not get any ssl error when i curl the site

Can you help me fix this?

Thanks

Netbox v3.3.2 with nginx as proxy.

Docker image outdated

It looks like the latest release has not been published as a docker image.

Is there a process for this? It seems the one linked in the readme is a personal publish i think

Error creating manufacturers - netbox v3.7.1

My guess here is that this script doesn't support netbox v3. But this is the error I get when trying to run the script to do an initial import on a new system. There are currently 0 manufacturers existing on this system yet.

Error creating manufacturers
Error during manufacturer creation. - {"error": "duplicate key value violates unique constraint \"dcim_manufacturer_slug_key\"\nDETAIL:  Key (slug)=(watchguard) already exists.", "exception": "IntegrityError", "netbox_version": "3.7.1", "python_version": "3.9.18"}

I tried changing requirements.txt to bump pynetbox up to 7.3.3 and I still get the same error.

ssl.SSLCertVerificationError

This is not a bug, but i need help to bypass this error.

where i can change hostname(IP) to match machinename/hostname


/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connection.py:455: SubjectAltNameWarning: Certificate for 192.168.1.82 has no subjectAltName, falling back to check for a commonName for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See urllib3/urllib3#497 for details.)
warnings.warn(
Traceback (most recent call last):
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 382, in _make_request
self._validate_conn(conn)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 1010, in _validate_conn
conn.connect()
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connection.py", line 464, in connect
_match_hostname(cert, self.assert_hostname or server_hostname)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connection.py", line 512, in _match_hostname
match_hostname(cert, asserted_hostname)
File "/usr/lib/python3.9/ssl.py", line 420, in match_hostname
raise CertificateError("hostname %r "
ssl.SSLCertVerificationError: ("hostname '192.168.1.82' doesn't match 'backupserver02'",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/urllib3/util/retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.1.82', port=443): Max retries exceeded with url: /api/ (Caused by SSLError(SSLCertVerificationError("hostname '192.168.1.82' doesn't match 'backupserver02'")))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/francisco/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 856, in
main()
File "/home/francisco/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 779, in main
determine_features(nb)
File "/home/francisco/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 42, in determine_features
nb_ver = [int(x) for x in nb.version.split('.')]
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/pynetbox/api.py", line 212, in version
version = Request(
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/pynetbox/core/query.py", line 181, in get_version
req = requests.get(
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/api.py", line 76, in get
return request('get', url, params=params, **kwargs)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/home/francisco/Netbox-Device-Type-Library-Import/venv/lib/python3.9/site-packages/requests/adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.1.82', port=443): Max retries exceeded with url: /api/ (Caused by SSLError(SSLCertVerificationError("hostname '192.168.1.82' doesn't match 'backupserver02'")))

IGNORE_SSL_ERRORS not propigating

Hi -- I tried running the importer on my instance of Netbox and I ran into issues where when I set the IGNORE_SSL_ERRORS to 'True' it was not propagating all the way. The resolution to this was to set line 481 in netbox_api.py to the below.

response = requests.patch(url, headers=headers, files=files, verify=False)

What was added was ', verify=False'

This just needs to take the propagation from the .env file to fix. Thanks!

invalid syntax line 16

I get the following eror when trying to run this script

File "nb-dt-import.py", line 16
def update_package(path: str):
^
SyntaxError: invalid syntax

Установка в OpenSUSE Leap 15.2

При работе в OpenSUSE Leap 15.2 я установил дополнительно модули python
ordered_set, nbs, bs4, packaging, appdirs, logging3.

Изменил строку 24
Было --- def update_package(path: str):
Стало --- def update_package(path=str):
Изменил строку 29
Было --- print(f"Pulled Repo {repo.remotes.origin.url}")
Стало --- print(f'Pulled Repo {repo.remotes.origin.url}')

и все заработало.

Спасибо!!!

pynetbox is out of date in requirements.txt

When trying to install requirements with pip install -r requirements.txt I get the following error: ERROR: Could not find a version that satisfies the requirement pynetbox==4.2.5 (from versions: 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.1.0, 3.0.0, 3.0.1, 3.0.2, 3.1.0, 3.2.0, 3.3.0, 3.3.1, 3.4.0, 3.4.1, 3.4.2, 3.4.3, 3.4.4, 3.4.5, 3.4.6, 3.4.7, 3.4.8, 3.4.9, 3.4.10, 3.4.11, 4.0.0rc1, 4.0.0, 4.0.1, 4.0.2, 4.0.3, 4.0.4, 4.0.5, 4.0.6, 4.0.7, 4.0.8, 4.1.0, 4.1.1, 4.1.2, 4.2.0, 4.2.1, 4.2.2, 4.2.4, 4.2.5, 4.3.0, 4.3.1, 4.3.3, 5.0.1, 5.0.3, 5.0.4, 5.0.5, 5.0.7, 5.0.8, 5.1.0, 5.1.1, 5.1.2, 5.2.0, 5.2.1, 5.3.0, 5.3.1, 6.0.0, 6.0.1, 6.0.2, 6.1.0, 6.1.1, 6.1.2, 6.1.3, 6.2.0, 6.3.0, 6.4.0, 6.4.1, 6.5.0, 6.6.0, 6.6.1, 6.6.2)
ERROR: No matching distribution found for pynetbox==4.2.5

I updated pynetbox to use 6.6.2 and it worked without issue. Running RHEL 8.6 and Python 3.6.8

import per device

Hey,

thx for this cool tool !
I would really like to see an option to only import one device, rather than all of one vendor.

I try to keep my netbox as clean as possible, so that people can't pick the wrong device.

Is that possible ?

Pieter

HTTP Client closing connection seemingly randomly

So in general the importer seems to be working, it gets through the first few devices, but then without error always dies with the following error:

Error: urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

Open for stack trace / full output
Traceback (most recent call last):
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 706, in urlopen
    chunked=chunked,
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1336, in getresponse
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 306, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.7/http/client.py", line 275, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 756, in urlopen
    method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/util/retry.py", line 532, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/packages/six.py", line 769, in reraise
    raise value.with_traceback(tb)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 706, in urlopen
    chunked=chunked,
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1336, in getresponse
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 306, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.7/http/client.py", line 275, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./nb-dt-import.py", line 853, in <module>
    main()
  File "./nb-dt-import.py", line 826, in main
    createDeviceTypes(deviceTypes, nb)
  File "./nb-dt-import.py", line 707, in createDeviceTypes
    dt.id, nb)
  File "./nb-dt-import.py", line 554, in create_module_bays
    devicetype_id=device_type
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/pynetbox/core/endpoint.py", line 225, in filter
    ret = [self._response_loader(i) for i in req.get()]
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/pynetbox/core/query.py", line 300, in get
    return req_all()
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/pynetbox/core/query.py", line 279, in req_all
    req = self._make_call(add_params=add_params)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/pynetbox/core/query.py", line 247, in _make_call
    params=params, json=data
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/requests/sessions.py", line 555, in get
    return self.request('GET', url, **kwargs)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/opt/netbox-pi/Netbox-Device-Type-Library-Import/lib/python3.7/site-packages/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

I'm watching the netbox container http logs during the time and see nothing out of the ordinary, just all of the GET and POST requests coming and going, all 200 responses.

Last few http requests from netbox logs before error (open for more details)
[pid: 443|app: 0|req: 142/279] 172.19.0.1 () {30 vars in 460 bytes} [Sat Dec 31 16:20:56 2022] GET /api/dcim/manufacturers/ => generated 15843 bytes in 253 msecs (HTTP/1.1 200) 9 headers in 329 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 143/280] 172.19.0.1 () {30 vars in 497 bytes} [Sat Dec 31 16:20:56 2022] GET /api/dcim/manufacturers/?limit=92&offset=50 => generated 13442 bytes in 214 msecs (HTTP/1.1 200) 9 headers in 329 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 144/281] 172.19.0.1 () {30 vars in 458 bytes} [Sat Dec 31 16:20:56 2022] GET /api/dcim/device-types/ => generated 4271 bytes in 152 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 145/282] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:56 2022] GET /api/dcim/module-bay-templates/?devicetype_id=1 => generated 4524 bytes in 99 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 146/283] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/module-bay-templates/?devicetype_id=2 => generated 3045 bytes in 90 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 147/284] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/module-bay-templates/?devicetype_id=3 => generated 1548 bytes in 87 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 148/285] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/module-bay-templates/?devicetype_id=4 => generated 6040 bytes in 107 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 149/286] 172.19.0.1 () {30 vars in 503 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/interface-templates/?devicetype_id=5 => generated 15481 bytes in 150 msecs (HTTP/1.1 200) 9 headers in 329 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 150/287] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/power-port-templates/?devicetype_id=5 => generated 649 bytes in 101 msecs (HTTP/1.1 200) 9 headers in 327 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 151/288] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/console-port-templates/?devicetype_id=5 => generated 1197 bytes in 130 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 152/289] 172.19.0.1 () {30 vars in 503 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/interface-templates/?devicetype_id=6 => generated 52 bytes in 72 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 153/290] 172.19.0.1 () {34 vars in 512 bytes} [Sat Dec 31 16:20:57 2022] POST /api/dcim/interface-templates/ => generated 609 bytes in 91 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 154/291] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:57 2022] GET /api/dcim/power-port-templates/?devicetype_id=6 => generated 52 bytes in 68 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 155/292] 172.19.0.1 () {34 vars in 515 bytes} [Sat Dec 31 16:20:58 2022] POST /api/dcim/power-port-templates/ => generated 1205 bytes in 119 msecs (HTTP/1.1 201) 10 headers in 351 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 156/293] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:20:58 2022] GET /api/dcim/console-port-templates/?devicetype_id=6 => generated 52 bytes in 61 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 157/294] 172.19.0.1 () {34 vars in 518 bytes} [Sat Dec 31 16:20:58 2022] POST /api/dcim/console-port-templates/ => generated 545 bytes in 78 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 158/295] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:20:58 2022] GET /api/dcim/power-outlet-templates/?devicetype_id=6 => generated 52 bytes in 71 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 159/296] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:58 2022] GET /api/dcim/power-port-templates/?devicetype_id=6 => generated 1255 bytes in 108 msecs (HTTP/1.1 200) 9 headers in 328 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 160/297] 172.19.0.1 () {34 vars in 519 bytes} [Sat Dec 31 16:20:58 2022] POST /api/dcim/power-outlet-templates/ => generated 5443 bytes in 371 msecs (HTTP/1.1 201) 10 headers in 351 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 161/298] 172.19.0.1 () {34 vars in 500 bytes} [Sat Dec 31 16:20:58 2022] POST /api/dcim/device-types/ => generated 608 bytes in 145 msecs (HTTP/1.1 201) 11 headers in 408 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 162/299] 172.19.0.1 () {30 vars in 503 bytes} [Sat Dec 31 16:20:59 2022] GET /api/dcim/interface-templates/?devicetype_id=7 => generated 52 bytes in 65 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 163/300] 172.19.0.1 () {34 vars in 512 bytes} [Sat Dec 31 16:20:59 2022] POST /api/dcim/interface-templates/ => generated 606 bytes in 94 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 164/301] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:59 2022] GET /api/dcim/power-port-templates/?devicetype_id=7 => generated 52 bytes in 70 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 165/302] 172.19.0.1 () {34 vars in 514 bytes} [Sat Dec 31 16:20:59 2022] POST /api/dcim/power-port-templates/ => generated 601 bytes in 81 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 166/303] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:20:59 2022] GET /api/dcim/console-port-templates/?devicetype_id=7 => generated 52 bytes in 61 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 167/304] 172.19.0.1 () {34 vars in 518 bytes} [Sat Dec 31 16:20:59 2022] POST /api/dcim/console-port-templates/ => generated 535 bytes in 85 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 168/305] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:20:59 2022] GET /api/dcim/power-outlet-templates/?devicetype_id=7 => generated 52 bytes in 64 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 169/306] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:20:59 2022] GET /api/dcim/power-port-templates/?devicetype_id=7 => generated 651 bytes in 104 msecs (HTTP/1.1 200) 9 headers in 327 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 170/307] 172.19.0.1 () {34 vars in 520 bytes} [Sat Dec 31 16:20:59 2022] POST /api/dcim/power-outlet-templates/ => generated 17479 bytes in 1237 msecs (HTTP/1.1 201) 10 headers in 352 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 171/308] 172.19.0.1 () {34 vars in 499 bytes} [Sat Dec 31 16:21:01 2022] POST /api/dcim/device-types/ => generated 561 bytes in 138 msecs (HTTP/1.1 201) 11 headers in 408 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 172/309] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:21:01 2022] GET /api/dcim/power-port-templates/?devicetype_id=8 => generated 52 bytes in 72 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 173/310] 172.19.0.1 () {34 vars in 514 bytes} [Sat Dec 31 16:21:01 2022] POST /api/dcim/power-port-templates/ => generated 600 bytes in 78 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 174/311] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:21:01 2022] GET /api/dcim/power-outlet-templates/?devicetype_id=8 => generated 52 bytes in 68 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 175/312] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:21:01 2022] GET /api/dcim/power-port-templates/?devicetype_id=8 => generated 650 bytes in 100 msecs (HTTP/1.1 200) 9 headers in 327 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 176/313] 172.19.0.1 () {34 vars in 519 bytes} [Sat Dec 31 16:21:01 2022] POST /api/dcim/power-outlet-templates/ => generated 4713 bytes in 325 msecs (HTTP/1.1 201) 10 headers in 351 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 177/314] 172.19.0.1 () {34 vars in 500 bytes} [Sat Dec 31 16:21:01 2022] POST /api/dcim/device-types/ => generated 629 bytes in 137 msecs (HTTP/1.1 201) 11 headers in 408 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 178/315] 172.19.0.1 () {30 vars in 503 bytes} [Sat Dec 31 16:21:01 2022] GET /api/dcim/interface-templates/?devicetype_id=9 => generated 52 bytes in 73 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 179/316] 172.19.0.1 () {34 vars in 512 bytes} [Sat Dec 31 16:21:02 2022] POST /api/dcim/interface-templates/ => generated 615 bytes in 83 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 180/317] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:21:02 2022] GET /api/dcim/power-port-templates/?devicetype_id=9 => generated 52 bytes in 70 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 181/318] 172.19.0.1 () {34 vars in 514 bytes} [Sat Dec 31 16:21:02 2022] POST /api/dcim/power-port-templates/ => generated 610 bytes in 78 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 182/319] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:21:02 2022] GET /api/dcim/console-port-templates/?devicetype_id=9 => generated 52 bytes in 62 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 183/320] 172.19.0.1 () {34 vars in 518 bytes} [Sat Dec 31 16:21:02 2022] POST /api/dcim/console-port-templates/ => generated 544 bytes in 77 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 184/321] 172.19.0.1 () {30 vars in 509 bytes} [Sat Dec 31 16:21:02 2022] GET /api/dcim/power-outlet-templates/?devicetype_id=9 => generated 52 bytes in 66 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 185/322] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:21:02 2022] GET /api/dcim/power-port-templates/?devicetype_id=9 => generated 660 bytes in 103 msecs (HTTP/1.1 200) 9 headers in 327 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 186/323] 172.19.0.1 () {34 vars in 520 bytes} [Sat Dec 31 16:21:02 2022] POST /api/dcim/power-outlet-templates/ => generated 17695 bytes in 1285 msecs (HTTP/1.1 201) 10 headers in 352 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 187/324] 172.19.0.1 () {34 vars in 500 bytes} [Sat Dec 31 16:21:03 2022] POST /api/dcim/device-types/ => generated 567 bytes in 142 msecs (HTTP/1.1 201) 11 headers in 409 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 188/325] 172.19.0.1 () {30 vars in 505 bytes} [Sat Dec 31 16:21:04 2022] GET /api/dcim/interface-templates/?devicetype_id=10 => generated 52 bytes in 69 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 189/326] 172.19.0.1 () {34 vars in 512 bytes} [Sat Dec 31 16:21:04 2022] POST /api/dcim/interface-templates/ => generated 611 bytes in 87 msecs (HTTP/1.1 201) 10 headers in 350 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 190/327] 172.19.0.1 () {30 vars in 507 bytes} [Sat Dec 31 16:21:04 2022] GET /api/dcim/power-port-templates/?devicetype_id=10 => generated 52 bytes in 76 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 191/328] 172.19.0.1 () {34 vars in 515 bytes} [Sat Dec 31 16:21:04 2022] POST /api/dcim/power-port-templates/ => generated 1209 bytes in 120 msecs (HTTP/1.1 201) 10 headers in 351 bytes (1 switches on core 0)
[pid: 443|app: 0|req: 192/329] 172.19.0.1 () {30 vars in 511 bytes} [Sat Dec 31 16:21:04 2022] GET /api/dcim/console-port-templates/?devicetype_id=10 => generated 52 bytes in 65 msecs (HTTP/1.1 200) 9 headers in 326 bytes (1 switches on core 0)

Any idea what could be causing this?

Netbox: 3.4.1
Netbox-Device-Type-Library-Import: main latest (31.12.22)

Update db failed on slug

  1. Updated to the latest version
  2. Removed the "repo" directory (due to the #38)
  3. Ran the script.
  4. Got these errors:
    `Manufacturer Exists: A10 - 2
    Manufacturer Exists: APC - 3
    Manufacturer Exists: ActionTec - 4
    Manufacturer Exists: Adtran - 5
    Manufacturer Exists: Alcatel-Lucent - 6
    Manufacturer Exists: Allied Telesis - 7
    Manufacturer Exists: Alpha - 8
    Manufacturer Exists: Arista - 9
    Manufacturer Exists: Aruba - 10
    Manufacturer Exists: Avocent - 11
    Manufacturer Exists: Brocade - 12
    Manufacturer Exists: Cisco - 13
    Manufacturer Exists: Citrix - 14
    Manufacturer Exists: CyberPower - 15
    Manufacturer Exists: Deciso - 16
    Manufacturer Exists: Dell - 17
    Manufacturer Exists: Delta - 18
    Manufacturer Exists: Eaton - 19
    Manufacturer Exists: Extreme Networks - 20
    Manufacturer Exists: F5 - 21
    Manufacturer Exists: FS - 22
    Manufacturer Exists: Factor-TS - 23
    Manufacturer Exists: Fortinet - 1
    Manufacturer Exists: Generic - 24
    Manufacturer Exists: HPE - 25
    Manufacturer Exists: Huawei - 26
    Manufacturer Exists: Infinera - 27
    Manufacturer Exists: Infoblox - 28
    Manufacturer Exists: Infotecs - 29
    Manufacturer Exists: Juniper - 30
    Manufacturer Exists: Mellanox - 32
    Manufacturer Exists: MikroTik - 33
    Manufacturer Exists: NetApp - 34
    Manufacturer Exists: Netonix - 35
    Manufacturer Exists: Nokia - 36
    Manufacturer Exists: Opengear - 37
    Manufacturer Exists: Palo Alto - 38
    Manufacturer Exists: Panduit - 39
    Manufacturer Exists: QNAP - 40
    Manufacturer Exists: Raritan - 41
    Manufacturer Exists: Raspberry Pi - 42
    Manufacturer Exists: Riverbed - 43
    Manufacturer Exists: Rockwell Automation - 44
    Manufacturer Exists: Solid Optics - 45
    Manufacturer Exists: TP-Link - 46
    Manufacturer Exists: Testing - 47
    Manufacturer Exists: TrendNet - 48
    Manufacturer Exists: TrippLite - 49
    Manufacturer Exists: Ubiquiti - 50
    Manufacturer Exists: Vertiv - 51
    Manufacturer Exists: WTI - 52
    Manufacturer Exists: ZPE - 53

[{},{},{},{},{"slug":["manufacturer with this slug already exists."]},{},{},{},{},{},{}]

{"manufacturer":["Related object not found using the provided attributes: {'name': '3Com', 'slug': '3com'}"]}
Traceback (most recent call last):
File "/opt/netbox/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 446, in
main()
File "/opt/netbox/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 436, in main
createDeviceTypes(deviceTypes, nb)
File "/opt/netbox/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 352, in createDeviceTypes
dt.id, nb)
UnboundLocalError: local variable 'dt' referenced before assignment
`

SSL: WRONG_VERSION_NUMBER

This is a dependency problem that should be documented at least.
Another solution is to hardcode in the requirements a version of urllib3 without the bug.

the issue is the same as described here:

https://stackoverflow.com/questions/65516325/ssl-wrong-version-number-on-python-request

there are 2 solutions/workarounds

  1. in the env environment, when writing the netbox URL, use "http://" instead of "https://"
  2. install a bug free version of urllib3

when running the script i got the following

(venv) anubisg1@CZPRG-6VJY9Y3:~/Device-Type-Library-Import$ ./nb-dt-import.py
Package devicetype-library is already installed, updating /home/anubisg1/Device-Type-Library-Import/repo
Traceback (most recent call last):
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 467, in _make_request
    self._validate_conn(conn)
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 1096, in _validate_conn
    conn.connect()
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connection.py", line 642, in connect
    sock_and_verified = _ssl_wrap_socket_and_match_hostname(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connection.py", line 782, in _ssl_wrap_socket_and_match_hostname
    ssl_sock = ssl_wrap_socket(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/util/ssl_.py", line 470, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/util/ssl_.py", line 514, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.10/ssl.py", line 513, in wrap_socket
    return self.sslsocket_class._create(
  File "/usr/lib/python3.10/ssl.py", line 1100, in _create
    self.do_handshake()
  File "/usr/lib/python3.10/ssl.py", line 1371, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 491, in _make_request
    raise new_e
urllib3.exceptions.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py", line 844, in urlopen
    retries = retries.increment(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/util/retry.py", line 515, in increment
    raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.0.177', port=8000): Max retries exceeded with url: /api/ (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)')))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/anubisg1/Device-Type-Library-Import/./nb-dt-import.py", line 54, in <module>
    main()
  File "/home/anubisg1/Device-Type-Library-Import/./nb-dt-import.py", line 17, in main
    netbox = NetBox(settings)
  File "/home/anubisg1/Device-Type-Library-Import/netbox_api.py", line 28, in __init__
    self.verify_compatibility()
  File "/home/anubisg1/Device-Type-Library-Import/netbox_api.py", line 50, in verify_compatibility
    version_split = [int(x) for x in self.netbox.version.split('.')]
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/pynetbox/core/api.py", line 109, in version
    ).get_version()
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/pynetbox/core/query.py", line 180, in get_version
    req = self.http_session.get(
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/home/anubisg1/Device-Type-Library-Import/venv/lib/python3.10/site-packages/requests/adapters.py", line 517, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.0.177', port=8000): Max retries exceeded with url: /api/ (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)')))

Unable to Palo Alto using --Vendors

Hey,

Seems like you can't select Palo Alto using the --Vendors command, most likely due to it being two words? I tried it without spaces and with other 2 word vendors and doesn't seem to work.

Import script issue

Afternoon,
Using the super admin account (default account during setup) to run .
Every time i try to import either all off the device or just Cisco i get the following error.
The effect of the script is that the user account becomes deactivated.

I have changed the MAX_PAGE_SIZE = 0 thinking it was an issue with the API requesting to much at once but it doesnt seem to have solved it.
Anyone else seen this?

When checking Netbox it seems to have imported the manufacture and devices ok

Package devicetype-library is already installed, updating /home/met1/Netbox-Device-Type-Library-Import/repo
Pulled Repo https://github.com/netbox-community/devicetype-library.git
Vendor Specified, Gathering All Matching Device-Types
1 Vendors Found
400 Device-Types Found
Traceback (most recent call last):
  File "./nb-dt-import.py", line 432, in <module>
    main()
  File "./nb-dt-import.py", line 421, in main
    createManufacturers(vendors, nb)
  File "./nb-dt-import.py", line 76, in createManufacturers
    all_manufacturers = {str(item): item for item in nb.dcim.manufacturers.all()}
  File "/home/met1/Netbox-Device-Type-Library-Import/venv/lib/python3.8/site-packages/pynetbox/core/endpoint.py", line 101, in all
    return [self._response_loader(i) for i in req.get()]
  File "/home/met1/Netbox-Device-Type-Library-Import/venv/lib/python3.8/site-packages/pynetbox/core/query.py", line 300, in get
    return req_all()
  File "/home/met1/Netbox-Device-Type-Library-Import/venv/lib/python3.8/site-packages/pynetbox/core/query.py", line 279, in req_all
    req = self._make_call(add_params=add_params)
  File "/home/met1/Netbox-Device-Type-Library-Import/venv/lib/python3.8/site-packages/pynetbox/core/query.py", line 263, in _make_call
    raise RequestError(req)
pynetbox.core.query.RequestError: The request failed with code 403 Forbidden: {'detail': 'You do not have permission to perform this action.'}

Looks to be failing at Manufacture detail due to not having permision to do it. This could be just to do with the account already being getting to that point

Cheers
Rob

Module bays and types import

Just checking whats the status of this?

I'm seeing modules in the devicetype-library but this tool isn't importing them.

I don't mind working on it or contributing to this if no one else is working on it.

SSL Problems

Hi,

I'm getting following error:

requests.exceptions.SSLError: HTTPSConnectionPool(host='x.x.x.x', port=443): Max retries exceeded with url: /api/dcim/manufacturers/?name=Juniper (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1123)')))

Is it possible to add the option not to validate the cert. (working with self signed certs).

Kind regards,

Stefan

{"detail":"Invalid token"}

Running the script results in the above error - it reads the vendor and device and then spits this out, even though the NETBOX_TOKEN was copied from opt/netbox/netbox/netbox/configuration.py

`python3 nb-dt-import.py --vendor HPE
Pulled Repo
Package devicetype-library is already installed, updating
Vendor Specified, Gathering All Matching Device-Types
1 Vendors Found
3 Device-Types Found
{"detail":"Invalid token"}
{"detail":"Invalid token"}
{"detail":"Invalid token"}
{"detail":"Invalid token"}

0 devices created
0 interfaces/ports updated
0 manufacturers created`

Import fails when importing all vendors

The split function in Python has two modes, one when a delimiter is specified and another when you use the default argument. If you pass an empty string to it, this is how the different modes react:

"".split() == []
"".split(",") == [""]

In order to hit the else block in this part of the code when you don't specify a vendor, the list needs to be empty which doesn't happen whenever a delimiter is specified for the split function.

https://github.com/minitriga/Netbox-Device-Type-Library-Import/blob/625bdba43415213d704836bdab3d1c6e1674af19/nb-dt-import.py#L425-L430

Uploading of front/rear images for device types fails

The front_image and rear_image attributes require special handling for uploading images into Django.
Since the script doesn't use multipart/form data, the import of any device type that specifies these attributes fails with

{"front_image":["The submitted data was not a file. Check the encoding type on the form."],"rear_image":["The submitted data was not a file. Check the encoding type on the form."]}

The request failed with code 400 Bad Request

When trying to run import script I am having below issue, any idea?

root@netbox:/opt/netbox/Netbox-Device-Type-Library-Import# source venv/bin/activate
(venv) root@netbox:/opt/netbox/Netbox-Device-Type-Library-Import# cat .env

NETBOX_URL=https://localhost
NETBOX_TOKEN=5baac1bba5e79bb222779d6b9a524e2ce09d6e93
REPO_URL=https://github.com/netbox-community/devicetype-library.git
REPO_BRANCH=master
IGNORE_SSL_ERRORS=True
#SLUGS=c9300-48u isr4431 isr4331

(venv) root@netbox:/opt/netbox/Netbox-Device-Type-Library-Import# ./nb-dt-import.py --vendors cisco

Package devicetype-library is already installed, updating /opt/netbox/Netbox-Device-Type-Library-Import/repo
/opt/netbox/Netbox-Device-Type-Library-Import/venv/lib/python3.10/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
warnings.warn(
Traceback (most recent call last):
File "/opt/netbox/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 54, in
main()
File "/opt/netbox/Netbox-Device-Type-Library-Import/./nb-dt-import.py", line 17, in main
netbox = NetBox(settings)
File "/opt/netbox/Netbox-Device-Type-Library-Import/netbox_api.py", line 28, in init
self.verify_compatibility()
File "/opt/netbox/Netbox-Device-Type-Library-Import/netbox_api.py", line 50, in verify_compatibility
version_split = [int(x) for x in self.netbox.version.split('.')]
File "/opt/netbox/Netbox-Device-Type-Library-Import/venv/lib/python3.10/site-packages/pynetbox/core/api.py", line 109, in version
).get_version()
File "/opt/netbox/Netbox-Device-Type-Library-Import/venv/lib/python3.10/site-packages/pynetbox/core/query.py", line 187, in get_version
raise RequestError(req)
pynetbox.core.query.RequestError: The request failed with code 400 Bad Request but more specific details were not returned in json. Check the NetBox Logs or investigate this exception's error attribute.

Part Number/DeviceType Update

There where several Ubiquiti devises with the device type and part number backwards on the device type library, This has been fixed but running the Import script dose not recognize this.
2021-07-02 09_20_39-Ubiquiti by typecookie · Pull Request #422 · netbox-community_devicetype-library

SSL Certificate issues

When running the script, at first I encountered the now obvious issue of a self signed certificate, but then, after installing a legit certificate I still get an error:
**Max retries exceeded with url: /api/dcim/manufacturers/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: **CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))

The certificate is correct, and chain seems present.
Can you help me fix this?

Thanks

Netbox v3.3.1

SSL issues

I just installed netbox and then i ran this script i get an ssl error

requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168..', port=443): Max retries exceeded with url: /api/dcim/manufacturers/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate

Traceback when running the script

It doesn't seem to do anything for me but fail right away. I am fairly new to Netbox though so I would appreciate any assistance.

$./nb-dt-import.py
Package devicetype-library is already installed, updating C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import/repo
114 Vendors Found
Traceback (most recent call last):
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\nb-dt-import.py", line 54, in <module>
    main()
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\nb-dt-import.py", line 22, in main
    device_types = settings.dtl_repo.parse_files(files, slugs=args.slugs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\repo.py", line 90, in parse_files
    data = yaml.safe_load(stream)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\__init__.py", line 125, in safe_load
    return load(stream, SafeLoader)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\__init__.py", line 79, in load
    loader = Loader(stream)
             ^^^^^^^^^^^^^^
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\loader.py", line 34, in __init__
    Reader.__init__(self, stream)
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\reader.py", line 85, in __init__
    self.determine_encoding()
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\reader.py", line 124, in determine_encoding
    self.update_raw()
  File "C:\Users\baky\Git\tests\nornir\Device-Type-Library-Import\venv\Lib\site-packages\yaml\reader.py", line 178, in update_raw
    data = self.stream.read(size)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 344: character maps to <undefined>

Python tuple error

trying to use the docker image, I get the following:
Package Installed https://github.com/netbox-community/devicetype-library.git
No Vendors Specified, Gathering All Device-Types
82 Vendors Found
1778 Device-Types Found
Traceback (most recent call last):
File "/app/nb-dt-import.py", line 447, in
main()
File "/app/nb-dt-import.py", line 436, in main
createManufacturers(vendors, nb)
File "/app/nb-dt-import.py", line 100, in createManufacturers
print(f'Manufacturer Created: {man.name} - '
AttributeError: 'tuple' object has no attribute 'name'

SSL error even with IGNORE_SSL_ERRORS=True

I'm getting this trace below if I try to import the device type library. Netbox system is using an certificate issued by DigiCert not a self signed certificate. How can I solve the issue? Thank you!

Pulled Repo https://github.com/netbox-community/devicetype-library.git
IGNORE_SSL_ERRORS is True, catching exception and disabling SSL verification.
Traceback (most recent call last):
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\connectionpool.py", line 386, in _make_request
self._validate_conn(conn)
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\connectionpool.py", line 1042, in validate_conn
conn.connect()
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\connection.py", line 419, in connect
self.sock = ssl_wrap_socket(
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\util\ssl
.py", line 449, in ssl_wrap_socket
ssl_sock = ssl_wrap_socket_impl(
File "C:\Users\103925siru.conda\envs\netbox_import\lib\site-packages\urllib3\util\ssl
.py", line 493, in _ssl_wrap_socket_impl
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
File "C:\Users\103925siru.conda\envs\netbox_import\lib\ssl.py", line 501, in wrap_socket
return self.sslsocket_class._create(
File "C:\Users\103925siru.conda\envs\netbox_import\lib\ssl.py", line 1041, in _create
self.do_handshake()
File "C:\Users\103925siru.conda\envs\netbox_import\lib\ssl.py", line 1310, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)

Issue Running import script

I've followed the instructions and when I come to run the import script I get the below error message

Traceback (most recent call last):
File "./nb-dt-import.py", line 2, in
from git import Repo, exc, RemoteProgress
ModuleNotFoundError: No module named 'git'

Netbox version 2.11.6.

Can anyone help please with resolving the issue?

Thanks

Some Ubiquiti Devices Don't import

I've just run the script today to import Ubiquiti devices to my existing docker instance and noticed that some (two?) devices weren't imported. Seemingly with no errors displayed - but perhaps I'm not reading the log correctly.

The output says 118 device-types found, but only 116 imported.
I noticed that the UniFi Dream Machine Pro wasn't imported (But the UDM & UDM Pro SE were imported successfully), and another unknown device-type also wasn't imported.

I've temporarily solved this my manually importing the UDMP, but it would be good to see this fixed please.

Here's the script I ran:
docker run -e "NETBOX_URL=http://:/" -e "NETBOX_TOKEN=" -e "VENDORS=Ubiquiti" ghcr.io/minitriga/netbox-device-type-library-import > devimport.log

If it's helpful, here's the output:
devtypeimport.log

UnboundLocalError: local variable 'dt' referenced before assignment

Netbox version (v3.2.8)
When run ./nb-dt-import.py I get error message:

# python3 ./nb-dt-import.py
Package devicetype-library is already installed, updating /opt/netbox_device_type_import/repo
Pulled Repo https://github.com/netbox-community/devicetype-library.git
No Vendors Specified, Gathering All Device-Types
88 Vendors Found
1882 Device-Types Found
[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{"slug":["manufacturer with this slug already exists."]},{},{}]
{"manufacturer":["Related object not found using the provided attributes: {'name': '3Com', 'slug': '3com'}"]}
Traceback (most recent call last):
  File "./nb-dt-import.py", line 853, in <module>
    main()
  File "./nb-dt-import.py", line 826, in main
    createDeviceTypes(deviceTypes, nb)
  File "./nb-dt-import.py", line 680, in createDeviceTypes
    dt.id, nb)
UnboundLocalError: local variable 'dt' referenced before assignment

Script replaces seemingly random existing images with each run

With one run, the script will create new device types, but then on subsequent runs it seems to overwrite device images with a new name, then the next sometimes it'll do the same again, and again.

Example: device type EMAT09-10

First run:

Difference

{
"front_image": ""
}

{
"front_image": "devicetype-images/eaton-emat09-10.front.png"
}

Second run:

Difference

{
"front_image": "devicetype-images/eaton-emat09-10.front.png"
}

{
"front_image": "devicetype-images/eaton-emat09-10.front_8zE6qHf.png"
}

Third run:

Difference

{
"front_image": "devicetype-images/eaton-emat09-10.front.png"
}

{
"front_image": "devicetype-images/eaton-emat09-10.front_KCjLwwE.png"
}

Of course, this is completely unnecessary and no doubt is filling up storage with random new images. I'm just wondering - why does the script even overwrite images in the first place? Surely it's enough to upload them once.

I pulled the version of the script down yesterday, so it's a current issue.

repo_url is not set ?

Hi all, just setting this up and getting the following error running ./nb-dt-import.py as per guide.

Any help?

./nb-dt-import.py
Traceback (most recent call last):
File "./nb-dt-import.py", line 10, in
import settings
File "/opt/Netbox-Device-Type-Library-Import/settings.py", line 25, in
raise EnvironmentError("Failed because {} is not set.".format(var))
OSError: Failed because REPO_URL is not set.

Issue importing

venv) ubuntu@primary:~/Netbox-Device-Type-Library-Import$ ./nb-dt-import.py --vendors CISCO
Package devicetype-library is already installed, updating /home/ubuntu/Netbox-Device-Type-Library-Import/repo
Traceback (most recent call last):
File "./nb-dt-import.py", line 446, in
main()
File "./nb-dt-import.py", line 417, in main
update_package('./repo')
TypeError: update_package() missing 1 required positional argument: 'branch'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.