Full Code of Uninett/nav for AI

master 5577d96c9d43 cached
2578 files
34.9 MB
9.3M tokens
10418 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (37,081K chars total). Download the full file to get everything.
Repository: Uninett/nav
Branch: master
Commit: 5577d96c9d43
Files: 2578
Total size: 34.9 MB

Directory structure:
gitextract_mfgwl7w2/

├── .codecov.yml
├── .dockerignore
├── .git-blame-ignore-revs
├── .npmrc
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .sonarcloud.properties
├── AUTHORS.rst
├── CHANGELOG.md
├── COPYING
├── Dockerfile
├── HACKING
├── HISTORY
├── INSTALL
├── Makefile
├── NOTES.rst
├── README.rst
├── changelog.d/
│   ├── +replace-use-l10n.changed.md
│   ├── .gitkeep
│   ├── 2927.added.md
│   ├── 3881.added.md
│   ├── 3916.changed.md
│   ├── 3954.fixed.md
│   ├── 3959.fixed.md
│   ├── 3961.changed.md
│   └── 3980.fixed.md
├── checks/
│   └── check_test_names.py
├── constraints.txt
├── contrib/
│   ├── patches/
│   │   ├── cricket-win32-null-bug.patch
│   │   ├── cricket_zoom_1.5.patch
│   │   ├── nav_cricket-1.0.3_v0.2.ALFA.patch
│   │   └── net-snmp-memory.patch
│   └── scripts/
│       └── isc_dhpcd_graphite/
│           ├── README.rst
│           └── isc_dhpcd_graphite.py
├── dist.sh
├── doc/
│   ├── _static/
│   │   └── custom.css
│   ├── api/
│   │   ├── mibretriever.rst
│   │   ├── searchproviders.rst
│   │   └── sensor.rst
│   ├── conf.py
│   ├── contents.rst
│   ├── exts/
│   │   ├── alerttypes.py
│   │   ├── alerttypes.rst.j2
│   │   └── xref.py
│   ├── faq/
│   │   ├── faq.rst
│   │   └── graph_gaps.rst
│   ├── glossary.rst
│   ├── hacking/
│   │   ├── adding-environment-probe-support.rst
│   │   ├── extending-nav-locally.rst
│   │   ├── hacking-with-pycharm.rst
│   │   ├── hacking.rst
│   │   ├── index.rst
│   │   ├── javascript.rst
│   │   ├── release-procedure.rst
│   │   ├── snmp-tunnels.rst
│   │   ├── using-devcontainers.rst
│   │   ├── using-docker.rst
│   │   ├── web-interface-customization.rst
│   │   └── writing-a-servicemon-plugin.rst
│   ├── hg2git/
│   │   ├── README.rst
│   │   └── hg2gitmapping.txt
│   ├── howto/
│   │   ├── allauth-and-oidc.rst
│   │   ├── api_parameters.rst
│   │   ├── commandline-utilities.rst
│   │   ├── debugging-topology.rst
│   │   ├── email.rst
│   │   ├── generic-install-from-source.rst
│   │   ├── index.rst
│   │   ├── installing-graphite-on-debian.rst
│   │   ├── integrating-graphite-with-nav.rst
│   │   ├── manual-install-on-debian.rst
│   │   ├── migrate-data.rst
│   │   ├── migrate-dhcpstats.rst
│   │   ├── migrate-rrd-to-graphite.rst
│   │   ├── mod_auth_mellon_feide.rst
│   │   ├── mod_auth_openidc_feide.rst
│   │   ├── securing-nav-in-production.rst
│   │   ├── setting-up-logging.rst
│   │   └── using_the_api.rst
│   ├── index.rst
│   ├── intro/
│   │   ├── getting-organized.rst
│   │   ├── getting-started.rst
│   │   └── install.rst
│   ├── msg_and_maint_db.dia
│   ├── nav-flowchart.dia
│   ├── overview.rst
│   ├── reference/
│   │   ├── alerttypes.rst
│   │   ├── arnold.rst
│   │   ├── authentication.rst
│   │   ├── backend-processes.rst
│   │   ├── cabling_and_patch.rst
│   │   ├── dhcpstats.rst
│   │   ├── event-templates.rst
│   │   ├── eventengine.rst
│   │   ├── geomap.rst
│   │   ├── index.rst
│   │   ├── ipam.rst
│   │   ├── ipdevpoll.rst
│   │   ├── jwt.rst
│   │   ├── ldap.rst
│   │   ├── mailin.rst
│   │   ├── management-profiles.rst
│   │   ├── mfa.rst
│   │   ├── models-event.rst
│   │   ├── models-manage.rst
│   │   ├── navstats.rst
│   │   ├── portadmin.rst
│   │   ├── radius-install.rst
│   │   ├── radius.rst
│   │   ├── remote_user.rst
│   │   ├── smsd.rst
│   │   ├── snmptrapd.rst
│   │   └── social-account.rst
│   ├── release-notes.rst
│   ├── requirements.txt
│   ├── svn2hg/
│   │   ├── README
│   │   └── localtags
│   └── templates/
│       └── layout.html
├── docker-compose.snmp.yml
├── docker-compose.yml
├── package.json
├── pyproject.toml
├── python/
│   └── nav/
│       ├── Snmp/
│       │   ├── __init__.py
│       │   ├── defines.py
│       │   ├── errors.py
│       │   ├── profile.py
│       │   └── pynetsnmp.py
│       ├── __init__.py
│       ├── activeipcollector/
│       │   ├── __init__.py
│       │   ├── collector.py
│       │   └── manager.py
│       ├── alertengine/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── dispatchers/
│       │       ├── __init__.py
│       │       ├── email_dispatcher.py
│       │       ├── slack_dispatcher.py
│       │       └── sms_dispatcher.py
│       ├── arnold.py
│       ├── asyncdns.py
│       ├── auditlog/
│       │   ├── __init__.py
│       │   ├── api.py
│       │   ├── apps.py
│       │   ├── models.py
│       │   ├── urls.py
│       │   ├── utils.py
│       │   └── views.py
│       ├── bin/
│       │   ├── __init__.py
│       │   ├── alertengine.py
│       │   ├── autoenable.py
│       │   ├── cisco_auth_sessions.py
│       │   ├── collect_active_ip.py
│       │   ├── dhcpstats.py
│       │   ├── emailreports.py
│       │   ├── eventengine.py
│       │   ├── ipdevpolld.py
│       │   ├── logengine.py
│       │   ├── macwatch.py
│       │   ├── mailin.py
│       │   ├── maintengine.py
│       │   ├── navcheckservice.py
│       │   ├── navclean.py
│       │   ├── navdf.py
│       │   ├── navdump.py
│       │   ├── naventity.py
│       │   ├── navmain.py
│       │   ├── navoidverify.py
│       │   ├── navrefresh.py
│       │   ├── navsnmp.py
│       │   ├── navstats.py
│       │   ├── navsynctypes.py
│       │   ├── navtopology.py
│       │   ├── navuser.py
│       │   ├── netbiostracker.py
│       │   ├── pping.py
│       │   ├── radiusparser.py
│       │   ├── servicemon.py
│       │   ├── smsd.py
│       │   ├── snmptrapd.py
│       │   ├── sortedstats_cacher.py
│       │   ├── start_arnold.py
│       │   ├── t1000.py
│       │   ├── thresholdmon.py
│       │   └── update_ouis.py
│       ├── bitvector.py
│       ├── bootstrap.py
│       ├── buildconf.py
│       ├── bulkimport.py
│       ├── bulkparse.py
│       ├── colors.py
│       ├── config/
│       │   ├── __init__.py
│       │   └── toml.py
│       ├── daemon.py
│       ├── db/
│       │   └── __init__.py
│       ├── debug.py
│       ├── dhcpstats/
│       │   ├── __init__.py
│       │   ├── common.py
│       │   ├── errors.py
│       │   └── kea_dhcp.py
│       ├── django/
│       │   ├── __init__.py
│       │   ├── apps.py
│       │   ├── context_processors.py
│       │   ├── decorators.py
│       │   ├── defaults.py
│       │   ├── filter.py
│       │   ├── formats/
│       │   │   ├── __init__.py
│       │   │   └── en/
│       │   │       ├── __init__.py
│       │   │       └── formats.py
│       │   ├── forms.py
│       │   ├── legacy.py
│       │   ├── manage.py
│       │   ├── settings.py
│       │   ├── templatetags/
│       │   │   ├── __init__.py
│       │   │   ├── breadcrumbs.py
│       │   │   ├── date_and_time.py
│       │   │   ├── forms.py
│       │   │   ├── info.py
│       │   │   ├── maintenance.py
│       │   │   ├── popover.py
│       │   │   ├── port_info.py
│       │   │   ├── portadmin.py
│       │   │   ├── query.py
│       │   │   ├── radius.py
│       │   │   ├── report.py
│       │   │   ├── silent_include.py
│       │   │   ├── string_manipulation.py
│       │   │   ├── thresholds.py
│       │   │   ├── tools.py
│       │   │   └── watchdog.py
│       │   ├── urls.py
│       │   ├── utils.py
│       │   ├── validators.py
│       │   ├── views.py
│       │   └── widgets.py
│       ├── enterprise/
│       │   ├── __init__.py
│       │   └── ids.py
│       ├── errors.py
│       ├── etc/
│       │   ├── alertengine.conf
│       │   ├── alertmsg/
│       │   │   ├── aggregateLinkState/
│       │   │   │   ├── linkDegraded-email.txt
│       │   │   │   ├── linkDegraded-sms.txt
│       │   │   │   ├── linkRestored-email.txt
│       │   │   │   └── linkRestored-sms-txt
│       │   │   ├── apState/
│       │   │   │   ├── apDown-email.txt
│       │   │   │   ├── apDown-sms.txt
│       │   │   │   ├── apUp-email.txt
│       │   │   │   └── apUp-sms.txt
│       │   │   ├── bgpState/
│       │   │   │   ├── bgpAdmDown-email.txt
│       │   │   │   ├── bgpAdmDown-sms.txt
│       │   │   │   ├── bgpDown-email.txt
│       │   │   │   ├── bgpDown-sms.txt
│       │   │   │   ├── bgpEstablished-email.txt
│       │   │   │   └── bgpEstablished-sms.txt
│       │   │   ├── boxRestart/
│       │   │   │   ├── coldStart-email.txt
│       │   │   │   └── coldStart-sms.txt
│       │   │   ├── boxState/
│       │   │   │   ├── boxDown-email.txt
│       │   │   │   ├── boxDown-sms.txt
│       │   │   │   ├── boxDownWarning-email.txt
│       │   │   │   ├── boxDownWarning-sms.txt
│       │   │   │   ├── boxShadow-email.txt
│       │   │   │   ├── boxShadow-sms.txt
│       │   │   │   ├── boxShadowWarning-email.txt
│       │   │   │   ├── boxShadowWarning-sms.txt
│       │   │   │   ├── boxSunny-email.txt
│       │   │   │   ├── boxSunny-sms.txt
│       │   │   │   ├── boxUp-email.txt
│       │   │   │   └── boxUp-sms.txt
│       │   │   ├── chassisState/
│       │   │   │   ├── chassisDown-email.txt
│       │   │   │   ├── chassisDown-sms.txt
│       │   │   │   ├── chassisUp-email.txt
│       │   │   │   └── chassisUp-sms.txt
│       │   │   ├── default-email.txt
│       │   │   ├── default-sms.txt
│       │   │   ├── deviceNotice/
│       │   │   │   ├── deviceError-email.txt
│       │   │   │   ├── deviceError-sms.txt
│       │   │   │   ├── deviceFwUpgrade-email.txt
│       │   │   │   ├── deviceFwUpgrade-sms.txt
│       │   │   │   ├── deviceHwUpgrade-email.txt
│       │   │   │   ├── deviceHwUpgrade-sms.txt
│       │   │   │   ├── deviceSwUpgrade-email.txt
│       │   │   │   └── deviceSwUpgrade-sms.txt
│       │   │   ├── deviceState/
│       │   │   │   ├── deviceDeletedChassis-email.txt
│       │   │   │   ├── deviceDeletedChassis-sms.txt
│       │   │   │   ├── deviceDeletedFan-email.txt
│       │   │   │   ├── deviceDeletedFan-sms.txt
│       │   │   │   ├── deviceDeletedModule-email.txt
│       │   │   │   ├── deviceDeletedModule-sms.txt
│       │   │   │   ├── deviceDeletedPsu-email.txt
│       │   │   │   ├── deviceDeletedPsu-sms.txt
│       │   │   │   ├── deviceNewChassis-email.txt
│       │   │   │   ├── deviceNewChassis-sms.txt
│       │   │   │   ├── deviceNewFan-email.txt
│       │   │   │   ├── deviceNewFan-sms.txt
│       │   │   │   ├── deviceNewModule-email.txt
│       │   │   │   ├── deviceNewModule-sms.txt
│       │   │   │   ├── deviceNewPsu-email.txt
│       │   │   │   └── deviceNewPsu-sms.txt
│       │   │   ├── fanState/
│       │   │   │   ├── fanNotOK-email.txt
│       │   │   │   ├── fanNotOK-sms.txt
│       │   │   │   ├── fanOK-email.txt
│       │   │   │   └── fanOK-sms.txt
│       │   │   ├── info/
│       │   │   │   ├── deviceHwVerChanged-email.txt
│       │   │   │   ├── deviceHwVerChanged-sms.txt
│       │   │   │   ├── dnsMismatch-email.txt
│       │   │   │   ├── dnsMismatch-sms.txt
│       │   │   │   ├── macWarning-email.txt
│       │   │   │   ├── macWarning-sms.txt
│       │   │   │   ├── serialChanged-email.txt
│       │   │   │   └── serialChanged-sms.txt
│       │   │   ├── juniperRedAlarmState/
│       │   │   │   ├── juniperRedAlarmOff-email.txt
│       │   │   │   ├── juniperRedAlarmOff-sms.txt
│       │   │   │   ├── juniperRedAlarmOn-email.txt
│       │   │   │   └── juniperRedAlarmOn-sms.txt
│       │   │   ├── juniperYellowAlarmState/
│       │   │   │   ├── juniperYellowAlarmOff-email.txt
│       │   │   │   ├── juniperYellowAlarmOff-sms.txt
│       │   │   │   ├── juniperYellowAlarmOn-email.txt
│       │   │   │   └── juniperYellowAlarmOn-sms.txt
│       │   │   ├── kake/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── linkState/
│       │   │   │   ├── linkDown-email.txt
│       │   │   │   ├── linkDown-sms.txt
│       │   │   │   ├── linkUp-email.txt
│       │   │   │   └── linkUp-sms.txt
│       │   │   ├── maintenanceState/
│       │   │   │   ├── offMaintenance-email.txt
│       │   │   │   ├── offMaintenance-sms.txt
│       │   │   │   ├── onMaintenance-email.txt
│       │   │   │   └── onMaintenance-sms.txt
│       │   │   ├── moduleState/
│       │   │   │   ├── moduleDown-email.txt
│       │   │   │   ├── moduleDown-sms.txt
│       │   │   │   ├── moduleDownWarning-email.txt
│       │   │   │   ├── moduleDownWarning-sms.txt
│       │   │   │   ├── moduleUp-email.txt
│       │   │   │   └── moduleUp-sms.txt
│       │   │   ├── psuState/
│       │   │   │   ├── psuNotOK-email.txt
│       │   │   │   ├── psuNotOK-sms.txt
│       │   │   │   ├── psuOK-email.txt
│       │   │   │   └── psuOK-sms.txt
│       │   │   ├── serviceState/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── snmpAgentState/
│       │   │   │   ├── snmpAgentDown-email.txt
│       │   │   │   ├── snmpAgentDown-sms.txt
│       │   │   │   ├── snmpAgentUp-email.txt
│       │   │   │   └── snmpAgentUp-sms.txt
│       │   │   ├── thresholdState/
│       │   │   │   ├── belowThreshold-email.txt
│       │   │   │   ├── belowThreshold-sms.txt
│       │   │   │   ├── exceededThreshold-email.txt
│       │   │   │   └── exceededThreshold-sms.txt
│       │   │   ├── upsPowerState/
│       │   │   │   ├── upsOnBatteryPower-email.txt
│       │   │   │   ├── upsOnBatteryPower-sms.txt
│       │   │   │   ├── upsOnUtilityPower-email.txt
│       │   │   │   └── upsOnUtilityPower-sms.txt
│       │   │   ├── weathergoose_airflow/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_humidity/
│       │   │   │   ├── cmClimateHumidityNOTIFY-email.txt
│       │   │   │   ├── cmClimateHumidityNOTIFY-sms.txt
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_light/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_sound/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_temperature/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   └── whatsup/
│       │   │       ├── default-email.txt
│       │   │       └── default-sms.txt
│       │   ├── alertprofiles/
│       │   │   ├── README
│       │   │   ├── five_periods.conf
│       │   │   ├── one_period.conf
│       │   │   └── three_periods.conf
│       │   ├── apache/
│       │   │   └── apache.conf.example
│       │   ├── arnold/
│       │   │   ├── arnold.conf
│       │   │   ├── mailtemplates/
│       │   │   │   └── README
│       │   │   └── nonblock.conf
│       │   ├── cron.d/
│       │   │   ├── activeip
│       │   │   ├── dbclean
│       │   │   ├── emailreports
│       │   │   ├── logengine
│       │   │   ├── mactrace
│       │   │   ├── maintengine
│       │   │   ├── navdhcpstats
│       │   │   ├── navoui
│       │   │   ├── navstats
│       │   │   ├── netbiostracker
│       │   │   ├── sortedstats_cacher
│       │   │   ├── thresholdmon
│       │   │   └── topology
│       │   ├── daemons.yml
│       │   ├── db.conf
│       │   ├── dhcpstats.conf
│       │   ├── eventengine.conf
│       │   ├── fillthresholds.conf
│       │   ├── geomap/
│       │   │   ├── config.py
│       │   │   ├── popup_network.html
│       │   │   ├── popup_network_open.html
│       │   │   ├── popup_place.html
│       │   │   └── popup_place_open.html
│       │   ├── graphite/
│       │   │   ├── README
│       │   │   ├── storage-aggregation.conf
│       │   │   └── storage-schemas.conf
│       │   ├── graphite.conf
│       │   ├── ipdevpoll.conf
│       │   ├── l2trace.conf
│       │   ├── logger.conf
│       │   ├── logging.conf
│       │   ├── mailin.conf
│       │   ├── nav.conf
│       │   ├── navstats.conf
│       │   ├── netbiostracker.conf
│       │   ├── portadmin/
│       │   │   └── portadmin.conf
│       │   ├── pping.conf
│       │   ├── report/
│       │   │   ├── front.html
│       │   │   └── report.conf.d/
│       │   │       ├── report.conf
│       │   │       └── report.local.conf
│       │   ├── seeddb.conf
│       │   ├── servicemon.conf
│       │   ├── severity.yml
│       │   ├── smsd.conf
│       │   ├── snmptrapd.conf
│       │   ├── sortedstats.conf
│       │   ├── toolbox/
│       │   │   ├── alertprofiles.tool
│       │   │   ├── arnold.tool
│       │   │   ├── auditlog.tool
│       │   │   ├── business.tool
│       │   │   ├── devicehistory.tool
│       │   │   ├── geomap.tool
│       │   │   ├── info.tool
│       │   │   ├── interface_browser.tool
│       │   │   ├── ipam.tool
│       │   │   ├── ipdevinfo.tool
│       │   │   ├── l2trace.tool
│       │   │   ├── logger.tool
│       │   │   ├── machinetracker.tool
│       │   │   ├── macwatch.tool
│       │   │   ├── maintenance.tool
│       │   │   ├── messages.tool
│       │   │   ├── neighbors.tool
│       │   │   ├── netmap.tool
│       │   │   ├── networkexplorer.tool
│       │   │   ├── portadmin.tool
│       │   │   ├── radius.tool
│       │   │   ├── report.tool
│       │   │   ├── seeddb.tool
│       │   │   ├── stats.tool
│       │   │   ├── status.tool
│       │   │   ├── threshold.tool
│       │   │   ├── useradmin.tool
│       │   │   └── watchdog.tool
│       │   └── webfront/
│       │       ├── authentication.toml
│       │       ├── contact-information.txt
│       │       ├── jwt.conf
│       │       ├── nav-links.conf
│       │       ├── webfront.conf
│       │       ├── welcome-anonymous.txt
│       │       └── welcome-registered.txt
│       ├── event.py
│       ├── event2.py
│       ├── eventengine/
│       │   ├── __init__.py
│       │   ├── alerts.py
│       │   ├── config.py
│       │   ├── daemon.py
│       │   ├── engine.py
│       │   ├── export.py
│       │   ├── plugin.py
│       │   ├── plugins/
│       │   │   ├── __init__.py
│       │   │   ├── aggregatelinkstate.py
│       │   │   ├── bgpstate.py
│       │   │   ├── boxstate.py
│       │   │   ├── delayedstate.py
│       │   │   ├── juniperalertcount.py
│       │   │   ├── linkstate.py
│       │   │   ├── maintenancestate.py
│       │   │   ├── modulestate.py
│       │   │   ├── servicestate.py
│       │   │   ├── snmpagentstate.py
│       │   │   ├── thresholdstate.py
│       │   │   └── upgrade.py
│       │   ├── severity.py
│       │   ├── topology.py
│       │   └── unresolved.py
│       ├── ip.py
│       ├── ipdevpoll/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── control.py
│       │   ├── daemon.py
│       │   ├── dataloader.py
│       │   ├── db.py
│       │   ├── descrparsers.py
│       │   ├── epollreactor2.py
│       │   ├── jobs.py
│       │   ├── log.py
│       │   ├── neighbor.py
│       │   ├── plugins/
│       │   │   ├── __init__.py
│       │   │   ├── arp.py
│       │   │   ├── bgp.py
│       │   │   ├── bridge.py
│       │   │   ├── cam.py
│       │   │   ├── cdp.py
│       │   │   ├── ciscovlan.py
│       │   │   ├── debugging.py
│       │   │   ├── dnsname.py
│       │   │   ├── dot1q.py
│       │   │   ├── entity.py
│       │   │   ├── extremevlan.py
│       │   │   ├── interfaces.py
│       │   │   ├── juniperalarm.py
│       │   │   ├── juniperdot1q.py
│       │   │   ├── linkaggregate.py
│       │   │   ├── linkstate.py
│       │   │   ├── lldp.py
│       │   │   ├── modules.py
│       │   │   ├── paloaltoarp.py
│       │   │   ├── poe.py
│       │   │   ├── prefix.py
│       │   │   ├── propserial.py
│       │   │   ├── psu.py
│       │   │   ├── psuwatch.py
│       │   │   ├── sensors.py
│       │   │   ├── snmpcheck.py
│       │   │   ├── staticroutes.py
│       │   │   ├── statmulticast.py
│       │   │   ├── statports.py
│       │   │   ├── statsensors.py
│       │   │   ├── statsystem.py
│       │   │   ├── system.py
│       │   │   ├── typeoid.py
│       │   │   ├── uptime.py
│       │   │   └── virtualrouter.py
│       │   ├── pool.py
│       │   ├── schedule.py
│       │   ├── shadows/
│       │   │   ├── __init__.py
│       │   │   ├── adjacency.py
│       │   │   ├── cam.py
│       │   │   ├── entity.py
│       │   │   ├── gwpeers.py
│       │   │   ├── interface.py
│       │   │   ├── netbox.py
│       │   │   ├── prefix.py
│       │   │   └── swportblocked.py
│       │   ├── signals.py
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   ├── common.py
│       │   │   └── pynetsnmp.py
│       │   ├── storage.py
│       │   ├── timestamps.py
│       │   └── utils.py
│       ├── junos/
│       │   ├── __init__.py
│       │   ├── nav_views.py
│       │   └── nav_views.yml
│       ├── jwtconf.py
│       ├── logengine.py
│       ├── logs.py
│       ├── macaddress.py
│       ├── mailin/
│       │   ├── __init__.py
│       │   └── plugins/
│       │       ├── __init__.py
│       │       ├── kake.py
│       │       └── whatsup.py
│       ├── maintengine.py
│       ├── metrics/
│       │   ├── __init__.py
│       │   ├── carbon.py
│       │   ├── data.py
│       │   ├── errors.py
│       │   ├── graphs.py
│       │   ├── lookup.py
│       │   ├── names.py
│       │   ├── templates.py
│       │   └── thresholds.py
│       ├── mibs/
│       │   ├── __init__.py
│       │   ├── alcatel_ind1_port_mib.py
│       │   ├── arista_vrf_mib.py
│       │   ├── bgp4_mib.py
│       │   ├── bgp4_v2_mib_juniper.py
│       │   ├── bridge_mib.py
│       │   ├── cd6c_mib.py
│       │   ├── cisco_auth_framework_mib.py
│       │   ├── cisco_bgp4_mib.py
│       │   ├── cisco_c2900_mib.py
│       │   ├── cisco_cdp_mib.py
│       │   ├── cisco_enhanced_memory_pool_mib.py
│       │   ├── cisco_entity_fru_control_mib.py
│       │   ├── cisco_entity_sensor_mib.py
│       │   ├── cisco_envmon_mib.py
│       │   ├── cisco_hsrp_mib.py
│       │   ├── cisco_ietf_ip_mib.py
│       │   ├── cisco_memory_pool_mib.py
│       │   ├── cisco_power_ethernet_ext_mib.py
│       │   ├── cisco_process_mib.py
│       │   ├── cisco_stack_mib.py
│       │   ├── cisco_vlan_iftable_relationship_mib.py
│       │   ├── cisco_vlan_membership_mib.py
│       │   ├── cisco_vtp_mib.py
│       │   ├── comet.py
│       │   ├── comet_t3611.py
│       │   ├── coriant_groove_mib.py
│       │   ├── cpqpower_mib.py
│       │   ├── eltek_distributed_mib.py
│       │   ├── entity_mib.py
│       │   ├── entity_sensor_mib.py
│       │   ├── esswitch_mib.py
│       │   ├── etherlike_mib.py
│       │   ├── extreme_vlan_mib.py
│       │   ├── geist_mibv3.py
│       │   ├── geist_mibv4.py
│       │   ├── hp_httpmanageable_mib.py
│       │   ├── hpicf_fan_mib.py
│       │   ├── hpicf_powersupply_mib.py
│       │   ├── ibm_pdu_mib.py
│       │   ├── ieee8023_lag_mib.py
│       │   ├── if_mib.py
│       │   ├── ip_forward_mib.py
│       │   ├── ip_mib.py
│       │   ├── ipv6_mib.py
│       │   ├── itw_mib.py
│       │   ├── itw_mibv3.py
│       │   ├── itw_mibv4.py
│       │   ├── juniper_alarm_mib.py
│       │   ├── juniper_dom_mib.py
│       │   ├── juniper_mib.py
│       │   ├── lldp_mib.py
│       │   ├── mg_snmp_ups_mib.py
│       │   ├── mibretriever.py
│       │   ├── netswitch_mib.py
│       │   ├── old_cisco_cpu_mib.py
│       │   ├── pdu2_mib.py
│       │   ├── power_ethernet_mib.py
│       │   ├── powernet_mib.py
│       │   ├── pwt_3phase_mibv1.py
│       │   ├── qbridge_mib.py
│       │   ├── rittal_cmc_iii.py
│       │   ├── snmpv2_mib.py
│       │   ├── spagent_mib.py
│       │   ├── statistics_mib.py
│       │   ├── types.py
│       │   ├── ups_mib.py
│       │   ├── vrrp_mib.py
│       │   ├── wlsx_systemext_mib.py
│       │   └── xups_mib.py
│       ├── models/
│       │   ├── __init__.py
│       │   ├── api.py
│       │   ├── apps.py
│       │   ├── arnold.py
│       │   ├── cabling.py
│       │   ├── event.py
│       │   ├── fields.py
│       │   ├── images.py
│       │   ├── logger.py
│       │   ├── manage.py
│       │   ├── models.py
│       │   ├── msgmaint.py
│       │   ├── oui.py
│       │   ├── profiles.py
│       │   ├── rack.py
│       │   ├── service.py
│       │   ├── sql/
│       │   │   ├── README
│       │   │   ├── baseline/
│       │   │   │   ├── arnold.sql
│       │   │   │   ├── indexes.sql
│       │   │   │   ├── logger.sql
│       │   │   │   ├── manage.sql
│       │   │   │   ├── manage2.sql
│       │   │   │   ├── navprofiles.sql
│       │   │   │   ├── radius.sql
│       │   │   │   └── types.sql
│       │   │   ├── changes/
│       │   │   │   ├── sc.03.08.0000.sql
│       │   │   │   ├── sc.03.08.0001.sql
│       │   │   │   ├── sc.03.09.0001.sql
│       │   │   │   ├── sc.03.09.0002.sql
│       │   │   │   ├── sc.03.09.0003.sql
│       │   │   │   ├── sc.03.09.0004.sql
│       │   │   │   ├── sc.03.09.0005.sql
│       │   │   │   ├── sc.03.09.0006.sql
│       │   │   │   ├── sc.03.10.0001.sql
│       │   │   │   ├── sc.03.10.0002.sql
│       │   │   │   ├── sc.03.10.0003.sql
│       │   │   │   ├── sc.03.10.0004.sql
│       │   │   │   ├── sc.03.10.0005.sql
│       │   │   │   ├── sc.03.10.0006.sql
│       │   │   │   ├── sc.03.10.0007.sql
│       │   │   │   ├── sc.03.11.0001.sql
│       │   │   │   ├── sc.03.11.0002.sql
│       │   │   │   ├── sc.03.11.0003.sql
│       │   │   │   ├── sc.03.11.0004.sql
│       │   │   │   ├── sc.03.11.0005.sql
│       │   │   │   ├── sc.03.11.0006.sql
│       │   │   │   ├── sc.03.11.0007.sql
│       │   │   │   ├── sc.03.11.0008.sql
│       │   │   │   ├── sc.03.11.0009.sql
│       │   │   │   ├── sc.03.11.0010.sql
│       │   │   │   ├── sc.03.11.0011.sql
│       │   │   │   ├── sc.03.11.0012.sql
│       │   │   │   ├── sc.03.11.0013.sql
│       │   │   │   ├── sc.03.12.0001.sql
│       │   │   │   ├── sc.03.12.0002.sql
│       │   │   │   ├── sc.03.12.0003.sql
│       │   │   │   ├── sc.03.12.0004.sql
│       │   │   │   ├── sc.03.12.0005.sql
│       │   │   │   ├── sc.03.12.0025.sql
│       │   │   │   ├── sc.03.12.0026.sql
│       │   │   │   ├── sc.03.12.0027.sql
│       │   │   │   ├── sc.03.12.0028.sql
│       │   │   │   ├── sc.03.12.0050.sql
│       │   │   │   ├── sc.03.12.0051.sql
│       │   │   │   ├── sc.03.12.0052.sql
│       │   │   │   ├── sc.03.12.0053.sql
│       │   │   │   ├── sc.03.12.0054.sql
│       │   │   │   ├── sc.03.12.0100.sql
│       │   │   │   ├── sc.03.12.0101.sql
│       │   │   │   ├── sc.03.12.0102.sql
│       │   │   │   ├── sc.03.12.0103.sql
│       │   │   │   ├── sc.03.12.0104.sql
│       │   │   │   ├── sc.03.12.0105.sql
│       │   │   │   ├── sc.03.12.0106.sql
│       │   │   │   ├── sc.03.12.0107.sql
│       │   │   │   ├── sc.03.12.0110.sql
│       │   │   │   ├── sc.03.12.0111.sql
│       │   │   │   ├── sc.03.13.0001.sql
│       │   │   │   ├── sc.03.13.0002.sql
│       │   │   │   ├── sc.03.13.0010.sql
│       │   │   │   ├── sc.03.13.0011.sql
│       │   │   │   ├── sc.03.13.0012.sql
│       │   │   │   ├── sc.03.13.0013.sql
│       │   │   │   ├── sc.03.13.0014.sql
│       │   │   │   ├── sc.03.13.0015.sql
│       │   │   │   ├── sc.03.14.0001.sql
│       │   │   │   ├── sc.03.14.0002.sql
│       │   │   │   ├── sc.03.14.0003.sql
│       │   │   │   ├── sc.03.14.0004.sql
│       │   │   │   ├── sc.03.14.0005.sql
│       │   │   │   ├── sc.03.14.0006.sql
│       │   │   │   ├── sc.03.14.0007.sql
│       │   │   │   ├── sc.03.15.0001.sql
│       │   │   │   ├── sc.03.15.0002.sql
│       │   │   │   ├── sc.03.15.0003.sql
│       │   │   │   ├── sc.03.15.0004.sql
│       │   │   │   ├── sc.03.15.0050.sql
│       │   │   │   ├── sc.03.15.0070.sql
│       │   │   │   ├── sc.03.15.0071.sql
│       │   │   │   ├── sc.03.15.0072.sql
│       │   │   │   ├── sc.03.15.0100.sql
│       │   │   │   ├── sc.03.15.0101.sql
│       │   │   │   ├── sc.03.15.0102.sql
│       │   │   │   ├── sc.03.15.0103.sql
│       │   │   │   ├── sc.03.15.0104.sql
│       │   │   │   ├── sc.03.15.0105.sql
│       │   │   │   ├── sc.03.15.0200.sql
│       │   │   │   ├── sc.03.15.0201.sql
│       │   │   │   ├── sc.04.00.0001.sql
│       │   │   │   ├── sc.04.00.0002.sql
│       │   │   │   ├── sc.04.00.0003.sql
│       │   │   │   ├── sc.04.00.0004.sql
│       │   │   │   ├── sc.04.00.0010.sql
│       │   │   │   ├── sc.04.00.0011.sql
│       │   │   │   ├── sc.04.00.0012.sql
│       │   │   │   ├── sc.04.00.0013.sql
│       │   │   │   ├── sc.04.00.0014.sql
│       │   │   │   ├── sc.04.00.0015.sql
│       │   │   │   ├── sc.04.00.0016.sql
│       │   │   │   ├── sc.04.00.0017.sql
│       │   │   │   ├── sc.04.00.0018.sql
│       │   │   │   ├── sc.04.00.0019.sql
│       │   │   │   ├── sc.04.00.0020.sql
│       │   │   │   ├── sc.04.01.0001.sql
│       │   │   │   ├── sc.04.01.0002.sql
│       │   │   │   ├── sc.04.01.0003.sql
│       │   │   │   ├── sc.04.02.0001.sql
│       │   │   │   ├── sc.04.02.0010.sql
│       │   │   │   ├── sc.04.02.0020.sql
│       │   │   │   ├── sc.04.02.0050.sql
│       │   │   │   ├── sc.04.02.0055.sql
│       │   │   │   ├── sc.04.02.0100.sql
│       │   │   │   ├── sc.04.02.0101.sql
│       │   │   │   ├── sc.04.02.0102.sql
│       │   │   │   ├── sc.04.02.0103.sql
│       │   │   │   ├── sc.04.02.0104.sql
│       │   │   │   ├── sc.04.03.0001.sql
│       │   │   │   ├── sc.04.03.0002.sql
│       │   │   │   ├── sc.04.03.0003.sql
│       │   │   │   ├── sc.04.03.0004.sql
│       │   │   │   ├── sc.04.03.0005.sql
│       │   │   │   ├── sc.04.03.0006.sql
│       │   │   │   ├── sc.04.03.0050.sql
│       │   │   │   ├── sc.04.03.0051.sql
│       │   │   │   ├── sc.04.03.0060.sql
│       │   │   │   ├── sc.04.03.0061.sql
│       │   │   │   ├── sc.04.03.0070.sql
│       │   │   │   ├── sc.04.04.0001.sql
│       │   │   │   ├── sc.04.04.0050.sql
│       │   │   │   ├── sc.04.04.0051.sql
│       │   │   │   ├── sc.04.04.0052.sql
│       │   │   │   ├── sc.04.04.0053.sql
│       │   │   │   ├── sc.04.05.0050.sql
│       │   │   │   ├── sc.04.06.0001.sql
│       │   │   │   ├── sc.04.06.0002.sql
│       │   │   │   ├── sc.04.06.0003.sql
│       │   │   │   ├── sc.04.06.0004.sql
│       │   │   │   ├── sc.04.06.0050.sql
│       │   │   │   ├── sc.04.06.0051.sql
│       │   │   │   ├── sc.04.06.0052.sql
│       │   │   │   ├── sc.04.06.0053.sql
│       │   │   │   ├── sc.04.06.0054.sql
│       │   │   │   ├── sc.04.06.0055.sql
│       │   │   │   ├── sc.04.06.0056.sql
│       │   │   │   ├── sc.04.07.0001.sql
│       │   │   │   ├── sc.04.07.0002.sql
│       │   │   │   ├── sc.04.07.0003.sql
│       │   │   │   ├── sc.04.07.0010.sql
│       │   │   │   ├── sc.04.07.0011.sql
│       │   │   │   ├── sc.04.07.0050.sql
│       │   │   │   ├── sc.04.07.0060.sql
│       │   │   │   ├── sc.04.07.0070.sql
│       │   │   │   ├── sc.04.07.0100.sql
│       │   │   │   ├── sc.04.07.0110.sql
│       │   │   │   ├── sc.04.08.0001.sql
│       │   │   │   ├── sc.04.08.0010.sql
│       │   │   │   ├── sc.04.08.0020.sql
│       │   │   │   ├── sc.04.08.0050.sql
│       │   │   │   ├── sc.04.08.0080.sql
│       │   │   │   ├── sc.04.08.0210.sql
│       │   │   │   ├── sc.04.08.0310.sql
│       │   │   │   ├── sc.04.08.0410.sql
│       │   │   │   ├── sc.04.08.0510.sql
│       │   │   │   ├── sc.04.08.1000.sql
│       │   │   │   ├── sc.04.08.1001.sql
│       │   │   │   ├── sc.04.08.3685.sql
│       │   │   │   ├── sc.04.09.0001.sql
│       │   │   │   ├── sc.04.09.0050.sql
│       │   │   │   ├── sc.04.09.0100.sql
│       │   │   │   ├── sc.04.09.0110.sql
│       │   │   │   ├── sc.04.09.0200.sql
│       │   │   │   ├── sc.05.00.0001.sql
│       │   │   │   ├── sc.05.00.0010.sql
│       │   │   │   ├── sc.05.00.0011.sql
│       │   │   │   ├── sc.05.00.0012.sql
│       │   │   │   ├── sc.05.00.0020.sql
│       │   │   │   ├── sc.05.00.0030.sql
│       │   │   │   ├── sc.05.00.0050.sql
│       │   │   │   ├── sc.05.00.0060.sql
│       │   │   │   ├── sc.05.00.0070.sql
│       │   │   │   ├── sc.05.00.0080.sql
│       │   │   │   ├── sc.05.00.0100.sql
│       │   │   │   ├── sc.05.01.0001.sql
│       │   │   │   ├── sc.05.02.0001.sql
│       │   │   │   ├── sc.05.02.0002.sql
│       │   │   │   ├── sc.05.04.0001.sql
│       │   │   │   ├── sc.05.04.0002.sql
│       │   │   │   ├── sc.05.04.0003.sql
│       │   │   │   ├── sc.05.05.0001.sql
│       │   │   │   ├── sc.05.05.0002.sql
│       │   │   │   ├── sc.05.07.0001.sql
│       │   │   │   ├── sc.05.07.0002.sql
│       │   │   │   ├── sc.05.10.0001.sql
│       │   │   │   ├── sc.05.10.0002.sql
│       │   │   │   ├── sc.05.11.0001.sql
│       │   │   │   ├── sc.05.11.0002.sql
│       │   │   │   ├── sc.05.12.0001.sql
│       │   │   │   ├── sc.05.12.0002.sql
│       │   │   │   ├── sc.05.12.0010.sql
│       │   │   │   ├── sc.05.12.0100.sql
│       │   │   │   ├── sc.05.14.0001.sql
│       │   │   │   ├── sc.05.14.0002.sql
│       │   │   │   ├── sc.05.14.0003.sql
│       │   │   │   ├── sc.05.14.0004.sql
│       │   │   │   ├── sc.05.14.0101.sql
│       │   │   │   ├── sc.05.14.0102.sql
│       │   │   │   ├── sc.05.14.0103.sql
│       │   │   │   ├── sc.05.15.0001.sql
│       │   │   │   ├── sc.05.15.0502.sql
│       │   │   │   ├── sc.05.16.0001.sql
│       │   │   │   ├── sc.05.17.0002.sql
│       │   │   │   ├── sc.05.17.0003.sql
│       │   │   │   ├── sc.05.17.0005.sql
│       │   │   │   ├── sc.05.18.0501.sql
│       │   │   │   ├── sc.05.18.0502.sql
│       │   │   │   ├── sc.05.18.0503.sql
│       │   │   │   ├── sc.05.18.0505.sql
│       │   │   │   └── sc.05.18.0506.sql
│       │   │   ├── historic-upgrades/
│       │   │   │   ├── 3.0_beta10.sql
│       │   │   │   ├── 3.0_beta7.sql
│       │   │   │   ├── 3.0_beta8.sql
│       │   │   │   ├── 3.0_rc1.sql
│       │   │   │   ├── 3.1.0.sql
│       │   │   │   ├── 3.2.0.sql
│       │   │   │   ├── 3.3.0.sql
│       │   │   │   ├── 3.4.0.sql
│       │   │   │   ├── 3.4.2.sql
│       │   │   │   ├── 3.5.0.sql
│       │   │   │   ├── 3.5.0b1.sql
│       │   │   │   ├── 3.5.0b2-hpfix.sql
│       │   │   │   ├── 3.5.0b2.sql
│       │   │   │   ├── 3.5.0b3.sql
│       │   │   │   ├── 3.6.0.sql
│       │   │   │   ├── 3.6.0b1.sql
│       │   │   │   ├── 3.6.0b3.sql
│       │   │   │   ├── 3.6.0b5.sql
│       │   │   │   ├── 3.6.0b6.sql
│       │   │   │   ├── 3.6.1.sql
│       │   │   │   ├── 3.7.0.sql
│       │   │   │   ├── 3.7.1.sql
│       │   │   │   ├── README
│       │   │   │   └── mergedb.sh
│       │   │   └── syncdb.py
│       │   └── thresholds.py
│       ├── napalm.py
│       ├── natsort.py
│       ├── netbiostracker/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   └── tracker.py
│       ├── netmap/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── metadata.py
│       │   ├── stubs/
│       │   │   └── __init__.py
│       │   ├── topology.py
│       │   └── traffic.py
│       ├── oidparsers.py
│       ├── oids.py
│       ├── pgdump.py
│       ├── pgsync.py
│       ├── portadmin/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── handlers.py
│       │   ├── management.py
│       │   ├── napalm/
│       │   │   ├── __init__.py
│       │   │   ├── juniper.py
│       │   │   └── templates/
│       │   │       └── portadmin/
│       │   │           ├── junos-disable-interface.djt
│       │   │           ├── junos-disable-poe.djt
│       │   │           ├── junos-enable-poe.djt
│       │   │           ├── junos-set-access-port-vlan.djt
│       │   │           ├── junos-set-interface-description.djt
│       │   │           └── junos-set-trunk-port-vlans.djt
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── cisco.py
│       │   │   ├── dell.py
│       │   │   ├── h3c.py
│       │   │   └── hp.py
│       │   └── vlan.py
│       ├── pwhash.py
│       ├── report/
│       │   ├── IPtools.py
│       │   ├── IPtree.py
│       │   ├── __init__.py
│       │   ├── dbresult.py
│       │   ├── generator.py
│       │   ├── matrix.py
│       │   ├── matrixIPv4.py
│       │   ├── matrixIPv6.py
│       │   ├── metaIP.py
│       │   └── report.py
│       ├── smidumps/
│       │   ├── AIRESPACE-WIRELESS-MIB.py
│       │   ├── ALCATEL-IND1-PORT-MIB.py
│       │   ├── ARISTA-VRF-MIB.py
│       │   ├── BGP4-MIB.py
│       │   ├── BGP4-V2-MIB-JUNIPER.py
│       │   ├── BRIDGE-MIB.py
│       │   ├── CD6C.py
│       │   ├── CISCO-AUTH-FRAMEWORK-MIB.py
│       │   ├── CISCO-BGP4-MIB.py
│       │   ├── CISCO-C2900-MIB.py
│       │   ├── CISCO-CDP-MIB.py
│       │   ├── CISCO-ENHANCED-MEMPOOL-MIB.py
│       │   ├── CISCO-ENTITY-FRU-CONTROL-MIB.py
│       │   ├── CISCO-ENTITY-SENSOR-MIB.py
│       │   ├── CISCO-ENVMON-MIB.py
│       │   ├── CISCO-HSRP-MIB.py
│       │   ├── CISCO-IETF-IP-MIB.py
│       │   ├── CISCO-MEMORY-POOL-MIB.py
│       │   ├── CISCO-PAE-MIB.py
│       │   ├── CISCO-POWER-ETHERNET-EXT-MIB.py
│       │   ├── CISCO-PROCESS-MIB.py
│       │   ├── CISCO-STACK-MIB.py
│       │   ├── CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB.py
│       │   ├── CISCO-VLAN-MEMBERSHIP-MIB.py
│       │   ├── CISCO-VTP-MIB.py
│       │   ├── COMETMS-MIB.py
│       │   ├── CORIANT-GROOVE-MIB.py
│       │   ├── CPQPOWER-MIB.py
│       │   ├── DNOS-SWITCHING-MIB.py
│       │   ├── ELTEK-DISTRIBUTED-MIB.py
│       │   ├── ENTITY-MIB.py
│       │   ├── ENTITY-SENSOR-MIB.py
│       │   ├── EXTREME-VLAN-MIB.py
│       │   ├── EtherLike-MIB.py
│       │   ├── FAN-MIB.py
│       │   ├── GEIST-MIB-V3.py
│       │   ├── GEIST-V4-MIB.py
│       │   ├── IANA-ENTITY-MIB.py
│       │   ├── IBM-PDU-MIB.py
│       │   ├── IEEE8023-LAG-MIB.py
│       │   ├── IF-MIB.py
│       │   ├── IP-FORWARD-MIB.py
│       │   ├── IP-MIB.py
│       │   ├── IPV6-MIB.py
│       │   ├── IT-WATCHDOGS-MIB-V3.py
│       │   ├── IT-WATCHDOGS-MIB.py
│       │   ├── IT-WATCHDOGS-V4-MIB.py
│       │   ├── JUNIPER-ALARM-MIB.py
│       │   ├── JUNIPER-DOM-MIB.py
│       │   ├── JUNIPER-MIB.py
│       │   ├── LLDP-MIB.py
│       │   ├── MG-SNMP-UPS-MIB.py
│       │   ├── NETSWITCH-MIB.py
│       │   ├── OLD-CISCO-CPU-MIB.py
│       │   ├── P8541-MIB.py
│       │   ├── P8652-MIB.py
│       │   ├── PDU2-MIB.py
│       │   ├── POWER-ETHERNET-MIB.py
│       │   ├── POWERSUPPLY-MIB.py
│       │   ├── PWTv1-MIB.py
│       │   ├── PowerNet-MIB.py
│       │   ├── Q-BRIDGE-MIB.py
│       │   ├── RITTAL-CMC-III-MIB.py
│       │   ├── SEMI-MIB.py
│       │   ├── SNMPv2-MIB.py
│       │   ├── SPAGENT-MIB.py
│       │   ├── STAND-ALONE-ETHERNET-SWITCH-MIB.py
│       │   ├── STATISTICS-MIB.py
│       │   ├── T3611-MIB.py
│       │   ├── UPS-MIB.py
│       │   ├── VRRP-MIB.py
│       │   ├── WLSX-SYSTEMEXT-MIB.py
│       │   ├── XUPS-MIB.py
│       │   └── __init__.py
│       ├── smsd/
│       │   ├── __init__.py
│       │   ├── boostdispatcher.py
│       │   ├── debugdispatcher.py
│       │   ├── dispatcher.py
│       │   ├── gammudispatcher.py
│       │   ├── httpgetdispatcher.py
│       │   ├── navdbqueue.py
│       │   └── uninettmaildispatcher.py
│       ├── snmptrapd/
│       │   ├── __init__.py
│       │   ├── agent.py
│       │   ├── agent_pynetsnmp.py
│       │   ├── handlers/
│       │   │   ├── __init__.py
│       │   │   ├── airespace.py
│       │   │   ├── handlertemplate.py
│       │   │   ├── linkupdown.py
│       │   │   ├── ups.py
│       │   │   └── weathergoose.py
│       │   ├── plugin.py
│       │   └── trap.py
│       ├── startstop.py
│       ├── statemon/
│       │   ├── RunQueue.py
│       │   ├── __init__.py
│       │   ├── abstractchecker.py
│       │   ├── checker/
│       │   │   ├── DcChecker.py
│       │   │   ├── DhcpChecker.py
│       │   │   ├── DnsChecker.py
│       │   │   ├── DummyChecker.py
│       │   │   ├── FtpChecker.py
│       │   │   ├── HttpChecker.py
│       │   │   ├── HttpsChecker.py
│       │   │   ├── ImapChecker.py
│       │   │   ├── ImapsChecker.py
│       │   │   ├── LdapChecker.py
│       │   │   ├── MysqlChecker.py
│       │   │   ├── OracleChecker.py
│       │   │   ├── Pop3Checker.py
│       │   │   ├── PortChecker.py
│       │   │   ├── PostgresqlChecker.py
│       │   │   ├── RadiusChecker.py
│       │   │   ├── RpcChecker.py
│       │   │   ├── SmbChecker.py
│       │   │   ├── SmtpChecker.py
│       │   │   ├── SshChecker.py
│       │   │   ├── __init__.py
│       │   │   └── radius/
│       │   │       └── dictionary.rfc2865
│       │   ├── checkermap.py
│       │   ├── circbuf.py
│       │   ├── config.py
│       │   ├── db.py
│       │   ├── event.py
│       │   ├── icmppacket.py
│       │   ├── megaping.py
│       │   ├── netbox.py
│       │   └── statistics.py
│       ├── tableformat.py
│       ├── tests/
│       │   ├── __init__.py
│       │   └── cases.py
│       ├── thresholdmon.py
│       ├── topology/
│       │   ├── __init__.py
│       │   ├── analyze.py
│       │   ├── detector.py
│       │   ├── diff.py
│       │   ├── layer2.py
│       │   └── vlan.py
│       ├── toposort.py
│       ├── util.py
│       ├── watchdog/
│       │   ├── __init__.py
│       │   ├── tests.py
│       │   └── util.py
│       ├── web/
│       │   ├── __init__.py
│       │   ├── ajax/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── alertprofiles/
│       │   │   ├── __init__.py
│       │   │   ├── decorators.py
│       │   │   ├── forms.py
│       │   │   ├── shortcuts.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── api/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   ├── v1/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── alert_serializers.py
│       │   │   │   ├── auth.py
│       │   │   │   ├── fields.py
│       │   │   │   ├── filter_backends.py
│       │   │   │   ├── helpers/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── prefix_collector.py
│       │   │   │   ├── serializers.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   └── v2/
│       │   │       ├── __init__.py
│       │   │       └── urls.py
│       │   ├── apps.py
│       │   ├── arnold/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── auth/
│       │   │   ├── __init__.py
│       │   │   ├── allauth/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── adapter.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── backends.py
│       │   │   ├── ldap.py
│       │   │   ├── ldap_auth_backend.py
│       │   │   ├── middleware.py
│       │   │   ├── remote_user.py
│       │   │   ├── sudo.py
│       │   │   └── utils.py
│       │   ├── business/
│       │   │   ├── __init__.py
│       │   │   ├── reportengine.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── crispyforms.py
│       │   ├── devicehistory/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   ├── utils/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── componentsearch.py
│       │   │   │   ├── error.py
│       │   │   │   └── history.py
│       │   │   └── views.py
│       │   ├── geomap/
│       │   │   ├── __init__.py
│       │   │   ├── conf.py
│       │   │   ├── db.py
│       │   │   ├── features.py
│       │   │   ├── graph.py
│       │   │   ├── output_formats.py
│       │   │   ├── templatetags/
│       │   │   │   ├── __init__.py
│       │   │   │   └── geomap.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── graphite/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── info/
│       │   │   ├── __init__.py
│       │   │   ├── event/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── forms.py
│       │   │   ├── images/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── upload.py
│       │   │   │   ├── urls.py
│       │   │   │   ├── utils.py
│       │   │   │   └── views.py
│       │   │   ├── location/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── netboxgroup/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── prefix/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── room/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── searchproviders.py
│       │   │   ├── urls.py
│       │   │   ├── views.py
│       │   │   └── vlan/
│       │   │       ├── __init__.py
│       │   │       ├── urls.py
│       │   │       └── views.py
│       │   ├── interface_browser/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── ipam/
│       │   │   ├── __init__.py
│       │   │   ├── api.py
│       │   │   ├── prefix_tree.py
│       │   │   ├── urls.py
│       │   │   ├── util.py
│       │   │   └── views.py
│       │   ├── ipdevinfo/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── host_information.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── jwtgen.py
│       │   ├── l2trace/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── machinetracker/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── iprange.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── macwatch/
│       │   │   ├── __init__.py
│       │   │   ├── apps.py
│       │   │   ├── forms.py
│       │   │   ├── models.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── maintenance/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── message.py
│       │   ├── messages/
│       │   │   ├── __init__.py
│       │   │   ├── feeds.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── modals.py
│       │   ├── modpython.py
│       │   ├── navlets/
│       │   │   ├── __init__.py
│       │   │   ├── alert.py
│       │   │   ├── env_rack.py
│       │   │   ├── error.py
│       │   │   ├── feedreader.py
│       │   │   ├── forms.py
│       │   │   ├── gettingstarted.py
│       │   │   ├── graph.py
│       │   │   ├── linklist.py
│       │   │   ├── locationstatus.py
│       │   │   ├── machinetracker.py
│       │   │   ├── messages.py
│       │   │   ├── navblog.py
│       │   │   ├── pdu.py
│       │   │   ├── portadmin.py
│       │   │   ├── report.py
│       │   │   ├── room_map.py
│       │   │   ├── roomstatus.py
│       │   │   ├── sensor.py
│       │   │   ├── status2.py
│       │   │   ├── ups.py
│       │   │   ├── urls.py
│       │   │   ├── vlangraph.py
│       │   │   ├── watchdog.py
│       │   │   └── welcome.py
│       │   ├── neighbors/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── netmap/
│       │   │   ├── __init__.py
│       │   │   ├── api.py
│       │   │   ├── cache.py
│       │   │   ├── common.py
│       │   │   ├── graph.py
│       │   │   ├── mixins.py
│       │   │   ├── serializers.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── networkexplorer/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── mixins.py
│       │   │   ├── search.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── portadmin/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── templates/
│       │   │   │   └── portadmin/
│       │   │   │       └── aliasformat.html
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── radius/
│       │   │   ├── __init__.py
│       │   │   ├── db.py
│       │   │   ├── forms.py
│       │   │   ├── radius_config.py
│       │   │   ├── radiuslib.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── report/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── sass/
│       │   │   ├── _fonts.scss
│       │   │   ├── _foundation.scss
│       │   │   ├── _navsettings.scss
│       │   │   ├── _normalize.scss
│       │   │   ├── _overrides.scss
│       │   │   ├── font-awesome/
│       │   │   │   ├── _animated.scss
│       │   │   │   ├── _bordered-pulled.scss
│       │   │   │   ├── _core.scss
│       │   │   │   ├── _fixed-width.scss
│       │   │   │   ├── _icons.scss
│       │   │   │   ├── _larger.scss
│       │   │   │   ├── _list.scss
│       │   │   │   ├── _mixins.scss
│       │   │   │   ├── _path.scss
│       │   │   │   ├── _rotated-flipped.scss
│       │   │   │   ├── _screen-reader.scss
│       │   │   │   ├── _spinning.scss
│       │   │   │   ├── _stacked.scss
│       │   │   │   ├── _variables.scss
│       │   │   │   └── font-awesome.scss
│       │   │   ├── foundation/
│       │   │   │   ├── _functions.scss
│       │   │   │   ├── _settings.scss
│       │   │   │   └── components/
│       │   │   │       ├── _accordion.scss
│       │   │   │       ├── _alert-boxes.scss
│       │   │   │       ├── _block-grid.scss
│       │   │   │       ├── _breadcrumbs.scss
│       │   │   │       ├── _button-groups.scss
│       │   │   │       ├── _buttons.scss
│       │   │   │       ├── _forms.scss
│       │   │   │       ├── _global.scss
│       │   │   │       ├── _grid.scss
│       │   │   │       ├── _inline-lists.scss
│       │   │   │       ├── _keystrokes.scss
│       │   │   │       ├── _labels.scss
│       │   │   │       ├── _pagination.scss
│       │   │   │       ├── _panels.scss
│       │   │   │       ├── _reveal.scss
│       │   │   │       ├── _sub-nav.scss
│       │   │   │       ├── _switch.scss
│       │   │   │       ├── _switches.scss
│       │   │   │       ├── _tables.scss
│       │   │   │       ├── _tabs.scss
│       │   │   │       ├── _toolbar.scss
│       │   │   │       ├── _top-bar.scss
│       │   │   │       ├── _type.scss
│       │   │   │       └── _visibility.scss
│       │   │   ├── libs/
│       │   │   │   ├── driver.css
│       │   │   │   └── flatpickr.css
│       │   │   ├── nav/
│       │   │   │   ├── _accordion.scss
│       │   │   │   ├── _datatables.scss
│       │   │   │   ├── _dialog.scss
│       │   │   │   ├── _fonts.scss
│       │   │   │   ├── _footer.scss
│       │   │   │   ├── _lightbox.scss
│       │   │   │   ├── _modal.scss
│       │   │   │   ├── _popover.scss
│       │   │   │   ├── _select2.scss
│       │   │   │   ├── _sensors.scss
│       │   │   │   ├── _settings.scss
│       │   │   │   ├── _table.scss
│       │   │   │   ├── _tabs.scss
│       │   │   │   ├── _tooltip.scss
│       │   │   │   ├── alertprofiles.scss
│       │   │   │   ├── arnold.scss
│       │   │   │   ├── business.scss
│       │   │   │   ├── calendar.scss
│       │   │   │   ├── color.scss
│       │   │   │   ├── custom.scss
│       │   │   │   ├── devicehistory.scss
│       │   │   │   ├── errorpages.scss
│       │   │   │   ├── geomap.scss
│       │   │   │   ├── index.scss
│       │   │   │   ├── info_room.scss
│       │   │   │   ├── interface_browser.scss
│       │   │   │   ├── ipam.scss
│       │   │   │   ├── ipdevinfo.scss
│       │   │   │   ├── jquery-ui-1.8.21.custom.scss
│       │   │   │   ├── jquery-ui.scss
│       │   │   │   ├── local_rickshaw.scss
│       │   │   │   ├── login.scss
│       │   │   │   ├── machinetracker.scss
│       │   │   │   ├── maintenance.scss
│       │   │   │   ├── mixins.scss
│       │   │   │   ├── multi-select.scss
│       │   │   │   ├── my_account.scss
│       │   │   │   ├── navlets.scss
│       │   │   │   ├── navlets_compact.scss
│       │   │   │   ├── neighbors.scss
│       │   │   │   ├── netmap.scss
│       │   │   │   ├── networkexplorer.scss
│       │   │   │   ├── normalize.scss
│       │   │   │   ├── ol.scss
│       │   │   │   ├── openlayers.scss
│       │   │   │   ├── openlayers3.scss
│       │   │   │   ├── portadmin.scss
│       │   │   │   ├── powersupplies.scss
│       │   │   │   ├── rack.scss
│       │   │   │   ├── report.scss
│       │   │   │   ├── rickshaw.scss
│       │   │   │   ├── seeddb.scss
│       │   │   │   ├── status.scss
│       │   │   │   ├── subnet_matrix.scss
│       │   │   │   ├── syslogger.scss
│       │   │   │   ├── threshold.scss
│       │   │   │   ├── treeselect.scss
│       │   │   │   ├── useradmin.scss
│       │   │   │   └── watchdog.scss
│       │   │   └── nav.scss
│       │   ├── security.py
│       │   ├── seeddb/
│       │   │   ├── __init__.py
│       │   │   ├── constants.py
│       │   │   ├── forms/
│       │   │   │   ├── __init__.py
│       │   │   │   └── bulk.py
│       │   │   ├── page/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── cabling.py
│       │   │   │   ├── location.py
│       │   │   │   ├── management_profile/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── forms.py
│       │   │   │   ├── netbox/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── edit.py
│       │   │   │   │   └── forms.py
│       │   │   │   ├── netboxgroup.py
│       │   │   │   ├── netboxtype.py
│       │   │   │   ├── organization.py
│       │   │   │   ├── patch/
│       │   │   │   │   └── __init__.py
│       │   │   │   ├── prefix.py
│       │   │   │   ├── room.py
│       │   │   │   ├── service/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── edit.py
│       │   │   │   ├── usage.py
│       │   │   │   ├── vendor.py
│       │   │   │   └── vlan.py
│       │   │   ├── urls.py
│       │   │   └── utils/
│       │   │       ├── __init__.py
│       │   │       ├── bulk.py
│       │   │       ├── delete.py
│       │   │       ├── edit.py
│       │   │       ├── list.py
│       │   │       └── move.py
│       │   ├── servicecheckers.py
│       │   ├── session_serializer.py
│       │   ├── sortedstats/
│       │   │   ├── __init__.py
│       │   │   ├── config.py
│       │   │   ├── forms.py
│       │   │   ├── statmodules.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── static/
│       │   │   ├── fonts/
│       │   │   │   └── FontAwesome.otf
│       │   │   └── js/
│       │   │       ├── build.js
│       │   │       ├── geomap/
│       │   │       │   ├── Calendar.js
│       │   │       │   ├── GeomapPlugin.js
│       │   │       │   ├── MyHTTPProtocol.js
│       │   │       │   ├── NetworkLayer.js
│       │   │       │   ├── Permalink.js
│       │   │       │   ├── PopupControl.js
│       │   │       │   ├── Time.js
│       │   │       │   ├── TimeInterval.js
│       │   │       │   ├── TimeNavigator.js
│       │   │       │   ├── coordinates.js
│       │   │       │   ├── geomap.js
│       │   │       │   ├── proj4js-compressed.js
│       │   │       │   ├── projdefs/
│       │   │       │   │   ├── EPSG32601.js
│       │   │       │   │   ├── EPSG32602.js
│       │   │       │   │   ├── EPSG32603.js
│       │   │       │   │   ├── EPSG32604.js
│       │   │       │   │   ├── EPSG32605.js
│       │   │       │   │   ├── EPSG32606.js
│       │   │       │   │   ├── EPSG32607.js
│       │   │       │   │   ├── EPSG32608.js
│       │   │       │   │   ├── EPSG32609.js
│       │   │       │   │   ├── EPSG32610.js
│       │   │       │   │   ├── EPSG32611.js
│       │   │       │   │   ├── EPSG32612.js
│       │   │       │   │   ├── EPSG32613.js
│       │   │       │   │   ├── EPSG32614.js
│       │   │       │   │   ├── EPSG32615.js
│       │   │       │   │   ├── EPSG32616.js
│       │   │       │   │   ├── EPSG32617.js
│       │   │       │   │   ├── EPSG32618.js
│       │   │       │   │   ├── EPSG32619.js
│       │   │       │   │   ├── EPSG32620.js
│       │   │       │   │   ├── EPSG32621.js
│       │   │       │   │   ├── EPSG32622.js
│       │   │       │   │   ├── EPSG32623.js
│       │   │       │   │   ├── EPSG32624.js
│       │   │       │   │   ├── EPSG32625.js
│       │   │       │   │   ├── EPSG32626.js
│       │   │       │   │   ├── EPSG32627.js
│       │   │       │   │   ├── EPSG32628.js
│       │   │       │   │   ├── EPSG32629.js
│       │   │       │   │   ├── EPSG32630.js
│       │   │       │   │   ├── EPSG32631.js
│       │   │       │   │   ├── EPSG32632.js
│       │   │       │   │   ├── EPSG32633.js
│       │   │       │   │   ├── EPSG32634.js
│       │   │       │   │   ├── EPSG32635.js
│       │   │       │   │   ├── EPSG32636.js
│       │   │       │   │   ├── EPSG32637.js
│       │   │       │   │   ├── EPSG32638.js
│       │   │       │   │   ├── EPSG32639.js
│       │   │       │   │   ├── EPSG32640.js
│       │   │       │   │   ├── EPSG32641.js
│       │   │       │   │   ├── EPSG32642.js
│       │   │       │   │   ├── EPSG32643.js
│       │   │       │   │   ├── EPSG32644.js
│       │   │       │   │   ├── EPSG32645.js
│       │   │       │   │   ├── EPSG32646.js
│       │   │       │   │   ├── EPSG32647.js
│       │   │       │   │   ├── EPSG32648.js
│       │   │       │   │   ├── EPSG32649.js
│       │   │       │   │   ├── EPSG32650.js
│       │   │       │   │   ├── EPSG32651.js
│       │   │       │   │   ├── EPSG32652.js
│       │   │       │   │   ├── EPSG32653.js
│       │   │       │   │   ├── EPSG32654.js
│       │   │       │   │   ├── EPSG32655.js
│       │   │       │   │   ├── EPSG32656.js
│       │   │       │   │   ├── EPSG32657.js
│       │   │       │   │   ├── EPSG32658.js
│       │   │       │   │   ├── EPSG32659.js
│       │   │       │   │   ├── EPSG32660.js
│       │   │       │   │   ├── EPSG326xx.js
│       │   │       │   │   ├── EPSG32701.js
│       │   │       │   │   ├── EPSG32702.js
│       │   │       │   │   ├── EPSG32703.js
│       │   │       │   │   ├── EPSG32704.js
│       │   │       │   │   ├── EPSG32705.js
│       │   │       │   │   ├── EPSG32706.js
│       │   │       │   │   ├── EPSG32707.js
│       │   │       │   │   ├── EPSG32708.js
│       │   │       │   │   ├── EPSG32709.js
│       │   │       │   │   ├── EPSG32710.js
│       │   │       │   │   ├── EPSG32711.js
│       │   │       │   │   ├── EPSG32712.js
│       │   │       │   │   ├── EPSG32713.js
│       │   │       │   │   ├── EPSG32714.js
│       │   │       │   │   ├── EPSG32715.js
│       │   │       │   │   ├── EPSG32716.js
│       │   │       │   │   ├── EPSG32717.js
│       │   │       │   │   ├── EPSG32718.js
│       │   │       │   │   ├── EPSG32719.js
│       │   │       │   │   ├── EPSG32720.js
│       │   │       │   │   ├── EPSG32721.js
│       │   │       │   │   ├── EPSG32722.js
│       │   │       │   │   ├── EPSG32723.js
│       │   │       │   │   ├── EPSG32724.js
│       │   │       │   │   ├── EPSG32725.js
│       │   │       │   │   ├── EPSG32726.js
│       │   │       │   │   ├── EPSG32727.js
│       │   │       │   │   ├── EPSG32728.js
│       │   │       │   │   ├── EPSG32729.js
│       │   │       │   │   ├── EPSG32730.js
│       │   │       │   │   ├── EPSG32731.js
│       │   │       │   │   ├── EPSG32732.js
│       │   │       │   │   ├── EPSG32733.js
│       │   │       │   │   ├── EPSG32734.js
│       │   │       │   │   ├── EPSG32735.js
│       │   │       │   │   ├── EPSG32736.js
│       │   │       │   │   ├── EPSG32737.js
│       │   │       │   │   ├── EPSG32738.js
│       │   │       │   │   ├── EPSG32739.js
│       │   │       │   │   ├── EPSG32740.js
│       │   │       │   │   ├── EPSG32741.js
│       │   │       │   │   ├── EPSG32742.js
│       │   │       │   │   ├── EPSG32743.js
│       │   │       │   │   ├── EPSG32744.js
│       │   │       │   │   ├── EPSG32745.js
│       │   │       │   │   ├── EPSG32746.js
│       │   │       │   │   ├── EPSG32747.js
│       │   │       │   │   ├── EPSG32748.js
│       │   │       │   │   ├── EPSG32749.js
│       │   │       │   │   ├── EPSG32750.js
│       │   │       │   │   ├── EPSG32751.js
│       │   │       │   │   ├── EPSG32752.js
│       │   │       │   │   ├── EPSG32753.js
│       │   │       │   │   ├── EPSG32754.js
│       │   │       │   │   ├── EPSG32755.js
│       │   │       │   │   ├── EPSG32756.js
│       │   │       │   │   ├── EPSG32757.js
│       │   │       │   │   ├── EPSG32758.js
│       │   │       │   │   ├── EPSG32759.js
│       │   │       │   │   ├── EPSG32760.js
│       │   │       │   │   ├── EPSG327xx.js
│       │   │       │   │   ├── README
│       │   │       │   │   └── fetch.sh
│       │   │       │   └── util.js
│       │   │       ├── libs/
│       │   │       │   ├── backbone-eventbroker.js
│       │   │       │   ├── ipadebug.js
│       │   │       │   ├── ol-debug-4.6.5.js
│       │   │       │   ├── statist.js
│       │   │       │   ├── urijs/
│       │   │       │   │   ├── IPv6.js
│       │   │       │   │   ├── SecondLevelDomains.js
│       │   │       │   │   ├── URI.fragmentQuery.js
│       │   │       │   │   ├── URI.fragmentURI.js
│       │   │       │   │   ├── URI.js
│       │   │       │   │   ├── URITemplate.js
│       │   │       │   │   ├── jquery.URI.js
│       │   │       │   │   └── punycode.js
│       │   │       │   └── vue-2.2.0.js
│       │   │       ├── netmap.js
│       │   │       ├── networkexplorer.js
│       │   │       ├── package.json
│       │   │       ├── require_config.js
│       │   │       ├── require_config_dev.js
│       │   │       ├── resources/
│       │   │       │   ├── libs/
│       │   │       │   │   └── text.js
│       │   │       │   ├── netmap/
│       │   │       │   │   ├── layer2_link_info.html
│       │   │       │   │   ├── layer3_link_info.html
│       │   │       │   │   └── node_info.html
│       │   │       │   ├── networkexplorer/
│       │   │       │   │   ├── gwport.html
│       │   │       │   │   ├── router.html
│       │   │       │   │   ├── switch.html
│       │   │       │   │   ├── swport.html
│       │   │       │   │   └── swport_leaf.html
│       │   │       │   ├── rickshawgraph/
│       │   │       │   │   └── graphtemplate.hbs
│       │   │       │   ├── room/
│       │   │       │   │   ├── counter.html
│       │   │       │   │   ├── detail.html
│       │   │       │   │   └── sensor.html
│       │   │       │   ├── seeddb/
│       │   │       │   │   ├── hstore_container.html
│       │   │       │   │   └── hstore_row.html
│       │   │       │   ├── status2/
│       │   │       │   │   └── event_template.hbs
│       │   │       │   └── vue/
│       │   │       │       ├── environment_rack.html
│       │   │       │       ├── environment_rack_item.html
│       │   │       │       └── environment_rack_pdu_item.html
│       │   │       ├── src/
│       │   │       │   ├── 500.js
│       │   │       │   ├── alertprofiles.js
│       │   │       │   ├── arnold.js
│       │   │       │   ├── business.js
│       │   │       │   ├── dt_config.js
│       │   │       │   ├── dt_plugins/
│       │   │       │   │   ├── altsort.js
│       │   │       │   │   ├── date_title_sort.js
│       │   │       │   │   ├── ip_address_sort.js
│       │   │       │   │   ├── ip_address_typedetect.js
│       │   │       │   │   ├── modulesort.js
│       │   │       │   │   ├── natsort.js
│       │   │       │   │   ├── numeric_html.js
│       │   │       │   │   └── percent_sort.js
│       │   │       │   ├── getting_started_wizard.js
│       │   │       │   ├── image_upload.js
│       │   │       │   ├── info/
│       │   │       │   │   ├── global_dt_filters.js
│       │   │       │   │   └── table_info_converter.js
│       │   │       │   ├── info_location.js
│       │   │       │   ├── info_netboxgroup.js
│       │   │       │   ├── info_room.js
│       │   │       │   ├── info_room_rack.js
│       │   │       │   ├── interface_browser.js
│       │   │       │   ├── interface_browser_column_toggler.js
│       │   │       │   ├── interface_browser_dynamic_columns_controller.js
│       │   │       │   ├── interface_browser_filter_controller.js
│       │   │       │   ├── ipam/
│       │   │       │   │   ├── app.js
│       │   │       │   │   ├── ipam.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   ├── util.js
│       │   │       │   │   ├── views/
│       │   │       │   │   │   ├── behaviors.js
│       │   │       │   │   │   ├── control.js
│       │   │       │   │   │   ├── index.js
│       │   │       │   │   │   ├── prefixmap.js
│       │   │       │   │   │   ├── subnetallocator.js
│       │   │       │   │   │   ├── tree.js
│       │   │       │   │   │   └── usage.js
│       │   │       │   │   └── viz.js
│       │   │       │   ├── ipdevinfo.js
│       │   │       │   ├── libs/
│       │   │       │   │   └── tablesort_extensions.js
│       │   │       │   ├── machinetracker.js
│       │   │       │   ├── main.js
│       │   │       │   ├── maintenance.js
│       │   │       │   ├── messages.js
│       │   │       │   ├── navigation_preferences.js
│       │   │       │   ├── neighbors.js
│       │   │       │   ├── netmap/
│       │   │       │   │   ├── collections.js
│       │   │       │   │   ├── control_view.js
│       │   │       │   │   ├── graph.js
│       │   │       │   │   ├── graph_info_view.js
│       │   │       │   │   ├── graph_view.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   └── netmap.js
│       │   │       │   ├── networkexplorer.js
│       │   │       │   ├── plugins/
│       │   │       │   │   ├── accordion_maker.js
│       │   │       │   │   ├── alert.js
│       │   │       │   │   ├── checkbox_selector.js
│       │   │       │   │   ├── counterdisplay.js
│       │   │       │   │   ├── csrf-utils.js
│       │   │       │   │   ├── d3_sparkline.js
│       │   │       │   │   ├── fullscreen.js
│       │   │       │   │   ├── gauge.js
│       │   │       │   │   ├── graphfetcher.js
│       │   │       │   │   ├── graphfetcher_controller.js
│       │   │       │   │   ├── hover_highlight.js
│       │   │       │   │   ├── jquery_ui_helpers.js
│       │   │       │   │   ├── lightbox.js
│       │   │       │   │   ├── linear_gauge.js
│       │   │       │   │   ├── megadrop.js
│       │   │       │   │   ├── multiple_select.js
│       │   │       │   │   ├── nav-url-utils.js
│       │   │       │   │   ├── navlet_alert.js
│       │   │       │   │   ├── navlet_controller.js
│       │   │       │   │   ├── navlet_handlers.js
│       │   │       │   │   ├── navlet_pdu.js
│       │   │       │   │   ├── navlet_ups.js
│       │   │       │   │   ├── navlets_htmx_controller.js
│       │   │       │   │   ├── neighbor-map.js
│       │   │       │   │   ├── netmap-extras.js
│       │   │       │   │   ├── network_tree.js
│       │   │       │   │   ├── popover.js
│       │   │       │   │   ├── rickshaw-utils.js
│       │   │       │   │   ├── rickshaw_graph.js
│       │   │       │   │   ├── room_mapper.js
│       │   │       │   │   ├── seeddb_datatables.js
│       │   │       │   │   ├── seeddb_hstore.js
│       │   │       │   │   ├── seeddb_management_profile.js
│       │   │       │   │   ├── seeddb_map.js
│       │   │       │   │   ├── sensor_controller.js
│       │   │       │   │   ├── sensors_controller.js
│       │   │       │   │   ├── state_controller.js
│       │   │       │   │   ├── symbols.js
│       │   │       │   │   ├── tab_navigation.js
│       │   │       │   │   ├── table_utils.js
│       │   │       │   │   ├── tooltip.js
│       │   │       │   │   └── vue_rack.js
│       │   │       │   ├── portadmin.js
│       │   │       │   ├── porttable.js
│       │   │       │   ├── radius.js
│       │   │       │   ├── report.js
│       │   │       │   ├── seeddb.js
│       │   │       │   ├── seeddb_netbox.js
│       │   │       │   ├── seeddb_netbox_wizard.js
│       │   │       │   ├── sensor_details.js
│       │   │       │   ├── statistics.js
│       │   │       │   ├── status2/
│       │   │       │   │   ├── collections.js
│       │   │       │   │   ├── handlebars-helpers.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   ├── status.js
│       │   │       │   │   └── views.js
│       │   │       │   ├── subnetmatrix.js
│       │   │       │   ├── syslogger.js
│       │   │       │   ├── threshold.js
│       │   │       │   ├── watchdog.js
│       │   │       │   └── webfront.js
│       │   │       ├── test/
│       │   │       │   ├── div/
│       │   │       │   │   ├── graph-test.js
│       │   │       │   │   └── numbers-test.js
│       │   │       │   ├── info/
│       │   │       │   │   ├── global_dt_filters-test.js
│       │   │       │   │   ├── modulesort-test.js
│       │   │       │   │   ├── natsort-test.js
│       │   │       │   │   └── table_info_converter-test.js
│       │   │       │   ├── karma.conf.buildserver.js
│       │   │       │   ├── karma.conf.js
│       │   │       │   ├── main_test.js
│       │   │       │   ├── plugins/
│       │   │       │   │   ├── checkbox_selector-test.js
│       │   │       │   │   ├── multiple_select-test.js
│       │   │       │   │   ├── network_tree-test.js
│       │   │       │   │   └── rickshaw-utils-test.js
│       │   │       │   ├── require_config.test.js
│       │   │       │   └── resources/
│       │   │       │       ├── plugins/
│       │   │       │       │   └── header_footer_minimize/
│       │   │       │       │       └── header.html
│       │   │       │       └── templates/
│       │   │       │           └── multipleselect.html
│       │   │       └── treeselect.js
│       │   ├── status2/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── styleguide.py
│       │   ├── syslogger/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── templates/
│       │   │   ├── 404.html
│       │   │   ├── 500.html
│       │   │   ├── _breadcrumbs.html
│       │   │   ├── _breadcrumbs_list.html
│       │   │   ├── account/
│       │   │   │   ├── login.html
│       │   │   │   ├── password_change.html
│       │   │   │   └── signup_closed.html
│       │   │   ├── alertmsg/
│       │   │   │   ├── base.html
│       │   │   │   ├── bgpState/
│       │   │   │   │   └── bgpDown.html
│       │   │   │   └── linkState/
│       │   │   │       └── linkDown.html
│       │   │   ├── alertprofiles/
│       │   │   │   ├── _add_expression_operator_help_modal.html
│       │   │   │   ├── _filter_group_operator_help_modal.html
│       │   │   │   ├── _groups_and_permissions_modal.html
│       │   │   │   ├── _permissions_help_modal.html
│       │   │   │   ├── account_detail.html
│       │   │   │   ├── address_form.html
│       │   │   │   ├── address_list.html
│       │   │   │   ├── base.html
│       │   │   │   ├── base_detail.html
│       │   │   │   ├── base_list.html
│       │   │   │   ├── confirmation_list.html
│       │   │   │   ├── expression_form.html
│       │   │   │   ├── filter_form.html
│       │   │   │   ├── filter_group_form.html
│       │   │   │   ├── filter_group_list.html
│       │   │   │   ├── filter_list.html
│       │   │   │   ├── matchfield_form.html
│       │   │   │   ├── matchfield_list.html
│       │   │   │   ├── paginator.html
│       │   │   │   ├── permissions.html
│       │   │   │   ├── profile.html
│       │   │   │   ├── profile_detail.html
│       │   │   │   ├── sms_list.html
│       │   │   │   ├── subscription_form.html
│       │   │   │   ├── subsection_tabs.html
│       │   │   │   ├── timeperiod_edit.html
│       │   │   │   ├── timeperiod_form.html
│       │   │   │   └── timeperiods.html
│       │   │   ├── allauth/
│       │   │   │   ├── elements/
│       │   │   │   │   ├── button.html
│       │   │   │   │   ├── panel.html
│       │   │   │   │   ├── provider.html
│       │   │   │   │   └── provider_list.html
│       │   │   │   └── layouts/
│       │   │   │       ├── _tabs_list.html
│       │   │   │       ├── base.html
│       │   │   │       └── entrance.html
│       │   │   ├── arnold/
│       │   │   │   ├── back.html
│       │   │   │   ├── base.html
│       │   │   │   ├── choose_detentions.html
│       │   │   │   ├── details.html
│       │   │   │   ├── detainedports.html
│       │   │   │   ├── detention_profiles.html
│       │   │   │   ├── edit_detention_profile.html
│       │   │   │   ├── history.html
│       │   │   │   ├── justifications.html
│       │   │   │   ├── manualdetain-step2.html
│       │   │   │   ├── manualdetain.html
│       │   │   │   ├── quarantinevlans.html
│       │   │   │   ├── search.html
│       │   │   │   └── tabs.html
│       │   │   ├── auditlog/
│       │   │   │   ├── _logentry_list.html
│       │   │   │   ├── base.html
│       │   │   │   └── overview.html
│       │   │   ├── base.html
│       │   │   ├── business/
│       │   │   │   ├── base.html
│       │   │   │   ├── email.html
│       │   │   │   ├── email.txt
│       │   │   │   ├── frag-report-card.html
│       │   │   │   ├── frag-report-items.html
│       │   │   │   ├── frag-unsubscribe.html
│       │   │   │   ├── report-availability.html
│       │   │   │   └── report.html
│       │   │   ├── components/
│       │   │   │   └── popover/
│       │   │   │       ├── _close_button.html
│       │   │   │       └── _confirm_popover.html
│       │   │   ├── custom_crispy_templates/
│       │   │   │   ├── _form_content.html
│       │   │   │   ├── _form_field.html
│       │   │   │   ├── _form_fields.html
│       │   │   │   ├── field_helptext_as_icon.html
│       │   │   │   ├── flat_fieldset.html
│       │   │   │   ├── flat_form.html
│       │   │   │   ├── form_checkbox.html
│       │   │   │   ├── form_column.html
│       │   │   │   ├── form_div.html
│       │   │   │   ├── form_row.html
│       │   │   │   ├── horizontal_checkbox.html
│       │   │   │   └── submit_field.html
│       │   │   ├── debug.html
│       │   │   ├── devicehistory/
│       │   │   │   ├── _component-search-results.html
│       │   │   │   ├── _component_search_input.html
│       │   │   │   ├── _history_view_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── base_history.html
│       │   │   │   ├── confirm_error.html
│       │   │   │   ├── debug.html
│       │   │   │   ├── delete_module.html
│       │   │   │   ├── frag_moduletable.html
│       │   │   │   ├── history_search.html
│       │   │   │   ├── history_view.html
│       │   │   │   └── register_error.html
│       │   │   ├── footer.html
│       │   │   ├── foundation-5/
│       │   │   │   ├── README.txt
│       │   │   │   ├── errors.html
│       │   │   │   ├── errors_formset.html
│       │   │   │   └── field.html
│       │   │   ├── geomap/
│       │   │   │   ├── geomap-data-kml.xml
│       │   │   │   └── geomap.html
│       │   │   ├── info/
│       │   │   │   ├── _image_help_modal.html
│       │   │   │   ├── _image_upload_header.html
│       │   │   │   ├── _navbar_search_form.html
│       │   │   │   ├── _navbar_search_results.html
│       │   │   │   ├── _search_form.html
│       │   │   │   ├── _search_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── event/
│       │   │   │   │   ├── _about_acknowledge_info.html
│       │   │   │   │   ├── _about_delete_info.html
│       │   │   │   │   ├── _about_maintenance_info.html
│       │   │   │   │   ├── _about_resolve_info.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── details.html
│       │   │   │   │   ├── frag_event_message.html
│       │   │   │   │   └── frag_subject_details.html
│       │   │   │   ├── fragments/
│       │   │   │   │   └── netboxes.html
│       │   │   │   ├── images/
│       │   │   │   │   └── upload.html
│       │   │   │   ├── location/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── fragment_sublocation.html
│       │   │   │   │   ├── locationinfo.html
│       │   │   │   │   ├── locationinfo_main.html
│       │   │   │   │   ├── locationinfo_rooms.html
│       │   │   │   │   ├── locationinfo_sublocations.html
│       │   │   │   │   └── upload.html
│       │   │   │   ├── netboxgroup/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── group_detail.html
│       │   │   │   │   ├── group_edit.html
│       │   │   │   │   └── list_groups.html
│       │   │   │   ├── prefix/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── details.html
│       │   │   │   │   └── frag_tags.html
│       │   │   │   ├── room/
│       │   │   │   │   ├── _about_the_search_modal.html
│       │   │   │   │   ├── _add_rack_modal.html
│       │   │   │   │   ├── _add_sensor_diff_form.html
│       │   │   │   │   ├── _add_sensor_modal.html
│       │   │   │   │   ├── _add_sensor_single_form.html
│       │   │   │   │   ├── _add_sensor_sum_form.html
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── fragment_rack.html
│       │   │   │   │   ├── fragment_rackpdusensor.html
│       │   │   │   │   ├── fragment_racksensor.html
│       │   │   │   │   ├── netboxview.html
│       │   │   │   │   ├── roominfo.html
│       │   │   │   │   ├── roominfo_devices.html
│       │   │   │   │   ├── roominfo_main.html
│       │   │   │   │   ├── roominfo_racks.html
│       │   │   │   │   ├── roominfo_sensors.html
│       │   │   │   │   └── upload.html
│       │   │   │   └── vlan/
│       │   │   │       ├── _search_results.html
│       │   │   │       ├── base.html
│       │   │   │       └── vlandetails.html
│       │   │   ├── interface_browser/
│       │   │   │   └── base.html
│       │   │   ├── ipam/
│       │   │   │   ├── base.html
│       │   │   │   ├── includes/
│       │   │   │   │   ├── _subnet_diagram_help_modal.html
│       │   │   │   │   ├── allocate-subnet.html
│       │   │   │   │   ├── tree-form-advanced.html
│       │   │   │   │   ├── tree-form.html
│       │   │   │   │   ├── tree-node.html
│       │   │   │   │   └── tree-root.html
│       │   │   │   └── index.html
│       │   │   ├── ipdevinfo/
│       │   │   │   ├── _poe_classification_hint_modal.html
│       │   │   │   ├── _poe_status_hint_modal.html
│       │   │   │   ├── _search_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-affected.html
│       │   │   │   ├── frag-alerts.html
│       │   │   │   ├── frag-disclaimer.html
│       │   │   │   ├── frag-hostinfo.html
│       │   │   │   ├── frag-ipdevinfo-refresh-button.html
│       │   │   │   ├── frag-ipdevinfo-refresh-error.html
│       │   │   │   ├── frag-ipdevinfo-refresh-ongoing-button.html
│       │   │   │   ├── frag-ipdevinfo.html
│       │   │   │   ├── frag-neighbors.html
│       │   │   │   ├── frag-poe.html
│       │   │   │   ├── frag-port-metrics.html
│       │   │   │   ├── frag-portlist-datatable.html
│       │   │   │   ├── frag-portlist-tabs.html
│       │   │   │   ├── frag-ports.html
│       │   │   │   ├── frag-psutable.html
│       │   │   │   ├── frag-sensors.html
│       │   │   │   ├── frag-sensortable.html
│       │   │   │   ├── frag-services.html
│       │   │   │   ├── frag-sysmetrics.html
│       │   │   │   ├── ipdev-details.html
│       │   │   │   ├── module-details.html
│       │   │   │   ├── module-port-view.html
│       │   │   │   ├── modules.html
│       │   │   │   ├── poegroup-details.html
│       │   │   │   ├── port-details-aggregate-frag.html
│       │   │   │   ├── port-details-api-frag.html
│       │   │   │   ├── port-details-main-frag.html
│       │   │   │   ├── port-details-metrics-frag.html
│       │   │   │   ├── port-details-neighbors-frag.html
│       │   │   │   ├── port-details-recent-alerts-frag.html
│       │   │   │   ├── port-details-sensors-frag.html
│       │   │   │   ├── port-details-stacking-frag.html
│       │   │   │   ├── port-details-vlan-frag.html
│       │   │   │   ├── port-details.html
│       │   │   │   ├── port-legend.html
│       │   │   │   ├── search.html
│       │   │   │   ├── sensor-details.html
│       │   │   │   ├── service-list-table.html
│       │   │   │   ├── service-list.html
│       │   │   │   └── service-matrix.html
│       │   │   ├── l2trace/
│       │   │   │   └── l2trace.html
│       │   │   ├── machinetracker/
│       │   │   │   ├── _ip_search_help_modal.html
│       │   │   │   ├── _mac_search_help_modal.html
│       │   │   │   ├── _netbios_search_help_modal.html
│       │   │   │   ├── _search_help_trigger.html
│       │   │   │   ├── _switch_search_help_modal.html
│       │   │   │   ├── base.html
│       │   │   │   ├── fishy.html
│       │   │   │   ├── interface_tracker.html
│       │   │   │   ├── ip_search.html
│       │   │   │   ├── ip_tracker.html
│       │   │   │   ├── mac_search.html
│       │   │   │   ├── mac_tracker.html
│       │   │   │   ├── netbios_search.html
│       │   │   │   ├── netbios_tracker.html
│       │   │   │   ├── switch_search.html
│       │   │   │   └── uplink_tracker.html
│       │   │   ├── macwatch/
│       │   │   │   ├── addmacwatch.html
│       │   │   │   ├── base.html
│       │   │   │   ├── deletemacwatch.html
│       │   │   │   ├── editmacwatch.html
│       │   │   │   └── list_watches.html
│       │   │   ├── maintenance/
│       │   │   │   ├── _component-browse-location.html
│       │   │   │   ├── _component-browse.html
│       │   │   │   ├── _component-search-results.html
│       │   │   │   ├── _selected-components-list.html
│       │   │   │   ├── back.html
│       │   │   │   ├── base.html
│       │   │   │   ├── calendar.html
│       │   │   │   ├── cancel.html
│       │   │   │   ├── details.html
│       │   │   │   ├── frag-component-trail.html
│       │   │   │   ├── heading.html
│       │   │   │   ├── list.html
│       │   │   │   ├── new_task.html
│       │   │   │   └── tabs.html
│       │   │   ├── messages/
│       │   │   │   ├── base.html
│       │   │   │   ├── list.html
│       │   │   │   ├── save.html
│       │   │   │   └── view.html
│       │   │   ├── mfa/
│       │   │   │   ├── index.html
│       │   │   │   ├── recovery_codes/
│       │   │   │   │   ├── generate.html
│       │   │   │   │   └── index.html
│       │   │   │   └── totp/
│       │   │   │       ├── activate_form.html
│       │   │   │       └── deactivate_form.html
│       │   │   ├── modals/
│       │   │   │   ├── _nav_modal.html
│       │   │   │   ├── _nav_modal_alert.html
│       │   │   │   └── _nav_modal_resolve.html
│       │   │   ├── nav_header.html
│       │   │   ├── navlets/
│       │   │   │   ├── _add_navlet_modal.html
│       │   │   │   ├── _add_navlet_response.html
│       │   │   │   ├── _navlet_item.html
│       │   │   │   ├── _navlet_refresh.html
│       │   │   │   ├── _remove_modal_form.html
│       │   │   │   ├── _remove_navlet_response.html
│       │   │   │   ├── alert_edit.html
│       │   │   │   ├── alert_view.html
│       │   │   │   ├── base.html
│       │   │   │   ├── envrack_edit.html
│       │   │   │   ├── envrack_view.html
│       │   │   │   ├── error_view.html
│       │   │   │   ├── feedreader_edit.html
│       │   │   │   ├── feedreader_view.html
│       │   │   │   ├── getting_started_view.html
│       │   │   │   ├── graph_edit.html
│       │   │   │   ├── graph_view.html
│       │   │   │   ├── linklist_view.html
│       │   │   │   ├── machinetracker_view.html
│       │   │   │   ├── messages_view.html
│       │   │   │   ├── navblog_view.html
│       │   │   │   ├── pdu_edit.html
│       │   │   │   ├── pdu_view.html
│       │   │   │   ├── portadmin_view.html
│       │   │   │   ├── report_edit.html
│       │   │   │   ├── report_view.html
│       │   │   │   ├── room_location_status_edit.html
│       │   │   │   ├── room_location_status_view.html
│       │   │   │   ├── room_map_view.html
│       │   │   │   ├── sensor_edit.html
│       │   │   │   ├── sensor_view.html
│       │   │   │   ├── status2_edit.html
│       │   │   │   ├── status2_view.html
│       │   │   │   ├── status_edit.html
│       │   │   │   ├── status_view.html
│       │   │   │   ├── ups_edit.html
│       │   │   │   ├── ups_view.html
│       │   │   │   ├── vlangraph_edit.html
│       │   │   │   ├── vlangraph_view.html
│       │   │   │   ├── watchdog_view.html
│       │   │   │   └── welcome_view.html
│       │   │   ├── navurls.html
│       │   │   ├── neighbors/
│       │   │   │   ├── base.html
│       │   │   │   └── frag-tbody.html
│       │   │   ├── netmap/
│       │   │   │   ├── admin.html
│       │   │   │   └── netmap.html
│       │   │   ├── networkexplorer/
│       │   │   │   ├── base.html
│       │   │   │   ├── expand_gwport.html
│       │   │   │   ├── expand_router.html
│       │   │   │   ├── expand_switch.html
│       │   │   │   └── expand_swport.html
│       │   │   ├── portadmin/
│       │   │   │   ├── _feedback_modal.html
│       │   │   │   ├── _messages.html
│       │   │   │   ├── base.html
│       │   │   │   ├── netbox.html
│       │   │   │   ├── portlist.html
│       │   │   │   └── trunk_edit.html
│       │   │   ├── radius/
│       │   │   │   ├── _account_chart_hints_modal.html
│       │   │   │   ├── _account_log_hints_modal.html
│       │   │   │   ├── _error_log_hints_modal.html
│       │   │   │   ├── account_charts.html
│       │   │   │   ├── account_log.html
│       │   │   │   ├── base.html
│       │   │   │   ├── detail.html
│       │   │   │   ├── detail_modal.html
│       │   │   │   ├── details_table.html
│       │   │   │   └── error_log.html
│       │   │   ├── report/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag_matrix_index.html
│       │   │   │   ├── frag_matrix_report.html
│       │   │   │   ├── frag_matrix_report_link.html
│       │   │   │   ├── frag_report_filters.html
│       │   │   │   ├── frag_report_table.html
│       │   │   │   ├── index.html
│       │   │   │   ├── matrix.html
│       │   │   │   ├── report.html
│       │   │   │   └── report_list.html
│       │   │   ├── rest_framework/
│       │   │   │   └── api.html
│       │   │   ├── rrdviewer/
│       │   │   │   ├── base.html
│       │   │   │   └── rrd-details.html
│       │   │   ├── seeddb/
│       │   │   │   ├── _add_patch_modal.html
│       │   │   │   ├── _patch_table_row.html
│       │   │   │   ├── _remove_patch_modal.html
│       │   │   │   ├── _seeddb_check_connectivity_response.html
│       │   │   │   ├── _seeddb_check_connectivity_results.html
│       │   │   │   ├── _seeddb_collected_info.html
│       │   │   │   ├── _seeddb_netbox_form_content.html
│       │   │   │   ├── base.html
│       │   │   │   ├── bulk_import.html
│       │   │   │   ├── delete.html
│       │   │   │   ├── edit.html
│       │   │   │   ├── edit_patch.html
│       │   │   │   ├── edit_prefix.html
│       │   │   │   ├── edit_vlan.html
│       │   │   │   ├── fragments/
│       │   │   │   │   ├── branch.html
│       │   │   │   │   ├── branch_tooltip.html
│       │   │   │   │   └── patches.html
│       │   │   │   ├── index.html
│       │   │   │   ├── list.html
│       │   │   │   ├── list_cables.html
│       │   │   │   ├── list_netbox.html
│       │   │   │   ├── list_patches.html
│       │   │   │   ├── list_tree.html
│       │   │   │   ├── management-profile/
│       │   │   │   │   └── edit.html
│       │   │   │   ├── move.html
│       │   │   │   ├── netbox_wizard.html
│       │   │   │   ├── service_netbox_form.html
│       │   │   │   ├── service_property_form.html
│       │   │   │   ├── tabs_generic.html
│       │   │   │   ├── tabs_vlan.html
│       │   │   │   └── widgets/
│       │   │   │       └── alias_list.html
│       │   │   ├── socialaccount/
│       │   │   │   ├── authentication_error.html
│       │   │   │   ├── connections.html
│       │   │   │   ├── login.html
│       │   │   │   └── snippets/
│       │   │   │       └── login.html
│       │   │   ├── sortedstats/
│       │   │   │   └── sortedstats.html
│       │   │   ├── status2/
│       │   │   │   ├── base.html
│       │   │   │   └── status.html
│       │   │   ├── styleguide/
│       │   │   │   └── sparklines.html
│       │   │   ├── styleguide.html
│       │   │   ├── syslogger/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-errors.html
│       │   │   │   ├── frag-exceptions.html
│       │   │   │   ├── frag-results.html
│       │   │   │   ├── frag-search-form-fieldset.html
│       │   │   │   ├── frag-search.html
│       │   │   │   └── index.html
│       │   │   ├── threshold/
│       │   │   │   ├── _threshold_help_modal.html
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-thresholdlist.html
│       │   │   │   └── set_threshold.html
│       │   │   ├── toolbar.html
│       │   │   ├── useradmin/
│       │   │   │   ├── _confirm_token_delete.html
│       │   │   │   ├── account_detail.html
│       │   │   │   ├── account_list.html
│       │   │   │   ├── base.html
│       │   │   │   ├── delete.html
│       │   │   │   ├── feedback.html
│       │   │   │   ├── frag-auditlog.html
│       │   │   │   ├── frag-external-account-fieldset.html
│       │   │   │   ├── group_detail.html
│       │   │   │   ├── group_list.html
│       │   │   │   ├── jwt_created.html
│       │   │   │   ├── jwt_detail.html
│       │   │   │   ├── jwt_edit.html
│       │   │   │   ├── jwt_list.html
│       │   │   │   ├── jwt_not_enabled.html
│       │   │   │   ├── jwt_not_enabled_content.html
│       │   │   │   ├── not-logged-in.html
│       │   │   │   ├── tabs.html
│       │   │   │   ├── token_card_style.html
│       │   │   │   ├── token_detail.html
│       │   │   │   ├── token_edit.html
│       │   │   │   └── token_list.html
│       │   │   ├── watchdog/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag_overview.html
│       │   │   │   └── frag_tests.html
│       │   │   └── webfront/
│       │   │       ├── _about_audit_logging_modal.html
│       │   │       ├── _dashboard_nav.html
│       │   │       ├── _dashboard_nav_shared_indicator.html
│       │   │       ├── _dashboard_navlets.html
│       │   │       ├── _dashboard_search_form.html
│       │   │       ├── _dashboard_search_results.html
│       │   │       ├── _dashboard_set_default_response.html
│       │   │       ├── _dashboard_settings_columns_form.html
│       │   │       ├── _dashboard_settings_delete_confirmation.html
│       │   │       ├── _dashboard_settings_form.html
│       │   │       ├── _dashboard_settings_shared_form.html
│       │   │       ├── _dashboard_subscribe_button.html
│       │   │       ├── _import_dashboard_form_modal.html
│       │   │       ├── _lightbox_gallery.html
│       │   │       ├── _navbar_link_form.html
│       │   │       ├── _qr_code.html
│       │   │       ├── about.html
│       │   │       ├── index.html
│       │   │       ├── login.html
│       │   │       ├── preferences.html
│       │   │       └── toolbox.html
│       │   ├── threshold/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── useradmin/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── utils.py
│       │   ├── watchdog/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   └── webfront/
│       │       ├── __init__.py
│       │       ├── forms.py
│       │       ├── urls.py
│       │       ├── utils.py
│       │       └── views.py
│       └── wsgi.py
├── requirements/
│   ├── base.txt
│   ├── django42.txt
│   ├── django50.txt
│   ├── django51.txt
│   ├── django52.txt
│   └── optional.txt
├── requirements.txt
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   ├── free-port.sh
│   ├── functional/
│   │   ├── __init__.py
│   │   ├── arnold_test.py
│   │   ├── conftest.py
│   │   ├── geomap_test.py
│   │   ├── ipdevinfo_test.py
│   │   ├── navbar_test.py
│   │   ├── netmap_test.py
│   │   ├── room_test.py
│   │   └── status_test.py
│   ├── integration/
│   │   ├── __init__.py
│   │   ├── alertengine_test.py
│   │   ├── api_test.py
│   │   ├── auditlog_test.py
│   │   ├── bin_test.py
│   │   ├── bulkimport_test.py
│   │   ├── collectstatic_test.py
│   │   ├── conftest.py
│   │   ├── django_check_test.py
│   │   ├── djangodb_test.py
│   │   ├── event_test.py
│   │   ├── eventengine/
│   │   │   ├── __init__.py
│   │   │   ├── alerts_test.py
│   │   │   ├── boxdown_test.py
│   │   │   ├── juniper_alert_count_test.py
│   │   │   ├── severity_test.py
│   │   │   └── upgrade_test.py
│   │   ├── ipdevpoll/
│   │   │   ├── __init__.py
│   │   │   ├── db_test.py
│   │   │   ├── plugins/
│   │   │   │   ├── entity_test.py
│   │   │   │   ├── juniper_alarm_test.py
│   │   │   │   ├── paloaltoarp_test.py
│   │   │   │   ├── snmpcheck_test.py
│   │   │   │   └── typeoid_test.py
│   │   │   ├── pool_test.py
│   │   │   └── utils_test.py
│   │   ├── jwt_refresh_endpoint_test.py
│   │   ├── l2trace_test.py
│   │   ├── logs_test.py
│   │   ├── maintengine_test.py
│   │   ├── mibs/
│   │   │   ├── arista_vrf_mib_test.py
│   │   │   ├── ip_mib_test.py
│   │   │   ├── juniper_alarm_mib_test.py
│   │   │   ├── memory_test.py
│   │   │   ├── sensors_test.py
│   │   │   └── wlsx_systemext_mib_test.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   ├── account_test.py
│   │   │   ├── alert_test.py
│   │   │   ├── alerthistvarmap_test.py
│   │   │   ├── eventvarmap_test.py
│   │   │   ├── fields_test.py
│   │   │   ├── model_test.py
│   │   │   ├── netbox_test.py
│   │   │   ├── netbox_type_test.py
│   │   │   ├── oui_test.py
│   │   │   └── rack_test.py
│   │   ├── networkexplorer_test.py
│   │   ├── pping_test.py
│   │   ├── querysets_test.py
│   │   ├── report/
│   │   │   ├── __init__.py
│   │   │   └── generator_test.py
│   │   ├── seeddb_test.py
│   │   ├── smidump_test.py
│   │   ├── smsd_test.py
│   │   ├── snmp_fixtures/
│   │   │   ├── P8652.snmprec
│   │   │   ├── T3611.snmprec
│   │   │   ├── apc-pdu.snmprec
│   │   │   ├── arista.snmprec
│   │   │   ├── arista@IOT.snmprec
│   │   │   ├── arista@MGMT.snmprec
│   │   │   ├── arista@STUDENT.snmprec
│   │   │   ├── arista@VR.snmprec
│   │   │   ├── aruba-wlc.snmprec
│   │   │   ├── cisco-memory.snmprec
│   │   │   ├── hp-memory.snmprec
│   │   │   ├── juniper-alarm-none.snmprec
│   │   │   ├── juniper-alarm.snmprec
│   │   │   ├── juniper-memory.snmprec
│   │   │   ├── public.snmprec
│   │   │   ├── raritan.snmprec
│   │   │   └── snmpwalk.snmprec
│   │   ├── snmp_walk_test.py
│   │   ├── snmptrapd_test.py
│   │   ├── sql_test.py
│   │   ├── statemon/
│   │   │   ├── __init__.py
│   │   │   └── radius_test.py
│   │   ├── statemondb_test.py
│   │   ├── thresholdmon/
│   │   │   └── test_events.py
│   │   ├── update_ouis_test.py
│   │   ├── watchdog_test.py
│   │   ├── web/
│   │   │   ├── __init__.py
│   │   │   ├── ajax_test.py
│   │   │   ├── alertprofiles_test.py
│   │   │   ├── arnold_test.py
│   │   │   ├── auth/
│   │   │   │   ├── auth_test.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── ldap_auth_backend_test.py
│   │   │   │   ├── login_redirect_test.py
│   │   │   │   ├── sudo_test.py
│   │   │   │   └── utils_test.py
│   │   │   ├── crawler_test.py
│   │   │   ├── devicehistory/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── componentsearch_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── devicehistory_test.py
│   │   │   ├── geomap_test.py
│   │   │   ├── graphite_test.py
│   │   │   ├── info/
│   │   │   │   ├── info_test.py
│   │   │   │   ├── location_test.py
│   │   │   │   ├── room_test.py
│   │   │   │   └── search_test.py
│   │   │   ├── ipam/
│   │   │   │   ├── api_test.py
│   │   │   │   ├── util_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── ipdevinfo_test.py
│   │   │   ├── jwt_test.py
│   │   │   ├── machinetracker_test.py
│   │   │   ├── maintenance/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── utils_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── messages_test.py
│   │   │   ├── navlets_test.py
│   │   │   ├── netboxtype_test.py
│   │   │   ├── netmap_test.py
│   │   │   ├── portadmin_test.py
│   │   │   ├── prefixviewset_test.py
│   │   │   ├── radius_test.py
│   │   │   ├── seeddb_netbox_test.py
│   │   │   ├── status_test.py
│   │   │   ├── templatesyntax_test.py
│   │   │   ├── threshold_test.py
│   │   │   ├── useradmin_test.py
│   │   │   └── webfront_test.py
│   │   └── widget_test.py
│   ├── javascript-test.sh
│   ├── requirements.txt
│   ├── setup_test_config.py
│   ├── test-data.sql
│   └── unittests/
│       ├── Snmp/
│       │   ├── Snmp_test.py
│       │   ├── __init__.py
│       │   ├── encodings_test.py
│       │   └── profile_test.py
│       ├── __init__.py
│       ├── alertengine/
│       │   ├── __init__.py
│       │   ├── accountalertqueue_test.py
│       │   └── base_test.py
│       ├── api/
│       │   ├── __init__.py
│       │   ├── api_test.py
│       │   └── jwtpermission_test.py
│       ├── arnold/
│       │   ├── __init__.py
│       │   ├── arnold_memo_test.py
│       │   ├── arnold_should_detain_test.py
│       │   ├── arnold_snmp_test.py
│       │   └── arnold_test.py
│       ├── asyncdns_test.py
│       ├── buildconf_test.py
│       ├── business/
│       │   ├── __init__.py
│       │   └── business_test.py
│       ├── config_test.py
│       ├── config_toml_test.py
│       ├── conftest.py
│       ├── dhcpstats/
│       │   ├── common_test.py
│       │   └── kea_dhcp_test.py
│       ├── django/
│       │   ├── __init__.py
│       │   ├── aliases_field_test.py
│       │   ├── filter_test.py
│       │   ├── formats_test.py
│       │   ├── forms_test.py
│       │   ├── settings_test.py
│       │   ├── templatetags/
│       │   │   ├── __init__.py
│       │   │   ├── info_test.py
│       │   │   ├── popover_test.py
│       │   │   └── string_manipulation_test.py
│       │   ├── utils_test.py
│       │   └── validators_test.py
│       ├── eventengine/
│       │   ├── __init__.py
│       │   ├── alerts_test.py
│       │   ├── engine_test.py
│       │   ├── plugin_test.py
│       │   └── severity_test.py
│       ├── general/
│       │   ├── __init__.py
│       │   ├── bitvector_test.py
│       │   ├── bulkparse_test.py
│       │   ├── config_test.py
│       │   ├── conftest.py
│       │   ├── daemon_test.py
│       │   ├── logengine_test.py
│       │   ├── login_not_required_backport_test.py
│       │   ├── modpython_test.py
│       │   ├── objectcache_test.py
│       │   ├── prefix_ip_collector_test.py
│       │   ├── pwhash_test.py
│       │   ├── test_tableformat.py
│       │   ├── util_test.py
│       │   ├── web_middleware_test.py
│       │   └── webfront_test.py
│       ├── info/
│       │   ├── __init__.py
│       │   ├── room_views_test.py
│       │   └── views_test.py
│       ├── ipdevpoll/
│       │   ├── __init__.py
│       │   ├── config_test.py
│       │   ├── descrparsers_test.py
│       │   ├── dnsname_test.py
│       │   ├── interfaces_test.py
│       │   ├── ipdevpoll_test.py
│       │   ├── mibs_test.py
│       │   ├── modules_test.py
│       │   ├── neighbor_test.py
│       │   ├── plugins_arp_test.py
│       │   ├── plugins_lldp_test.py
│       │   ├── plugins_paloaltoarp_test.py
│       │   ├── plugins_snmpcheck_test.py
│       │   ├── pool_test.py
│       │   ├── prefix_test.py
│       │   ├── schedule_test.py
│       │   ├── shadows_adjacency_test.py
│       │   ├── shadows_test.py
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   └── common_test.py
│       │   ├── storage_test.py
│       │   ├── system_test.py
│       │   ├── timestamps_test.py
│       │   └── utils_test.py
│       ├── jwtconf_test.py
│       ├── logs_test.py
│       ├── macaddress/
│       │   ├── __init__.py
│       │   └── macaddress_test.py
│       ├── metrics/
│       │   ├── __init__.py
│       │   ├── data_test.py
│       │   ├── graphs_test.py
│       │   ├── names_test.py
│       │   ├── templates_test.py
│       │   └── thresholds_test.py
│       ├── mibs/
│       │   ├── __init__.py
│       │   ├── entity_mib_test.py
│       │   ├── lldp_mib_test.py
│       │   ├── mibretriever_test.py
│       │   ├── qbridge_mib_test.py
│       │   └── types_test.py
│       ├── models/
│       │   ├── event_test.py
│       │   ├── fields_test.py
│       │   ├── jwtrefreshtoken_test.py
│       │   ├── netbox_test.py
│       │   ├── sensor_test.py
│       │   └── varmap_test.py
│       ├── napalm_test.py
│       ├── natsort_test.py
│       ├── netmap/
│       │   ├── __init__.py
│       │   ├── cache_test.py
│       │   ├── metaclass_testcase.py
│       │   ├── metadata_json_test.py
│       │   ├── metadata_nx_test.py
│       │   ├── multidigraph_to_undirect_test.py
│       │   ├── stubs_test.py
│       │   ├── topology_layer2_testcase.py
│       │   ├── topology_layer3_testcase.py
│       │   └── topology_testcase.py
│       ├── pgsync_test.py
│       ├── portadmin/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── napalm/
│       │   │   ├── __init__.py
│       │   │   ├── conftest.py
│       │   │   ├── juniper_poe_test.py
│       │   │   └── juniper_test.py
│       │   ├── portadmin_poe_cisco_test.py
│       │   ├── portadmin_test.py
│       │   ├── portadmin_util_test.py
│       │   └── snmputils_test.py
│       ├── report/
│       │   ├── __init__.py
│       │   ├── iptools_test.py
│       │   └── util_test.py
│       ├── seeddb/
│       │   ├── management_profile_test.py
│       │   └── seeddb_test.py
│       ├── smsd/
│       │   ├── __init__.py
│       │   ├── dispatcher_test.py
│       │   └── gammudispatcher_test.py
│       ├── snmptrapd/
│       │   ├── __init__.py
│       │   ├── plugin_test.py
│       │   └── weathergoose_test.py
│       ├── statemon/
│       │   ├── conftest.py
│       │   ├── db_test.py
│       │   ├── host_test.py
│       │   ├── icmp_test.py
│       │   └── runqueue_test.py
│       ├── thresholdmon_test.py
│       ├── topology/
│       │   └── analyze_test.py
│       ├── watchdog/
│       │   └── tests_test.py
│       └── web/
│           ├── __init__.py
│           ├── auth/
│           │   ├── allauth_config_test.py
│           │   ├── allauth_views_test.py
│           │   ├── backends_test.py
│           │   └── remote_user_test.py
│           ├── geomap/
│           │   ├── __init__.py
│           │   └── utils_test.py
│           ├── ipam/
│           │   ├── __init__.py
│           │   ├── prefix_tree_test.py
│           │   └── util_test.py
│           ├── ipdevinfo_test.py
│           ├── jwtgen_test.py
│           ├── ldapauth_test.py
│           ├── maintenance/
│           │   ├── __init__.py
│           │   ├── forms_test.py
│           │   └── utils_test.py
│           ├── modals_test.py
│           ├── navlets_test.py
│           ├── portadmin/
│           │   ├── __init__.py
│           │   ├── utils_test.py
│           │   └── views_test.py
│           ├── qrcode_test.py
│           ├── servicecheckers_test.py
│           ├── sortedstats/
│           │   ├── sortedstats_test.py
│           │   └── sortedstatsconfig_test.py
│           ├── threshold_test.py
│           ├── urls_test.py
│           └── webfront_test.py
├── tools/
│   ├── README
│   ├── buglog.py
│   ├── docker/
│   │   ├── build.sh
│   │   ├── doc-watch.sh
│   │   ├── full-nav-restore.sh
│   │   ├── graphite/
│   │   │   ├── Dockerfile
│   │   │   ├── carbon.conf
│   │   │   └── supervisord.conf
│   │   ├── graphite.conf
│   │   ├── nav-apache-site.conf
│   │   ├── nav-start.sh
│   │   ├── run.sh
│   │   ├── sass-watch.sh
│   │   ├── supervisord.conf
│   │   ├── syncdb.sh
│   │   └── web.sh
│   ├── dump-remote-db.sh
│   ├── eventgenerators/
│   │   ├── boxevent.py
│   │   ├── devicenotice.py
│   │   ├── genericstate.py
│   │   ├── linkevent.py
│   │   ├── moduleevent.py
│   │   ├── servicestate.py
│   │   ├── snmpevent.py
│   │   └── thresholdstate.py
│   ├── forward/
│   │   ├── Dockerfile
│   │   └── snmp_forward.sh
│   ├── iana-enterprise.py
│   ├── release/
│   │   ├── announcement.py
│   │   ├── announcement.toml
│   │   └── templates/
│   │       └── announcement.md.j2
│   ├── reset-db-from-remote.sh
│   ├── reset-jwt-keys.sh
│   ├── restore-db.sh
│   ├── snmpdv3/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── snmpd.conf
│   ├── testsql.sh
│   ├── vendor.py
│   └── whatsgone.sh
├── tox.ini
├── version.sh
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .codecov.yml
================================================
coverage:
  range: 57..100
  round: down
  precision: 2
  status:
    project:
      default:
        target: auto
        threshold: 0.1  # Allow PRs to drop overall coverage no more than 0.1%


================================================
FILE: .dockerignore
================================================
# We actually need very little context to build a development image which
# mounts the source code as a volume, so we ignore everything except the few
# files we need to build the image
*

# We only need a few build tools and the requirements files, that is all
!tools/**/*
!requirements.txt
!constraints.txt
!tests/requirements.txt
!doc/requirements.txt
!requirements/**/*


================================================
FILE: .git-blame-ignore-revs
================================================
# Initiate black usage and reformat codebase @lunkwill42 19/03/2021
e6634e512c8ecf283c85a701366620e724806ab7
# Re-ran black on everything due to apparent disagreements on config? @lunkwill42 30/04/2021
78effe45d0febf7103714b7b3f0b9e277db287e9
# Ran black on bin scripts, as some of them seem to have been left out of the previous reformats @lunkwill42 11/11/2021
5d49efe59059c19da2d09d0ae695d498872cdb72
# Re-ran black on everything due to apparent disagreements on config? @lunkwill42 22/02/2022
e0496b75789656f5abca770e928988fd09bf7803
# Re-ran black due to new version 24.4.2
18245ec1a042aac23c4c85637d3454e8d1b5a1bb
# Re-ran black due to new version 24.8.0 @johannaengland 22/08/2024
90d33264b4d2aa106395f247e23830b0901bad3a
# Reformat code using black v25.1.0 @johannaengland 04/02/2025
a48942953b76e85f09094ed90e09c4e227f90b02
# Reformat codebase using ruff v0.11.9 @johannaengland 15/05/2025
2c3d056a25e7a190074a0feb79fbc0104e91284c


================================================
FILE: .npmrc
================================================
legacy-peer-deps=true


================================================
FILE: .pre-commit-config.yaml
================================================
exclude: smidumps/
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
    -   id: trailing-whitespace
    -   id: mixed-line-ending
    -   id: end-of-file-fixer
        exclude: &exclude_pattern '^changelog.d/'
-   repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.14.13
    hooks:
        # Run the formatter
    -   id: ruff-format
        name: "Ruff formatting"
      # Run the linter
    -   id: ruff
        name: "Ruff linting"


================================================
FILE: .readthedocs.yaml
================================================
version: 2

sphinx:
    configuration: doc/conf.py
    builder: html

build:
  os: ubuntu-22.04
  tools:
    python: "3.11"
  apt_packages:
    - libsnmp40

python:
  install:
    - method: uv
      command: sync
      groups:
        - docs


================================================
FILE: .sonarcloud.properties
================================================
sonar.projectKey=Uninett_nav
sonar.organization=uninett-1

# This is the name and version displayed in the SonarCloud UI.
sonar.projectName=NAV
sonar.projectVersion=5.13.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
sonar.sources=python

# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8

sonar.python.version=3.9,3.10,3.11,3.12,3.13
sonar.tests=tests

sonar.exclusions=python/nav/smidumps/**, python/nav/enterprise/ids.py, python/nav/etc/geomap/config.py, python/nav/web/static/js/libs/**


================================================
FILE: AUTHORS.rst
================================================
Network Administration Visualized list of authors
=================================================

This file tries to list everyone that has contributed to NAV, in the
form of code, documentation or packaging.

Currently active contributors/maintainers
-----------------------------------------

* Morten Brekkevold (formerly Vold) <morten.brekkevold at sikt.no>
  NAV's lead developer. Joined in 2002 to make NAV useable outside of NTNU.  Has
  been hacking and improving bits and pieces of NAV ever since.

* Hanne Moa <hanne.moa at sikt.no>
  Joined in 2017. An experienced Python developer who contributied the audit
  logging code, and has put down many hours in migrating to Python 3 and modern
  Django versions.

* Johanna England <johanna.england at sikt.no>
  Joined in 2021. Currently hacking away at open issues and learning the NAV
  codebase.

* Simon Oliver Tveit <simon.tveit at sikt.no>
  Joined in 2021. Currently hacking away at open issues and learning the NAV
  codebase.

* Ilona Podliashanyk <ilona.podliashanyk at sikt.no>
  Joined in 2022, working mainly as a front-end developer. Currently hacking
  away at open issues and learning the NAV codebase.

* Jørund Hellebø <jorund.hellebo at sikt.no>
  Joined part-time in 2024, working on DHCP statistics integration and building
  HTTP/REST API management profiles for Palo Alto API implementations, among
  other things.

* Simen Abelsen <simen.abelsen at sikt.no>
  Joined in August 2025, working on cleanup and modernization of the front-end
  codebase.

Other contributors and previous maintainers
-------------------------------------------
* Vidar Faltinsen <vidar.faltinsen at sikt.no>
  Founded the project in 1999.  He doesn't code, but he knows his way
  around a network, and has been a NAV mentor for all these years -
  producing documentation and offering keen insight into the problem
  domain.

* John-Magne Bredal
  Joined in 2000, and was instrumental in anything related to end user
  detentions (Arnold), the web interface and the API.

* Sigmund Augdal
  Active from 2017, until he left Uninett in 2019. An experienced Python
  developer who, among other things, rewrote the ipdevpoll multiprocess mode.

* Paulo Pamplona <paulo at nordu.net>
  Works at SUNET. Contributed a bugfix to strip null-bytes from bytestrings being
  made safe for PostgreSQL.

* Joar Heimonen <contact at joar.me>
  Contributed Palo Alto ARP plugin to enable ipdevpoll fetch ARP data from Palo
  Alto firewalls.

* Ragnhild Bodsberg
  Contributed various bugfixes to NAV as an intern at Sikt, during the summer
  of 2022.

* Philipp Petermann <philipp.petermann at unibas.ch>
  Contributed support for enabling CDP when configuring Cisco Voice VLANs in
  PortAdmin.

* Leigh Murray <l.d.murray@usit.uio.no>
  Implemented group-based ipdevpoll and pping, allowing multiple
  instances to run simultaneously handling specific groups of devices.

* Ruben Andreassen (University of Tromsø)
  Contributed the initial support for IT-WATCHDOGS-V4-MIB, GEIST-V4-MIB and
  PowerTek PDUs (PWTv1-MIB).

* Bård Schjander Flugon <bflugon at gmail.com>
  During his internship at Uninett, he wrote support for pluggable NAVbar
  search providers, consolidated a new SQL schema baseline from several years
  of migration scripts, and contributed multiple other improvements to NAV.

* Emil Henry Flakk <emil.flakk at sikt.no>
  Wrote the IPAM tool introduced in NAV 4.6, and continues to work on
  Netmap/Geomap fixes, among other things.

* Pär Stolpe <par at stolpe.se>
  Contributed more flexible LDAP authentication for Microsoft AD servers.

* Christian Strand Young <christian at strandyoung.com>
  Joined in the summer of 2011.  His main contributions are implementing IPv6
  support in pping and asynchronous DNS lookups in ipdevinfo & the Machine
  Tracker, as well as fixing various bugs.

* Christine Anne Sætre <christine.satre at ntnu.no>
  Interaction designer, hired as a consultant from NTNU to give feedback on UX
  during the NAV 4.0 interface redesign process.

* Morten Werner Forsbring <werner at debian.org>
  Packaging NAV for Debian 2004-2013.

* Roy Sindre Norangshol <roy.sindre.norangshol at sikt.no>
  Rewrote Netmap from a Java applet to a JavaScript implementation based on
  D3.js. Wrote the tools scripts for building NAV virtual machines based on
  Vagrant, and contributed to improve our automated JavaScript testing.

* Eivind Lysne <eivindlysne at gmail.com>
  Rewrote the remaining Cheetah templates to Django templates during the
  summer of 2013. Also contributed to the design changes scheduled for NAV
  4.0.

* Trond Kandal <trond.kandal at ntnu.no>
  Wrote PortAdmin with John-Magne.

* Ole Martin Bjørndalen <ole.martin.bjorndalen at uit.no>
  Wrote the MailIn system based on a Perl implementation from Uninett, and
  periodically contributes to the service monitor.

* Kai Arne Bjørnenak <kai.bjornenak at cc.uit.no>
  Write radius accounting logger.

* Magnus Motzfeldt Eide
  Active 2008-2012. Rewrote the old PHP-based Alert Profiles interface in
  Python/Django.  General code maintenance and rewrites of mod_python based
  systems to Django, and was also involved in the early development of
  ipdevpoll.

* Marius Halden <marius.halden at gmail.com>

* Matej Gregr <igregr at fit.vutbr.cz>

* Fredrik Skolmli
  Active 2010.  Contributed bugfixes and started the threshold configuration
  UI.

* Thomas Adamcik
  Active 2008-2010.  Rewrote the Perl-based Alert Engine in Python.
  Also rewrote the user admin panel to a Django-based solution, and contributed
  much to enable continuous integration using Hudson.

* Jørgen Abrahamsen
  Active 2008-2010. Bugfixes and features to various parts of NAV, such as
  report, smsd and ipdevinfo.

* Kristian Klette
  Active 2007-2010.  Wrote Netmap and the rewritten Network Explorer.

* Øystein Skartsæterhagen <oysteini at pvv.ntnu.no>, 2009
  Wrote Geomap, the OpenStreetMap-based traffic map.

* Roger Kristiansen

* Stein Magnus Jodal,  2006-2008
  Rewrote the SMS daemon from Perl to Python for NAV 3.2.  During the
  next couple of series releases, he cleaned up the entire web
  interface, defined new policies for how to code web interfaces in
  NAV, and rewrote several web tools.  Introduced Django to NAV 3.5,
  using it to rewrite the creaky IP Device Browser to the IP Device
  Info tool.

* Erlend Midttun <erlend.midttun at ntnu.no>

* Jostein Gogstad <jostein.gogstad at idi.ntnu.no>
  2007, implemented support for collecting IPv6 prefixes and
  neighboring caches, and matrix display of IPv6 subnets.

* Kristian Eide <kreide at gmail.com>
  Active 2000-2005.  Wrote the first Traffic Map applet.  Instrumental
  in the redesign of NAV for version 3, for which he wrote the
  getDeviceData SNMP collection engine, the camlogger, the event
  engine, the topology discovery mechanisms and the network explorer
  and l2trace web tools.

* Gro-Anita Vindheim <gro-anita.vindheim at ntnu.no>
  Active 1999-2001 and 2003-2005.  Wrote live.pl, the original pinger,
  and several other parts of NAV 2.  Maintenance on SQL reports, NAV
  v2->v3 migration helper scripts.

* Magnar Sveen, 2003-2004
  Designed the new web interface for NAV 3 and wrote much of the
  surrounding toolbox and user preferences code.

* Hans Jørgen Hoel, 2003-2004
  Wrote the SeedDB (formerly EditDB) and the original Device
  Management web tools. Partly involved in event engine's handling of
  device lifecycle events.

* Arne Øslebø
  Active 2002-2004.  Wrote the first Alert Engine in Perl.

* Andreas Åkre Solberg <andreas.solberg at sikt.no>
  Active 2002-2004.  Wrote the first Alert Profiles web interface in
  PHP, and parts of the first Alert Engine.

This dynamic duo wrote most of NAV's service monitor and parallel
pinger:

* Stian Søiland, 2002-2004
* Magnus Thanem Nordseth, 2002-2006

* Sigurd Gartmann, 2001-2004
  Wrote the SNMP collector for NAV 2, the report system and the syslog
  analyzer.

* Arve Vanvik, 2004
  Oracle plugin for the service monitor.

* Erlend Mjåvatten, 2003
  Wrote the original rrd browser and supporting libraries.

* Bjørn Ove Grøtan, 2003
  Wrote the original message&maintenance (emotd) web tool, and
  contributed initial code for LDAP authentication.

* Daniel Sandvold, 2002

* Erik Gorset, 2002
  Wrote parts of the service monitor and parallel pinger.

* Knut-Helge Vindheim <knut-helge.vindheim at ntnu.no>, 1999-2002
  Maintenance on various NAV 2 parts: The SMS daemon, SNMP collection
  scripts, database backup system.  For the most part, Knut-Helge has
  contributed invaluable insights into the operation of a large campus
  network.

* Trygve Lunheim, 1999-2000
  The original introduction of MRTG/Cricket integration.

* Stig Venås, 1999
  Wrote the original arp cache collector (arplogger.pl), which
  remained mostly unchanged in NAV for 9 years.

These guys were involved in projects that were precursors to NAV (such as the
first attempt at building a topology graph):

* Eric Sandnes, 1999
* Tor-Arne Kvaløy, 1999


================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

This changelog format was introduced in NAV 5.4.0. Older changelogs can be
found in the [HISTORY](HISTORY) file.

This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the changes for the upcoming release can be found in <https://github.com/Uninett/nav/tree/master/changelog.d/>.

<!-- towncrier release notes start -->

## [5.18.0] - 2026-03-30

### Security

- The CSRF cookie is now marked as secure when `needs_tls` is enabled in
  `webfront.conf`, matching the existing behavior of the session cookie.
  ([#3829](https://github.com/Uninett/nav/issues/3829))
- Passwords are no longer leaked in cleartext in Django error emails when LDAP
  authentication crashes. ([#3870](https://github.com/Uninett/nav/issues/3870))

### Removed (developer-centric)

- Removed obsolete Docker-based test environment. Replaced by test suite
  changes that can run in 'normal' development environments.
  ([#3849](https://github.com/Uninett/nav/issues/3849))

### Added

- Rooms and locations can now have multiple names (aliases). Aliases are
  searchable throughout NAV -- in the navbar, global search, device history,
  maintenance, netmap, network explorer, status widgets, and the REST API.
  Aliases can be managed in *SeedDB* and via bulk import/export. They are
  displayed on room/location detail pages, in search results, and in SeedDB
  list views.
  ([#3314](https://github.com/Uninett/nav/issues/3314),
  [#3315](https://github.com/Uninett/nav/issues/3315),
  [#3815](https://github.com/Uninett/nav/issues/3815),
  [#3818](https://github.com/Uninett/nav/issues/3818),
  [#3819](https://github.com/Uninett/nav/issues/3819),
  [#3820](https://github.com/Uninett/nav/issues/3820),
  [#3821](https://github.com/Uninett/nav/issues/3821),
  [#3822](https://github.com/Uninett/nav/issues/3822),
  [#3823](https://github.com/Uninett/nav/issues/3823),
  [#3836](https://github.com/Uninett/nav/issues/3836),
  [#3840](https://github.com/Uninett/nav/issues/3840),
  [#3841](https://github.com/Uninett/nav/issues/3841),
  [#3844](https://github.com/Uninett/nav/issues/3844),
  [#3851](https://github.com/Uninett/nav/issues/3851),
  [#3852](https://github.com/Uninett/nav/issues/3852),
  [#3868](https://github.com/Uninett/nav/issues/3868),
  [#3880](https://github.com/Uninett/nav/issues/3880),
  [#3895](https://github.com/Uninett/nav/issues/3895))
- Added support for two-factor authentication (TOTP), OAuth2, OIDC, and SAML
  login via `django-allauth`. Authentication can be configured through the new
  TOML config file `webfront/authentication.toml`.
  ([#3622](https://github.com/Uninett/nav/issues/3622),
  [#3676](https://github.com/Uninett/nav/issues/3676),
  [#3834](https://github.com/Uninett/nav/issues/3834),
  [#3862](https://github.com/Uninett/nav/issues/3862),
  [#3873](https://github.com/Uninett/nav/issues/3873),
  [#3889](https://github.com/Uninett/nav/issues/3889),
  [#3934](https://github.com/Uninett/nav/issues/3934),
  [#3936](https://github.com/Uninett/nav/issues/3936))
- Added a report of devices without a known uplink in the topology.
- Debug log runtimes of individual NAVbar search providers.

### Changed

- Auditlog entries can now be sorted by individual columns. Hyperlinks to more
  details are now provided for actors, objects and targets that still exist in
  the NAV database. ([#3776](https://github.com/Uninett/nav/pull/3776))
- Updated markdown dependency to 3.8.1.
  ([#3812](https://github.com/Uninett/nav/issues/3812))
- Downgraded spammy `WARNING` log about alerts referencing deleted objects to
  `DEBUG` level. ([#3927](https://github.com/Uninett/nav/issues/3927))

### Changed (developer-centric)

- Standardize vendored JavaScript library management.

  Vendored JS files now follow a consistent `<name>-<version>.min.js` naming
  convention and are tracked as npm dependencies for easier version management.
  A `vendor.py` tool is included to automate installing and copying vendored
  files. ([#2470](https://github.com/Uninett/nav/issues/2470))
- Tox environments and GitHub workflows switched over to uv for dependency
  management. ([#3859](https://github.com/Uninett/nav/issues/3859))

### Fixed

- Fix network explorer search not working after the first search per page load.
  ([#3853](https://github.com/Uninett/nav/issues/3853))
- Fixed l2trace crash when tracing through a netbox with no associated prefix.
  ([#3866](https://github.com/Uninett/nav/issues/3866))
- LDAP login no longer crashes with a 500 error when a user cannot be found
  during group membership verification.
  ([#3871](https://github.com/Uninett/nav/issues/3871))
- Fix report column tooltips (`$explain_`) not showing when the column also has
  a `$name_` override. ([#3876](https://github.com/Uninett/nav/issues/3876))
- Fixed a crash in SeedDB bulk import when IP addresses contain trailing
  whitespace. ([#3884](https://github.com/Uninett/nav/issues/3884))


## [5.17.1] - 2026-02-27

### Fixed

- Fix collapsed multiselects in status tool filters
  ([#3797](https://github.com/Uninett/nav/issues/3797))
- Event engine now yields to overdue scheduler callbacks between processing
  queued events, preventing long event batches from blocking time-critical
  tasks. ([#3798](https://github.com/Uninett/nav/issues/3798))
  - Added missing index on `netboxentity.deviceid` to speed up lookups by
    device. ([#3794](https://github.com/Uninett/nav/pull/3794))
- Fix crash when rendering navlet error responses due to missing navlet ID
  ([#3802](https://github.com/Uninett/nav/issues/3802))
- Fixed a session crash (`UpdateError`) on the login page that could leak
  cleartext passwords in Django error emails.
  ([#3803](https://github.com/Uninett/nav/issues/3803))
- Fix chart widget failing to load images from URLs without query parameters
  ([#3805](https://github.com/Uninett/nav/issues/3805))
- Fixed `sc.05.16.0001.sql` migration failure on PostgreSQL 14 caused by
  ambiguous `||` operator when concatenating an integer without an explicit
  `::TEXT` cast. ([#3806](https://github.com/Uninett/nav/issues/3806))
- Fixed a crash in Netmap when the topology graph exceeds memcached's max item
  size. The graph is now returned successfully even when it cannot be cached.
  ([#3795](https://github.com/Uninett/nav/pull/3795))
- Improved active IP collector query performance (~10x) by utilizing partial
  database indexes on the `arp` table more effectively.
  ([#3793](https://github.com/Uninett/nav/pull/3793))
- PortAdmin's "commit configuration" endpoint now returns 503 instead of 500
  when the device is unreachable or does not support configuration commits, and
  no longer triggers spurious admin error emails for these expected operational
  failures. ([#3801](https://github.com/Uninett/nav/pull/3801))
- Turned support for `REMOTE_USER` back on. Regression caused by the new
  auth-system and its complicated route to the finish line.


## [5.17.0] - 2026-02-13

### Security

- Enable CSRF protection in entire NAV web UI
  ([#3395](https://github.com/Uninett/nav/issues/3395))

### Added

- DHCP usage statistics graphs are now shown on VLAN and prefix pages when
  found in Graphite ([#2373](https://github.com/Uninett/nav/issues/2373))
- Added "more than" / "less than" option to the "Last Seen" filter on the Room
  view interface list ([#3313](https://github.com/Uninett/nav/issues/3313))
- Added hyperlink to management profile options in SeedDB netbox form
  ([#3643](https://github.com/Uninett/nav/issues/3643))
- Added browse tree and description search for easier maintenance task
  component selection ([#3778](https://github.com/Uninett/nav/issues/3778))
- Added support for SNMP v3-based CAM data collection on Cisco switches (Adds
  support for SNMP v3 context switching for logical MIB instances)
  ([#2811](https://github.com/Uninett/nav/issues/2811))
- Added script to generate GitHub, blog and e-mail release announcements from
  `CHANGELOG.md`

### Changed

- Finally switched from NAV's homegrown authentication system to Django's own.
  This makes NAV compatible with a lot of 3rd party libraries, and is a
  necessary step to support MFA.

  This is a big change. Test thoroughly before putting this version into
  production. This is especially important if you have configured `REMOTE_USER`
  authentication.  NAV's classic `REMOTE_USER` support has a lot of bells and
  whistles that Django's support lacks. We have added support for NAV's config
  options but it is a little used feature. There should be no need to update
  the confg file.  ([#3626](https://github.com/Uninett/nav/issues/3626))
- Allow users to set a subscribed dashboard as their default
  ([#3572](https://github.com/Uninett/nav/issues/3572))
- Refactored `dhcpstats` backend. Users beware: option
  `user_context_poolname_key` in `dhcpstats.conf` renamed to
  `user_context_groupname_key` and its default value changed from `name` to
  `group`.  ([#3766](https://github.com/Uninett/nav/issues/3766))
- Upgraded jQuery library to version 4
  ([#3730](https://github.com/Uninett/nav/issues/3730))
- Upgraded Marionette to V4 in the IPAM tool
  ([#1873](https://github.com/Uninett/nav/issues/1873))
- Refactored dashboard navlets to use HTMX for rendering and updates
  ([#3635](https://github.com/Uninett/nav/issues/3635))
- Stopped CI testing on Python 3.12 by default
  ([#3741](https://github.com/Uninett/nav/issues/3741))

### Fixed

- Re-enabled sorting by actor in auditlog table, now actually working robustly!
  ([#3581](https://github.com/Uninett/nav/issues/3581))
- Fixed breadcrumbs missing from JWT Create and Edit frontend pages
  ([#3682](https://github.com/Uninett/nav/issues/3682))
- Fixed bug where Netmap views could not be created or updated
  ([#3737](https://github.com/Uninett/nav/pull/3737))
- Ensure that the auditlog entries for deleting accounts behave like other
  entries. ([#3738](https://github.com/Uninett/nav/issues/3738))
- Fixed IP Device select in Add New Service form
  ([#3749](https://github.com/Uninett/nav/issues/3749))
- Filtering on SeedDB Patch and Cable pages now searches all visible columns
  instead of only the `jack` field
  ([#3760](https://github.com/Uninett/nav/issues/3760))
- Popover arrow is now correctly positioned when aligned to the end
  ([#3770](https://github.com/Uninett/nav/issues/3770))
- Fix bug where Getting Started tour does not highlight the correct element
  ([#3771](https://github.com/Uninett/nav/issues/3771))
- PortAdmin's save feedback modal now appears instantly instead of being
  delayed by a network round-trip
  ([#3772](https://github.com/Uninett/nav/issues/3772))
- Add global CSRF token handlers for all HTMX and jQuery AJAX POST requests, to
  ensure things do not break unintentionally when CSRF validation is enabled
- Fixed a crash in `nav config where` when no config file directory could be
  found


## [5.16.1] - 2026-01-09

### Fixed

- Fixed location search for locations with slashes in names
  ([#3717](https://github.com/Uninett/nav/issues/3717))
- Fixed `pping` and `snmptrapd` crashes when attempting to look for config files
  in inaccessible directories
  ([#3720](https://github.com/Uninett/nav/issues/3720))
- Support RFC3339/ISO8601-formatted timestamps when parsing syslog messages in
  `logengine` ([#3722](https://github.com/Uninett/nav/issues/3722))
- Fixed GeoMap display of rooms/locations with slashes in their IDs
  ([#3724](https://github.com/Uninett/nav/issues/3724))


## [5.16.0] - 2025-12-19

### Security

- Upgrade jQuery library and dependencies
  ([#3582](https://github.com/Uninett/nav/issues/3582))
- Stop revealing actual API tokens in any type of log
  ([#3686](https://github.com/Uninett/nav/issues/3686))
- Escape column text in audit log table to mitigate potential XSS
  vulnerabilities ([#2803](https://github.com/Uninett/nav/issues/2803))

### Added

- Added support for searching for inactive devices by serial number in Device
  History tool ([#1996](https://github.com/Uninett/nav/issues/1996))
- Added OS version and NAV version to exception debug view
  ([#2082](https://github.com/Uninett/nav/issues/2082))
- Add proper audit log entries for API token manipulations (legacy and JWT)
  ([#3405](https://github.com/Uninett/nav/issues/3405))
- Added a Django authentication backend to do NAV legacy style LDAP
  authentication, in preparation for authentication system rewrite
  ([#3498](https://github.com/Uninett/nav/issues/3498))
- Added confirmation modal when deleting dashboards
  ([#3648](https://github.com/Uninett/nav/issues/3648))
- Added test/research program `nav_cisco_auth_sessions` to retrieve information
  about authentication framework sessions from Cisco switches
  ([#3711](https://github.com/Uninett/nav/issues/3711))
- Added support for searching by description in main info search
  ([#3149](https://github.com/Uninett/nav/issues/3149))
- Allow `NAV_CONFIG_DIR` environment variable to override where NAV looks for
  configuration files ([#3697](https://github.com/Uninett/nav/issues/3697))

### Changed

- Added new dependency `distro` for identifying Linux distributions
  ([#2082](https://github.com/Uninett/nav/issues/2082))
- Load info page search results with HTMX
  ([#3618](https://github.com/Uninett/nav/issues/3618))
- Load filtered device history with HTMX
  ([#3663](https://github.com/Uninett/nav/issues/3663))
- Disabled broken audit log actor sorting
  ([#3581](https://github.com/Uninett/nav/issues/3581))

### Fixed

- Fixed room urls for rooms with slashes in name
  ([#3661](https://github.com/Uninett/nav/issues/3661))
- Upgrade select2 dependency to latest version
  ([#1873](https://github.com/Uninett/nav/issues/1873))
- Strip null bytes from LLDP local chassis IDs to avoid `topo` job abort errors
  (ValueErrors) ([#2479](https://github.com/Uninett/nav/issues/2479))
- Fixed ipdevpoll inventory job crash when including Comet T3611 MIB for
  collecting information for other Comet sensors
  ([#3566](https://github.com/Uninett/nav/issues/3566))
- Properly redirect entire browser to login page when a background HTMX request
  is received on an unauthenticated session (e.g. after session times out)
  ([#3656](https://github.com/Uninett/nav/issues/3656))
- Fixed accessing seeddb/room URLs for rooms with '/' in names
  ([#3659](https://github.com/Uninett/nav/issues/3659))
- Fixed broken event search URL
  ([#3677](https://github.com/Uninett/nav/issues/3677))
- Fixed accessing SeedDB urls for locations, usages, organizations and device
  groups with '/' in names
  ([#3712](https://github.com/Uninett/nav/pull/3712))
- Fixed bug where subnets were not selectable in the IPAM subnet allocator
  ([#3692](https://github.com/Uninett/nav/issues/3692))
- Fixed bug in SeedDB IP Device form where enter in a text field triggered an
  unwanted connectivity check
  ([#3694](https://github.com/Uninett/nav/issues/3694))
- Added success messages for JWT Token Create and Edit views


## [5.15.1] - 2025-11-17

### Fixed

- Fixed crash reports being sent by unauthenticated clients accessing the API
  ([#3650](https://github.com/Uninett/nav/issues/3650))
- Fixed non-working port overviews for devices that contain modules with
  slashes in their name. A broken interfaces API endpoint caused both
  *ipdevinfo* and *interface browser* port lists to malfunction.
  ([#3652](https://github.com/Uninett/nav/issues/3652))


## [5.15.0] - 2025-10-30

### Security

- In preparation for properly protecting against CSRF attacks throughout NAV:
  - Added CSRF tokens to AJAX POST requests
    ([#3465](https://github.com/Uninett/nav/issues/3465))
  - Removed CSRF tokens from GET requests
    ([#3472](https://github.com/Uninett/nav/issues/3472))

### Removed

- Removed unused vendored Foundation CSS stylesheets
  ([#3479](https://github.com/Uninett/nav/issues/3479))
- Removed vendored Foundation JavaScript library from codebase
  ([#3542](https://github.com/Uninett/nav/issues/3542))

### Added

- Show VLAN netident in ipdevinfo port list
  ([#2160](https://github.com/Uninett/nav/issues/2160))
- Dashboards are now shareable between users
  ([#2344](https://github.com/Uninett/nav/issues/2344))
- Show device MAC address in the Device Info tab of ipdevinfo
  ([#3222](https://github.com/Uninett/nav/issues/3222))
- Added Django 5.2 and Python 3.13 to default test matrix
  ([#3467](https://github.com/Uninett/nav/issues/3467))
- Improved user feedback in PortAdmin by loading live port details in
  background, after initial page load
  ([#3544](https://github.com/Uninett/nav/issues/3544))
- Added search results preview in navbar
  ([#3577](https://github.com/Uninett/nav/issues/3577))
- Documented how to enable IPv6 connectivity inside devcontainer (Docker)

### Changed

- Updated NAPALM dependency to 5.1.0
  ([#3495](https://github.com/Uninett/nav/issues/3495))
- Replaced SeedDB IP Device "check connectivity" JavaScript with HTMX,
  including improved user feedback
  ([#3560](https://github.com/Uninett/nav/issues/3560))

#### Non-visible and developer-centric changes

- The dated Foundation JavaScript libraries and CSS stylesheets are being
  replaced by a combination of HTMX-based features, new internal libraries and
  newer alternative libraries. The goal is to keep the outward user interface
  more or less unchanged:

  - Use HTMX modals in SeedDB Patch tool
    ([#3461](https://github.com/Uninett/nav/issues/3461))
  - Replaced tooltip in status actions with accessible help text toggle
    ([#3463](https://github.com/Uninett/nav/issues/3463))
  - Replaced Foundation Joyride with `Driver.js` implementation
    ([#3468](https://github.com/Uninett/nav/issues/3468))
  - Replaced Foundation Topbar JS with JQuery
    ([#3476](https://github.com/Uninett/nav/issues/3476))
  - Replaced Foundation Equalizer with JQuery
    ([#3477](https://github.com/Uninett/nav/issues/3477))
  - Replaced foundation alert plugin with custom JavaScript
    ([#3481](https://github.com/Uninett/nav/issues/3481))
  - Replaced native tooltips with NAV tooltips
    ([#3482](https://github.com/Uninett/nav/issues/3482))
  - Replaced navlet modals with HTMX implementation
    ([#3487](https://github.com/Uninett/nav/issues/3487))
  - Replaced search hint modals in Radius tool with HTMX
    ([#3494](https://github.com/Uninett/nav/issues/3494))
  - Replaced radius detail modals with HTMX
    ([#3514](https://github.com/Uninett/nav/issues/3514))
  - Added fit-content size to modals to support large content
  - Replace IPAM subnet diagram help modal with HTMX
  - Replaced "about logging" modal with HTMX
  - Replaced Foundation dropdowns with custom implementation
  - Replaced "import dashboard" modal with HTMX
  - Replaced Machine Tracker modals with HTMX
  - Replaced modals in ipdevinfo tool with HTMX
  - Replaced threshold form help modal with HTMX
  - Added custom NAV tooltip as replacement for Foundation JS
    ([#3449](https://github.com/Uninett/nav/issues/3449))
  - Added reusable HTMX modal utilities and styles
    ([#3461](https://github.com/Uninett/nav/issues/3461))
  - Added modal closing behaviour controls for close button visibility and
    outside click handling
    ([#3537](https://github.com/Uninett/nav/issues/3537))
  - Added support for positioning popover on multiple sides
    ([#3550](https://github.com/Uninett/nav/issues/3550))
  - Replaced feedback modal in Portadmin with HTMX
    ([#3540](https://github.com/Uninett/nav/issues/3540))
  - Replaced Foundation dropdowns with popovers
    ([#3531](https://github.com/Uninett/nav/issues/3531))
  - Upgraded tinysort dependency
    ([#3580](https://github.com/Uninett/nav/issues/3580))
  - Replaced Foundation Clearing Lightbox with custom Lightbox plugin for
    room/location picture gallery
    ([#3530](https://github.com/Uninett/nav/issues/3530))
  - Use fixed position tooltips in status widgets and SeedDB list tree
    ([#3576](https://github.com/Uninett/nav/issues/3576))
  - Added support for controlling popovers with client side events
    ([#3578](https://github.com/Uninett/nav/issues/3578))
  - Replaced outdated timepicker library with flatpickr
    ([#3587](https://github.com/Uninett/nav/issues/3587))

- Modernized Django URL config, mostly by replacing usage of `re_path()` with
  `path()` ([#3515](https://github.com/Uninett/nav/issues/3515),
  ([#3548](https://github.com/Uninett/nav/issues/3548),
  ([#3631](https://github.com/Uninett/nav/issues/3631))

### Fixed

- Protect against unexpected NUL bytes in SNMP strings by stripping them
  ([#2479](https://github.com/Uninett/nav/issues/2479))
- Fixed bug where status widget tooltip gets stuck
  ([#3301](https://github.com/Uninett/nav/issues/3301))
- Show friendly error message in Arnold when attempting to block ports on
  switches that do not feature a writeable management profile
  ([#3383](https://github.com/Uninett/nav/issues/3383))
- Fixed bug where ipdevinfo job refresh does not display error messages properly
  ([#3385](https://github.com/Uninett/nav/issues/3385))
- Made it possible to un-revoke JWT refresh token by recreating the token
  ([#3457](https://github.com/Uninett/nav/issues/3457))
- Fixed broken all-time searches in Radius tool
  ([#3500](https://github.com/Uninett/nav/issues/3500))
- Removed "no racks" alert after adding a new rack to a room
  ([#3506](https://github.com/Uninett/nav/issues/3506))
- Show distinct filter groups in Groups and Permissions modal in Alert Profiles
  ([#3523](https://github.com/Uninett/nav/issues/3523))
- Show errors on invalid IP in Network Explorer search
  ([#3534](https://github.com/Uninett/nav/issues/3534))
- Fixed saving rooms/locations with active alerts widgets after editing
  ([#3561](https://github.com/Uninett/nav/issues/3561))
- Fixed sudo-ing to the default (anonymous) account
  ([#3571](https://github.com/Uninett/nav/issues/3571))
- Fixed PortAdmin bug where restarting interfaces fails
  ([#3589](https://github.com/Uninett/nav/issues/3589))
- Fixed tooltips in Device History and Subnet Matrix tools
  ([#3591](https://github.com/Uninett/nav/issues/3591))
- Enabled GetBulk / bulkwalk operations under synchronous SNMP v3
  communication (enormously speeding up PortAdmin SNMPv3 queries)
  ([#3594](https://github.com/Uninett/nav/issues/3594))
- Adjusted size and position of "close modal" icon to avoid overlap with text
- Fixed bug where QR Code button is not clickable


## [5.14.1] - 2025-09-01

### Fixed

- Correctly display current chosen filter in Status tool
  ([#3442](https://github.com/Uninett/nav/issues/3442))
- Fixed showing activity graphs in port details in ipdevinfo
  ([#3484](https://github.com/Uninett/nav/issues/3484))


## [5.14.0] - 2025-08-21

### Added

#### User-visible additions

- New SQL reports in the *Report* tool:
  - Added an `operational entities` SQL report.
    ([#1947](https://github.com/Uninett/nav/issues/1947))
  - Added an `Events detected last 24 hours` SQL report.
    ([#3305](https://github.com/Uninett/nav/issues/3305))
- Collection job refreshing from web UI:
  - Added button to refresh `ipdevpoll` background jobs directly from *IP
    Device Info* tool. ([#3350](https://github.com/Uninett/nav/issues/3350))
  - `ipdevpoll` can now immediately reschedule jobs on incoming refresh events
    on the NAV event queue. Refreshes can be ordered from the command line
    using the `navrefresh` program.
    ([#2626](https://github.com/Uninett/nav/issues/2626))
- Added QR code link features:
  - Added link to "My Stuff" menu to generate QR code link to current page.
    ([#2897](https://github.com/Uninett/nav/issues/2897))
  - Added button to SeedDB that downloads a ZIP file with QR Codes linking to the
    selected netboxes/rooms. ([#2899](https://github.com/Uninett/nav/issues/2899))
  - Added config option to switch between generating SVG or PNG QR codes.
    ([#2916](https://github.com/Uninett/nav/issues/2916))
- API additions:
  - Added API endpoint for looking up vendor of MAC address.
    ([#3337](https://github.com/Uninett/nav/issues/3337))
  - Added API endpoint for the `NetboxEntity` model.
    ([#3378](https://github.com/Uninett/nav/issues/3378))
  - JWT token signing features:
    - Added API endpoint for JWT refresh tokens.
      ([#3270](https://github.com/Uninett/nav/issues/3270))
    - Added new tab to *User and API administration* tool for managing JWT refresh tokens.
      ([#3273](https://github.com/Uninett/nav/issues/3273))
    - Expiration times for issued JWT refresh tokens can be configured via
      `jwt.conf`. ([#3016](https://github.com/Uninett/nav/issues/3016))
    - Added support for including API endpoint read/write permission claims to
      JWT tokens.
- Added password security warnings:
  - Show a banner if the logged in user's password is insecure or old and it
    should be changed. ([#3345](https://github.com/Uninett/nav/issues/3345))
  - Show a banner to admins if other users' passwords are insecure or old.
    ([#3346](https://github.com/Uninett/nav/issues/3346))
- Added support for the *T3611* sensor from Comet.
  ([#3307](https://github.com/Uninett/nav/issues/3307))
- Added support for fetching DHCP pool statistics from Kea DHCP API.
  ([#2931](https://github.com/Uninett/nav/issues/2931))


#### Developer-centric additions

- Added HTMX as new front-end library.
  ([#3386](https://github.com/Uninett/nav/issues/3386))
- Document practical usage of devcontainer for developers.
  ([#3398](https://github.com/Uninett/nav/issues/3398))
- Added developer utilities for easily dumping/loading production data into
  devcontainer.

### Changed

#### User-visible changes

- Replaced QuickSelect component picker with dynamic HTMX-based search in
  Maintenance tool.  ([#3425](https://github.com/Uninett/nav/issues/3425))
- Replaced QuickSelect component picker with dynamic HTMX-based search in
  Device history tool.  ([#3434](https://github.com/Uninett/nav/issues/3434))
- Dependency changes:
  - Updated NAPALM dependency to 5.0
    ([#2358](https://github.com/Uninett/nav/issues/2358))
  - Updated `django-rest-framework` to version 3.14+, for proper compatibility
    Django 4.2 ([#3403](https://github.com/Uninett/nav/issues/3403))

#### Developer-centric changes

- Replaced usage of `twisted.internet.defer.returnValue` with regular Python
  `return`, due to deprecation in newest Twisted version.
  ([#2955](https://github.com/Uninett/nav/issues/2955))
- Redefined NAV account model to be usable as a Django user model.
  ([#3332](https://github.com/Uninett/nav/issues/3332))
- Remove unused `ColumnsForm`
  ([#3243](https://github.com/Uninett/nav/issues/3243))


### Fixed

- Fixed missing ARP API endpoint documentation for IP address filtering.
  ([#3215](https://github.com/Uninett/nav/issues/3215))
- Fixed broken location *history* searches from location view page.
  ([#3360](https://github.com/Uninett/nav/issues/3360))
- Restored ISO timestamps in the web UI (as they were before NAV 5.13)
  ([#3369](https://github.com/Uninett/nav/issues/3369))
- Fixed broken `Add to dashboard` functionality for boolean value sensors
  ([#3394](https://github.com/Uninett/nav/issues/3394))
- Fixed sorting by timestamp columns in threshold rule table and Useradmin
  API-token table. ([#3410](https://github.com/Uninett/nav/pull/3410))
- Take advantage of auxiliary `end_time` indexes on ARP table to improve prefix
  usage lookups in API. ([#3413](https://github.com/Uninett/nav/pull/3413))
- Made Docker test environment usable for devs on Apple silicon Macs.


## [5.13.2] - 2025-05-16

### Fixed

- Relax API permissions for endpoints used by NAV web GUI tools intended for
  non-admin users.  Several tools stopped working for non-admin users as a
  result of the permissions lockdown in the 5.13.1 security fix.
  - Relax permissions for API interface view endpoint
    ([#3373](https://github.com/Uninett/nav/issues/3373))
  - Relax permissions for API prefix usage view endpoint
    ([#3374](https://github.com/Uninett/nav/issues/3374))
  - Relax permissions for API list room endpoint
    ([#3375](https://github.com/Uninett/nav/issues/3375))


## [5.13.1] - 2025-05-12

### Security

- Lock down API access for unprivileged users

  By default, NAV granted full API access to logged-in users, regardless of
  their configured privilege level.  This would give unprivileged users access
  to manipulate NAV configuration and even elevate their own user privileges to
  administrator level.  [Read the full security advisory
  here.](https://github.com/Uninett/nav/security/advisories/GHSA-gprr-5vvf-582g)

### Changed

- Update NAPALM dependency to 5.0 to keep NAV web GUI working
  ([#2358](https://github.com/Uninett/nav/issues/2358))

### Fixed

- Fix filtering of 'Last seen' and sorting by 'Last active' in netbox
  interfaces view in room info
  ([#3329](https://github.com/Uninett/nav/issues/3329))


## [5.13.0] - 2025-03-07

### Security

- Omit Palo Alto API keys from ARP plugin log output
  ([#3251](https://github.com/Uninett/nav/issues/3251))

### Added

- Add option for showing OUI vendor name in Machine Tracker searches
  ([#3292](https://github.com/Uninett/nav/issues/3292))
- Add cronjob for populating database with OUI data nightly
  ([#3320](https://github.com/Uninett/nav/issues/3320))
- Run test suite by default on Python 3.11 and Django 4.2
  ([#2850](https://github.com/Uninett/nav/issues/2850))
- Added tests for device history search
  ([#3261](https://github.com/Uninett/nav/issues/3261))

### Changed

- Upgraded Django requirement to 4.2
  ([#2789](https://github.com/Uninett/nav/issues/2789))
- Upgraded and cleaned up various Docker environments used for development and
  testing to Debian Bookworm / Python 3.11
  ([#3284](https://github.com/Uninett/nav/issues/3284))

### Fixed

- Fix minor incompatibilities with Django 4.2
  ([#2850](https://github.com/Uninett/nav/issues/2850))
- Fixed non-responsive search function in room map widget
  ([#3207](https://github.com/Uninett/nav/issues/3207))
- Validate interval inputs in several search forms to avoid unhandled overflow
  errors (switch port activity, radius top talkers report, radius error log
  search, radius account log search)
  ([#3242](https://github.com/Uninett/nav/issues/3242),
  [#3245](https://github.com/Uninett/nav/issues/3245),
  [#3246](https://github.com/Uninett/nav/issues/3246),
  [#3247](https://github.com/Uninett/nav/issues/3247))
- Verify that multiple quarantine rules cannot be added with identical VLANs in
  Arnold ([#3244](https://github.com/Uninett/nav/issues/3244))
- Fixed broken module history view in device history
  ([#3258](https://github.com/Uninett/nav/issues/3258))
- Stop sending error mails to site admins from graphite-web proxy endpoint when
  graphite response code is in the 5XX range
  ([#3259](https://github.com/Uninett/nav/issues/3259))
- Ignore case of sysname in IP device info
  ([#3262](https://github.com/Uninett/nav/issues/3262))
- Add user-agent header when downloading OUI text file
  ([#3291](https://github.com/Uninett/nav/issues/3291))


## [5.12.0] - 2024-12-16

### Removed

- Removed dependencies django-crispy-forms and crispy-forms-foundation
  ([#2794](https://github.com/Uninett/nav/issues/2794))

### Added

- Active maintenance tasks that only reference deleted components will be
  automatically cancelled ([#3229](https://github.com/Uninett/nav/issues/3229))
- Alert profiles filter match value dropdowns now support interactive value
  searches ([#3238](https://github.com/Uninett/nav/issues/3238))
- Added support for setting access port VLANs for Cisco Small Business switches
  in PortAdmin (by reverting to non-Cisco-specific handler routines for this
  subgroup of products) ([#3249](https://github.com/Uninett/nav/issues/3249))

### Changed

- Switched to building CSS from Sass using webpack instead of deprecated
  `libsass`. ([#2849](https://github.com/Uninett/nav/issues/2849))
- Run tests using tox version 4
  ([#2973](https://github.com/Uninett/nav/issues/2973))
- The ipdevpoll plugin to fetch ARP cache data from a netbox's Palo Alto
  firewall API is now configured through a new management profile type assigned
  to that netbox ([#3147](https://github.com/Uninett/nav/issues/3147))
- The old-style `setup.py` script was removed and installation docs were
  updated ([#3176](https://github.com/Uninett/nav/issues/3176))
- Ensure that CSRF token info is included in all forms that have been
  refactored to remove the `django-crispy-forms` dependency
  ([#3157](https://github.com/Uninett/nav/issues/3157))

### Fixed

- Alert profiles filter match value dropdowns now support more than the old
  hard limit of 1000 choices
  ([#2908](https://github.com/Uninett/nav/issues/2908))
- Disable deletion of the default dashboard
  ([#3150](https://github.com/Uninett/nav/issues/3150))
- Rooms and locations with periods in their IDs can now be properly retrieved
  from the corresponding API endpoints
  ([#3186](https://github.com/Uninett/nav/issues/3186))
- Fix spurious crashing when loading some Netmap layer 3 views
  ([#3225](https://github.com/Uninett/nav/issues/3225))
- Improve description of deleted maintenance components
  ([#3228](https://github.com/Uninett/nav/issues/3228))
- Stop SNMP-based `arp` plugin from stepping on the `paloaltoarp` plugins toes.
  Note that this **requires** updating the plugin order in the `ip2mac` job in
  `ipdevpoll.conf` ([#3252](https://github.com/Uninett/nav/issues/3252))
- Ensure that each account has exactly one default dashboard


## [5.11.0] - 2024-10-03

### Removed

- Dropped support for Python 3.7
  ([#2790](https://github.com/Uninett/nav/issues/2790))

### Added

- Post lifecycle event when power supplies or fans are removed
  ([#2982](https://github.com/Uninett/nav/issues/2982))
- Post lifecycle event when a module or chassis is deleted via the status or
  device history tools ([#2983](https://github.com/Uninett/nav/issues/2983))
- Database model for representing Organizationally Unique Identifiers (OUI) to
  identify vendors for MAC addresses
- Script for populating database with OUIs and corresponding vendors from IEEE
  ([#2945](https://github.com/Uninett/nav/issues/2945))
- Module for generating JWTs
  ([#2948](https://github.com/Uninett/nav/issues/2948))
- Documentation for configuring and using JWT tokens in NAV API
  ([#2618](https://github.com/Uninett/nav/issues/2618))

### Changed

- Upgraded dependencies after dropping support for Python 3.7
  ([#2790](https://github.com/Uninett/nav/issues/2790))
- Changed Sphinx version to 7.4.7
  ([#2826](https://github.com/Uninett/nav/issues/2826))
- Changed required PostgreSQL version to 13
  ([#2892](https://github.com/Uninett/nav/issues/2892))
- Moved the test suite's web crawler complexity away from the test discovery
  phase to the test phase itself.  This reduces the number of generated test
  cases from `N` to 2 (where `N` is the number of reachable NAV pages)
  ([#2966](https://github.com/Uninett/nav/issues/2966))
- Link to the doc for using docker for development from the README and
  mention what ports are used when using docker for development
  ([#2978](https://github.com/Uninett/nav/issues/2978))
- Many user-facing forms of the web user interface have been refactored in
  order to remove a dependency that keeps NAV incompatible with Python 3.11.
  This should not affect looks or functionality.  This work is still ongoing in
  the master branch and we hope it will be complete by NAV version 5.12.

### Fixed

- Correctly delete an IP Device's existing `function` value when empty field
  value is submitted in the IP Device IP Device edit form
  ([#2269](https://github.com/Uninett/nav/issues/2269))
- Fixed crash bug when reordering filters within a filter group in Alert Profiles
  ([#2979](https://github.com/Uninett/nav/issues/2979))
- Fixed IPAM API crash bug that caused unnecessary error reports sent as e-mail
  to site admins ([#2989](https://github.com/Uninett/nav/issues/2989))
- Fixed bad tooltip grammar in ipdevinfo "degraded aggregate link" badge
- Make the test suite easier to run under MacOS
- Skip tests when 3rd party requirements are missing, instead of outright
  failing

### Security

- Ensure that CSRF token info is preserved when refactoring crispy forms to
  non-crispy equivalents. This means that `flat_form.html` and
  `_form_content.html` templates will include CSRF token info if form method is
  set to `POST`. ([#3056](https://github.com/Uninett/nav/issues/3056))


## [5.10.2] - 2024-06-03


### Changed

- `snmptrapd` renamed to `navtrapd` to avoid naming conflicts with Net-SNMP
  programs ([#2926](https://github.com/Uninett/nav/issues/2926))

### Fixed

- Replace incorrect fix for premature ARP record closure introduced in 5.10.1
  ([#2910](https://github.com/Uninett/nav/issues/2910))


## [5.10.1] - 2024-05-27


### Fixed

- Fix Machine Tracker DNS search crashing from exhausting all available file
  descriptors ([#2669](https://github.com/Uninett/nav/issues/2669))
- ARP records of unreachable devices are now closed by `navclean` cron job at
  configurable expiry intervals, rather than immediately as a response to a
  short ICMP packet loss ([#2913](https://github.com/Uninett/nav/issues/2913))
- Palo Alto API XML responses are now parsed based on keys instead of indexes
  ([#2924](https://github.com/Uninett/nav/issues/2924))


## [5.10.0] - 2024-05-16


### Removed

- Removed references to IRC support channel from documentation, as the channel
  is closing down ([#2907](https://github.com/Uninett/nav/issues/2907))

### Deprecated

- Support for Python versions older than 3.9 will be dropped in NAV 5.11.

### Added

- New ipdevpoll plugin to fetch ARP cache data from Palo Alto firewall APIs
  ([#2613](https://github.com/Uninett/nav/issues/2613))
- Introduced `towncrier` to aid in collaborative NAV changelog authoring
  ([#2869](https://github.com/Uninett/nav/issues/2869))
- Add library utilities to produce QR codes to arbitrary URLs, for use in
  upcoming features ([#2887](https://github.com/Uninett/nav/issues/2887))
- Added towncrier to automatically produce changelog

### Changed

- Change the Docker Compose-based development environment to use more build
  caching and avoid running too many things as root
  ([#2859](https://github.com/Uninett/nav/issues/2859))
- Changed required PostgreSQL version to 11

### Fixed

- Avoid running command line scripts twice on every invocation
  ([#2877](https://github.com/Uninett/nav/issues/2877),
  [#2878](https://github.com/Uninett/nav/pull/2878))
- Fixed `full-nav-restore.sh` developer helper script that broke after Docker
  Compose development was reorganized
  ([#2888](https://github.com/Uninett/nav/issues/2888))
- Fix missing delete icon in form selector labels
  ([#2898](https://github.com/Uninett/nav/issues/2898))



## [5.9.1] - 2024-03-15

### Fixed

- Fixed broken `navclean` and `navsynctypes`  scripts ([#2875](https://github.com/Uninett/nav/pull/2875), [#2874](https://github.com/Uninett/nav/issues/2874))

## [5.9.0] - 2024-03-08

### Added

- Added option to enable secure cookies in new web security section of `webfront.conf` ([#2194](https://github.com/Uninett/nav/issue/2194), [#2815](https://github.com/Uninett/nav/pull/2815))
- Made `mod_auth_mellon` (SAML) work for logins ([#2740](https://github.com/Uninett/nav/pull/2740))
  - Also added howto for setting up `mod_auth_mellon` for Feide authentication.

### Fixed

- Cycle session IDs on login/logout to protect against potential session fixation attacks ([#2804](https://github.com/Uninett/nav/issues/2804), [#2813](https://github.com/Uninett/nav/pull/2813), [#2836](https://github.com/Uninett/nav/pull/2836), [#2835](https://github.com/Uninett/nav/pull/2835))
- Flush sessions on logout ([#2828](https://github.com/Uninett/nav/pull/2828))
- Prevent clickjacking attacks on NAV by disallowing putting NAV site in document frames ([#2816](https://github.com/Uninett/nav/pull/2816), [#2817](https://github.com/Uninett/nav/pull/2817))
- Cleaned up overview/intro docs ([#2827](https://github.com/Uninett/nav/pull/2827))
- Various cleanups of the test suites:
  - Remove `FakeSession` redundancy ([#2841](https://github.com/Uninett/nav/issues/2841), [#2842](https://github.com/Uninett/nav/pull/2842))
  - Fixed activeipcollector `get_timestamp` function implementation and its broken timezone-naive test ([#2831](https://github.com/Uninett/nav/pull/2831))
  - Fixed broken statemon tests ([#2832](https://github.com/Uninett/nav/pull/2832))
  - Fixed warnings during integration tests ([#2847](https://github.com/Uninett/nav/issues/2847), [#2858](https://github.com/Uninett/nav/pull/2858))
  - Preserve 500-errors in webcrawler tests ([#2861](https://github.com/Uninett/nav/pull/2861))
- Removed nonsensical pydantic requirement ([#2867](https://github.com/Uninett/nav/pull/2867))
- Removed warnings when building docs ([#2856](https://github.com/Uninett/nav/pull/2856))

### Changed

- Modernize installation of NAV scripts/binaries using `pyproject.toml` ([#2676](https://github.com/Uninett/nav/issues/2676), [#2679](https://github.com/Uninett/nav/pull/2679))
- Changed the documentation theme from "Bootstrap" to "Read The Docs", as the Bootstrap theme was no longer being maintained.  This also avoids unnecessary JavaScript libraries in the docs ([#2805](https://github.com/Uninett/nav/issues/2805), [#2825](https://github.com/Uninett/nav/pull/2825), [#2824](https://github.com/Uninett/nav/pull/2824), [#2834](https://github.com/Uninett/nav/issues/2834), [#2837](https://github.com/Uninett/nav/pull/2837), [#2833](https://github.com/Uninett/nav/issues/2833), [#2853](https://github.com/Uninett/nav/pull/2853), [#2868](https://github.com/Uninett/nav/pull/2868))
- Various changes needed to move NAV closer to being fully compatible with Python 3.11:
  - Replaced all uses of `pkg_resources` with `importlib` ([#2791](https://github.com/Uninett/nav/issues/2791), [#2798](https://github.com/Uninett/nav/pull/2798), [#2799](https://github.com/Uninett/nav/pull/2799))
  - Upgraded Twisted to a version that supports Python 3.11 ([#2792](https://github.com/Uninett/nav/issues/2792), [#2796](https://github.com/Uninett/nav/pull/2796))
  - Upgraded psycopg to 2.9.9 ([#2793](https://github.com/Uninett/nav/issues/2793), [#2795](https://github.com/Uninett/nav/pull/2795))
  - Dropped code that was there to support Django's older than 3.2 ([#2823](https://github.com/Uninett/nav/pull/2823))
  - Upgraded `python-ldap` from 3.4.0->3.4.4 ([#2830](https://github.com/Uninett/nav/pull/2830))
  - Enabled running test suite on Python 3.10 by default ([#2838](https://github.com/Uninett/nav/pull/2838))
  - Stopped running test suite on Python 3.8 by default ([#2851](https://github.com/Uninett/nav/pull/2851))
  - Fixed invalid/deprecated backslash escapes in MIB dump files, as warned about in newer Python versions ([#2846](https://github.com/Uninett/nav/pull/2846), [#2848](https://github.com/Uninett/nav/pull/2848))
  - Fixed deprecation warning for Django 4.0 in test suite ([#2844](https://github.com/Uninett/nav/pull/2844))
  - Removed an adaption to Pythons older than 3.7 ([#2840](https://github.com/Uninett/nav/pull/2840))
  - Install Node/NPM in docker dev environment ([#2855](https://github.com/Uninett/nav/pull/2855))
  - Vendor the PickleSerializer ([#2866](https://github.com/Uninett/nav/pull/2866))

## [5.8.4] - 2023-12-14

### Fixed

- Allow admins to configure ports with invalid or unset native VLANs in PortAdmin ([#2477](https://github.com/Uninett/nav/issues/2477), [#2786](https://github.com/Uninett/nav/pull/2786))
- Fix bug that caused PoE config to be completely disabled for Cisco devices where at least one port did not support PoE ([#2781](https://github.com/Uninett/nav/pull/2781))
- Fix PortAdmin save button moving around for ports without PoE support ([#2782](https://github.com/Uninett/nav/pull/2782))
- Fix PortAdmin bug that prevented switching PoE state back and forth without reloading entire page ([#2785](https://github.com/Uninett/nav/pull/2785))
- Fix regression that caused maintenance tasks to be un-editable ([#2783](https://github.com/Uninett/nav/issues/2783), [#2784](https://github.com/Uninett/nav/pull/2784))

## [5.8.3] - 2023-12-01

### Fixed

- Fix non-working SNMPv1 communication ([#2772](https://github.com/Uninett/nav/issues/2772), [#2779](https://github.com/Uninett/nav/issues/2779), [#2780](https://github.com/Uninett/nav/pull/2780))

## [5.8.2] - 2023-11-30

### Fixed

- Fix broken "operate as user" function in User and API Administration tool ([#2766](https://github.com/Uninett/nav/issues/2766), [#2777](https://github.com/Uninett/nav/pull/2777))
- Fix crashing PDU widget ([#2776](https://github.com/Uninett/nav/pull/2776))
- Fix bug that caused PortAdmin to stop working for Cisco switches ([#2773](https://github.com/Uninett/nav/issues/2773), [#2774](https://github.com/Uninett/nav/pull/2774))


## [5.8.1] - 2023-11-29

### Fixed

- Constrain version of 3rd party module `ciscoconfparse`, in order to avoid NAV not working under Python 3.7 ([#2770](https://github.com/Uninett/nav/issues/2770), [#2771](https://github.com/Uninett/nav/pull/2771))
- Fix ipdevpoll crash error from using SNMP v2c profile example that came with NAV ([#2767](https://github.com/Uninett/nav/issues/2767), [#2768](https://github.com/Uninett/nav/pull/2768))
- Gracefully handle encoding errors in invalid sysname/IP input in SeedDB IP Device form ([#2764](https://github.com/Uninett/nav/pull/2764))
- Gracefully handle errors from invalid profiles list input in SeedDB IP Device form ([#2765](https://github.com/Uninett/nav/pull/2765))

## [5.8.0] - 2023-11-24

### Added

- Initial SNMPv3 support added to most parts of NAV
  - Add an SNMPv3 management profile type ([#2693](https://github.com/Uninett/nav/issues/2693), [#2699](https://github.com/Uninett/nav/pull/2699))
  - Add SNMPv3 session support to the synchronous SNMP libraries used by most parts of NAV except ipdevpoll ([#2700](https://github.com/Uninett/nav/issues/2700), [#2710](https://github.com/Uninett/nav/pull/2710))
  - Add SNMPv3 reachability tests in SeedDB IP Device registration forms ([#2704](https://github.com/Uninett/nav/issues/2704), [#2734](https://github.com/Uninett/nav/pull/2734), [#2727](https://github.com/Uninett/nav/issues/2727), [#2730](https://github.com/Uninett/nav/pull/2730))
  - Add SNMPv3 support to Portadmin ([#2712](https://github.com/Uninett/nav/issues/2712), [#2731](https://github.com/Uninett/nav/pull/2731))
  - Add SNMPv3 support to `navsnmp` command line program ([#2724](https://github.com/Uninett/nav/issues/2724), [#2725](https://github.com/Uninett/nav/pull/2725))
  - Add SNMPv3 support to Arnold ([#2726](https://github.com/Uninett/nav/issues/2726), [#2733](https://github.com/Uninett/nav/pull/2733))
  - Add SNMPv3 session support to ipdevpoll's asynchronous SNMP libraries ([#2736](https://github.com/Uninett/nav/issues/2736), [#2743](https://github.com/Uninett/nav/pull/2743))
  - Add SNMPv3 support to`navoidverify` and `naventity` command line programs ([#2747](https://github.com/Uninett/nav/issues/2747), [#2748](https://github.com/Uninett/nav/pull/2748))
- Power-over-Ethernet configuration support for Cisco and Juniper equipment in PortAdmin ([#2632](https://github.com/Uninett/nav/issues/2632), [#2633](https://github.com/Uninett/nav/issues/2633), [#2666](https://github.com/Uninett/nav/pull/2666), [#2635](https://github.com/Uninett/nav/pull/2635), [#2759](https://github.com/Uninett/nav/pull/2759))
- Extract VLAN association from router port names on Checkpoint firewalls ([#2684](https://github.com/Uninett/nav/issues/2684), [#2701](https://github.com/Uninett/nav/pull/2701))
- Add link to our GitHub discussion forums in "Getting help" documentation ([#2746](https://github.com/Uninett/nav/pull/2746))
- Add subcommand to `navuser` command line program for deleting users ([#2705](https://github.com/Uninett/nav/pull/2705))
- Add toggle in `webfront.conf` for automatic creation of remote users ([#2698](https://github.com/Uninett/nav/issue/2698), [#2707](https://github.com/Uninett/nav/pull/2707))
- Add proper documentation index page for all howto guides ([#2716](https://github.com/Uninett/nav/pull/2716))
- Add description to threshold alarms ([#2691](https://github.com/Uninett/nav/issue/2691), [#2709](https://github.com/Uninett/nav/pull/2709))


#### Developer-centric additions

- Add tests for overview of alert profiles page  ([#2741](https://github.com/Uninett/nav/pull/2741))
- Add make rule for cleaning `doc` directory ([#2717](https://github.com/Uninett/nav/pull/2717))
- Add an snmpd service container for SNMPv3 comms testing ([#2697](https://github.com/Uninett/nav/pull/2697))

### Fixed

- Improve validation of maintenance form input in order to avoid unintentional crash reports ([#2757](https://github.com/Uninett/nav/pull/2757))
- Handle invalid alert profile ID form input without crashing ([#2756](https://github.com/Uninett/nav/pull/2756))
- Prevent crash errors in esoteric situations where multiple dashboards have been erroneously marked as a user's default dashboard ([#2680](https://github.com/Uninett/nav/pull/2680))
- Fix broken `navoidverify` command on Linux ([#2737](https://github.com/Uninett/nav/pull/2737))
- Several regressions related to input validation in Alert Profiles were fixed:
  - Fix regression that prevented filter groups from being deleted from an alert profile ([#2729](https://github.com/Uninett/nav/pull/2729))
  - Fix regression that prevented activation/deactivation of alert profiles ([#2732](https://github.com/Uninett/nav/pull/2732))
  - Fix form validation with "equal" and "in" operators for adding expression with group to filter ([#2750](https://github.com/Uninett/nav/pull/2750))
  - Add more expression operator tests for alert profiles and fix cleaning in `ExpressionForm` ([#2752](https://github.com/Uninett/nav/pull/2752))

#### Developer-centric fixes

- Restructure alert profile tests ([#2739](https://github.com/Uninett/nav/pull/2739))

### Changed

- Allow write-enabled SNMP profiles to be used for reading when device has no read-only SNMP profiles ([#2735](https://github.com/Uninett/nav/issues/2735), [#2751](https://github.com/Uninett/nav/pull/2751))
- Improved howto guide for setting up remote user authentication using `mod_auth_oidc` ([#2708](https://github.com/Uninett/nav/pull/2708))

#### Developer-centric changes

- Refactored web authentication code in preparation for future changes to authentication flow ([#2706](https://github.com/Uninett/nav/pull/2706))

### Removed

#### Developer-centric removals

- Remove remaining uses of `Netbox.snmp_version` ([#2522](https://github.com/Uninett/nav/issues/2522))
- Remove unused function `snmp_parameter_factory` ([#2753](https://github.com/Uninett/nav/pull/2753))
- Remove deprecated Netbox SNMP properties ([#2754](https://github.com/Uninett/nav/pull/2754), [#2761](https://github.com/Uninett/nav/pull/2761))



## [5.7.1] - 2023-09-18

### Fixed

- Fixed regression that caused Netmap to be unusable in 5.7.0 ([#2681](https://github.com/Uninett/nav/issues/2681), [#2683](https://github.com/Uninett/nav/pull/2683))

## [5.7.0] - 2023-09-07

### Added

- Even more complex and flexible configuration of NAV logging is now supported through `logging.yml` ([#2659](https://github.com/Uninett/nav/pull/2659))
- Added howto guide for log configuration ([#2660](https://github.com/Uninett/nav/pull/2660))
- Currently non-functional (aka. "blacklisted") alert sender mechanisms are now flagged in the Alert Profiles tool wherever an affected alert address is displayed ([#2653](https://github.com/Uninett/nav/issues/2653), [#2664](https://github.com/Uninett/nav/issues/2664), [#2677](https://github.com/Uninett/nav/pull/2677), [#2678](https://github.com/Uninett/nav/pull/2678))
- Added support for polling and alerting on Juniper chassis and system alerts ([#2358](https://github.com/Uninett/nav/issues/2358), [#2388](https://github.com/Uninett/nav/pull/2388))
  - Juniper only provides alert counters via SNMP, no alert details, unfortunately.
  - Since NAV doesn't support alert state updates, a new eventengine plugin handles alert count transitions by resolving old alerts and creating new ones ([#2432](https://github.com/Uninett/nav/issues/2432), [#2519](https://github.com/Uninett/nav/pull/2519))
- Added a new `contains_address` filter to the `prefix` API endpoint, to enable lookup of matching prefix/vlan details from a single IP or subnet address ([#2577](https://github.com/Uninett/nav/issues/2577), [#2578](https://github.com/Uninett/nav/pull/2578))
- Defined and added abstract methods for Power-over-Ethernet configuration to PortAdmin management handler classes ([#2636](https://github.com/Uninett/nav/pull/2636))
  - These are needed for the upcoming vendor specific implementations of PoE config in PortAdmin.
- Implemented configuration file parsing for upcoming local JWT token feature ([#2568](https://github.com/Uninett/nav/pull/2568))

### Fixed

#### User-visible fixes

- Properly dispose of outgoing alert notifications to invalid alert addresses ([#2661](https://github.com/Uninett/nav/pull/2661))
- Fixed crash when attempting to log device errors with an empty comment in the Device History tool ([#2579](https://github.com/Uninett/nav/issues/2579), [#2580](https://github.com/Uninett/nav/pull/2580))
- Fixed bad styling and missing linebreaks in traceback section of the 500 error page ([#2607](https://github.com/Uninett/nav/issues/2607), [#2628](https://github.com/Uninett/nav/pull/2628))
- Show help text instead of error when running `nav` command without arguments ([#2601](https://github.com/Uninett/nav/issues/2601), [#2603](https://github.com/Uninett/nav/pull/2603))
- Prevent users from entering invalid `sysObjectID` values when editing Netbox types in SeedDB ([#2584](https://github.com/Uninett/nav/pull/2584), [#2566](https://github.com/Uninett/nav/issues/2566))
- Removed upper version bound for *Pillow* image manipulation library, to fix security warnings ([#2567](https://github.com/Uninett/nav/pull/2567))
- Alerts that cannot be sent due to blacklisted media plugins will no longer fill up `alertengine.log` every 30 seconds, unless DEBUG level logging is enabled ([#1787](https://github.com/Uninett/nav/issues/1787), [#2652](https://github.com/Uninett/nav/pull/2652))
- DNS lookups in ipdevinfo are now properly case insensitive ([#2615](https://github.com/Uninett/nav/issues/2615), [#2650](https://github.com/Uninett/nav/pull/2650))
- Alert Profiles will now properly require Slack alert addresses to be valid URLs ([#2657](https://github.com/Uninett/nav/pull/2657))
- 5 minute and 15 minute load average values will now be collected correctly for Juniper devices ([#2671](https://github.com/Uninett/nav/issues/2671), [#2672](https://github.com/Uninett/nav/pull/2672))
- Fix cabling API, which broke due to internal refactorings ([#2621](https://github.com/Uninett/nav/pull/2621))
- Only install NAV's custom `epollreactor2` in ipdevpoll if running on Linux ([#2503](https://github.com/Uninett/nav/issues/2503), [#2604](https://github.com/Uninett/nav/pull/2604))
  - Stops ipdevpoll from crashing on BSDs.

#### Developer-centric fixes

- Moved more of NAV's packaging definition to `pyproject.toml` ([#2655](https://github.com/Uninett/nav/pull/2655))
- Pin pip to version 23.1.0 for CI pipelines to continue working ([#2647](https://github.com/Uninett/nav/pull/2647))
- Improve ipdevpoll logging of SQL queries and from Twisted library ([#2640](https://github.com/Uninett/nav/pull/2640))
- Stop making skipped validation tests for non HTML content ([#2623](https://github.com/Uninett/nav/pull/2623))
- Version-locked indirect dependencies of test suites ([#2622](https://github.com/Uninett/nav/pull/2622), [#2617](https://github.com/Uninett/nav/issues/2617))
- Improve SNMP forwarding/proxying container setup, including adding IPv6 support ([#2637](https://github.com/Uninett/nav/pull/2637), [#2516](https://github.com/Uninett/nav/pull/2516))
- Documented a recipe for establishing SNMP tunnels when testing devices on otherwise unreachable networks ([#2426](https://github.com/Uninett/nav/issues/2426), [#2435](https://github.com/Uninett/nav/pull/2435))
- Run Django development web server in "insecure" mode to improve simulation of a production environment when debug flag is turned off ([#2625](https://github.com/Uninett/nav/pull/2625))
- Added a proper docstring to `bootstrap_django()` function ([#2619](https://github.com/Uninett/nav/pull/2619), [#2168](https://github.com/Uninett/nav/issues/2168))
- Stop restoring stale tox environment caches in GitHub workflows ([#2605](https://github.com/Uninett/nav/pull/2605))
- Added tests for ipdevpoll worker euthanization ([#2599](https://github.com/Uninett/nav/pull/2599), [#2548](https://github.com/Uninett/nav/issues/2548))
- Added tests to ensure snmptrapd can properly look up a NAV router that sends traps from one of its non-management IP addresses ([#2500](https://github.com/Uninett/nav/issues/2500), [#2510](https://github.com/Uninett/nav/pull/2510))
- Avoid redundant graphite time formatting strings by re-using constant ([#2588](https://github.com/Uninett/nav/pull/2588), [#2543](https://github.com/Uninett/nav/issues/2543))
- Make detection of running in a virtualenv more compatible with modern toolchain ([#2573](https://github.com/Uninett/nav/pull/2573))
- Revert to having tox run its own dependency installer ([#2572](https://github.com/Uninett/nav/pull/2572))
- Added explicit back-relation names for several Django ORM models ([#2544](https://github.com/Uninett/nav/pull/2544), [#2546](https://github.com/Uninett/nav/pull/2546), [#2547](https://github.com/Uninett/nav/pull/2547), [#2549](https://github.com/Uninett/nav/pull/2549), [#2550](https://github.com/Uninett/nav/pull/2550), [#2551](https://github.com/Uninett/nav/pull/2551))

## [5.6.1] - 2023-03-23

### Added

#### Developer-centric features
- Document a recipe for establishing SNMP tunnels using socat/SSH ([#2426](https://github.com/Uninett/nav/issues/2426), [#2435](https://github.com/Uninett/nav/pulls/2435))
- Updated/added explicit relation names to various ORM models ([#2544](https://github.com/Uninett/nav/pull/2544), [#2546](https://github.com/Uninett/nav/pull/2546), [#2547](https://github.com/Uninett/nav/pull/2547), [#2549](https://github.com/Uninett/nav/pull/2549), [#2550](https://github.com/Uninett/nav/pull/2550), [#2551](https://github.com/Uninett/nav/pull/2551), [#2595](https://github.com/Uninett/nav/pull/2595), [#2596](https://github.com/Uninett/nav/pull/2596))
- Added tests for simple searches ([#2597](https://github.com/Uninett/nav/pull/2597))

### Fixed

#### User-visible fixes
- Ensure event variables are always posted in transactions, so the event engine does not accidentally end up processing incomplete event information ([#2594](https://github.com/Uninett/nav/pull/2594))
- Report broken cache configuration as an error in Ranked Statistics tool, rather than taking down the whole NAV site ([#2561](https://github.com/Uninett/nav/issues/2561), [#2563](https://github.com/Uninett/nav/pull/2563))
- Show error message on invalid ip address in ipdevinfo ([#2590](https://github.com/Uninett/nav/pull/2590), [#2589](https://github.com/Uninett/nav/issues/2589))
- Link to correct room in room report if room has a space in its name ([#2593](https://github.com/Uninett/nav/pull/2593), [#2592](https://github.com/Uninett/nav/issues/2592))
- Work around duplicate internal serial numbers in Juniper equipment by trusting data only from the device with the lowest entity index ([#2583](https://github.com/Uninett/nav/pull/2583), [#2493](https://github.com/Uninett/nav/issues/2493))
- Make save function in AlertHistory, EventHistory and AlertQueue atomic  ([#2594](https://github.com/Uninett/nav/pull/2594))
- Ignore LDAP server referral responses, rather then erroring out during the login process ([#2576](https://github.com/Uninett/nav/pull/2576), [#1166](https://github.com/Uninett/nav/issues/1166))
- Include the `new_version` variable in alert message templates for device hw/fw/sw upgrades ([#2565](https://github.com/Uninett/nav/pull/2565))
- Update NAV blog widget to use the new blog URL ([#2585](https://github.com/Uninett/nav/pull/2585))
- Handle invalid IP address input in ipdevinfo device searches gracefully, rather then crashing with a 500 error ([#2589](https://github.com/Uninett/nav/issues/2589), [#2590](https://github.com/Uninett/nav/pull/2590))
- Fix broken links to room details from room report for rooms with spaces in their names ([#2592](https://github.com/Uninett/nav/issues/2592), [#2593](https://github.com/Uninett/nav/pull/2593))
- Catch Validation error in filtering of prefixes in API ([#2606](https://github.com/Uninett/nav/issues/2606), [#2608](https://github.com/Uninett/nav/pull/2608))
- Redesign the 500 Error page so that the exception traceback if formatted as one


## [5.6.0] - 2023-01-20

### Added

#### User-visible features

- NAPALM/NETCONF management profiles can now be configured with custom timeout values ([#2460](https://github.com/Uninett/nav/pull/2460), [#2390](https://github.com/Uninett/nav/issues/2390))
- Post lifecycle events the first time new chassis/module/PSU/fan devices are seen ([#2391](https://github.com/Uninett/nav/issues/2391), [#2414](https://github.com/Uninett/nav/pull/2414))
- Accept JSON Web Tokens signed by third-parties as valid API authentication/authorization tokens ([#2483](https://github.com/Uninett/nav/issues/2483), [#2511](https://github.com/Uninett/nav/pull/2511))
- Collect "chassis" serial numbers from Aruba wireless controllers ([#2514](https://github.com/Uninett/nav/pull/2514))
- Added an API endpoint for module information ([#2517](https://github.com/Uninett/nav/issues/2517), [#2520](https://github.com/Uninett/nav/pull/2520))
- Result caching added to ranked statistics - including the ability to populate the cache regularly behind-the-scenes in a cronjob (([#1504](https://github.com/Uninett/nav/issues/1504), [#2398](https://github.com/Uninett/nav/pull/2398))

#### Developer-centric features

- Added `buglog.py` option to fetch issue numbers from git reflog ([#2474](https://github.com/Uninett/nav/pull/2474))
- Added tests for  `get_memory_usage` for all memory MIBs ([#2376](https://github.com/Uninett/nav/issues/2376), [#2441](https://github.com/Uninett/nav/pull/2441))
- Added tests to discover invalid MIB dumps from smidump ([#2501](https://github.com/Uninett/nav/issues/2501), ([#2521](https://github.com/Uninett/nav/pull/2521))
- Updated/added explicit relation names to various ORM models ([#2539](https://github.com/Uninett/nav/pull/2539), [#2540](https://github.com/Uninett/nav/pull/2540), [#2541](https://github.com/Uninett/nav/pull/2541), [#2542](https://github.com/Uninett/nav/pull/2542))

### Fixed

#### User-visible fixes

- Empty alert messages are no longer sent when device software upgrades are detected ([#2533](https://github.com/Uninett/nav/issues/2533))
- Merged two fixes from the 5.4.x stable series that never actually made it into the 5.5 series:
  - Metric values of *0.0* are evaluated correctly by threshold rules ([#2447](https://github.com/Uninett/nav/issues/2447))
  - Validate maintenance calendar input form to avoid e-mail spam from bots scanning for vulnerabilities ([#2420](https://github.com/Uninett/nav/issues/2420), [#2431](https://github.com/Uninett/nav/pull/2431))
- Properly log (for posterity) old and new revision numbers with every software/hardware/firmware upgrade event NAV posts ([#2515](https://github.com/Uninett/nav/pull/2515), [#2545](https://github.com/Uninett/nav/pull/2545), [#2560](https://github.com/Uninett/nav/pull/2560))
- snmpwalk routine for synchronous NAV code now correctly handles end-of-mib-view errors ([#1925](https://github.com/Uninett/nav/issues/1925), [#2489](https://github.com/Uninett/nav/pull/2489))
- Removed deprecation warnings from command line programs `navsnmp`, `naventity` and `navoidverify` ([#2389](https://github.com/Uninett/nav/issues/2389), [#2429](https://github.com/Uninett/nav/pull/2429))

#### Developer-centric fixes

- Use pip-compile's backtracking dependency resolver to fix failing CI pipelines ([#2509](https://github.com/Uninett/nav/pull/2509))
- Updated libsnmp dependency for newer Ubuntu runners in GitHub pipelines ([#2532](https://github.com/Uninett/nav/pull/2532))
- Use same version of Django for pylint runs as the latest stable release ([#2536](https://github.com/Uninett/nav/pull/2536))
- Fixed a slew of new CI pipeline / test suite problems that appear after new years ([#2537](https://github.com/Uninett/nav/pull/2537))

## [5.5.2] - 2022-11-10

### Fixed

- Fix serious collection breakdown in ipdevpoll by re-generating a valid Python representation of CISCO-ENHANCED-MEMPOOL-MIB ([#2494](https://github.com/Uninett/nav/issues/2494), [#2495](https://github.com/Uninett/nav/pull/2495))
- Fix broken trap processing in snmptrapd ([#2497](https://github.com/Uninett/nav/issues/2497), [#2498](https://github.com/Uninett/nav/pull/2498))


## [5.5.1] - 2022-11-09

### Fixed

- Delete and ignore module devices with fake serial number `BUILTIN`, as reported by Juniper equipment, in order to avoid spamming with `device[SFH]wUpgrade` alerts ([#2491](https://github.com/Uninett/nav/issues/2491), [#2492](https://github.com/Uninett/nav/pull/2492))

## [5.5.0] - 2022-11-04

### Changed

- Bump `lxml` from 4.6.5 to 4.9.1 in /tests ([#2443](https://github.com/Uninett/nav/pull/2443))
- Links and documented references to the NAV mailing lists have changed to the `lister.sikt.no` domain.

### Added

- Add link to #nav irc channel on Libera.Chat to README file ([#2475](https://github.com/Uninett/nav/pull/2475))
- Add `mac_addresses` attribute to `/netbox/` API endpoint ([#2487](https://github.com/Uninett/nav/pull/2487), [#2490](https://github.com/Uninett/nav/pull/2490))
- Add ability to filter by alert severity in the status tool ([#2467](https://github.com/Uninett/nav/pull/2467))
- Support for fetching ARP cache entries from all Arista VRF instances ([#2262](https://github.com/Uninett/nav/issues/2262), [#2454](https://github.com/Uninett/nav/pull/2454)))
- Link aggregation information added to NAV API ([#1765](https://github.com/Uninett/nav/issues/1765), [#2440](https://github.com/Uninett/nav/pull/2440))
- Support fetching memory stats from `CISCO-ENHANCED-MEMPOOL-MIB` ([#2236](https://github.com/Uninett/nav/issues/2236), [#2439](https://github.com/Uninett/nav/pull/2439))
- Added a flag to `navcheckservice` that shows all available handler plugins ([#2378](https://github.com/Uninett/nav/issues/2378), [#2437](https://github.com/Uninett/nav/pull/2437))
- Post `deviceHwUpgrade`/`deviceSwUpgrade`/`deviceFwUpgrade` events when changes are detected to devices' hardware, software or firmware revisions ([#2393](https://github.com/Uninett/nav/issues/2393), [#2413](https://github.com/Uninett/nav/pull/2413))
- Call a `cleanup()` method for individual container objects after ipdevpoll save stage ([#2421](https://github.com/Uninett/nav/pull/2421))
- Added `Device` methods to resolve and return related objects/entities (chassis, modules, fans, power supplied) and extended device descriptions ([#2428](https://github.com/Uninett/nav/pull/2428))

### Fixed

- Avoid potential resource leaks by properly closing configuration files after reading them ([#2451](https://github.com/Uninett/nav/pull/2451))
- Geomap "link to this configuration" now actually opens the correct location at the correct zoom level ([#2412](https://github.com/Uninett/nav/issues/2412), [#2488](https://github.com/Uninett/nav/pull/2488))
- snmptrapd can now identify an SNMP agent from any of its interface addresses ([#2387](https://github.com/Uninett/nav/issues/2387), [#2461](https://github.com/Uninett/nav/pull/2461))
- PortAdmin now ignores incorrectly configured VLAN tags (tagged as `NA`) on Juniper switches, instead of crashing ([#2452](https://github.com/Uninett/nav/issues/2452), [#2453](https://github.com/Uninett/nav/pull/2453))
- Fix potential ipdevpoll crashes due to database fetches in wrong thread ([#2478](https://github.com/Uninett/nav/issues/2478), [#2480](https://github.com/Uninett/nav/pull/2480))
- Handle Graphite connection issues gracefully in ranked statistics page ([#2459](https://github.com/Uninett/nav/pull/2459))
- Handle Graphite connection issues gracefully in device group detail page ([#2345](https://github.com/Uninett/nav/issues/2345), [#2434](https://github.com/Uninett/nav/pull/2434))
- Removed needless carbon data chunking from `activeipcollector` ([#1696](https://github.com/Uninett/nav/issues/1696), [#2462](https://github.com/Uninett/nav/pull/2462))
- Evaluate `0.0` as a valid numeric metric value during threshold rule evaluations ([#2447](https://github.com/Uninett/nav/issues/2447)
- Updated dead links in Geomap documentation ([#2419](https://github.com/Uninett/nav/pull/2419))
- Link from IPAM to reserve prefixed in SeedDB now works again ([#2410](https://github.com/Uninett/nav/issues/2410), [#2422](https://github.com/Uninett/nav/pull/2422))
- Improved inefficient database queries in Arnold ([#2425](https://github.com/Uninett/nav/pull/2425))
- Updated tox examples in hacking documentation ([#2427](https://github.com/Uninett/nav/issues/2427), [#2430](https://github.com/Uninett/nav/pull/2430))
- Fixed an `AttributeError` crash bug in the `naventity` command line program ([#2433](https://github.com/Uninett/nav/issues/2433), [#2444](https://github.com/Uninett/nav/pull/2444))

## [5.4.0] - 2022-05-19

### Changed

- The changelog format has changed from the legacy format into one based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Transceivers are no longer classed as modules ([#1154](https://github.com/Uninett/nav/issues/1154))
- Generate more secure API tokens ([#2366](https://github.com/Uninett/nav/issues/2366))
- Remaining instances of "Uninett" in footer FAQ have changed to Sikt ([#2367](https://github.com/Uninett/nav/pull/2367))
- Upgrade to napalm 3.4.1 ([#2403](https://github.com/Uninett/nav/pull/2403))

### Added

- Support more recent AKCP environment probes ([#2107](https://github.com/Uninett/nav/issues/2107)
- Collect and graph temperature readings from JUNIPER-MIB ([#2342](https://github.com/Uninett/nav/issues/2342))
- Add support for wildcards in report IN operator (a.k.a. `(,,)`) ([#2347](https://github.com/Uninett/nav/issues/2347))
- Get VLAN tag from Juniper chassis cluster redundant ethernet interface ("RETH") names ([#2357](https://github.com/Uninett/nav/issues/2357))
- Collect and graph memory usage from JUNIPER-MIB ([#2359](https://github.com/Uninett/nav/issues/2359))
- Document NAV's various command line utilities ([#2368](https://github.com/Uninett/nav/pull/2368))
- Add a contrib script to ship ISC DHCP server lease stats to NAV's Graphite instance ([#2371](https://github.com/Uninett/nav/issues/2371))

### Fixed

- Don't display JavaScript alert dialog box when generating links to the current Geomap configuration ([#1016](https://github.com/Uninett/nav/issues/1016))
- Optimize SeedDB prefix listing queries ([#2156](https://github.com/Uninett/nav/issues/2156))
- Fix broken deletion of quick links from "My stuff"-menu ([#2334](https://github.com/Uninett/nav/issues/2334))
- Display friendlier Juniper RPC error reports in Portadmin ([#2362](https://github.com/Uninett/nav/issues/2362))
- Get rid of warning: `CacheKeyWarning: Cache key contains characters that will cause errors if used with memcached` ([#2379](https://github.com/Uninett/nav/issues/2379))
- Get rid of warning: `DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated` ([#2381](https://github.com/Uninett/nav/issues/2381))
-  Get rid of warning: `django.contrib.postgres.fields.JSONField is deprecated. Support for it (except in historical migrations) will be removed in Django 4.0.` ([#2382](https://github.com/Uninett/nav/issues/2382))
- Rotate room image thumbnails correctly based on EXIF orientation tag ([#2385](https://github.com/Uninett/nav/issues/2385))
- Fix Django JSONField import deprecation warnings ([#2396](https://github.com/Uninett/nav/pull/2396))
- Fix broken documentation build environment in Read The Docs ([#2399](https://github.com/Uninett/nav/pull/2399))
- Optimize SeedDB room listing queries ([#2400](https://github.com/Uninett/nav/pull/2400))
- Optimize SeedDB netboxtype listing queries ([#2401](https://github.com/Uninett/nav/pull/2401))
- Optimize SeedDB vlan listing queries ([#2402](https://github.com/Uninett/nav/pull/2402))
- Fix broken deserialization of Rack data ([#2407](https://github.com/Uninett/nav/pull/2407))
- Remove unnecessary quotation marks in SeedDB ([#2416](https://github.com/Uninett/nav/pull/2416))
- Fix incorrect handling of stateless event posting in internal APIs ([#2417](https://github.com/Uninett/nav/pull/2417))

### Removed

- Remaining Python 2 compatibility code ([#2319](https://github.com/Uninett/nav/issues/2319))
- Dependency on the `six` Python module


================================================
FILE: COPYING
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: Dockerfile
================================================
# NAV development container. This is NOT SUITABLE for production use of NAV.
# For more production-oriented containerization, have a look at the separate
# project https://github.com/Uninett/nav-container
#
# This container aims at providing all the build- and runtime dependencies of
# NAV itself in a single container, and allowing for running them all directly
# off the code in your source code checkout. It is intended to be used as part
# of the docker-compose.yml file, where the PostgreSQL and Graphite services
# are defined in separate containers.
#
# Run the container with your checked out NAV source code directory mounted on
# the '/source' volume to build and run all the necessary components inside
# the container. Changes to you SASS source files will be automatically
# detected and compiled, and any changes to files in the python directory will
# be immediately live in the web interface.
#
# The NAV web interface is exposed through the Django development server on
# port 80.
#
# REQUIREMENT: For the users inside the container to be able to access the
# source code mounted at /source, the directory and its files on the host must
# be world-readable!
#
#
FROM --platform=linux/amd64 debian:bookworm

# We're using mount caches, so don't clean the apt cache after every apt command!
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache

#### Prepare the OS base setup ###

ENV DEBIAN_FRONTEND=noninteractive

RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=locked \
    --mount=target=/var/cache/apt,type=cache,sharing=locked \
    apt-get update && \
    apt-get -y --no-install-recommends install \
            locales \
            python3-dbg python3-venv gdb \
            sudo python3-dev python3-pip python3-virtualenv build-essential supervisor \
	        debian-keyring debian-archive-keyring ca-certificates curl gpg

## Use deb.nodesource.com to fetch more modern versions of Node/NPM than Debian can provide
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg && \
    echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main' > /etc/apt/sources.list.d/nodesource.list && \
    apt-get update && \
    apt-get install -y nodejs

ARG TIMEZONE=Europe/Oslo
ARG LOCALE=en_US.UTF-8
ARG ENCODING=UTF-8
RUN echo "${LOCALE} ${ENCODING}" > /etc/locale.gen && locale-gen ${LOCALE} && update-locale LANG=${LOCALE} LC_ALL=${LOCALE}
ENV LANG=${LOCALE}
ENV LC_ALL=${LOCALE}
RUN echo "${TIMEZONE}" > /etc/timezone && cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime

#### Install various build and runtime requirements as Debian packages ####

RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=locked \
    --mount=target=/var/cache/apt,type=cache,sharing=locked \
    apt-get update \
    && apt-get -y --no-install-recommends install \
       git-core \
       libsnmp40 \
       cron \
       sudo \
       inotify-tools \
       postgresql-client \
       vim \
       less \
       nbtscan \
       # Python package build deps: \
       libpq-dev \
       libjpeg-dev \
       libz-dev \
       libldap2-dev \
       libsasl2-dev \
       # Useful tools for network debugging and SNMP querying: \
       dnsutils \
       iproute2 \
       iputils-ping \
       snmp

# Make an unprivileged nav user that corresponds to the user building this image.
# Allow this user to run sudo commands and make a virtualenv for them to install NAV in
ARG UID
ARG GID
RUN groupadd --gid "$GID" nav ; adduser --home=/source --shell=/bin/bash --uid=$UID --gid=$GID nav
RUN echo "nav    ALL =(ALL: ALL) NOPASSWD: ALL" > /etc/sudoers.d/nav
# Ensure the virtualenv's bin directory is on everyone's PATH variable
RUN sed -e 's,^Defaults.*secure_path.*,Defaults        secure_path="/opt/venvs/nav/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",' -i /etc/sudoers
RUN sed -e 's,^ENV_SUPATH.*,ENV_SUPATH      PATH=/opt/venvs/nav/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",' -i /etc/login.defs
RUN sed -e 's,^ENV_PATH.*,ENV_PATH        PATH=/opt/venvs/nav/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games",' -i /etc/login.defs

RUN --mount=type=cache,target=/source/.cache,sharing=locked \
    mkdir -p /opt/venvs/nav && chown nav /opt/venvs/nav && \
    mkdir -p /etc/nav && chown nav /etc/nav && \
    chown -R nav /source/.cache
USER nav
ENV PATH=/opt/venvs/nav/bin:$PATH
RUN python3.11 -m venv /opt/venvs/nav
RUN --mount=type=cache,target=/source/.cache,sharing=locked \
    pip install --upgrade setuptools wheel pip-tools build

#################################################################################
### COPYing the requirements file to pip-install Python requirements may bust ###
### Docker's cache at this point, so everything expensive you want to keep in ###
### the cache should go before this.                                          ###
#################################################################################

COPY tools/docker/supervisord.conf /etc/supervisor/conf.d/nav.conf

# Make an initial install of all NAV requirements into the virtualenv, to make
# builds inside the container go faster
COPY requirements/ /requirements
COPY requirements.txt /
COPY constraints.txt /
COPY tests/requirements.txt /test-requirements.txt
COPY doc/requirements.txt /doc-requirements.txt
RUN --mount=type=cache,target=/source/.cache,sharing=locked \
    cd /opt/venvs/nav && \
    pip-compile --resolver=backtracking --output-file ./requirements.txt.lock -c /constraints.txt /requirements.txt /test-requirements.txt /doc-requirements.txt ; \
    pip install -r ./requirements.txt.lock

ARG CUSTOM_PIP=ipython
RUN --mount=type=cache,target=/source/.cache,sharing=locked \
    pip install ${CUSTOM_PIP}

COPY tools/docker/full-nav-restore.sh /usr/local/sbin/full-nav-restore.sh

VOLUME ["/source"]
ENV    DJANGO_SETTINGS_MODULE=nav.django.settings
EXPOSE 8080

CMD        ["/source/tools/docker/run.sh"]


================================================
FILE: HACKING
================================================
This document is now maintained as doc/hacking/hacking.rst


================================================
FILE: HISTORY
================================================
This file is the changelog archive in the old NAV format for versions prior to
NAV 5.4.0.

Version 5.3.0
(released 22 Feb 2022)

 On January 1st 2022, Uninett, NSD and Unit (all entities owned by the Norwegian
 government) were merged into the new governmental agency *Sikt - Norwegian
 Agency for Shared Services in Education and Research*. This marks the first release
 of NAV under the new name.

 User-visible features and improvements:

  * #2245 (Link to room details page from SeedDB room edit page)
  * #2274 (Hidden attributes for devices)
    * #2323 (Completely hide all attributes starting with "__")
  * #2309 (Support a report.conf.d/ style config directory for reports)
  * #2311 (Wishlist: Info about locations visible via /report/location)

 Other fixed GitHub issues in this release:

  * #2280 (Only ethernetCsmacd interfaces are shown in the room viewer)
  * #2310 ([BUG] snmptrapd plugins crash when posting events in NAV 5.2)
  * #2315 (Properly upgrade to Django 2.2)
  * #2316 (Upgrade dependencies that will need a newer version to run on
           Django 3.2 or later)
  * #2317 (Upgrade Django to 3.2)
  * #2321 (Also list local conf reports in report widget)
  * #2324 ([BUG] Example severity rules distributed with NAV 5.2.1 do
           not actually work)
  * #2328 (Remove "no access" message from login page during normal
           login)
  * #2329 (Upgrade to dnspython 2.1)
  * #2341 (Warn when database config isn't readable)
  * #2352 (Fix Python 3.9 compatibility)
  * #2353 (Document the name change from Uninett to Sikt)
  * #2355 (Add Sikt to About page, copyrights and graphical profile)


Version 5.2.1
(released 23 Sep 2021)

 Fixed GitHub issues in this release:

  * #2304 (Display alert severity values in the event/alert details
           page)
  * #2306 ([BUG] pping is unable to report unreachable devices in NAV
           5.2.0)
  * #2308 ([BUG] Alert Profile severity filters that ship with NAV are
           outdated)


Version 5.2.0
(released 16 Sep 2021)

 User-visible features and improvements:

  * #1928 (Document 802.1X support of PortAdmin for end users)
  * #2289 (Add config option to disallow editing of uplinks and
           downlinks in PortAdmin)
  * #2295 (Redefine alert severity levels and make them configurable)
  * #2297 (Document the event and alert type hierarchy)

 Fixed GitHub issues in this release:

  * #2296 ([BUG] Portadmin save API incorrectly returns 500 error where
           400 is appropriate)
  * #2298 ([BUG] PortAdmin RpcError on JunOS 20 and newer)


Version 5.1.4
(released 24 Jun 2021)

 Fixed GitHub issues in this release:

  * #2281 ([BUG] Saving alert permissions crashes Alert Profiles)
  * #2282 (PortAdmin SNMP error handling is broken in several ways)
  * #2284 ([BUG] IP device interfaces don't get updated with speed
           information)
  * #2285 (Extract Cisco PoE port mapping method)
  * #2288 (Disable the PortAdmin "Enable" checkbox for interfaces that
           aren't editable)

Version 5.1.3
(released 09 Apr 2021)

 Fixed GitHub issues in this release:

  * #2159 ([BUG] UPS widget is inconsistent between showing minutes and
           seconds remaining time)
  * #2240 ([BUG] Workaround for wrong interface speed SNMP
           implementations)
  * #2253 (Drastically improve page load times on maintenance edit form)
  * #2254 ([BUG] Search after partial IP-address crashes)
  * #2255 (ipdevinfo maintenance task link should be to task details
           view, not the task editor)
  * #2257 (Exclude Coriant Groove port sensors from collection based on
           portAdminStatus)
  * #2260 (IP Device custom data should be "urlized")
  * #2263 ([BUG] Job 'inventory' for xxx aborted: Job aborted due to
           save failure (cause=ValueError('A string literal cannot
           contain NUL (0x00) characters.')))
  * #2264 (Hardcoded vendor name)
  * #2267 (Link to filtered report must be urlencoded)
  * #2269 ([BUG] ipdevinfo shows empty Function-field for some hosts)
  * #2270 ([BUG] Documentation search does not work)
  * #2275 (SshChecker not handling connections properly)

Version 5.1.2
(released 15 Jan 2021)

 Fixed GitHub issues in this release:

  * #2210 ([BUG] Traffic graphs use the SI unit system rather than
           binary prefixes)
  * #2215 ([BUG] NAV will refuse to identify LLDP remote port names that
           contain trailing NUL bytes)
  * #2235 ([BUG] TypeError at /alertprofiles/filters/add-expression/
           _init__() takes 1 positional argument but 2 were given)
  * #2238 ([BUG] Geomap doesn't work if DOMAIN_SUFFIX is not set in
           nav.conf)
  * #2239 ([BUG] using DOMAIN_SUFFIX  breaks netbox links in Geomap)
  * #2241 (Allow custom tabs for port details view)
  * #2250 (Fix formatting of small and negative numbers in Rickshaw
           graphs)
  * #2252 (Fix broken serial numbers for Juniper, APC PowerNet and old
           HP devices)

Version 5.1.1
(released 07 Dec 2020)

 Fixed GitHub issues in this release:

  * #2200 ([BUG] HttpChecker crashes when username/password combo is
           configured)
  * #2216 ([BUG] BGP sessions with AS numbers larger than 2147483647
           cause ipdevpoll jobs to fail with
           psycopg2.errors.NumericValueOutOfRange)
  * #2221 (NAV 5.1 Netmap is blank)
  * #2222 ([BUG] configuring juniper device description results in HTML
           special characters code)
  * #2224 ([BUG] status now shows box as 'down' even though it is up)
  * #2225 ([BUG] Alert export errors prevent proper processing of events
           in eventengine)
  * #2229 ([BUG] EventEngine alert export crashes on any alert from a
           device that is a member of a device group)
  * #2230 ([BUG] Cannot enable dot1x mode in PortAdmin)
  * #2234 ([BUG] Bulk import, 'NoneType' object has no attribute
           'split')

Version 5.1.0
(released 26 Nov 2020)

 User-visible features and improvements:

  * #2021 (Add SeedDB action to clone netboxes and rooms)
  * #2051 (Link to affected devices in Management profile)
  * #2128 (Add device filtering options to ipdevpoll and pping, to
           enable support for horizontal scaling and distributed
           monitoring)
  * #2175 (Implement NAPALM management profiles and connectivity)
  * #2185 (Modernize the type dumping script and make it available as an
           installable script for end user use)
  * #2204 (Add support for configuring Juniper switch ports in
           PortAdmin)
    - #2173 (Clean up PortAdmin ManagementHandler interface)
    - #2112 (Refactor PortAdmin's SNMP back-end classes and factories)
    - #2115 (Refactor portadmin configuration parsing bits)
    - #2121 (Use nav.config.NAVConfigParser for PortAdmin configuration)
    - #2205 (Adapt Portadmin UI workflow to meet needs of multiple
             backend protocols)

 Fixed GitHub issues in this release:

  * #2078 ([BUG] NAV daemons are unnecessarily run as root)
  * #2103 (Support Django 2.2)
  * #2139 ([BUG] fanState and psuState e-mail alerts say "no message
           template is defined")
  * #2141 (Work around lack of entity names when collecting sensors from
           Arista devices)
  * #2174 ([BUG] PortAdmin never issues a "write mem" operation when
           editing trunks)
  * #2190 ([BUG] Regression - mysql service check does not work)
  * #2197 ([BUG] Bottom part of room images are obscured by image
           caption)
  * #2198 ([BUG] CSV export from Netbox interfaces in Room view produce
           wrong filename and content.)
  * #2199 (Make servicemon HttpChecker use the port number from the URL,
           if present)
  * #2207 (Netbox reference is not passed to customization template for
           the ipdevinfo "What if" tab)
  * #2213 ([BUG] NAV does not import room position)


Version 5.0.8
(released 23 Oct 2020)

 This release fixes a single regression caused by the 5.0.7 release:

  * #2196 ([BUG] ipdevpoll topo job crashes with a PostgreSQL
           operational error, due to an index size error)

Version 5.0.7
(released 15 Oct 2020)

 Fixed GitHub issues in this release:

  * #2106 ([BUG] Cached LLDP/CDP records are never re-evaluated)
  * #2182 ([BUG] Delayed delivery alert subscriptions crash Alert
           Engine with a NameError)
  * #2184 ([BUG] Unrecognized Neighbors are never removed when all
           neighbors have been identified)
  * #2187 ([BUG] Locked accounts with a NULL value for a password cannot
           be edited)
  * #2188 ([BUG] Useradmin user listing becomes excruciatingly slow when
           many users have password issues)
  * #2189 ([BUG] Regression - ftp service check in 5.X does not work)

Version 5.0.6
(released 27 Aug 2020)

 Fixed GitHub issues in this release:

  * #2144 (Prevent ipdevinfo from crashing on weird device names)
  * #2149 (Inventory failing on DLink DGS-1100 : 'TypeError: argument of
           type 'int' is not iterable')
  * #2150 ([BUG] Interface down is causing widget 'status' to display
           'Could not load widget' due to HTTP 500)
  * #2165 ([BUG] Delayed delivery alert subscriptions in single time
           period alert profiles are never sent)
  * #2167 (Fix potential typecast issue with SQL migration to NAV 5.0)
  * #2169 ([BUG] macwatch.py crashes when logging notifications about
           found MAC addresses)
  * #2170 ([BUG] Alertengine stops dispatching Slack notifications
           indefinitely if Slack complains of too many requests)
  * #2171 (Warn about user accounts that have issues with their
           passwords)
  * #2172 (Prevent login/password changes to default account)
  * #2177 ([BUG] Attempting to move IP devices to another room crashes
           SeedDB)
  * #2178 ([BUG] PDU widget stops displaying properly if room is
           deleted)
  * #2179 ([BUG] UPS widget does not display properly if UPS is deleted
           from NAV)
  * #2180 ([BUG] Entering invalid dates in Device History search form
           causes crash)

Version 5.0.5
(released 13 Mar 2020)

 Fixed GitHub issues in this release:

  * #1994 (snmptrapd linkupdown plugin does not handle v2 traps)
  * #2101 ([BUG] Geomap data API endpoint crashes with a TypeError)
  * #2109 ([BUG] ipdevinfo sensor details page crashes with
           AttributeError on unit-less sensors)
  * #2111 ([BUG] Logging non-ASCII characters crashes NAV programs)
  * #2113 (Document advice for robust e-mail)
  * #2114 ([BUG] Unable to save status filter in [Status] page)
  * #2119 ([BUG] Latitude/Longitude is displayed weirdly in the SeedDB
           room list)
  * #2123 (Drop support for legacy status preference pickles)
  * #2129 (Euthanize unresponsive ipdevpoll workers)
  * #2130 ([BUG] Cannot import dashboard)


Version 5.0.4
(released 16 Jan 2020)

 Fixed GitHub issues in this release:

  * #2074 ([BUG] ipdevpoll inventory job crashes for many devices with
           an AttributeError)
  * #2075 ([BUG] Editing existing API tokens shows no enabled endpoints)
  * #2076 ([BUG] Missing Javascript multiselect library used by
           Useradmin API token form)
  * #2077 ([BUG] string handling in snmptrapd is broken on Python 3)
  * #2081 ([BUG] Bulk importing netboxes without a managment profile
           raises an exception)
  * #2083 ([BUG] TypeError is raised when creating a csv for download
           from a room-search)
  * #2085 ([BUG] TypeError is raised when getting navlet)
  * #2087 ([BUG] Reports with many pages crash once page 4 is visited)
  * #2090 ([BUG] Marking machine as disabled in arnold raises TypeError)
  * #2092 ([BUG] ipdevinfo sensor tab produces too large Graphite
           request)
  * #2093 ([BUG] PortAdmin crashes when viewing a switch with non-ASCII
           port descriptions)
  * #2097 ([BUG] Adding a manual detention without a number of days
           until autoenable crashes Arnold)


Version 5.0.3
(released 19 Dec 2019)

 Fixed GitHub issues in this release:

  * #2015 (Broken Mikrotik LLDP-MIB implementation causes ipdevpoll LLDP
           plugin to crash)
  * #2055 ([BUG] Navlets crash/appear blank if their config is stored as
           legacy pickles)
  * #2057 (Make servicemon run on Python 3)
  * #2058 ([BUG] navpgdump crashes with TypeError on Python 3 if
           exclusion options are provided)
  * #2059 ([BUG] Coriant Groove sensors names appear as reprs of bytes
           objects under Python 3)
  * #2060 ([BUG] smsd gammudispatcher error handling fails on Python 3)
  * #2061 ([BUG] silent_include tag template crashes any view that uses
           it)
  * #2062 ([BUG] ipdevpoll considers the same devices changed on every
           reload loop, causing massive scheduling problems)
  * #2063 (Massively reduce the number of queries produced by the API
           /alert endpoint)
  * #2065 ([BUG] some servicemon checker runs crash with a
           UnboundLocalError)
  * #2066 (Increase the max number of shown alerts in Status page to
           1000 and provide feedback spinner when loading data)
  * #2067 ([BUG] Alertengine Slack dispatcher fails with TypeError)
  * #2068 ([BUG] Workaround for faulty Aruba ENTITY-MIB::entLogicalTable
           implementation crashes with TypeError on Python 3)
  * #2069 ([BUG] ipdevpoll inventory job crashes with a Django
           ValidationError)
  * #2070 ([BUG] Servicemon SMTP checker fails with " a bytes-like
           object is required, not 'str'")
  * #2071 ([BUG] Active maintenance task list crashes when tasks contain
           deleted IP devices)
  * #2072 ([BUG] Servicemon RadiusChecker always fails with "secret must
           be a binary string" message)
  * #2073 ([BUG] Room image upload crashes with a TypeError)

Version 5.0.2
(released 13 Dec 2019)

 Fixed GitHub issues in this release:

  * #2035 (Enable room geo positions to be writeable in API)
  * #2036 ([BUG] logengine crash with AttributeError on every run on NAV
           5.0.1)
  * #2037 ([BUG] ipdevpolld multiprocess mode logs reams of TypeErrors)
  * #2038 ([BUG] ipdevpoll psuwatch crash with TypeError immediately
           after upgrade to NAV 5)
  * #2039 (Fix broken natural sort implementation on Python 3 )
  * #2041 (Geomap does not work in NAV 5.0.1)
  * #2043 ([BUG] Syslog analyzer search returns nothing)
  * #2044 ([BUG] navclean does not work under Python 3)
  * #2045 ([BUG] Exception is raised when visiting /api/1/alert/ID)
  * #2047 ([BUG] ipdevpoll jobs crash with "A string literal cannot
           contain NUL (0x00) characters" messages for some devices)
  * #2048 (Support MAC address device IDs from CDP records)
  * #2049 ([BUG] ipdevinfo old style Switch port activity view is blank)
  * #2050 ([BUG] Geomap is missing links between nodes)
  * #2052 ([BUG] ipdevpoll inventory job sometimes crashes when saving
           POE Port information)
  * #2054 ([BUG] pping resolves all boxDown alerts on restart)
  * #2055 ([BUG] Navlets crash/appear blank if their config is stored as
           legacy pickles)
  * #2056 ([BUG] Cannot add activity graphs to dashboard)


Version 5.0.1
(released 05 Dec 2019)

 Fixed GitHub issues in this release:

  * #2016 (ipdevpoll inventory job crashes when processing manufacturing
           dates from ENTITY-MIB under Python 3)
  * #2019 (IP Device info "Neighbor" tab is blank)
  * #2023 (Netmap layer 3 crashing)
  * #2025 (SeedDB bulk import file upload crashes)
  * #2030 (Ensure internal snmp agent check state stays in sync with
           global snmpAgentState)
  * #2031 (Fix PortAdmin crash on invalid IP search)
  * #2032 (Replace SNMP community columns in SeedDB netbox listing with
           management profile lists)
  * #2033 (Don't crash when logging in users with old-style password
           hashes)


Version 5.0.0
(released 07 Nov 2019)

#############################################################
##                   DEPRECATION WARNING                   ##
#############################################################
##                                                         ##
## NAV will now also run on Python 3. Support for Python 2 ##
## will be dropped shortly. Please refer to the release    ##
## notes for details.                                      ##
##                                                         ##
#############################################################

 User-visible features and improvements:

  * #1793 (Add maintenance filter option to netbox API endpoint)
    + #1995 (Add maintenance filter to Netbox API endpoint)
  * #1859 (Improve portadmin support for dot1x)
  * #1905 (Add support for alcatel DDM-sensors)
  * #1908 (Add display widget for binary/boolean sensors to "racks")
  * #1919 (Add support for external sensors from newer Watchdog
           products)
    + #1926 (Add support for most external sensors on newer watchdog
             products)
  * #1930 (Refactor IT-WATCHDOGS-MIB MibRetriever implementations)
  * #1943 (Improve support for boolean sensors in racks)
  * #1947 (Management profiles)
  * #1969 (Store local chassis ids from LLDP-MIB and use for neighbor
           lookups)
  * #1970 (Add API for management profiles)
  * #1971 (Provide option to automatically enable CDP on voice ports)
    + #1974 (enabling CDP when a voice port is set using portadmin)
  * #1987 (Refactor power supply and fan monitoring functionality)
  * #1988 (Add status monitoring for Juniper PSUs and FANs)
  * #1989 (Collect optical sensor measurements from Coriant Groove
           devices)
  * #1998 (Remove support for alert dispatching over Jabber)
  * #2002 (Refactor installation documentation.)
  * #2005 (Export stream of serialized alerts from the event engine)
  * #2007 (Support REMOTE_USER header for web authentication)
  * #2008 (Add more database stats to Watchdog's "NAV by the numbers")

 Fixed GitHub issues in this release:

  * #1978 (Netmap layer 2 traffic data requests to Graphite are too slow
           and too large)
  * #1979 (Location alerts widget crashes intermittently)
  * #1980 (Using the wrong Radius dictionary file can cause servicemon
           to eat all available system memory and hang)
  * #1984 (Blank sysnames should not be allowed)
    + #1985 (Disallow blank sysnames)
  * #1990 (Make type changes immediately when unknown types are
           encountered)
  * #2004 ([BUG] Interface browser shows wrong "last used" date)
  * #2009 (Ensure rooms require a location attribute also in the SQL
           schema)


Version 4.9.8
(released 22 Aug 2019)

 Fixed GitHub issues in this release:

  * #1753 (SNMP-less servers are no longer connected in the NAV
           topology)
  * #1941 (Interface information pop-ups in the status widget tends to
           hang)
  * #1942 (get_mib() should be able to load MIB modules from outside the
           nav.smidumps package)
  * #1962 (Environment rack widget edit mode crashes if there are racks
           in rooms with non-ascii characters in their name)
  * #1964 (smsd crashes when discarding non-dispatchable messages with
           non-ASCII chars (or for users with non-ASCII chars in their
           name))
  * #1972 (Ensure PostgreSQL unique constraints are consistently named)
  * #1973 (Stop explicitly installing pl/pgSQL during db init.)
  * #1975 (Unhandled ValueError in eventengine when snmptrapd posts
           invalid linkState events)
  * #1976 (Properly display sensor data scale on sensor details page.)
  * #1977 (Use Juniper 802.1X VLAN workaround in default configuration)


Version 4.9.7
(released 07 Jun 2019)

 Fixed GitHub issues in this release:

  * #1882 (Invalid VLANs are generated from Juniper switches)
  * #1920 (Provide a hook for adding extra information in the What-If
           tab in the IP Device Info page)
  * #1946 (Vlans are categorized as linknets on Cisco Nexus with HSRP)
  * #1953 (Adding new public filter in Alert Profiles fails)
  * #1958 (NAV creates Graphite metrics with illegal characters in name)
  * #1960 (Add option to control user administrator privileges from
           LDAP)


Version 4.9.6
(released 23 May 2019)

 Fixed GitHub issues in this release:

  * #1782 (ipdevpoll snmpcheck algorithm no longer works as expected)
    + #1952 ((snmpcheck) Store up/down state in NetboxInfo, so we can
             properly sen…)
  * #1931 (Support for HPE Metered PDUs)
    + #1933 (Add support for HPE metered PDUs)
  * #1935 (The VLAN dropdowns in PortAdmin needs to show the description
           in addition to the id, if any)
    + #1955 (Show net ident for vlans in the portadmin vlan dropdown box)
  * #1944 (Sensor links in Environment Rack navlet does not work)
  * #1948 (Verify LDAP entitlements)


Version 4.9.5
(released 02 May 2019)

 Fixed GitHub issues in this release:

  * #1890 (Temperature gauges do not render if multiple threshold rules
           apply to it)
    + #1921 (Handle arbitrary number of thresholds for a given sensor)
  * #1902 (Sensor widgets should hyperlink to sensor's page view, not IP
           Device's page view)
  * #1903 (Topology missing for LLDP-enabled Alcatel switches)
  * #1906 ("Cisco chassis/module serial numbers decoded" report crashes
           when filtering)
  * #1907 (servicemon DnsChecker fails when DNS server doesn't have a
           matching record)
  * #1916 (UninettMailDispatcher does not work under NAV 4.9)
  * #1917 (snmptrapd needs to log more details about received traps)
  * #1923 (ENTITY-MIB implementation can no longer resolve physical
           device classes properly)
    + #1924 (Support cross-MIB type definitions in MibRetrievers)


Version 4.9.4
(released 28 Mar 2019)

 NB: This release introduces a new dependency to py2-ipaddress==3.4.1

 Fixed GitHub issues in this release:

  * #1639 (Not all NAV programs respect TIME_ZONE from nav.conf)
  * #1762 (navdump drops function-data)
  * #1788 (Deleting an alert profile subscription that has queued alerts
           will cause alertengine to process all those alerts as if they
           were new ones on the queue. )
  * #1885 (LDAP authentication against Microsoft AD using suffix bind is
           broken in NAV 4.9)
  * #1894 (Terminals that don't support colors cause nav start/stop
           commands to crash)
  * #1895 (Verify nav.conf values as part of nav start)
  * #1896 (UnicodeEncodeError when LDAP user with non-ASCII characters
           in DN logs in)


Version 4.9.3
(released 28 Feb 2019)

 Fixed GitHub issues in this release:

  * #757  (devicehistory search by date ignores date)
  * #1792 (Precision of several Eaton/MGE UPS sensors are wrong)
  * #1812 (Malformed subid on (old) thresholdState events can cause
           status page and alert API endpoints to crash)
  * #1818 (Update ENTITY-MIB definition to RFC 6933)
  * #1855 (IPAM subnet suggest function is broken)
  * #1856 (Geomap doesn't work in NAV 4.9)
  * #1857 (E-mailing of business report subscriptions doesn't work)
  * #1862 (Please add case-insensitive matching on interface names in
           ipdevinfo queries for 'ifname')
  * #1865 (Servicemon resource leak causes all services to be reported
           as down)
  * #1871 (Alert detail headers are not present in e-mail notifications
           from AlertEngine)


Version 4.9.2
(released 14 Feb 2019)

 User-visible features and improvements:

  * #1837 (Save config to non volatile memory in portadmin for dell
           switches)
  * #1853 (The navuser command should have an option to verify a user's
           passord)

 Fixed GitHub issues in this release:

  * #1784 (Breadcrumb missing from /useradmin/tokens/)
  * #1834 (AlertEngine fails to send email if EMAIL_PORT is present in
           nav.conf)
  * #1839 (The interfaces API endpoint crashes when using the last_used
           filter)
  * #1841 (Useradmin Token listing crashes on NAV 4.9.1 if any tokens
           are created with no endpoint list)
  * #1842 (Netmap layer 3 graph API endpoint crashes on NAV 4.9.1)
  * #1844 (PortAdmin crashes with TypeError if an ifaliasformat is
           configured)
  * #1846 (IPAM fails under NAV 4.9.1 if any Organization object has
           non-ASCII characters in description)
  * #1847 ("Rooms with active alerts" widget fails under NAV 4.9.1)
  * #1848 (Stateless alerts are shown in status widget even when
           checkbox is left unchecked)
  * #1851 (Fix searching for other things than ip addresses in
           portadmin)
  * #1852 (Empty NAVbar search results in ValueError crash)


Version 4.9.1
(released 07 Feb 2019)

 Fixed GitHub issues in this release:

  * #1820 (ipdevpoll will not schedule jobs under NAV 4.9.0)
  * #1822 (Command line argument support for nav daemon startup config)
  * #1823 (Old switch port layout screen is blank in NAV 4.9.0)
  * #1824 (navdump crashes when dumping service table)
  * #1825 (Alertprofiles crashes when attempting to delete matchfield)
  * #1826 (Device history crashes when attempting to browse the history
           of an IP Device)
  * #1827 (Any l2trace search will crash with a Django FieldError)
  * #1828 (PDU dashboard widget crashes under NAV 4.9.0)
  * #1829 (Any toolbox descriptor file containing superfluous equal
           signs will be silently ignored by the web interface)
  * #1830 (MAC address prefix filters are horribly slow in arp and cam
           API endpoints)
  * #1831 (Threshold monitor crashes if rule returns Graphite error)


Version 4.9.0
(released 31 Jan 2019)

#############################################################
##                 NOTICE OF LICENSE CHANGE                ##
#############################################################
##                                                         ##
## NAV's copyright license has changed from GPL v2 to GPL  ##
## v3. Please refer to the release notes for details.      ##
##                                                         ##
#############################################################

 User-visible features and improvements:

  * #1423 (Add API endpoint for accounts and account groups)
  * #1509 (Add active alerts tab for port details page)
  * #1646 (Add event/alert details page)
  * #1615 (Room view - want device/interface count)
  * #1624 (Add support for Dell DNOS-SWITCHING-MIB)
  * #1659 (Add an interface browser tool)
  * #1662 (Business reports, device availability - filter for
           maintenance)
  * #1667 (More interface information for linkState alerts in status
           tool/widget)
  * #1705 (Enable use of api endpoint without specifying version)
  * #1706 (Audit log when users operates as other user)
  * #1739 (PortAdmin - users should not be able to set trunk on port)
  * #1758 (Writable vlan and prefix endpoints)
  * #1761 (API netbox endpoint: filter on type__name)
  * #1791 (Implement IT-WATCHDOGS-V4-MIB and GEIST-V4-MIB)
  * #1807 (Implement support for Powertek PDU inlet status)
  * #1817 (Add hook to customize tabs in ipdevinfo and info/room)

 Fixed GitHub issues in this release:

  * #1683 (Avoid "magic" Django bootstrapping in nav.models)
  * #1703 (Upgrade Django Rest Framework)
  * #1709 (Rename verb for changing interface admin status)
  * #1728 (Upgrade python-ldap)
  * #1744 (Replace automake toolchain with setuptools)
  * #1752 (No warnings for Django 1.8)
  * #1786 (Make middlewares work correctly on Django 1.10+)
  * #1796 (A crashing search provider will crash the entire search ui)
  * #1798 (Environment sensor rack API crashes on missing sensors)
  * #1799 (Portadmin errors out if making changes after using browser
           back button)
  * #1800 (Alert profile listing "Remove selected" button needn't be
           visible when there are no profiles to select.)
  * #1801 (Network Explorer MAC search always crashes)
  * #1802 (Saving a threshold rule without a target crashes with a
           KeyError)
  * #1803 (ipdevpoll should be able to perform reverse DNS lookups using
           /etc/hosts file)
  * #1804 (Unrecognized neighbors report crashes with 'bogus escape (end
           of line)')
  * #1814 (Change the NAV license from GPLv2 to GPLv3)
  * #1819 (/prefix/usage API endpoint crashes instead of returning 404 on
           non-existent prefixes)


Version 4.8.6
(released 25 Oct 2018)

 Fixed GitHub issues in this release:

  * #1738 (snmptrapd stops logging after receiving HUP signal)
  * #1741 (Use of Object.assign breaks ipdevinfo in Internet Explorer)
  * #1750 (API arp and cam endpoint crashes on invalid mac query param)
  * #1780 (Machinetracker MAC search performs unnecessary join with
           Netbios table)
  * #1781 (Machinetracker performs unnecessary duplicate DNS lookups)


Version 4.8.5
(released 21 Jun 2018)

 Fixed GitHub issues in this release:

  * #1688 (Report crashes when using %, * or non-ASCII characters in
           filter values)
  * #1693 (Changing password from "User and API Administration" leads to
           KeyError)
  * #1702 (Adding log entries with non-ascii characters crashes page)
  * #1711 (Regression: Report crashes when attempting to sort a column
           filtered on a non-ASCII value)
  * #1719 ('navdump -a' puts status messages into the output files)
  * #1721 (Widget spinner visible when opening tool-menu)
  * #1729 (Room search "CSV download" CR in "last active" field)
  * #1734 (l2trace crashes when searching for invalid IP addresses)
  * #1735 (HTTP errors from Graphite shouldn't crash NAV's Graphite
           render proxy)

 Copyright changes:

  Third party copyright owners of NAV code, like The Norwegian University of
  Science and Technology, and the University of Tromsø, have signed over their
  copyright for their code contributions to Uninett. NAV 4.8 is still licensed
  under GPLv2-only, but will be relicensed under GPLv3 in the upcoming 4.9
  series. This should have no impact on end users; as a company with public
  ownership, Uninett will always strive to keep NAV under a free and open
  source license.


Version 4.8.4
(released 05 Apr 2018)

 Fixed GitHub issues in this release:

  * #1638 ('array index out of range' when viewing a trunk port in
           PortAdmin)
  * #1643 (Location with active alerts - edit title)
  * #1650 (Submitting a threshold rule without a target crashes with a
           KeyError)
  * #1655 (Auditlog only displaying the first 100 entries in the log)
    + #1654 (Fix broken auditlog browsing and auditlog more things)
  * #1656 (Sensor widget crashes when sensor is missing)
  * #1660 (UninettMailDispatcher does not support non-ASCII characters
           and requires SMTP server on localhost)
  * #1661 (Business reports, link availability - want description)
  * #1664 (Remove bracket syntax for url parameters to Graphite)
  * #1665 (Interface details tries to get sensor data on empty
           sensorlist)
  * #1669 (Shouldn't use CAM to select topology for aggregated ports
           where LLDP is available on the physical ports)
    + #1685 (Do not consider CAM data from aggregator ports when there
             is LLDP/CDP topology available from its aggregated ports)
  * #1670 (Treshold editor doesn't work for metrics with hash characters
           in name)
  * #1673 (Repeated traceback e-mails for Internal Server Error:
           /netmap/traffic/layer2/)
  * #1676 (Audit log changes to API tokens)
  * #1677 (ipdevinfo should link to an IP Device's audit log)
  * #1678 (EventMixIn.get_subject() should never return a string)
  * #1680 (SeedDB patch editor only lists switch ports, not physical
           ports)


Version 4.8.3
(released 11 Jan 2018)

 Fixed GitHub issues in this release:

  * #1619 (Port-filter in ipdevinfo ports-tab does not remember choice
           in IE Edge)
  * #1640 (snmptrapd documentation is outdated)
  * #1641 (Inefficient deletion of obsolete SwPortVlan records)
  * #1642 (Port details page crashes with NoReverseMatch exception for
           ports with slashes in names)
  * #1644 (Certain UPS units trigger an AssertionError inside
           ipdevpoll's bridge plugin, crashing the inventory job)
  * #1645 (navtopology crashes on self-loops)
  * #1647 (NAV 4.8.2 LDAP error at first login / user creation)
  * #1648 (Several NAV subsystems crash when config files contain non-
           ASCII comments)
  * #1649 (Negative values leads to mangled graphs)


Version 4.8.2
(released 07 Dec 2017)

 Fixed GitHub issues in this release:

  * #1591 (SeedDB does not warn about too long room ids or location ids
           when bulk importing, it just crashes)
  * #1628 (Room status widget crash with MultipleObjectsReturned in some
           cases)
  * #1629 (Following a link to edit an IP Device that has been deleted
           crashes SeedDB)
  * #1631 (ipdevpoll statuscheck job crashes in poe plugin)
  * #1632 (The ipdevpoll 5minstats job crashes with an AttributeError in
           the statports plugin)
  * #1633 (The ipdevpoll 5minstats job crashes in the statsystem plugin
           on VRF master devices)
  * #1634 (The poe plugin still crashes on devices that have no set
           type)
  * #1635 (The statuscheck ipdevpoll job crashes with an AttributeError
           if device reports inconsistent PoE Group indexes in POWER-
           ETHERNET-MIB)


Version 4.8.1
(released 30 Nov 2017)

 Fixed GitHub issues in this release:

  * #1618 (ipdevpoll multiprocess mode broken in v4.8.0)
    + #1620 (ipdevpoll multiprocess bug fixes and tests)
  * #1621 (refactor cache handling in report to separate concerns)
  * #1627 (The navclean command isn't installed in NAV 4.8.0)


Version 4.8.0
(released 23 Nov 2017)

 User-visible features and improvements:

  * #1156 (Detect topology of unrouted VLANs)
  * #1225 (Service Http(s)Checker should be ok with 401 status if no
           user/password is configured)
  * #1232 (Collect Digital Optical Monitoring (DOM) data)
    + #1559 (Added support for DOM value for juniper devices using
             JUNIPER-DOM-MIB)
  * #1240 (Add a widget with alerts grouped by location)
    + #1554 (Added a Locations with active alerts widget)
  * #1242 (information about power over ethernet (poe) interfaces)
  * #1243 (email availability reports)
    + #1570 (E-mail subscription to Business reports)
  * #1313 (Deleting a netbox is extremely slow)
    + #1542 (Deleting netbox in background with navclean)
  * #1420 (Upload and browse pictures on Locations, just as with
           rooms)
    + #1555 (Added support for pictures in locations)
  * #1503 (Extended Location information)
  * #1505 (Better ports overview)
    + #1562 (New and improved, filterable interface listing for devices)
    + #1600 (Portlist improvements)
  * #1506 (Add option to show source of ARP records in Machine
           Tracker, to avoid confusion in HSRP/VRRP lans)
    + #1541 (Added option for showing origin in machinetracker)
  * #1513 (Support adding, updating and deleting IP Devices using the API)
    + #1612 (Enable write operations for netbox and room API endpoints)
  * #1533 (Feature request: toggle all VLANs in portadmin trunk)
  * #1545 (Added auditlog for trunk edit in portadmin)
  * #1584 (Cleanup django_sessions periodically)
  * #1599 (Option to filter nodes by category in ipdefvinfo neighbor
           graph)
  * #1611 (Display list of allowed VLANs on trunks in port details)

 Other fixed GitHub issues in this release:

  * #1211 (Optical transmit/receive power sensors should have a relation
           to an interface)
    + #1558 (Make sensors relatable to interfaces)
  * #1345 (Collect bridge addresses for neighbor identification)
    + #1548 (Collect base bridge address from BRIDGE-MIB as part of the
             bridge plugin)
  * #1510 (Create new SQL baseline)
    + #1544 (Updated the SQL Baseline with changes before 4.7)
    + #1614 (SQL baseline cleanup)
  * #1523 (Netmap lists interface under wrong netbox)
  * #1549 (Topology algorithms partial rewrite)
  * #1557 (Power over Ethernet support in ipdevinfo)
  * #1564 (snmpcheck: Fix database access from main thread and per
           process cache)
  * #1566 (Remove inline pydns)
  * #1585 (Remove support for outdated versions of pysnmp)
  * #1602 (Remove django-oauth2-provider library dependency)


Version 4.7.3
(released 09 Nov 2017)

 Fixed GitHub issues in this release:

  * #1402 (Maintenance alerts about non existing devices)
  * #1590 (IPAM: Add quickfix, logging for prefixes with no VLAN)
  * #1592 (Report crashes when attempting to sort a column filtered on a
           non-ASCII value)
  * #1593 (Logengine inserts quoted log messages into database)
  * #1595 (Drawing sensor graphs fail for sensors that have no human
           readable description)
  * #1601 (Updating room id creates a new room)
  * #1603 (AlertEngine crashes when processing filters containing "not
           equals" matches)
  * #1604 (Running ipdevpoll in multiprocess mode will delay resolving
           of snmpAgentDown alerts)
  * #1605 (Log output from ipdevpoll multiprocess workers is lost)
  * #1606 (linear gauge does not fill with gradient)
  * #1610 (Remove stale topology information from ports that are down,
           where the assumed link partner is still up )


Version 4.7.2
(released 28 Sep 2017)

 Fixed GitHub issues in this release:

  * #1516 (Default maintenance duration too long)
  * #1532 (SeedDB bulk import of organizations and rooms crashes on
           misformatted attribute lists)
  * #1535 (Alert profiles - filtering on location does not include
           sublocations)
  * #1546 (IndexError in portadmin search if ipdevpoll hasn't run yet)
  * #1553 (Status widgets crash if filtering on locations with non-ascii
           characters in the ID)
  * #1560 (portadmin may change vlan for incorrect port on non-cisco
           devices)
  * #1565 (geomap does not render rooms)
  * #1567 (Moved searchproviderlist to settings)
  * #1568 (Fixed deleting non-required schemas in search_path)
  * #1571 (devicehistory - device group history does not work)
  * #1583 (Netmap cache crashes on non-ascii strings)


Version 4.7.1
(released 09 Jun 2017)

 Fixed GitHub issues in this release:

  * #1524 (Auditlog is a top-level module, causing all of NAV 4.7.0 to
           break)
  * #1528 (All ipdevpoll jobs, except `dns` and `snmpcheck`, stopped
           working after upgrade to 4.7.0)
  * #1527 (ipdevpoll logs every line twice)


Version 4.7.0
(released 08 Jun 2017)

 User-visible features and improvements:


  * #1174 (Rewrite ipdevpoll's multiprocess mode to use generic worker
           model)
  * #1183+#1463 (Monitor BGP connectivity)
  * #1236+1416 (Feature request: API for unrecognized neighbors)
  * #1239 (multidashboard export import)
  * #1411+#1515 (Add PortAdmin "Write mem" support for H3C switches)
  * #1428 (added broadcast & multicast counters to interfaces (ipdevinfo))
  * #1467 (Add support for Comet MS series data loggers)
  * #1468 (Rittal cmc iii support)
  * #1469 (Powernet: Distinguish between phase load and bank load sensors.)
  * #1472 (Added support for Raritan PDU2 mib PDUs)
  * #1474 (Add a comprehensive view of collected sensors and their data on
           a new Sensors tab in ipdevinfo)
  * #1475 (Collect sensor readings from Lenovo/IBM PDUs (Power Distribution
           Units))
  * #1486+#1488 (Add a rack based view of environment sensors in a room)
  * #1489+#1492 (Avoid redundant port counter collection from virtualized
                 instances, such as Cisco VRF)
  * #1498 (Add fullscreen mode for all maps)
  * #1518 (Default setting for map starting point when selecting room geo
           location)
  * #1522 (Auditlog)

 Other fixed GitHub issues in this release:

  * #1403 (deleting a netbox makes data-collection stop)
  * #1456 (The old status page code should be removed)
  * #1462 (Netmap performance improvements)
  * #1493 (Status widget, "Not device group" filter is wrong)
  * #1496 (Missing jQuery tinysort javascript library)
  * #1500 (Sensor details - fix spelling on "Thesholds")
  * #1507 (The regexp for ifalias is not shown)
  * #1511 (Minor IPAM improvements)
  * #1512 (Update old javascript libraries)
  * #1519 (ipdevinfo doesn't list aggregators for some Juniper interfaces)


Version 4.6.2
(released 16 Mar 2017)

 Fixed GitHub issues in this release:

  * #1326 (ipdevpoll -n option may be unable to match single IP addresses
           in environments without DNS names)
  * #1344 (Location is mandatory field when adding a room, but not when
           bulk importing)
  * #1433 (Users with non-set passwords may crash the login page)
  * #1437 (Eventengine's modulestate plugin will not handle alerts on
           modules that have duplicates)
  * #1454 (Alert message HTML templates break on events that have no
           associated alert type)
  * #1455 (Alert profiles with vendor-based filters seems to crash the
           Alertengine completely)
  * #1460 ("arp" API endpoint produces server error when mixing ip and
           ordering=netbox)
  * #1464 (Selecting page size in reports eliminates search parameters)
  * #1471 (Fallback to default set of sensor-collecting MIBs does not work)
  * #1471 (revision library stuff should be renamed to cache)
  * #1476 (OverflowError when searching for IPv6 prefix in the navbar)
  * #1477 (The Prefix details page should only list GW and GSW devices
           under the router ports list)
  * #1478 (l2trace hardcodes internal URLs)
  * #1479 (Change prefix links to new prefix details page)
  * #1480 (ipdevpoll sensors plugin should verify enterprise IDs using live
           queries, not db lookups)
  * #1481 (Organization column is empty in room deviceinfo page)
  * #1484 (cant save status filter when filter has special characters)
  * #1485 (AlertProfiles crashes with a UnicodeEncodeError when attempting
           to save a profile with non-ASCII characters in its name)


Version 4.6.1
(released 26 Jan 2017)

 NAV has moved to GitHub. Issues are now tracked at
 https://github.com/UNINETT/nav/issues . Due to the migration of bug data from
 Launchpad, reporter and subscriber information has been lost (all bugs appear
 to be reported by jmbredal).

 If you have existing bug reports you still wish to keep an eye on, you can
 find the migrated issue by searching the Launchpad bug number in our GitHub
 issue tracker.

 Fixed issues in this release:

  * #320  (Error in IPAM function after upgrade to 4.6)
  * #321  (Graph widget modifies graph interval to 24 hours, no matter what
           the URL says)
  * #891  ("rooms with active alerts"-widget needs event filter)
  * #892  (cancelled maintenance tasks with no endtime are displayed)
  * #893  (Long log lines cause logging to stop for ipdevpoll processes in
           multiprocess mode)
  * #1022 (Some dropdowns not sorted in Alert Profiles)
  * #1024 (support external links in ups widget)
  * #1425 (Using arrow keys to navigate when there is only a single
           dashboard moves to a 'undefined' dashboard, resulting in a 404
           Not Found)
  * #1426 (Left/right arrow keys are captured globally on dashboards,
           making it impossible to make small edits to widget titles and
           such)
  * #1238 (choose columns in status widget)
  * #1412 (multiple dashboards should be presented as tabs)


Version 4.6.0
(released 01 Dec 2016)

 User-visible features and improvements:

  * LP#1248086 (alert on loss of redundancy in an aggregated (portchannel) link)
  * LP#1531850 (more flexible system for location of equipment)
  * LP#1634874 (choose columns in status widget)
  * LP#1646405 (Improve functions for IP Address Management [IPAM])
  * LP#1646408 (prefix details page)
  * LP#1646411 (Collect and store static routes)
  * LP#1646413 (Work around buggy Q-BRIDGE-MIB implementation in Juniper EX
                switches)
  * LP#1646416 (Add a command line program to manipulate NAV users)

  Please read the release notes for more information about the new features.

 Bugfixes:

  * LP#1626856 (ipdevpoll inventory job crashes if a device reports multiple
                modules with the same name)
  * LP#1629823 (prefix usage api endpoint lists empty results)
  * LP#1630506 (Arnold detention crashes when switch reports SNMP agent error)
  * LP#1634903 (LLDP topology bug when two devices share the same initial
                sysname)
  * LP#1638568 (Incomplete topology information causes eventengine to post
                boxShadow alerts instead of boxDown alerts)
  * LP#1640714 (Erroneous interpretation of LLDP-MIB port numbers may cause
                wrong topology to be detected)
  * LP#1641522 (Chart Widget unresponsive)


Version 4.5.3
(released 01 Sep 2016)

 Bugfixes:

  * LP#1592747 (Cisco chassis serial number decoding report should include
                modules as well)
  * LP#1597666 (No data collected on some Comet web probes)
  * LP#1608869 (graph widget does not update)
  * LP#1608920 (make graph widget time controls optional)
  * LP#1619136 (Specifying both starttime and endtime values crashes the arp API
                endpoint)
  * LP#1619138 (Searching for IP addresses in the arp API endpoint is horribly
                inefficient)


Version 4.5.2
(released 30 Jun 2016)

 Bugfixes:

  * LP#1567939 (add buttons to change time period in statistics widget)
  * LP#1575112 (Missing switch ports and CAM data from Aruba switches (S2500))
  * LP#1594271 (Sensors with non-ASCII names or descriptions may cause errors in
                status widget and status page)
  * LP#1595445 (Some or all enabled VLANs are sometimes missing from Cisco trunk
                ports)
  * LP#1595835 (Collect binary inputs of Comet web sensors)


Version 4.5.1
(released 16 Jun 2016)

 Bugfixes:

  * LP#1591973 (navstats binary is not installed in NAV 4.5.0)
  * LP#1592281 (ipdevpoll statuscheck errors out on some Aruba switches)
  * LP#1593193 (Race condition may make eventengine ignore events at random)


Version 4.5.0
(released 09 Jun 2016)

 User-visible features and improvements:

  * LP#1321249 (A new tool for generating Graphite metrics from PostgreSQL
                queries)
  * LP#1531851 (Trend comparison in graphs)
  * LP#1531853 (API: more flexible authorization and administration)
  * LP#1534481 (Maintenance task selection based on device group)
  * LP#1546434 (Add bulk upload of images in room view)
  * LP#1577318 (Add timestamp filtering to cam and arp API)
  * LP#1588187 (Cabling/patch registration and presentation in need of serious
                usability improvements)

 Bugfixes:

  * LP#1551217 (Alert from 3rd party - maintenance mode not respected) [the
               4.4.4 release did not fix the eventengine part of this issue,
               this release does]
  * LP#1590654 (Lost ipdevpoll database connections aren't properly reset under
                Django 1.7)


Version 4.4.4
(released 02 Jun 2016)

 Bugfixes:

  * LP#1551217 (Alert from 3rd party - maintenance mode not respected)
  * LP#1569704 (Supplied Apache config example doesn't explicitly allow access
                to read files in the upload location)
  * LP#1570814 (DNS lookups in web UI leak UDP sockets until resource
                exhaustion)
  * LP#1571010 (timeformat unreadable in scheduled messages)
  * LP#1572580 (Malformed month names in syslog messages cause logengine crash)
  * LP#1572599 (Adding VLAN graphs to dashboard does nothing)
  * LP#1572894 (portadmin: Save all button disappears on small screens)
  * LP#1573486 (netmap crashes when a room is not connected to a location)
  * LP#1573569 (portadmin: crash when cisco voice enabled and visiting hp
                device)
  * LP#1578108 (eventengine enters an infinite loop and stops processing events)
  * LP#1588201 (Status page describes many threshold alerts only as "Sensor
                object")


Version 4.4.3
(released 31 Mar 2016)

 Bugfixes:

  * LP#1538270 (PortAdmin crashes when non admin try to remove a vlan from the
                trunk)
  * LP#1543529 (portadmin: default vlan is not setable for non-admin if auth is
                enabled)
  * LP#1543953 (Wrong units in Gbits/s graphs)
  * LP#1544059 (Subnet matrix is no longer helpful when no scopes have been
                defined)
  * LP#1551205 (Subject description of 3rd party alerts in status page are
                uninformative)
  * LP#1552198 (ranked statistics give vague error when no data exists)
  * LP#1554466 (PortAdmin: when proper cisco voice vlans enabled changing vlan
                changes native vlan)
  * LP#1559004 (Extract VLAN information from Juniper routers)
  * LP#1563369 (Rickshaw graphs do not update on interval change)


Version 4.4.2
(released 4 Feb 2016)

 Bugfixes:

  * LP#1538029 (Rickshaw color palette is bad for color blind users)
  * LP#1538113 (report widget crashes with 500)
  * LP#1538270 (PortAdmin crashes when non admin try to remove a vlan from the
                trunk)
  * LP#1540839 (ipdevpoll inventory job fails when deleting old router
                addresses)
  * LP#1541246 (alertprofiles: adding subscription fails (when form is not
                valid?))
  * LP#1541358 (NAV doesn't work with python-gammu versions 2 and up)


Version 4.4.1
(released 21 Jan 2016)

 Bugfixes:

  * LP#1535647 (Broken graph widgets after upgrade to 4.4.0)
  * LP#1535688 (ipdevpoll multiprocess mode broken in NAV 4.4.0)
  * LP#1535701 (subnet matrix has no visible feedback to user if prefix
                utilization API call fails)
  * LP#1535723 (Room page's interface tab is blank in NAV 4.4.0)
  * LP#1536031 (Unable to create a new user)
  * LP#1536060 (Unable to get switch port activity for anything but the default
                interval value)


Version 4.4.0
(released 14 Jan 2016)

 User-visible features and improvements:

  * LP#1248195 (Make NAV compatible with Django 1.7)
  * LP#1350815 (Add zooming in graphs, like Cacti)
  * LP#1465571 (PortAdmin should log to separate log file)
  * LP#1466373 (seeddb confirm navigation when form is not saved)
  * LP#1466440 (Device groups should be searchable from the navbar)
  * LP#1466462 (Report pagination is nearly invisible)
  * LP#1483578 (request: enable-button in /arnold/details/)
  * LP#1511363 (Organize scope-list in Subnet Matrix-frontend)
  * LP#1526789 (Support sensor discovery on Geist-branded WeatherGoose products)
  * LP#1528124 (Autocreate new types with sensible vendor id's)
  * LP#1531159 (portadmin: support for Cisco voice vlans)

 Bugfixes:

  * LP#1248205 (403 Forbidden on front page with apache 2.4)
  * LP#1518246 (subnet matrix - first subnet is not shown)
  * LP#1518251 (subnet matrix - /23 prefixes are displayed incorrectly)
  * LP#1518254 (subnet matrix - link to prefix is suddenly a scope)
  * LP#1521107 (Messages widget does not refresh)
  * LP#1521124 (Django security fix in Debian makes time periods display as
                blank)
  * LP#1526282 (Module replacements will sometimes crash ipdevpoll inventory job
                with IntegrityError)
  * LP#1532701 (Snmptrapd fails to post link events if module name is unknown)


Version 4.3.3
(released 26 Nov 2015)

 Bugfixes:

  * LP#1518950 (machine tracker - form should reflect link parameters)
  * LP#1519362 (Forgetting to add a name to an alert profile causes template
                selection to be cleared in form)
  * LP#1520119 (Servicemon silently stops checking services after running for a
                while)


Version 4.3.2
(released 19 Nov 2015)

 Bugfixes:

  * LP#1487436 (arnold rejects ip-addresses that ends with the number 0)
  * LP#1488003 (Alert Profiles UI does not enable multi-value select for the
                "IN" filter operator)
  * LP#1488010 (link to ipdevinfo if applicable for subjects without absolute
                url)
  * LP#1488441 (room map widget does not load map)
  * LP#1488774 (Arnold documentation should be updated and moved from wiki to
                Sphinx)
  * LP#1489843 (javascript require-libs timeout)
  * LP#1492246 (Topology of disabled interfaces may linger in some cases)
  * LP#1494190 (clicking on a shared time period in alert profiles selects all)
  * LP#1494232 (hovering a shared time period in alert profiles highlights all)
  * LP#1494233 (When exporting switch port information from a room view as CSV,
                the output contains extra spaces and newlines in the first
                column)
  * LP#1494279 (Inconsistent Servicemon checker names)
  * LP#1496396 (Service checker descriptions and service checker argument
                descriptions are not displayed to the user in SeedDB)
  * LP#1496780 (Threshold alerts are not very descriptive on the status page)
  * LP#1497970 (Add SEMI-MIB to retrieve serial number for HP 1810 switch)
  * LP#1498323 (Traps from WeatherGoose devices no longer work after rebranding
                from IT Watchdogs to Geist)
  * LP#1499343 (The wiki page describing background processes in NAV should be
                moved to Sphinx docs)
  * LP#1500423 (ipdevpoll: Transaction managed block ended with pending
                COMMIT/ROLLBACK)
  * LP#1500425 (Inventory and statuscheck jobs of ipdevpoll still can fail after
                an OS upgrade)
  * LP#1505524 (Retrieve software version for HP 1810 switch)
  * LP#1505945 (Add API endpoint for VLAN information)
  * LP#1507467 (Temperature sensor gauges as widgets)
  * LP#1513046 (LLDP neighbors with "funny" names may cause ipdevinfo
                NoReverseMatch crash)
  * LP#1516956 (Services should be considered on maintenance when their parent
                IP Device is on maintenance)
  * LP#1516972 (Maintenance status is not visible in service matrix and service
                lists)

Version 4.3.1
(released 20 Aug 2015)

 Bugfixes:

  * LP#1464660 (macwatch AttributeError when attempting to post events under NAV
                4.3.0)
  * LP#1466734 (Portadmin should link back to ipdevinfo)
  * LP#1467508 (report export csv not working)
  * LP#1469620 (Ipdevinfo: switchport activity only show activity for last 30
                days)
  * LP#1469988 (arnold does not reset autoenable date on manual detentions)
  * LP#1478827 (Include vendor and description in the netbox API endpoint)
  * LP#1478835 (portadmin snmp timeout while saving)
  * LP#1480262 (Rendering a port traffic graph results in a UnicodeEncodeError)
  * LP#1480814 (Non-ASCII characters in username will crash login page if
                authenticating against a Microsoft AD server)
  * LP#1483145 (seeddb invalid ip crashes check connectivity)
  * LP#1484386 (Floating graph control panel intermittently appears at top of
                page when selecting Port Metrics tab in ipdevinfo)
  * LP#1484423 (ipdevpoll inventory job fails with AttributeError: 'NoneType'
                object has no attribute 'strip')
  * LP#1484427 (ipdevpoll 5minstats job fails on some Cisco WLCs)
  * LP#1486415 (IntegrityError when posting chassis events from ipdevpoll)
  * LP#1486430 (Jobs "inventory" and "statuscheck" fails after switch OS
                upgrade)


Version 4.3.0
(released 11 Jun 2015)

 This release makes some fundamental changes to NAV's data model to improve
 support for non-physical devices (like Cisco VSS and Cisco VDC). Please read
 the release notes for further information.

 User-visible features and improvements:

  * LP#744943  (Add switch to toggle display of traffic lines in Geomap)
  * LP#961212  (Show planned/active maintenance tasks for device in IP Device
                Info)
  * LP#1149160 (Auto-recognize HTTP URLs in reports and hyperlink them)
  * LP#1166695 (PortAdmin available from the toolbox)
  * LP#1169550 (NAV's data model should reflect modern reality, with virtual
                device support)
  * LP#1242872 (Option to turn off traffic stats in Geomap)
  * LP#1248081 (New interface/tool to browse unrecognized neighbors)
  * LP#1366895 (Report widget)
  * LP#1421644 (Support Weathergoose traps from external temperature sensors)

 Bugfixes:

  * LP#1233093 (Report pages crash under psycopg2 >= 2.5)
  * LP#1397257 (Port Admin may not work properly for any non-HP and non-Cisco
                device)
  * LP#1447973 (CDP/LLDP neighbor matching fails when multiple ports match the
                identification)
  * LP#1447999 (Existing adjacency candidate data in db is not deleted if a
                device's CDP cache or LLDP remote table becomes empty)
  * LP#1448086 (Unable to identify LLDP neighbor's port in some instances)
  * LP#1458826 (1minstats job crashes on invalid ENTITY-MIB references from
                CISCO-PROCESS-MIB)
  * LP#1459138 (Ignore Cisco reserved VLANs when collecting BRIDGE-MIB data)
  * LP#1463724 (Increase frequency of module status verification)


Version 4.2.6
(released 23 Apr 2015)

 Bugfixes:

  * LP#1248083 (The ipdevinfo "Affected" tab should be renamed to "what if")
  * LP#1248085 (ipdevinfo "affected" tab needs to properly list the affected
                organizations)
  * LP#1338388 (Netmap link traffic does not always show)
  * LP#1435451 (Vendors report should only show Vendors in use)
  * LP#1436125 (No CPU graph from some Cisco CPUs)
  * LP#1436388 (VLAN number cannot be forced by router port description)
  * LP#1437318 (PostgreSQL load driven up by overzealous pruning of old
                ipdevpoll_job_log entries in NAV 4.2.5)
  * LP#1438930 (No negative values can be displayed in graphs)
  * LP#1442538 (Graphite-web doesn't support metric aliases with non-ASCII
                characters)
  * LP#1443775 (alert templates for climate humidity notifications does not
                exist)
  * LP#1444416 (netmap L3 crash in urlresolvers.py)


Version 4.2.5
(released 20 Mar 2015)

 This was released to replace the broken 4.2.4 release. The fixed regression
 is this:

  * LP#1434520 (pping is unable to post boxUp/boxDown events)

 Bugfixes:

  * LP#1403365 (offMaintenance alerts for same device every 5 minutes)
  * LP#1422298 (device history crashes when viewing weathergoose events)
  * LP#1422316 (thresholdmon AttributeError crash)
  * LP#1425536 (Status widget error when filtering on Device group)
  * LP#1425846 (alert profiles does not display without refresh)
  * LP#1427666 (watchdog is slow)
  * LP#1428071 (Portadmin crashes when searching by sysname or ip)
  * LP#1428578 (seeddb test for snmp version crashes if neither v1 or v2c is
                supported)
  * LP#1429868 (ipdevpoll jobs that are no longer supposed to run for a device
                as flagged as "overdue")
  * LP#1430795 (SeedDB room edit form asks for user's location, shows no map
                until permission is given)
  * LP#1430797 (Geomap shows no map at all when no room positions are defined)
  * LP#1430802 (SeedDB room edit insists on inserting a geoposition)
  * LP#1430803 (SeedDB room form position indicator icon is missing)
  * LP#1431780 (Trunk port status is never reset on non-Cisco equipment)
  * LP#1432056 (mod_wsgi option WSGIApplicationGroup should be %{GLOBAL} by
                default)
  * LP#1432057 ([appliance] missing python-dnspython)
  * LP#1432620 (Unable to load Netmap layer 3 map with ELINK peers)
  * LP#1432682 (Should be able to specify exact subnet prefixes to ignore)
  * LP#1433063 (netmap zoom and pan does not work for some views)
  * LP#1433120 (Shouldn't generate linkState alerts for intentionally shutdown
                interfaces)


Version 4.2.4
(released 19 Mar 2015)

 Release retracted.


Version 4.2.3
(released 12 Feb 2015)

 Bugfixes:

  * LP#392148  (Add microformats in maintenance module)
  * LP#1108736 (seeddb vlan page have checkbox but no delete selected)
  * LP#1242868 (device group improvements)
  * LP#1248095 (device groups should be searchable in the NAVbar)
  * LP#1316608 (Search in statistics gives stacktrace)
  * LP#1398382 (AssertionError prevents Netmap from loading any graph/map)
  * LP#1410687 (room netbox interfaces must indicate that topology exists)
  * LP#1411243 (Radius error log search: "could not convert string to float:
                hours")
  * LP#1412735 (arnold switching from exponential to normal duration gives wrong
                duration)
  * LP#1414934 (Expanding some switch ports makes Network Explorer hang)
  * LP#1414943 (No collected IPv6 prefixes on Cisco Nexus routers)
  * LP#1414975 (network explorer doesn't report backend failures to end user)
  * LP#1419746 (portadmin crashes when searching for a netbox that has no type)
  * LP#1420836 (Parsing of sensors with names that contains #)
  * LP#1421126 (snmpAgentDown blocks BoxDown event)


Version 4.2.2
(released 08 Jan 2015)

 Important note:

  This release adds commas to the list of characters escaped in Graphite
  metric names, which may change the name used for some of your existing
  metrics after an upgrade. If you want to keep your data, the underlying
  files need to be renamed manually in your Graphite installation. See the
  updated release notes for more.

 Bugfixes:

  * LP#1169559 (Print button for Netmap)
  * LP#1394522 (Netbox and Location bulk import formats must be changed to
                include data attributes)
  * LP#1396913 (Status page, filter on Device Group)
  * LP#1396920 (NAV 4, Internet Explorer Compatibility mode)
  * LP#1396924 (NAV 4.2 does not work with SASS 3.4 or newer, but the install
                docs do not specify this)
  * LP#1397255 (Subject text of psuDown alerts in status tool is non-
                descriptive)
  * LP#1397886 (device history script timeout on many results)
  * LP#1398382 (AssertionError prevents Netmap from loading any graph/map)
  * LP#1398791 (Maintenance system stops working when an IP device on
                maintenance is deleted)
  * LP#1398815 (Rooms, hyperlink inconsistensies between report and seeddb)
  * LP#1399558 (portadmin tries to write to memory for each change)
  * LP#1400307 (Need easier way to remove services)
  * LP#1401114 (dropdown for ipdevice when adding a service is fubar)
  * LP#1401470 (ipdevpoll TypeError: unsupported operand type(s) for +:
                'NoneType' and 'float')
  * LP#1403066 (Some routers fail to expand in Network Explorer)
  * LP#1403432 (report.conf, wrong url for netboxinfo)
  * LP#1403797 (Geomap is insanely slow after migration to Graphite in NAV 4.0)
  * LP#1403803 (Geomap "loading data" indicator is missing)
  * LP#1403884 (geomap sends data request on every tiny movement)
  * LP#1404207 (Intermittent ValueErrors thrown from pynetsnmp causes ipdevpoll
                jobs to fail)
  * LP#1404222 (Conflicting sysnames cause ipdevpoll jobs to crash)
  * LP#1404225 (Multiple DNS PTR records for the same IP address causes sysname
                to swing back and forth in NAV)
  * LP#1407625 (/search/devicegroup takes too long)


Version 4.2.1
(released 27 Nov 2014)

 Bugfixes:

  * LP#1395710 (api token can not be refreshed from the api)
  * LP#1396514 (Status tool in NAV 4.2 shows no events if API call returns a 500
                error)
  * LP#1396516 (Status API in NAV 4.2 crashes when there are old deviant alerts
                present)
  * LP#1396517 (Status tool makes hyperlinks out of alert subjects that have no
                defined URL)
  * LP#1396531 (logengine spams the error message "KeyError: 'LINK'")
  * LP#1396914 (netmap filter on location excludes links)


Version 4.2.0
(released 20 Nov 2014)

 User-visible features and improvements:

  * LP#1063703 (The status page is becoming cluttered and should be redesigned)
  * LP#1374384 (Adding new devices to a room on maintenance does not put those
                devices on maintenance)
  * LP#1383624 (Machine Tracker should search uplink data as well)
  * LP#1383625 (Machine Tracker MAC search should also search physical port
                addresses)
  * LP#1384262 (Add unrecognized neighbor search to navbar)
  * LP#1388078 (Add IGMP Multicast group usage statistics to NAV)
  * LP#1389226 (Arbitrary attributes on netbox and location)
  * LP#1390073 (Add support for AKCP sensorProbe8)

 Other, less visible, improvements:

  * LP#1388835 (Maintenance Engine needs a rewrite)

 Bugfixes:

  * LP#1385121 ("Add graph to dashboard" does nothing under certain Apache
                configurations)
  * LP#1386716 (Maintenance task with no end time displays incorrectly in edit
                form)
  * LP#1389121 (when searching for an ip-address with space in it, NAV crashes)
  * LP#1389145 (Netbiostracker crash on unparseable MAC Address)


Version 4.1.2
(released 30 Oct 2014)

 Bugfixes:

  * LP#1236387 (Netbiostracker doesn't handle MAC addresses with hyphens)
  * LP#1248084 (The heading "devices going down" in ipdevinfo affected tab
                should be changed to "devices unreachable")
  * LP#1359111 (Problem getting inventory for HP 5412R)
  * LP#1370051 (Whitespace in machinetracker widget causes stacktrace)
  * LP#1370517 (Several search views throw 500 exceptions where a 404 Not Found
                would be appropriate)
  * LP#1371026 (ipdevpoll topo job fails with AttributeError)
  * LP#1373841 (link from subnet matrix to machinetracker gives no results)
  * LP#1374391 (graph widget should have a target url attribute)
  * LP#1375749 (Maintenance calendar does not display task starting previous
                month)
  * LP#1380583 (Python requirements in install doc are out of sync with
                requirements.txt)
  * LP#1382460 (Ambiguous search input crashes l2trace)
  * LP#1382492 (Machine tracker searches crash when results include devices that
                haven't had any ipdevpoll jobs run against them)
  * LP#1382522 (Radius accounting search crashes when searching for hostname
                that cannot be found in DNS)
  * LP#1383624 (Machine Tracker should search uplink data as well)
  * LP#1383625 (Machine Tracker MAC search should also search physical port
                addresses)
  * LP#1384262 (Add unrecognized neighbor search to navbar)
  * LP#1387215 (Rubbish CDP neighboring port data crashes topo job)
  * LP#1387598 (ip2mac and inventory jobs crash with "IPv4 Address with more
                than 4 bytes" on some Cisco devices)


Version 4.1.1
(released 14 Aug 2014)

 Bugfixes:

  * LP#1052804 (NoReverseMatch error on multiple pages when adding IPv6 host
                with no DNS name)
  * LP#1316599 (NoReverseMatch exception when trying to load netmap)
  * LP#1333170 (Disused prefixes aren't properly deleted from the database)
  * LP#1338548 (Searching for an apparently "invalid" hostname crashes
                ipdevinfo)
  * LP#1339575 (Room and organization data keys cannot be added using SQL
                without first checking for NULL values)
  * LP#1340193 (NAV gets confused when re-using VLAN tags for multiple broadcast
                domains)
  * LP#1340576 (Virtual status of router addresses cycles back and forth,
                causing net type to swing back and forth between lan and link)
  * LP#1355693 (Interface names not present in linkState alert messages)
  * LP#1355923 (dump.py -t room crash)


Version 4.1.0
(released 26 Jun 2014)

 User-visible features and improvements:

   * LP#744951  (show % usage for smaller subnets in subnet matrix)
   * LP#1062298 (Watchdog feature to monitor internal status of NAV processes)
   * LP#1169557 (Room and Organization opt fields should be replaced with an
                 arbitrary variable=value scheme)
   * LP#1248092 (ipdevpoll CAM collection optimizations)
   * LP#1319657 (ipdevinfo alert tab does not display alerttype)
   * LP#1312648 (Remember user's preference for number of rows per page in
                 SeedDB list views)
   * LP#1311205 (Change administrative status of interface from PortAdmin)
   * LP#1334243 (REST API)


Version 4.0.3
(released 26 Jun 2014)

 Bugfixes:

  * LP#1255978 (Add Arnold-information in ipdevinfo Port Details)
  * LP#1301191 (Portadmin vlan change for many interfaces takes a long time)
  * LP#1318534 (Publish timestamps is set to Default when editing a Message)
  * LP#1321246 (vlan search result should be sorted by vlan)
  * LP#1321251 (search for Netbios in Machine Tracker widget)
  * LP#1321634 (Some alerts are never resolved when devices have moved around)
  * LP#1323206 (device history-link in ipdevinfo not working as intended)
  * LP#1324108 (arnold fails to manually detain when sysname is uppercase)
  * LP#1327098 (ipdevpoll jobs are marked as successful when nothing was done)
  * LP#1333167 (Netbox.up sometimes out of sync with actual alert-based box
                state)
  * LP#1334258 (Geomap fails to load any data if a single Graphite metric causes
                an error)


Version 4.0.2
(released 15 May 2014)

 Bugfixes:

  * LP#1302403 (Unplugged HP power supplies are marked with "unknown" state)
  * LP#1303804 (No graphs are rendered if graphite base url doesn't end with a
                slash)
  * LP#1304279 (values in threshold alerts are always 100)
  * LP#1304455 (Submitting an empty search form crashes Arnold)
  * LP#1314503 (migrate_to_whisper.py crashes on mismatches between RRD files
                and database)
  * LP#1316091 (pping dies when carbon is unavailable)
  * LP#1316600 (external tools have no icons)
  * LP#1316965 (NAV 4.0 collects port traffic stats from EDGE devices)


Version 4.0.1
(released 03 Apr 2014)

 Bugfixes:

  * LP#1300117 (Fix for bug 1295092 causes ipdevpoll inventory jobs to crash for
                Cisco devices)
  * LP#1301251 (LDAP users with non-ASCII characters in their name cause login
                page to crash when user lookup method is 'search' (MS AD))
  * LP#1301260 (seeddb prefix edit does not display all fields)
  * LP#1301343 (CDP cache is never refreshed on devices that do not respond to
                CDP-MIB::cdpGlobalLastChange)
  * LP#1301349 (Module down alerts fail to mention the module's name)
  * LP#1301794 (LDAP group membership verification crashes with
                UnicodeDecodeError when username contains non-ASCII chars)


Version 4.0.0
(released 27 Mar 2014)

 Final 4.0.0 release. Please read changelog entries for all 4.0 beta releases
 to get a complete overview of the changes since 3.15.

 Bugfixes:

  * LP#1293616 (missing cascade in table account_navlet)
  * The map would not display when editing rooms in SeedDB.

 User-visible features and improvements:

  * Stale link state alerts can now be cleared/dismissed directly from the
    Status page.

  * Sensor readings are now collected every minute (the `statsensors` plugin
    has moved to the 1minstats job. Please update your Graphite's
    `storage-schemas.conf` accordingly, if you have been beta testing the 4.0
    releases).

  * The POWER and ENV main device categories have been added, to categorize
    power distribution equipment and environmental probes.

  * Added "Environment sensors" tab to the Room view. All temperature sensors
    on ENV-category devices in a room are now displayed on this tab, with
    gauges and time-series graphs.

  * Added support for the Comet P8541 web probe (remote temperature sensor).

  * UPS-MIB sensors: Fixed wrong value precision on a couple of objects, and
    added support for the full range of data available from the battery,
    input, output and bypass groups.

  * Added a "setup guide"-type tour for first-time SeedDB users.

  * The cdp, tftp, cs_at_vlan and chassis checkboxes in SeedDB's type form
    have been obsolete for several years, and were finally removed from NAV's
    data model. Bulk import and dump formats have been updated accordingly.

  * Even more tweaks and adjustments to improve the new UI.


Version 4.0b5
(released 03 Mar 2014)

 Bugfixes:

  * Fixed various bugs around the web interface, introduced in previous
    releases.

 User-visible features and improvements:

  * Graph widget now has editable title. Default value is taken from from the
    displayed graph.

  * Make global graph controls float on top of viewport
Download .txt
gitextract_mfgwl7w2/

├── .codecov.yml
├── .dockerignore
├── .git-blame-ignore-revs
├── .npmrc
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── .sonarcloud.properties
├── AUTHORS.rst
├── CHANGELOG.md
├── COPYING
├── Dockerfile
├── HACKING
├── HISTORY
├── INSTALL
├── Makefile
├── NOTES.rst
├── README.rst
├── changelog.d/
│   ├── +replace-use-l10n.changed.md
│   ├── .gitkeep
│   ├── 2927.added.md
│   ├── 3881.added.md
│   ├── 3916.changed.md
│   ├── 3954.fixed.md
│   ├── 3959.fixed.md
│   ├── 3961.changed.md
│   └── 3980.fixed.md
├── checks/
│   └── check_test_names.py
├── constraints.txt
├── contrib/
│   ├── patches/
│   │   ├── cricket-win32-null-bug.patch
│   │   ├── cricket_zoom_1.5.patch
│   │   ├── nav_cricket-1.0.3_v0.2.ALFA.patch
│   │   └── net-snmp-memory.patch
│   └── scripts/
│       └── isc_dhpcd_graphite/
│           ├── README.rst
│           └── isc_dhpcd_graphite.py
├── dist.sh
├── doc/
│   ├── _static/
│   │   └── custom.css
│   ├── api/
│   │   ├── mibretriever.rst
│   │   ├── searchproviders.rst
│   │   └── sensor.rst
│   ├── conf.py
│   ├── contents.rst
│   ├── exts/
│   │   ├── alerttypes.py
│   │   ├── alerttypes.rst.j2
│   │   └── xref.py
│   ├── faq/
│   │   ├── faq.rst
│   │   └── graph_gaps.rst
│   ├── glossary.rst
│   ├── hacking/
│   │   ├── adding-environment-probe-support.rst
│   │   ├── extending-nav-locally.rst
│   │   ├── hacking-with-pycharm.rst
│   │   ├── hacking.rst
│   │   ├── index.rst
│   │   ├── javascript.rst
│   │   ├── release-procedure.rst
│   │   ├── snmp-tunnels.rst
│   │   ├── using-devcontainers.rst
│   │   ├── using-docker.rst
│   │   ├── web-interface-customization.rst
│   │   └── writing-a-servicemon-plugin.rst
│   ├── hg2git/
│   │   ├── README.rst
│   │   └── hg2gitmapping.txt
│   ├── howto/
│   │   ├── allauth-and-oidc.rst
│   │   ├── api_parameters.rst
│   │   ├── commandline-utilities.rst
│   │   ├── debugging-topology.rst
│   │   ├── email.rst
│   │   ├── generic-install-from-source.rst
│   │   ├── index.rst
│   │   ├── installing-graphite-on-debian.rst
│   │   ├── integrating-graphite-with-nav.rst
│   │   ├── manual-install-on-debian.rst
│   │   ├── migrate-data.rst
│   │   ├── migrate-dhcpstats.rst
│   │   ├── migrate-rrd-to-graphite.rst
│   │   ├── mod_auth_mellon_feide.rst
│   │   ├── mod_auth_openidc_feide.rst
│   │   ├── securing-nav-in-production.rst
│   │   ├── setting-up-logging.rst
│   │   └── using_the_api.rst
│   ├── index.rst
│   ├── intro/
│   │   ├── getting-organized.rst
│   │   ├── getting-started.rst
│   │   └── install.rst
│   ├── msg_and_maint_db.dia
│   ├── nav-flowchart.dia
│   ├── overview.rst
│   ├── reference/
│   │   ├── alerttypes.rst
│   │   ├── arnold.rst
│   │   ├── authentication.rst
│   │   ├── backend-processes.rst
│   │   ├── cabling_and_patch.rst
│   │   ├── dhcpstats.rst
│   │   ├── event-templates.rst
│   │   ├── eventengine.rst
│   │   ├── geomap.rst
│   │   ├── index.rst
│   │   ├── ipam.rst
│   │   ├── ipdevpoll.rst
│   │   ├── jwt.rst
│   │   ├── ldap.rst
│   │   ├── mailin.rst
│   │   ├── management-profiles.rst
│   │   ├── mfa.rst
│   │   ├── models-event.rst
│   │   ├── models-manage.rst
│   │   ├── navstats.rst
│   │   ├── portadmin.rst
│   │   ├── radius-install.rst
│   │   ├── radius.rst
│   │   ├── remote_user.rst
│   │   ├── smsd.rst
│   │   ├── snmptrapd.rst
│   │   └── social-account.rst
│   ├── release-notes.rst
│   ├── requirements.txt
│   ├── svn2hg/
│   │   ├── README
│   │   └── localtags
│   └── templates/
│       └── layout.html
├── docker-compose.snmp.yml
├── docker-compose.yml
├── package.json
├── pyproject.toml
├── python/
│   └── nav/
│       ├── Snmp/
│       │   ├── __init__.py
│       │   ├── defines.py
│       │   ├── errors.py
│       │   ├── profile.py
│       │   └── pynetsnmp.py
│       ├── __init__.py
│       ├── activeipcollector/
│       │   ├── __init__.py
│       │   ├── collector.py
│       │   └── manager.py
│       ├── alertengine/
│       │   ├── __init__.py
│       │   ├── base.py
│       │   └── dispatchers/
│       │       ├── __init__.py
│       │       ├── email_dispatcher.py
│       │       ├── slack_dispatcher.py
│       │       └── sms_dispatcher.py
│       ├── arnold.py
│       ├── asyncdns.py
│       ├── auditlog/
│       │   ├── __init__.py
│       │   ├── api.py
│       │   ├── apps.py
│       │   ├── models.py
│       │   ├── urls.py
│       │   ├── utils.py
│       │   └── views.py
│       ├── bin/
│       │   ├── __init__.py
│       │   ├── alertengine.py
│       │   ├── autoenable.py
│       │   ├── cisco_auth_sessions.py
│       │   ├── collect_active_ip.py
│       │   ├── dhcpstats.py
│       │   ├── emailreports.py
│       │   ├── eventengine.py
│       │   ├── ipdevpolld.py
│       │   ├── logengine.py
│       │   ├── macwatch.py
│       │   ├── mailin.py
│       │   ├── maintengine.py
│       │   ├── navcheckservice.py
│       │   ├── navclean.py
│       │   ├── navdf.py
│       │   ├── navdump.py
│       │   ├── naventity.py
│       │   ├── navmain.py
│       │   ├── navoidverify.py
│       │   ├── navrefresh.py
│       │   ├── navsnmp.py
│       │   ├── navstats.py
│       │   ├── navsynctypes.py
│       │   ├── navtopology.py
│       │   ├── navuser.py
│       │   ├── netbiostracker.py
│       │   ├── pping.py
│       │   ├── radiusparser.py
│       │   ├── servicemon.py
│       │   ├── smsd.py
│       │   ├── snmptrapd.py
│       │   ├── sortedstats_cacher.py
│       │   ├── start_arnold.py
│       │   ├── t1000.py
│       │   ├── thresholdmon.py
│       │   └── update_ouis.py
│       ├── bitvector.py
│       ├── bootstrap.py
│       ├── buildconf.py
│       ├── bulkimport.py
│       ├── bulkparse.py
│       ├── colors.py
│       ├── config/
│       │   ├── __init__.py
│       │   └── toml.py
│       ├── daemon.py
│       ├── db/
│       │   └── __init__.py
│       ├── debug.py
│       ├── dhcpstats/
│       │   ├── __init__.py
│       │   ├── common.py
│       │   ├── errors.py
│       │   └── kea_dhcp.py
│       ├── django/
│       │   ├── __init__.py
│       │   ├── apps.py
│       │   ├── context_processors.py
│       │   ├── decorators.py
│       │   ├── defaults.py
│       │   ├── filter.py
│       │   ├── formats/
│       │   │   ├── __init__.py
│       │   │   └── en/
│       │   │       ├── __init__.py
│       │   │       └── formats.py
│       │   ├── forms.py
│       │   ├── legacy.py
│       │   ├── manage.py
│       │   ├── settings.py
│       │   ├── templatetags/
│       │   │   ├── __init__.py
│       │   │   ├── breadcrumbs.py
│       │   │   ├── date_and_time.py
│       │   │   ├── forms.py
│       │   │   ├── info.py
│       │   │   ├── maintenance.py
│       │   │   ├── popover.py
│       │   │   ├── port_info.py
│       │   │   ├── portadmin.py
│       │   │   ├── query.py
│       │   │   ├── radius.py
│       │   │   ├── report.py
│       │   │   ├── silent_include.py
│       │   │   ├── string_manipulation.py
│       │   │   ├── thresholds.py
│       │   │   ├── tools.py
│       │   │   └── watchdog.py
│       │   ├── urls.py
│       │   ├── utils.py
│       │   ├── validators.py
│       │   ├── views.py
│       │   └── widgets.py
│       ├── enterprise/
│       │   ├── __init__.py
│       │   └── ids.py
│       ├── errors.py
│       ├── etc/
│       │   ├── alertengine.conf
│       │   ├── alertmsg/
│       │   │   ├── aggregateLinkState/
│       │   │   │   ├── linkDegraded-email.txt
│       │   │   │   ├── linkDegraded-sms.txt
│       │   │   │   ├── linkRestored-email.txt
│       │   │   │   └── linkRestored-sms-txt
│       │   │   ├── apState/
│       │   │   │   ├── apDown-email.txt
│       │   │   │   ├── apDown-sms.txt
│       │   │   │   ├── apUp-email.txt
│       │   │   │   └── apUp-sms.txt
│       │   │   ├── bgpState/
│       │   │   │   ├── bgpAdmDown-email.txt
│       │   │   │   ├── bgpAdmDown-sms.txt
│       │   │   │   ├── bgpDown-email.txt
│       │   │   │   ├── bgpDown-sms.txt
│       │   │   │   ├── bgpEstablished-email.txt
│       │   │   │   └── bgpEstablished-sms.txt
│       │   │   ├── boxRestart/
│       │   │   │   ├── coldStart-email.txt
│       │   │   │   └── coldStart-sms.txt
│       │   │   ├── boxState/
│       │   │   │   ├── boxDown-email.txt
│       │   │   │   ├── boxDown-sms.txt
│       │   │   │   ├── boxDownWarning-email.txt
│       │   │   │   ├── boxDownWarning-sms.txt
│       │   │   │   ├── boxShadow-email.txt
│       │   │   │   ├── boxShadow-sms.txt
│       │   │   │   ├── boxShadowWarning-email.txt
│       │   │   │   ├── boxShadowWarning-sms.txt
│       │   │   │   ├── boxSunny-email.txt
│       │   │   │   ├── boxSunny-sms.txt
│       │   │   │   ├── boxUp-email.txt
│       │   │   │   └── boxUp-sms.txt
│       │   │   ├── chassisState/
│       │   │   │   ├── chassisDown-email.txt
│       │   │   │   ├── chassisDown-sms.txt
│       │   │   │   ├── chassisUp-email.txt
│       │   │   │   └── chassisUp-sms.txt
│       │   │   ├── default-email.txt
│       │   │   ├── default-sms.txt
│       │   │   ├── deviceNotice/
│       │   │   │   ├── deviceError-email.txt
│       │   │   │   ├── deviceError-sms.txt
│       │   │   │   ├── deviceFwUpgrade-email.txt
│       │   │   │   ├── deviceFwUpgrade-sms.txt
│       │   │   │   ├── deviceHwUpgrade-email.txt
│       │   │   │   ├── deviceHwUpgrade-sms.txt
│       │   │   │   ├── deviceSwUpgrade-email.txt
│       │   │   │   └── deviceSwUpgrade-sms.txt
│       │   │   ├── deviceState/
│       │   │   │   ├── deviceDeletedChassis-email.txt
│       │   │   │   ├── deviceDeletedChassis-sms.txt
│       │   │   │   ├── deviceDeletedFan-email.txt
│       │   │   │   ├── deviceDeletedFan-sms.txt
│       │   │   │   ├── deviceDeletedModule-email.txt
│       │   │   │   ├── deviceDeletedModule-sms.txt
│       │   │   │   ├── deviceDeletedPsu-email.txt
│       │   │   │   ├── deviceDeletedPsu-sms.txt
│       │   │   │   ├── deviceNewChassis-email.txt
│       │   │   │   ├── deviceNewChassis-sms.txt
│       │   │   │   ├── deviceNewFan-email.txt
│       │   │   │   ├── deviceNewFan-sms.txt
│       │   │   │   ├── deviceNewModule-email.txt
│       │   │   │   ├── deviceNewModule-sms.txt
│       │   │   │   ├── deviceNewPsu-email.txt
│       │   │   │   └── deviceNewPsu-sms.txt
│       │   │   ├── fanState/
│       │   │   │   ├── fanNotOK-email.txt
│       │   │   │   ├── fanNotOK-sms.txt
│       │   │   │   ├── fanOK-email.txt
│       │   │   │   └── fanOK-sms.txt
│       │   │   ├── info/
│       │   │   │   ├── deviceHwVerChanged-email.txt
│       │   │   │   ├── deviceHwVerChanged-sms.txt
│       │   │   │   ├── dnsMismatch-email.txt
│       │   │   │   ├── dnsMismatch-sms.txt
│       │   │   │   ├── macWarning-email.txt
│       │   │   │   ├── macWarning-sms.txt
│       │   │   │   ├── serialChanged-email.txt
│       │   │   │   └── serialChanged-sms.txt
│       │   │   ├── juniperRedAlarmState/
│       │   │   │   ├── juniperRedAlarmOff-email.txt
│       │   │   │   ├── juniperRedAlarmOff-sms.txt
│       │   │   │   ├── juniperRedAlarmOn-email.txt
│       │   │   │   └── juniperRedAlarmOn-sms.txt
│       │   │   ├── juniperYellowAlarmState/
│       │   │   │   ├── juniperYellowAlarmOff-email.txt
│       │   │   │   ├── juniperYellowAlarmOff-sms.txt
│       │   │   │   ├── juniperYellowAlarmOn-email.txt
│       │   │   │   └── juniperYellowAlarmOn-sms.txt
│       │   │   ├── kake/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── linkState/
│       │   │   │   ├── linkDown-email.txt
│       │   │   │   ├── linkDown-sms.txt
│       │   │   │   ├── linkUp-email.txt
│       │   │   │   └── linkUp-sms.txt
│       │   │   ├── maintenanceState/
│       │   │   │   ├── offMaintenance-email.txt
│       │   │   │   ├── offMaintenance-sms.txt
│       │   │   │   ├── onMaintenance-email.txt
│       │   │   │   └── onMaintenance-sms.txt
│       │   │   ├── moduleState/
│       │   │   │   ├── moduleDown-email.txt
│       │   │   │   ├── moduleDown-sms.txt
│       │   │   │   ├── moduleDownWarning-email.txt
│       │   │   │   ├── moduleDownWarning-sms.txt
│       │   │   │   ├── moduleUp-email.txt
│       │   │   │   └── moduleUp-sms.txt
│       │   │   ├── psuState/
│       │   │   │   ├── psuNotOK-email.txt
│       │   │   │   ├── psuNotOK-sms.txt
│       │   │   │   ├── psuOK-email.txt
│       │   │   │   └── psuOK-sms.txt
│       │   │   ├── serviceState/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── snmpAgentState/
│       │   │   │   ├── snmpAgentDown-email.txt
│       │   │   │   ├── snmpAgentDown-sms.txt
│       │   │   │   ├── snmpAgentUp-email.txt
│       │   │   │   └── snmpAgentUp-sms.txt
│       │   │   ├── thresholdState/
│       │   │   │   ├── belowThreshold-email.txt
│       │   │   │   ├── belowThreshold-sms.txt
│       │   │   │   ├── exceededThreshold-email.txt
│       │   │   │   └── exceededThreshold-sms.txt
│       │   │   ├── upsPowerState/
│       │   │   │   ├── upsOnBatteryPower-email.txt
│       │   │   │   ├── upsOnBatteryPower-sms.txt
│       │   │   │   ├── upsOnUtilityPower-email.txt
│       │   │   │   └── upsOnUtilityPower-sms.txt
│       │   │   ├── weathergoose_airflow/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_humidity/
│       │   │   │   ├── cmClimateHumidityNOTIFY-email.txt
│       │   │   │   ├── cmClimateHumidityNOTIFY-sms.txt
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_light/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_sound/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   ├── weathergoose_temperature/
│       │   │   │   ├── default-email.txt
│       │   │   │   └── default-sms.txt
│       │   │   └── whatsup/
│       │   │       ├── default-email.txt
│       │   │       └── default-sms.txt
│       │   ├── alertprofiles/
│       │   │   ├── README
│       │   │   ├── five_periods.conf
│       │   │   ├── one_period.conf
│       │   │   └── three_periods.conf
│       │   ├── apache/
│       │   │   └── apache.conf.example
│       │   ├── arnold/
│       │   │   ├── arnold.conf
│       │   │   ├── mailtemplates/
│       │   │   │   └── README
│       │   │   └── nonblock.conf
│       │   ├── cron.d/
│       │   │   ├── activeip
│       │   │   ├── dbclean
│       │   │   ├── emailreports
│       │   │   ├── logengine
│       │   │   ├── mactrace
│       │   │   ├── maintengine
│       │   │   ├── navdhcpstats
│       │   │   ├── navoui
│       │   │   ├── navstats
│       │   │   ├── netbiostracker
│       │   │   ├── sortedstats_cacher
│       │   │   ├── thresholdmon
│       │   │   └── topology
│       │   ├── daemons.yml
│       │   ├── db.conf
│       │   ├── dhcpstats.conf
│       │   ├── eventengine.conf
│       │   ├── fillthresholds.conf
│       │   ├── geomap/
│       │   │   ├── config.py
│       │   │   ├── popup_network.html
│       │   │   ├── popup_network_open.html
│       │   │   ├── popup_place.html
│       │   │   └── popup_place_open.html
│       │   ├── graphite/
│       │   │   ├── README
│       │   │   ├── storage-aggregation.conf
│       │   │   └── storage-schemas.conf
│       │   ├── graphite.conf
│       │   ├── ipdevpoll.conf
│       │   ├── l2trace.conf
│       │   ├── logger.conf
│       │   ├── logging.conf
│       │   ├── mailin.conf
│       │   ├── nav.conf
│       │   ├── navstats.conf
│       │   ├── netbiostracker.conf
│       │   ├── portadmin/
│       │   │   └── portadmin.conf
│       │   ├── pping.conf
│       │   ├── report/
│       │   │   ├── front.html
│       │   │   └── report.conf.d/
│       │   │       ├── report.conf
│       │   │       └── report.local.conf
│       │   ├── seeddb.conf
│       │   ├── servicemon.conf
│       │   ├── severity.yml
│       │   ├── smsd.conf
│       │   ├── snmptrapd.conf
│       │   ├── sortedstats.conf
│       │   ├── toolbox/
│       │   │   ├── alertprofiles.tool
│       │   │   ├── arnold.tool
│       │   │   ├── auditlog.tool
│       │   │   ├── business.tool
│       │   │   ├── devicehistory.tool
│       │   │   ├── geomap.tool
│       │   │   ├── info.tool
│       │   │   ├── interface_browser.tool
│       │   │   ├── ipam.tool
│       │   │   ├── ipdevinfo.tool
│       │   │   ├── l2trace.tool
│       │   │   ├── logger.tool
│       │   │   ├── machinetracker.tool
│       │   │   ├── macwatch.tool
│       │   │   ├── maintenance.tool
│       │   │   ├── messages.tool
│       │   │   ├── neighbors.tool
│       │   │   ├── netmap.tool
│       │   │   ├── networkexplorer.tool
│       │   │   ├── portadmin.tool
│       │   │   ├── radius.tool
│       │   │   ├── report.tool
│       │   │   ├── seeddb.tool
│       │   │   ├── stats.tool
│       │   │   ├── status.tool
│       │   │   ├── threshold.tool
│       │   │   ├── useradmin.tool
│       │   │   └── watchdog.tool
│       │   └── webfront/
│       │       ├── authentication.toml
│       │       ├── contact-information.txt
│       │       ├── jwt.conf
│       │       ├── nav-links.conf
│       │       ├── webfront.conf
│       │       ├── welcome-anonymous.txt
│       │       └── welcome-registered.txt
│       ├── event.py
│       ├── event2.py
│       ├── eventengine/
│       │   ├── __init__.py
│       │   ├── alerts.py
│       │   ├── config.py
│       │   ├── daemon.py
│       │   ├── engine.py
│       │   ├── export.py
│       │   ├── plugin.py
│       │   ├── plugins/
│       │   │   ├── __init__.py
│       │   │   ├── aggregatelinkstate.py
│       │   │   ├── bgpstate.py
│       │   │   ├── boxstate.py
│       │   │   ├── delayedstate.py
│       │   │   ├── juniperalertcount.py
│       │   │   ├── linkstate.py
│       │   │   ├── maintenancestate.py
│       │   │   ├── modulestate.py
│       │   │   ├── servicestate.py
│       │   │   ├── snmpagentstate.py
│       │   │   ├── thresholdstate.py
│       │   │   └── upgrade.py
│       │   ├── severity.py
│       │   ├── topology.py
│       │   └── unresolved.py
│       ├── ip.py
│       ├── ipdevpoll/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── control.py
│       │   ├── daemon.py
│       │   ├── dataloader.py
│       │   ├── db.py
│       │   ├── descrparsers.py
│       │   ├── epollreactor2.py
│       │   ├── jobs.py
│       │   ├── log.py
│       │   ├── neighbor.py
│       │   ├── plugins/
│       │   │   ├── __init__.py
│       │   │   ├── arp.py
│       │   │   ├── bgp.py
│       │   │   ├── bridge.py
│       │   │   ├── cam.py
│       │   │   ├── cdp.py
│       │   │   ├── ciscovlan.py
│       │   │   ├── debugging.py
│       │   │   ├── dnsname.py
│       │   │   ├── dot1q.py
│       │   │   ├── entity.py
│       │   │   ├── extremevlan.py
│       │   │   ├── interfaces.py
│       │   │   ├── juniperalarm.py
│       │   │   ├── juniperdot1q.py
│       │   │   ├── linkaggregate.py
│       │   │   ├── linkstate.py
│       │   │   ├── lldp.py
│       │   │   ├── modules.py
│       │   │   ├── paloaltoarp.py
│       │   │   ├── poe.py
│       │   │   ├── prefix.py
│       │   │   ├── propserial.py
│       │   │   ├── psu.py
│       │   │   ├── psuwatch.py
│       │   │   ├── sensors.py
│       │   │   ├── snmpcheck.py
│       │   │   ├── staticroutes.py
│       │   │   ├── statmulticast.py
│       │   │   ├── statports.py
│       │   │   ├── statsensors.py
│       │   │   ├── statsystem.py
│       │   │   ├── system.py
│       │   │   ├── typeoid.py
│       │   │   ├── uptime.py
│       │   │   └── virtualrouter.py
│       │   ├── pool.py
│       │   ├── schedule.py
│       │   ├── shadows/
│       │   │   ├── __init__.py
│       │   │   ├── adjacency.py
│       │   │   ├── cam.py
│       │   │   ├── entity.py
│       │   │   ├── gwpeers.py
│       │   │   ├── interface.py
│       │   │   ├── netbox.py
│       │   │   ├── prefix.py
│       │   │   └── swportblocked.py
│       │   ├── signals.py
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   ├── common.py
│       │   │   └── pynetsnmp.py
│       │   ├── storage.py
│       │   ├── timestamps.py
│       │   └── utils.py
│       ├── junos/
│       │   ├── __init__.py
│       │   ├── nav_views.py
│       │   └── nav_views.yml
│       ├── jwtconf.py
│       ├── logengine.py
│       ├── logs.py
│       ├── macaddress.py
│       ├── mailin/
│       │   ├── __init__.py
│       │   └── plugins/
│       │       ├── __init__.py
│       │       ├── kake.py
│       │       └── whatsup.py
│       ├── maintengine.py
│       ├── metrics/
│       │   ├── __init__.py
│       │   ├── carbon.py
│       │   ├── data.py
│       │   ├── errors.py
│       │   ├── graphs.py
│       │   ├── lookup.py
│       │   ├── names.py
│       │   ├── templates.py
│       │   └── thresholds.py
│       ├── mibs/
│       │   ├── __init__.py
│       │   ├── alcatel_ind1_port_mib.py
│       │   ├── arista_vrf_mib.py
│       │   ├── bgp4_mib.py
│       │   ├── bgp4_v2_mib_juniper.py
│       │   ├── bridge_mib.py
│       │   ├── cd6c_mib.py
│       │   ├── cisco_auth_framework_mib.py
│       │   ├── cisco_bgp4_mib.py
│       │   ├── cisco_c2900_mib.py
│       │   ├── cisco_cdp_mib.py
│       │   ├── cisco_enhanced_memory_pool_mib.py
│       │   ├── cisco_entity_fru_control_mib.py
│       │   ├── cisco_entity_sensor_mib.py
│       │   ├── cisco_envmon_mib.py
│       │   ├── cisco_hsrp_mib.py
│       │   ├── cisco_ietf_ip_mib.py
│       │   ├── cisco_memory_pool_mib.py
│       │   ├── cisco_power_ethernet_ext_mib.py
│       │   ├── cisco_process_mib.py
│       │   ├── cisco_stack_mib.py
│       │   ├── cisco_vlan_iftable_relationship_mib.py
│       │   ├── cisco_vlan_membership_mib.py
│       │   ├── cisco_vtp_mib.py
│       │   ├── comet.py
│       │   ├── comet_t3611.py
│       │   ├── coriant_groove_mib.py
│       │   ├── cpqpower_mib.py
│       │   ├── eltek_distributed_mib.py
│       │   ├── entity_mib.py
│       │   ├── entity_sensor_mib.py
│       │   ├── esswitch_mib.py
│       │   ├── etherlike_mib.py
│       │   ├── extreme_vlan_mib.py
│       │   ├── geist_mibv3.py
│       │   ├── geist_mibv4.py
│       │   ├── hp_httpmanageable_mib.py
│       │   ├── hpicf_fan_mib.py
│       │   ├── hpicf_powersupply_mib.py
│       │   ├── ibm_pdu_mib.py
│       │   ├── ieee8023_lag_mib.py
│       │   ├── if_mib.py
│       │   ├── ip_forward_mib.py
│       │   ├── ip_mib.py
│       │   ├── ipv6_mib.py
│       │   ├── itw_mib.py
│       │   ├── itw_mibv3.py
│       │   ├── itw_mibv4.py
│       │   ├── juniper_alarm_mib.py
│       │   ├── juniper_dom_mib.py
│       │   ├── juniper_mib.py
│       │   ├── lldp_mib.py
│       │   ├── mg_snmp_ups_mib.py
│       │   ├── mibretriever.py
│       │   ├── netswitch_mib.py
│       │   ├── old_cisco_cpu_mib.py
│       │   ├── pdu2_mib.py
│       │   ├── power_ethernet_mib.py
│       │   ├── powernet_mib.py
│       │   ├── pwt_3phase_mibv1.py
│       │   ├── qbridge_mib.py
│       │   ├── rittal_cmc_iii.py
│       │   ├── snmpv2_mib.py
│       │   ├── spagent_mib.py
│       │   ├── statistics_mib.py
│       │   ├── types.py
│       │   ├── ups_mib.py
│       │   ├── vrrp_mib.py
│       │   ├── wlsx_systemext_mib.py
│       │   └── xups_mib.py
│       ├── models/
│       │   ├── __init__.py
│       │   ├── api.py
│       │   ├── apps.py
│       │   ├── arnold.py
│       │   ├── cabling.py
│       │   ├── event.py
│       │   ├── fields.py
│       │   ├── images.py
│       │   ├── logger.py
│       │   ├── manage.py
│       │   ├── models.py
│       │   ├── msgmaint.py
│       │   ├── oui.py
│       │   ├── profiles.py
│       │   ├── rack.py
│       │   ├── service.py
│       │   ├── sql/
│       │   │   ├── README
│       │   │   ├── baseline/
│       │   │   │   ├── arnold.sql
│       │   │   │   ├── indexes.sql
│       │   │   │   ├── logger.sql
│       │   │   │   ├── manage.sql
│       │   │   │   ├── manage2.sql
│       │   │   │   ├── navprofiles.sql
│       │   │   │   ├── radius.sql
│       │   │   │   └── types.sql
│       │   │   ├── changes/
│       │   │   │   ├── sc.03.08.0000.sql
│       │   │   │   ├── sc.03.08.0001.sql
│       │   │   │   ├── sc.03.09.0001.sql
│       │   │   │   ├── sc.03.09.0002.sql
│       │   │   │   ├── sc.03.09.0003.sql
│       │   │   │   ├── sc.03.09.0004.sql
│       │   │   │   ├── sc.03.09.0005.sql
│       │   │   │   ├── sc.03.09.0006.sql
│       │   │   │   ├── sc.03.10.0001.sql
│       │   │   │   ├── sc.03.10.0002.sql
│       │   │   │   ├── sc.03.10.0003.sql
│       │   │   │   ├── sc.03.10.0004.sql
│       │   │   │   ├── sc.03.10.0005.sql
│       │   │   │   ├── sc.03.10.0006.sql
│       │   │   │   ├── sc.03.10.0007.sql
│       │   │   │   ├── sc.03.11.0001.sql
│       │   │   │   ├── sc.03.11.0002.sql
│       │   │   │   ├── sc.03.11.0003.sql
│       │   │   │   ├── sc.03.11.0004.sql
│       │   │   │   ├── sc.03.11.0005.sql
│       │   │   │   ├── sc.03.11.0006.sql
│       │   │   │   ├── sc.03.11.0007.sql
│       │   │   │   ├── sc.03.11.0008.sql
│       │   │   │   ├── sc.03.11.0009.sql
│       │   │   │   ├── sc.03.11.0010.sql
│       │   │   │   ├── sc.03.11.0011.sql
│       │   │   │   ├── sc.03.11.0012.sql
│       │   │   │   ├── sc.03.11.0013.sql
│       │   │   │   ├── sc.03.12.0001.sql
│       │   │   │   ├── sc.03.12.0002.sql
│       │   │   │   ├── sc.03.12.0003.sql
│       │   │   │   ├── sc.03.12.0004.sql
│       │   │   │   ├── sc.03.12.0005.sql
│       │   │   │   ├── sc.03.12.0025.sql
│       │   │   │   ├── sc.03.12.0026.sql
│       │   │   │   ├── sc.03.12.0027.sql
│       │   │   │   ├── sc.03.12.0028.sql
│       │   │   │   ├── sc.03.12.0050.sql
│       │   │   │   ├── sc.03.12.0051.sql
│       │   │   │   ├── sc.03.12.0052.sql
│       │   │   │   ├── sc.03.12.0053.sql
│       │   │   │   ├── sc.03.12.0054.sql
│       │   │   │   ├── sc.03.12.0100.sql
│       │   │   │   ├── sc.03.12.0101.sql
│       │   │   │   ├── sc.03.12.0102.sql
│       │   │   │   ├── sc.03.12.0103.sql
│       │   │   │   ├── sc.03.12.0104.sql
│       │   │   │   ├── sc.03.12.0105.sql
│       │   │   │   ├── sc.03.12.0106.sql
│       │   │   │   ├── sc.03.12.0107.sql
│       │   │   │   ├── sc.03.12.0110.sql
│       │   │   │   ├── sc.03.12.0111.sql
│       │   │   │   ├── sc.03.13.0001.sql
│       │   │   │   ├── sc.03.13.0002.sql
│       │   │   │   ├── sc.03.13.0010.sql
│       │   │   │   ├── sc.03.13.0011.sql
│       │   │   │   ├── sc.03.13.0012.sql
│       │   │   │   ├── sc.03.13.0013.sql
│       │   │   │   ├── sc.03.13.0014.sql
│       │   │   │   ├── sc.03.13.0015.sql
│       │   │   │   ├── sc.03.14.0001.sql
│       │   │   │   ├── sc.03.14.0002.sql
│       │   │   │   ├── sc.03.14.0003.sql
│       │   │   │   ├── sc.03.14.0004.sql
│       │   │   │   ├── sc.03.14.0005.sql
│       │   │   │   ├── sc.03.14.0006.sql
│       │   │   │   ├── sc.03.14.0007.sql
│       │   │   │   ├── sc.03.15.0001.sql
│       │   │   │   ├── sc.03.15.0002.sql
│       │   │   │   ├── sc.03.15.0003.sql
│       │   │   │   ├── sc.03.15.0004.sql
│       │   │   │   ├── sc.03.15.0050.sql
│       │   │   │   ├── sc.03.15.0070.sql
│       │   │   │   ├── sc.03.15.0071.sql
│       │   │   │   ├── sc.03.15.0072.sql
│       │   │   │   ├── sc.03.15.0100.sql
│       │   │   │   ├── sc.03.15.0101.sql
│       │   │   │   ├── sc.03.15.0102.sql
│       │   │   │   ├── sc.03.15.0103.sql
│       │   │   │   ├── sc.03.15.0104.sql
│       │   │   │   ├── sc.03.15.0105.sql
│       │   │   │   ├── sc.03.15.0200.sql
│       │   │   │   ├── sc.03.15.0201.sql
│       │   │   │   ├── sc.04.00.0001.sql
│       │   │   │   ├── sc.04.00.0002.sql
│       │   │   │   ├── sc.04.00.0003.sql
│       │   │   │   ├── sc.04.00.0004.sql
│       │   │   │   ├── sc.04.00.0010.sql
│       │   │   │   ├── sc.04.00.0011.sql
│       │   │   │   ├── sc.04.00.0012.sql
│       │   │   │   ├── sc.04.00.0013.sql
│       │   │   │   ├── sc.04.00.0014.sql
│       │   │   │   ├── sc.04.00.0015.sql
│       │   │   │   ├── sc.04.00.0016.sql
│       │   │   │   ├── sc.04.00.0017.sql
│       │   │   │   ├── sc.04.00.0018.sql
│       │   │   │   ├── sc.04.00.0019.sql
│       │   │   │   ├── sc.04.00.0020.sql
│       │   │   │   ├── sc.04.01.0001.sql
│       │   │   │   ├── sc.04.01.0002.sql
│       │   │   │   ├── sc.04.01.0003.sql
│       │   │   │   ├── sc.04.02.0001.sql
│       │   │   │   ├── sc.04.02.0010.sql
│       │   │   │   ├── sc.04.02.0020.sql
│       │   │   │   ├── sc.04.02.0050.sql
│       │   │   │   ├── sc.04.02.0055.sql
│       │   │   │   ├── sc.04.02.0100.sql
│       │   │   │   ├── sc.04.02.0101.sql
│       │   │   │   ├── sc.04.02.0102.sql
│       │   │   │   ├── sc.04.02.0103.sql
│       │   │   │   ├── sc.04.02.0104.sql
│       │   │   │   ├── sc.04.03.0001.sql
│       │   │   │   ├── sc.04.03.0002.sql
│       │   │   │   ├── sc.04.03.0003.sql
│       │   │   │   ├── sc.04.03.0004.sql
│       │   │   │   ├── sc.04.03.0005.sql
│       │   │   │   ├── sc.04.03.0006.sql
│       │   │   │   ├── sc.04.03.0050.sql
│       │   │   │   ├── sc.04.03.0051.sql
│       │   │   │   ├── sc.04.03.0060.sql
│       │   │   │   ├── sc.04.03.0061.sql
│       │   │   │   ├── sc.04.03.0070.sql
│       │   │   │   ├── sc.04.04.0001.sql
│       │   │   │   ├── sc.04.04.0050.sql
│       │   │   │   ├── sc.04.04.0051.sql
│       │   │   │   ├── sc.04.04.0052.sql
│       │   │   │   ├── sc.04.04.0053.sql
│       │   │   │   ├── sc.04.05.0050.sql
│       │   │   │   ├── sc.04.06.0001.sql
│       │   │   │   ├── sc.04.06.0002.sql
│       │   │   │   ├── sc.04.06.0003.sql
│       │   │   │   ├── sc.04.06.0004.sql
│       │   │   │   ├── sc.04.06.0050.sql
│       │   │   │   ├── sc.04.06.0051.sql
│       │   │   │   ├── sc.04.06.0052.sql
│       │   │   │   ├── sc.04.06.0053.sql
│       │   │   │   ├── sc.04.06.0054.sql
│       │   │   │   ├── sc.04.06.0055.sql
│       │   │   │   ├── sc.04.06.0056.sql
│       │   │   │   ├── sc.04.07.0001.sql
│       │   │   │   ├── sc.04.07.0002.sql
│       │   │   │   ├── sc.04.07.0003.sql
│       │   │   │   ├── sc.04.07.0010.sql
│       │   │   │   ├── sc.04.07.0011.sql
│       │   │   │   ├── sc.04.07.0050.sql
│       │   │   │   ├── sc.04.07.0060.sql
│       │   │   │   ├── sc.04.07.0070.sql
│       │   │   │   ├── sc.04.07.0100.sql
│       │   │   │   ├── sc.04.07.0110.sql
│       │   │   │   ├── sc.04.08.0001.sql
│       │   │   │   ├── sc.04.08.0010.sql
│       │   │   │   ├── sc.04.08.0020.sql
│       │   │   │   ├── sc.04.08.0050.sql
│       │   │   │   ├── sc.04.08.0080.sql
│       │   │   │   ├── sc.04.08.0210.sql
│       │   │   │   ├── sc.04.08.0310.sql
│       │   │   │   ├── sc.04.08.0410.sql
│       │   │   │   ├── sc.04.08.0510.sql
│       │   │   │   ├── sc.04.08.1000.sql
│       │   │   │   ├── sc.04.08.1001.sql
│       │   │   │   ├── sc.04.08.3685.sql
│       │   │   │   ├── sc.04.09.0001.sql
│       │   │   │   ├── sc.04.09.0050.sql
│       │   │   │   ├── sc.04.09.0100.sql
│       │   │   │   ├── sc.04.09.0110.sql
│       │   │   │   ├── sc.04.09.0200.sql
│       │   │   │   ├── sc.05.00.0001.sql
│       │   │   │   ├── sc.05.00.0010.sql
│       │   │   │   ├── sc.05.00.0011.sql
│       │   │   │   ├── sc.05.00.0012.sql
│       │   │   │   ├── sc.05.00.0020.sql
│       │   │   │   ├── sc.05.00.0030.sql
│       │   │   │   ├── sc.05.00.0050.sql
│       │   │   │   ├── sc.05.00.0060.sql
│       │   │   │   ├── sc.05.00.0070.sql
│       │   │   │   ├── sc.05.00.0080.sql
│       │   │   │   ├── sc.05.00.0100.sql
│       │   │   │   ├── sc.05.01.0001.sql
│       │   │   │   ├── sc.05.02.0001.sql
│       │   │   │   ├── sc.05.02.0002.sql
│       │   │   │   ├── sc.05.04.0001.sql
│       │   │   │   ├── sc.05.04.0002.sql
│       │   │   │   ├── sc.05.04.0003.sql
│       │   │   │   ├── sc.05.05.0001.sql
│       │   │   │   ├── sc.05.05.0002.sql
│       │   │   │   ├── sc.05.07.0001.sql
│       │   │   │   ├── sc.05.07.0002.sql
│       │   │   │   ├── sc.05.10.0001.sql
│       │   │   │   ├── sc.05.10.0002.sql
│       │   │   │   ├── sc.05.11.0001.sql
│       │   │   │   ├── sc.05.11.0002.sql
│       │   │   │   ├── sc.05.12.0001.sql
│       │   │   │   ├── sc.05.12.0002.sql
│       │   │   │   ├── sc.05.12.0010.sql
│       │   │   │   ├── sc.05.12.0100.sql
│       │   │   │   ├── sc.05.14.0001.sql
│       │   │   │   ├── sc.05.14.0002.sql
│       │   │   │   ├── sc.05.14.0003.sql
│       │   │   │   ├── sc.05.14.0004.sql
│       │   │   │   ├── sc.05.14.0101.sql
│       │   │   │   ├── sc.05.14.0102.sql
│       │   │   │   ├── sc.05.14.0103.sql
│       │   │   │   ├── sc.05.15.0001.sql
│       │   │   │   ├── sc.05.15.0502.sql
│       │   │   │   ├── sc.05.16.0001.sql
│       │   │   │   ├── sc.05.17.0002.sql
│       │   │   │   ├── sc.05.17.0003.sql
│       │   │   │   ├── sc.05.17.0005.sql
│       │   │   │   ├── sc.05.18.0501.sql
│       │   │   │   ├── sc.05.18.0502.sql
│       │   │   │   ├── sc.05.18.0503.sql
│       │   │   │   ├── sc.05.18.0505.sql
│       │   │   │   └── sc.05.18.0506.sql
│       │   │   ├── historic-upgrades/
│       │   │   │   ├── 3.0_beta10.sql
│       │   │   │   ├── 3.0_beta7.sql
│       │   │   │   ├── 3.0_beta8.sql
│       │   │   │   ├── 3.0_rc1.sql
│       │   │   │   ├── 3.1.0.sql
│       │   │   │   ├── 3.2.0.sql
│       │   │   │   ├── 3.3.0.sql
│       │   │   │   ├── 3.4.0.sql
│       │   │   │   ├── 3.4.2.sql
│       │   │   │   ├── 3.5.0.sql
│       │   │   │   ├── 3.5.0b1.sql
│       │   │   │   ├── 3.5.0b2-hpfix.sql
│       │   │   │   ├── 3.5.0b2.sql
│       │   │   │   ├── 3.5.0b3.sql
│       │   │   │   ├── 3.6.0.sql
│       │   │   │   ├── 3.6.0b1.sql
│       │   │   │   ├── 3.6.0b3.sql
│       │   │   │   ├── 3.6.0b5.sql
│       │   │   │   ├── 3.6.0b6.sql
│       │   │   │   ├── 3.6.1.sql
│       │   │   │   ├── 3.7.0.sql
│       │   │   │   ├── 3.7.1.sql
│       │   │   │   ├── README
│       │   │   │   └── mergedb.sh
│       │   │   └── syncdb.py
│       │   └── thresholds.py
│       ├── napalm.py
│       ├── natsort.py
│       ├── netbiostracker/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   └── tracker.py
│       ├── netmap/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── metadata.py
│       │   ├── stubs/
│       │   │   └── __init__.py
│       │   ├── topology.py
│       │   └── traffic.py
│       ├── oidparsers.py
│       ├── oids.py
│       ├── pgdump.py
│       ├── pgsync.py
│       ├── portadmin/
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── handlers.py
│       │   ├── management.py
│       │   ├── napalm/
│       │   │   ├── __init__.py
│       │   │   ├── juniper.py
│       │   │   └── templates/
│       │   │       └── portadmin/
│       │   │           ├── junos-disable-interface.djt
│       │   │           ├── junos-disable-poe.djt
│       │   │           ├── junos-enable-poe.djt
│       │   │           ├── junos-set-access-port-vlan.djt
│       │   │           ├── junos-set-interface-description.djt
│       │   │           └── junos-set-trunk-port-vlans.djt
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── cisco.py
│       │   │   ├── dell.py
│       │   │   ├── h3c.py
│       │   │   └── hp.py
│       │   └── vlan.py
│       ├── pwhash.py
│       ├── report/
│       │   ├── IPtools.py
│       │   ├── IPtree.py
│       │   ├── __init__.py
│       │   ├── dbresult.py
│       │   ├── generator.py
│       │   ├── matrix.py
│       │   ├── matrixIPv4.py
│       │   ├── matrixIPv6.py
│       │   ├── metaIP.py
│       │   └── report.py
│       ├── smidumps/
│       │   ├── AIRESPACE-WIRELESS-MIB.py
│       │   ├── ALCATEL-IND1-PORT-MIB.py
│       │   ├── ARISTA-VRF-MIB.py
│       │   ├── BGP4-MIB.py
│       │   ├── BGP4-V2-MIB-JUNIPER.py
│       │   ├── BRIDGE-MIB.py
│       │   ├── CD6C.py
│       │   ├── CISCO-AUTH-FRAMEWORK-MIB.py
│       │   ├── CISCO-BGP4-MIB.py
│       │   ├── CISCO-C2900-MIB.py
│       │   ├── CISCO-CDP-MIB.py
│       │   ├── CISCO-ENHANCED-MEMPOOL-MIB.py
│       │   ├── CISCO-ENTITY-FRU-CONTROL-MIB.py
│       │   ├── CISCO-ENTITY-SENSOR-MIB.py
│       │   ├── CISCO-ENVMON-MIB.py
│       │   ├── CISCO-HSRP-MIB.py
│       │   ├── CISCO-IETF-IP-MIB.py
│       │   ├── CISCO-MEMORY-POOL-MIB.py
│       │   ├── CISCO-PAE-MIB.py
│       │   ├── CISCO-POWER-ETHERNET-EXT-MIB.py
│       │   ├── CISCO-PROCESS-MIB.py
│       │   ├── CISCO-STACK-MIB.py
│       │   ├── CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB.py
│       │   ├── CISCO-VLAN-MEMBERSHIP-MIB.py
│       │   ├── CISCO-VTP-MIB.py
│       │   ├── COMETMS-MIB.py
│       │   ├── CORIANT-GROOVE-MIB.py
│       │   ├── CPQPOWER-MIB.py
│       │   ├── DNOS-SWITCHING-MIB.py
│       │   ├── ELTEK-DISTRIBUTED-MIB.py
│       │   ├── ENTITY-MIB.py
│       │   ├── ENTITY-SENSOR-MIB.py
│       │   ├── EXTREME-VLAN-MIB.py
│       │   ├── EtherLike-MIB.py
│       │   ├── FAN-MIB.py
│       │   ├── GEIST-MIB-V3.py
│       │   ├── GEIST-V4-MIB.py
│       │   ├── IANA-ENTITY-MIB.py
│       │   ├── IBM-PDU-MIB.py
│       │   ├── IEEE8023-LAG-MIB.py
│       │   ├── IF-MIB.py
│       │   ├── IP-FORWARD-MIB.py
│       │   ├── IP-MIB.py
│       │   ├── IPV6-MIB.py
│       │   ├── IT-WATCHDOGS-MIB-V3.py
│       │   ├── IT-WATCHDOGS-MIB.py
│       │   ├── IT-WATCHDOGS-V4-MIB.py
│       │   ├── JUNIPER-ALARM-MIB.py
│       │   ├── JUNIPER-DOM-MIB.py
│       │   ├── JUNIPER-MIB.py
│       │   ├── LLDP-MIB.py
│       │   ├── MG-SNMP-UPS-MIB.py
│       │   ├── NETSWITCH-MIB.py
│       │   ├── OLD-CISCO-CPU-MIB.py
│       │   ├── P8541-MIB.py
│       │   ├── P8652-MIB.py
│       │   ├── PDU2-MIB.py
│       │   ├── POWER-ETHERNET-MIB.py
│       │   ├── POWERSUPPLY-MIB.py
│       │   ├── PWTv1-MIB.py
│       │   ├── PowerNet-MIB.py
│       │   ├── Q-BRIDGE-MIB.py
│       │   ├── RITTAL-CMC-III-MIB.py
│       │   ├── SEMI-MIB.py
│       │   ├── SNMPv2-MIB.py
│       │   ├── SPAGENT-MIB.py
│       │   ├── STAND-ALONE-ETHERNET-SWITCH-MIB.py
│       │   ├── STATISTICS-MIB.py
│       │   ├── T3611-MIB.py
│       │   ├── UPS-MIB.py
│       │   ├── VRRP-MIB.py
│       │   ├── WLSX-SYSTEMEXT-MIB.py
│       │   ├── XUPS-MIB.py
│       │   └── __init__.py
│       ├── smsd/
│       │   ├── __init__.py
│       │   ├── boostdispatcher.py
│       │   ├── debugdispatcher.py
│       │   ├── dispatcher.py
│       │   ├── gammudispatcher.py
│       │   ├── httpgetdispatcher.py
│       │   ├── navdbqueue.py
│       │   └── uninettmaildispatcher.py
│       ├── snmptrapd/
│       │   ├── __init__.py
│       │   ├── agent.py
│       │   ├── agent_pynetsnmp.py
│       │   ├── handlers/
│       │   │   ├── __init__.py
│       │   │   ├── airespace.py
│       │   │   ├── handlertemplate.py
│       │   │   ├── linkupdown.py
│       │   │   ├── ups.py
│       │   │   └── weathergoose.py
│       │   ├── plugin.py
│       │   └── trap.py
│       ├── startstop.py
│       ├── statemon/
│       │   ├── RunQueue.py
│       │   ├── __init__.py
│       │   ├── abstractchecker.py
│       │   ├── checker/
│       │   │   ├── DcChecker.py
│       │   │   ├── DhcpChecker.py
│       │   │   ├── DnsChecker.py
│       │   │   ├── DummyChecker.py
│       │   │   ├── FtpChecker.py
│       │   │   ├── HttpChecker.py
│       │   │   ├── HttpsChecker.py
│       │   │   ├── ImapChecker.py
│       │   │   ├── ImapsChecker.py
│       │   │   ├── LdapChecker.py
│       │   │   ├── MysqlChecker.py
│       │   │   ├── OracleChecker.py
│       │   │   ├── Pop3Checker.py
│       │   │   ├── PortChecker.py
│       │   │   ├── PostgresqlChecker.py
│       │   │   ├── RadiusChecker.py
│       │   │   ├── RpcChecker.py
│       │   │   ├── SmbChecker.py
│       │   │   ├── SmtpChecker.py
│       │   │   ├── SshChecker.py
│       │   │   ├── __init__.py
│       │   │   └── radius/
│       │   │       └── dictionary.rfc2865
│       │   ├── checkermap.py
│       │   ├── circbuf.py
│       │   ├── config.py
│       │   ├── db.py
│       │   ├── event.py
│       │   ├── icmppacket.py
│       │   ├── megaping.py
│       │   ├── netbox.py
│       │   └── statistics.py
│       ├── tableformat.py
│       ├── tests/
│       │   ├── __init__.py
│       │   └── cases.py
│       ├── thresholdmon.py
│       ├── topology/
│       │   ├── __init__.py
│       │   ├── analyze.py
│       │   ├── detector.py
│       │   ├── diff.py
│       │   ├── layer2.py
│       │   └── vlan.py
│       ├── toposort.py
│       ├── util.py
│       ├── watchdog/
│       │   ├── __init__.py
│       │   ├── tests.py
│       │   └── util.py
│       ├── web/
│       │   ├── __init__.py
│       │   ├── ajax/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── alertprofiles/
│       │   │   ├── __init__.py
│       │   │   ├── decorators.py
│       │   │   ├── forms.py
│       │   │   ├── shortcuts.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── api/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   ├── v1/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── alert_serializers.py
│       │   │   │   ├── auth.py
│       │   │   │   ├── fields.py
│       │   │   │   ├── filter_backends.py
│       │   │   │   ├── helpers/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── prefix_collector.py
│       │   │   │   ├── serializers.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   └── v2/
│       │   │       ├── __init__.py
│       │   │       └── urls.py
│       │   ├── apps.py
│       │   ├── arnold/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── auth/
│       │   │   ├── __init__.py
│       │   │   ├── allauth/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── adapter.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── backends.py
│       │   │   ├── ldap.py
│       │   │   ├── ldap_auth_backend.py
│       │   │   ├── middleware.py
│       │   │   ├── remote_user.py
│       │   │   ├── sudo.py
│       │   │   └── utils.py
│       │   ├── business/
│       │   │   ├── __init__.py
│       │   │   ├── reportengine.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── crispyforms.py
│       │   ├── devicehistory/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   ├── utils/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── componentsearch.py
│       │   │   │   ├── error.py
│       │   │   │   └── history.py
│       │   │   └── views.py
│       │   ├── geomap/
│       │   │   ├── __init__.py
│       │   │   ├── conf.py
│       │   │   ├── db.py
│       │   │   ├── features.py
│       │   │   ├── graph.py
│       │   │   ├── output_formats.py
│       │   │   ├── templatetags/
│       │   │   │   ├── __init__.py
│       │   │   │   └── geomap.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── graphite/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── info/
│       │   │   ├── __init__.py
│       │   │   ├── event/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── forms.py
│       │   │   ├── images/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── upload.py
│       │   │   │   ├── urls.py
│       │   │   │   ├── utils.py
│       │   │   │   └── views.py
│       │   │   ├── location/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── netboxgroup/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── prefix/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── room/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── urls.py
│       │   │   │   └── views.py
│       │   │   ├── searchproviders.py
│       │   │   ├── urls.py
│       │   │   ├── views.py
│       │   │   └── vlan/
│       │   │       ├── __init__.py
│       │   │       ├── urls.py
│       │   │       └── views.py
│       │   ├── interface_browser/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── ipam/
│       │   │   ├── __init__.py
│       │   │   ├── api.py
│       │   │   ├── prefix_tree.py
│       │   │   ├── urls.py
│       │   │   ├── util.py
│       │   │   └── views.py
│       │   ├── ipdevinfo/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── host_information.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── jwtgen.py
│       │   ├── l2trace/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── machinetracker/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── iprange.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── macwatch/
│       │   │   ├── __init__.py
│       │   │   ├── apps.py
│       │   │   ├── forms.py
│       │   │   ├── models.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── maintenance/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── message.py
│       │   ├── messages/
│       │   │   ├── __init__.py
│       │   │   ├── feeds.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── modals.py
│       │   ├── modpython.py
│       │   ├── navlets/
│       │   │   ├── __init__.py
│       │   │   ├── alert.py
│       │   │   ├── env_rack.py
│       │   │   ├── error.py
│       │   │   ├── feedreader.py
│       │   │   ├── forms.py
│       │   │   ├── gettingstarted.py
│       │   │   ├── graph.py
│       │   │   ├── linklist.py
│       │   │   ├── locationstatus.py
│       │   │   ├── machinetracker.py
│       │   │   ├── messages.py
│       │   │   ├── navblog.py
│       │   │   ├── pdu.py
│       │   │   ├── portadmin.py
│       │   │   ├── report.py
│       │   │   ├── room_map.py
│       │   │   ├── roomstatus.py
│       │   │   ├── sensor.py
│       │   │   ├── status2.py
│       │   │   ├── ups.py
│       │   │   ├── urls.py
│       │   │   ├── vlangraph.py
│       │   │   ├── watchdog.py
│       │   │   └── welcome.py
│       │   ├── neighbors/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── netmap/
│       │   │   ├── __init__.py
│       │   │   ├── api.py
│       │   │   ├── cache.py
│       │   │   ├── common.py
│       │   │   ├── graph.py
│       │   │   ├── mixins.py
│       │   │   ├── serializers.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── networkexplorer/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── mixins.py
│       │   │   ├── search.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── portadmin/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── templates/
│       │   │   │   └── portadmin/
│       │   │   │       └── aliasformat.html
│       │   │   ├── urls.py
│       │   │   ├── utils.py
│       │   │   └── views.py
│       │   ├── radius/
│       │   │   ├── __init__.py
│       │   │   ├── db.py
│       │   │   ├── forms.py
│       │   │   ├── radius_config.py
│       │   │   ├── radiuslib.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── report/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── sass/
│       │   │   ├── _fonts.scss
│       │   │   ├── _foundation.scss
│       │   │   ├── _navsettings.scss
│       │   │   ├── _normalize.scss
│       │   │   ├── _overrides.scss
│       │   │   ├── font-awesome/
│       │   │   │   ├── _animated.scss
│       │   │   │   ├── _bordered-pulled.scss
│       │   │   │   ├── _core.scss
│       │   │   │   ├── _fixed-width.scss
│       │   │   │   ├── _icons.scss
│       │   │   │   ├── _larger.scss
│       │   │   │   ├── _list.scss
│       │   │   │   ├── _mixins.scss
│       │   │   │   ├── _path.scss
│       │   │   │   ├── _rotated-flipped.scss
│       │   │   │   ├── _screen-reader.scss
│       │   │   │   ├── _spinning.scss
│       │   │   │   ├── _stacked.scss
│       │   │   │   ├── _variables.scss
│       │   │   │   └── font-awesome.scss
│       │   │   ├── foundation/
│       │   │   │   ├── _functions.scss
│       │   │   │   ├── _settings.scss
│       │   │   │   └── components/
│       │   │   │       ├── _accordion.scss
│       │   │   │       ├── _alert-boxes.scss
│       │   │   │       ├── _block-grid.scss
│       │   │   │       ├── _breadcrumbs.scss
│       │   │   │       ├── _button-groups.scss
│       │   │   │       ├── _buttons.scss
│       │   │   │       ├── _forms.scss
│       │   │   │       ├── _global.scss
│       │   │   │       ├── _grid.scss
│       │   │   │       ├── _inline-lists.scss
│       │   │   │       ├── _keystrokes.scss
│       │   │   │       ├── _labels.scss
│       │   │   │       ├── _pagination.scss
│       │   │   │       ├── _panels.scss
│       │   │   │       ├── _reveal.scss
│       │   │   │       ├── _sub-nav.scss
│       │   │   │       ├── _switch.scss
│       │   │   │       ├── _switches.scss
│       │   │   │       ├── _tables.scss
│       │   │   │       ├── _tabs.scss
│       │   │   │       ├── _toolbar.scss
│       │   │   │       ├── _top-bar.scss
│       │   │   │       ├── _type.scss
│       │   │   │       └── _visibility.scss
│       │   │   ├── libs/
│       │   │   │   ├── driver.css
│       │   │   │   └── flatpickr.css
│       │   │   ├── nav/
│       │   │   │   ├── _accordion.scss
│       │   │   │   ├── _datatables.scss
│       │   │   │   ├── _dialog.scss
│       │   │   │   ├── _fonts.scss
│       │   │   │   ├── _footer.scss
│       │   │   │   ├── _lightbox.scss
│       │   │   │   ├── _modal.scss
│       │   │   │   ├── _popover.scss
│       │   │   │   ├── _select2.scss
│       │   │   │   ├── _sensors.scss
│       │   │   │   ├── _settings.scss
│       │   │   │   ├── _table.scss
│       │   │   │   ├── _tabs.scss
│       │   │   │   ├── _tooltip.scss
│       │   │   │   ├── alertprofiles.scss
│       │   │   │   ├── arnold.scss
│       │   │   │   ├── business.scss
│       │   │   │   ├── calendar.scss
│       │   │   │   ├── color.scss
│       │   │   │   ├── custom.scss
│       │   │   │   ├── devicehistory.scss
│       │   │   │   ├── errorpages.scss
│       │   │   │   ├── geomap.scss
│       │   │   │   ├── index.scss
│       │   │   │   ├── info_room.scss
│       │   │   │   ├── interface_browser.scss
│       │   │   │   ├── ipam.scss
│       │   │   │   ├── ipdevinfo.scss
│       │   │   │   ├── jquery-ui-1.8.21.custom.scss
│       │   │   │   ├── jquery-ui.scss
│       │   │   │   ├── local_rickshaw.scss
│       │   │   │   ├── login.scss
│       │   │   │   ├── machinetracker.scss
│       │   │   │   ├── maintenance.scss
│       │   │   │   ├── mixins.scss
│       │   │   │   ├── multi-select.scss
│       │   │   │   ├── my_account.scss
│       │   │   │   ├── navlets.scss
│       │   │   │   ├── navlets_compact.scss
│       │   │   │   ├── neighbors.scss
│       │   │   │   ├── netmap.scss
│       │   │   │   ├── networkexplorer.scss
│       │   │   │   ├── normalize.scss
│       │   │   │   ├── ol.scss
│       │   │   │   ├── openlayers.scss
│       │   │   │   ├── openlayers3.scss
│       │   │   │   ├── portadmin.scss
│       │   │   │   ├── powersupplies.scss
│       │   │   │   ├── rack.scss
│       │   │   │   ├── report.scss
│       │   │   │   ├── rickshaw.scss
│       │   │   │   ├── seeddb.scss
│       │   │   │   ├── status.scss
│       │   │   │   ├── subnet_matrix.scss
│       │   │   │   ├── syslogger.scss
│       │   │   │   ├── threshold.scss
│       │   │   │   ├── treeselect.scss
│       │   │   │   ├── useradmin.scss
│       │   │   │   └── watchdog.scss
│       │   │   └── nav.scss
│       │   ├── security.py
│       │   ├── seeddb/
│       │   │   ├── __init__.py
│       │   │   ├── constants.py
│       │   │   ├── forms/
│       │   │   │   ├── __init__.py
│       │   │   │   └── bulk.py
│       │   │   ├── page/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── cabling.py
│       │   │   │   ├── location.py
│       │   │   │   ├── management_profile/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── forms.py
│       │   │   │   ├── netbox/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── edit.py
│       │   │   │   │   └── forms.py
│       │   │   │   ├── netboxgroup.py
│       │   │   │   ├── netboxtype.py
│       │   │   │   ├── organization.py
│       │   │   │   ├── patch/
│       │   │   │   │   └── __init__.py
│       │   │   │   ├── prefix.py
│       │   │   │   ├── room.py
│       │   │   │   ├── service/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   └── edit.py
│       │   │   │   ├── usage.py
│       │   │   │   ├── vendor.py
│       │   │   │   └── vlan.py
│       │   │   ├── urls.py
│       │   │   └── utils/
│       │   │       ├── __init__.py
│       │   │       ├── bulk.py
│       │   │       ├── delete.py
│       │   │       ├── edit.py
│       │   │       ├── list.py
│       │   │       └── move.py
│       │   ├── servicecheckers.py
│       │   ├── session_serializer.py
│       │   ├── sortedstats/
│       │   │   ├── __init__.py
│       │   │   ├── config.py
│       │   │   ├── forms.py
│       │   │   ├── statmodules.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── static/
│       │   │   ├── fonts/
│       │   │   │   └── FontAwesome.otf
│       │   │   └── js/
│       │   │       ├── build.js
│       │   │       ├── geomap/
│       │   │       │   ├── Calendar.js
│       │   │       │   ├── GeomapPlugin.js
│       │   │       │   ├── MyHTTPProtocol.js
│       │   │       │   ├── NetworkLayer.js
│       │   │       │   ├── Permalink.js
│       │   │       │   ├── PopupControl.js
│       │   │       │   ├── Time.js
│       │   │       │   ├── TimeInterval.js
│       │   │       │   ├── TimeNavigator.js
│       │   │       │   ├── coordinates.js
│       │   │       │   ├── geomap.js
│       │   │       │   ├── proj4js-compressed.js
│       │   │       │   ├── projdefs/
│       │   │       │   │   ├── EPSG32601.js
│       │   │       │   │   ├── EPSG32602.js
│       │   │       │   │   ├── EPSG32603.js
│       │   │       │   │   ├── EPSG32604.js
│       │   │       │   │   ├── EPSG32605.js
│       │   │       │   │   ├── EPSG32606.js
│       │   │       │   │   ├── EPSG32607.js
│       │   │       │   │   ├── EPSG32608.js
│       │   │       │   │   ├── EPSG32609.js
│       │   │       │   │   ├── EPSG32610.js
│       │   │       │   │   ├── EPSG32611.js
│       │   │       │   │   ├── EPSG32612.js
│       │   │       │   │   ├── EPSG32613.js
│       │   │       │   │   ├── EPSG32614.js
│       │   │       │   │   ├── EPSG32615.js
│       │   │       │   │   ├── EPSG32616.js
│       │   │       │   │   ├── EPSG32617.js
│       │   │       │   │   ├── EPSG32618.js
│       │   │       │   │   ├── EPSG32619.js
│       │   │       │   │   ├── EPSG32620.js
│       │   │       │   │   ├── EPSG32621.js
│       │   │       │   │   ├── EPSG32622.js
│       │   │       │   │   ├── EPSG32623.js
│       │   │       │   │   ├── EPSG32624.js
│       │   │       │   │   ├── EPSG32625.js
│       │   │       │   │   ├── EPSG32626.js
│       │   │       │   │   ├── EPSG32627.js
│       │   │       │   │   ├── EPSG32628.js
│       │   │       │   │   ├── EPSG32629.js
│       │   │       │   │   ├── EPSG32630.js
│       │   │       │   │   ├── EPSG32631.js
│       │   │       │   │   ├── EPSG32632.js
│       │   │       │   │   ├── EPSG32633.js
│       │   │       │   │   ├── EPSG32634.js
│       │   │       │   │   ├── EPSG32635.js
│       │   │       │   │   ├── EPSG32636.js
│       │   │       │   │   ├── EPSG32637.js
│       │   │       │   │   ├── EPSG32638.js
│       │   │       │   │   ├── EPSG32639.js
│       │   │       │   │   ├── EPSG32640.js
│       │   │       │   │   ├── EPSG32641.js
│       │   │       │   │   ├── EPSG32642.js
│       │   │       │   │   ├── EPSG32643.js
│       │   │       │   │   ├── EPSG32644.js
│       │   │       │   │   ├── EPSG32645.js
│       │   │       │   │   ├── EPSG32646.js
│       │   │       │   │   ├── EPSG32647.js
│       │   │       │   │   ├── EPSG32648.js
│       │   │       │   │   ├── EPSG32649.js
│       │   │       │   │   ├── EPSG32650.js
│       │   │       │   │   ├── EPSG32651.js
│       │   │       │   │   ├── EPSG32652.js
│       │   │       │   │   ├── EPSG32653.js
│       │   │       │   │   ├── EPSG32654.js
│       │   │       │   │   ├── EPSG32655.js
│       │   │       │   │   ├── EPSG32656.js
│       │   │       │   │   ├── EPSG32657.js
│       │   │       │   │   ├── EPSG32658.js
│       │   │       │   │   ├── EPSG32659.js
│       │   │       │   │   ├── EPSG32660.js
│       │   │       │   │   ├── EPSG326xx.js
│       │   │       │   │   ├── EPSG32701.js
│       │   │       │   │   ├── EPSG32702.js
│       │   │       │   │   ├── EPSG32703.js
│       │   │       │   │   ├── EPSG32704.js
│       │   │       │   │   ├── EPSG32705.js
│       │   │       │   │   ├── EPSG32706.js
│       │   │       │   │   ├── EPSG32707.js
│       │   │       │   │   ├── EPSG32708.js
│       │   │       │   │   ├── EPSG32709.js
│       │   │       │   │   ├── EPSG32710.js
│       │   │       │   │   ├── EPSG32711.js
│       │   │       │   │   ├── EPSG32712.js
│       │   │       │   │   ├── EPSG32713.js
│       │   │       │   │   ├── EPSG32714.js
│       │   │       │   │   ├── EPSG32715.js
│       │   │       │   │   ├── EPSG32716.js
│       │   │       │   │   ├── EPSG32717.js
│       │   │       │   │   ├── EPSG32718.js
│       │   │       │   │   ├── EPSG32719.js
│       │   │       │   │   ├── EPSG32720.js
│       │   │       │   │   ├── EPSG32721.js
│       │   │       │   │   ├── EPSG32722.js
│       │   │       │   │   ├── EPSG32723.js
│       │   │       │   │   ├── EPSG32724.js
│       │   │       │   │   ├── EPSG32725.js
│       │   │       │   │   ├── EPSG32726.js
│       │   │       │   │   ├── EPSG32727.js
│       │   │       │   │   ├── EPSG32728.js
│       │   │       │   │   ├── EPSG32729.js
│       │   │       │   │   ├── EPSG32730.js
│       │   │       │   │   ├── EPSG32731.js
│       │   │       │   │   ├── EPSG32732.js
│       │   │       │   │   ├── EPSG32733.js
│       │   │       │   │   ├── EPSG32734.js
│       │   │       │   │   ├── EPSG32735.js
│       │   │       │   │   ├── EPSG32736.js
│       │   │       │   │   ├── EPSG32737.js
│       │   │       │   │   ├── EPSG32738.js
│       │   │       │   │   ├── EPSG32739.js
│       │   │       │   │   ├── EPSG32740.js
│       │   │       │   │   ├── EPSG32741.js
│       │   │       │   │   ├── EPSG32742.js
│       │   │       │   │   ├── EPSG32743.js
│       │   │       │   │   ├── EPSG32744.js
│       │   │       │   │   ├── EPSG32745.js
│       │   │       │   │   ├── EPSG32746.js
│       │   │       │   │   ├── EPSG32747.js
│       │   │       │   │   ├── EPSG32748.js
│       │   │       │   │   ├── EPSG32749.js
│       │   │       │   │   ├── EPSG32750.js
│       │   │       │   │   ├── EPSG32751.js
│       │   │       │   │   ├── EPSG32752.js
│       │   │       │   │   ├── EPSG32753.js
│       │   │       │   │   ├── EPSG32754.js
│       │   │       │   │   ├── EPSG32755.js
│       │   │       │   │   ├── EPSG32756.js
│       │   │       │   │   ├── EPSG32757.js
│       │   │       │   │   ├── EPSG32758.js
│       │   │       │   │   ├── EPSG32759.js
│       │   │       │   │   ├── EPSG32760.js
│       │   │       │   │   ├── EPSG327xx.js
│       │   │       │   │   ├── README
│       │   │       │   │   └── fetch.sh
│       │   │       │   └── util.js
│       │   │       ├── libs/
│       │   │       │   ├── backbone-eventbroker.js
│       │   │       │   ├── ipadebug.js
│       │   │       │   ├── ol-debug-4.6.5.js
│       │   │       │   ├── statist.js
│       │   │       │   ├── urijs/
│       │   │       │   │   ├── IPv6.js
│       │   │       │   │   ├── SecondLevelDomains.js
│       │   │       │   │   ├── URI.fragmentQuery.js
│       │   │       │   │   ├── URI.fragmentURI.js
│       │   │       │   │   ├── URI.js
│       │   │       │   │   ├── URITemplate.js
│       │   │       │   │   ├── jquery.URI.js
│       │   │       │   │   └── punycode.js
│       │   │       │   └── vue-2.2.0.js
│       │   │       ├── netmap.js
│       │   │       ├── networkexplorer.js
│       │   │       ├── package.json
│       │   │       ├── require_config.js
│       │   │       ├── require_config_dev.js
│       │   │       ├── resources/
│       │   │       │   ├── libs/
│       │   │       │   │   └── text.js
│       │   │       │   ├── netmap/
│       │   │       │   │   ├── layer2_link_info.html
│       │   │       │   │   ├── layer3_link_info.html
│       │   │       │   │   └── node_info.html
│       │   │       │   ├── networkexplorer/
│       │   │       │   │   ├── gwport.html
│       │   │       │   │   ├── router.html
│       │   │       │   │   ├── switch.html
│       │   │       │   │   ├── swport.html
│       │   │       │   │   └── swport_leaf.html
│       │   │       │   ├── rickshawgraph/
│       │   │       │   │   └── graphtemplate.hbs
│       │   │       │   ├── room/
│       │   │       │   │   ├── counter.html
│       │   │       │   │   ├── detail.html
│       │   │       │   │   └── sensor.html
│       │   │       │   ├── seeddb/
│       │   │       │   │   ├── hstore_container.html
│       │   │       │   │   └── hstore_row.html
│       │   │       │   ├── status2/
│       │   │       │   │   └── event_template.hbs
│       │   │       │   └── vue/
│       │   │       │       ├── environment_rack.html
│       │   │       │       ├── environment_rack_item.html
│       │   │       │       └── environment_rack_pdu_item.html
│       │   │       ├── src/
│       │   │       │   ├── 500.js
│       │   │       │   ├── alertprofiles.js
│       │   │       │   ├── arnold.js
│       │   │       │   ├── business.js
│       │   │       │   ├── dt_config.js
│       │   │       │   ├── dt_plugins/
│       │   │       │   │   ├── altsort.js
│       │   │       │   │   ├── date_title_sort.js
│       │   │       │   │   ├── ip_address_sort.js
│       │   │       │   │   ├── ip_address_typedetect.js
│       │   │       │   │   ├── modulesort.js
│       │   │       │   │   ├── natsort.js
│       │   │       │   │   ├── numeric_html.js
│       │   │       │   │   └── percent_sort.js
│       │   │       │   ├── getting_started_wizard.js
│       │   │       │   ├── image_upload.js
│       │   │       │   ├── info/
│       │   │       │   │   ├── global_dt_filters.js
│       │   │       │   │   └── table_info_converter.js
│       │   │       │   ├── info_location.js
│       │   │       │   ├── info_netboxgroup.js
│       │   │       │   ├── info_room.js
│       │   │       │   ├── info_room_rack.js
│       │   │       │   ├── interface_browser.js
│       │   │       │   ├── interface_browser_column_toggler.js
│       │   │       │   ├── interface_browser_dynamic_columns_controller.js
│       │   │       │   ├── interface_browser_filter_controller.js
│       │   │       │   ├── ipam/
│       │   │       │   │   ├── app.js
│       │   │       │   │   ├── ipam.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   ├── util.js
│       │   │       │   │   ├── views/
│       │   │       │   │   │   ├── behaviors.js
│       │   │       │   │   │   ├── control.js
│       │   │       │   │   │   ├── index.js
│       │   │       │   │   │   ├── prefixmap.js
│       │   │       │   │   │   ├── subnetallocator.js
│       │   │       │   │   │   ├── tree.js
│       │   │       │   │   │   └── usage.js
│       │   │       │   │   └── viz.js
│       │   │       │   ├── ipdevinfo.js
│       │   │       │   ├── libs/
│       │   │       │   │   └── tablesort_extensions.js
│       │   │       │   ├── machinetracker.js
│       │   │       │   ├── main.js
│       │   │       │   ├── maintenance.js
│       │   │       │   ├── messages.js
│       │   │       │   ├── navigation_preferences.js
│       │   │       │   ├── neighbors.js
│       │   │       │   ├── netmap/
│       │   │       │   │   ├── collections.js
│       │   │       │   │   ├── control_view.js
│       │   │       │   │   ├── graph.js
│       │   │       │   │   ├── graph_info_view.js
│       │   │       │   │   ├── graph_view.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   └── netmap.js
│       │   │       │   ├── networkexplorer.js
│       │   │       │   ├── plugins/
│       │   │       │   │   ├── accordion_maker.js
│       │   │       │   │   ├── alert.js
│       │   │       │   │   ├── checkbox_selector.js
│       │   │       │   │   ├── counterdisplay.js
│       │   │       │   │   ├── csrf-utils.js
│       │   │       │   │   ├── d3_sparkline.js
│       │   │       │   │   ├── fullscreen.js
│       │   │       │   │   ├── gauge.js
│       │   │       │   │   ├── graphfetcher.js
│       │   │       │   │   ├── graphfetcher_controller.js
│       │   │       │   │   ├── hover_highlight.js
│       │   │       │   │   ├── jquery_ui_helpers.js
│       │   │       │   │   ├── lightbox.js
│       │   │       │   │   ├── linear_gauge.js
│       │   │       │   │   ├── megadrop.js
│       │   │       │   │   ├── multiple_select.js
│       │   │       │   │   ├── nav-url-utils.js
│       │   │       │   │   ├── navlet_alert.js
│       │   │       │   │   ├── navlet_controller.js
│       │   │       │   │   ├── navlet_handlers.js
│       │   │       │   │   ├── navlet_pdu.js
│       │   │       │   │   ├── navlet_ups.js
│       │   │       │   │   ├── navlets_htmx_controller.js
│       │   │       │   │   ├── neighbor-map.js
│       │   │       │   │   ├── netmap-extras.js
│       │   │       │   │   ├── network_tree.js
│       │   │       │   │   ├── popover.js
│       │   │       │   │   ├── rickshaw-utils.js
│       │   │       │   │   ├── rickshaw_graph.js
│       │   │       │   │   ├── room_mapper.js
│       │   │       │   │   ├── seeddb_datatables.js
│       │   │       │   │   ├── seeddb_hstore.js
│       │   │       │   │   ├── seeddb_management_profile.js
│       │   │       │   │   ├── seeddb_map.js
│       │   │       │   │   ├── sensor_controller.js
│       │   │       │   │   ├── sensors_controller.js
│       │   │       │   │   ├── state_controller.js
│       │   │       │   │   ├── symbols.js
│       │   │       │   │   ├── tab_navigation.js
│       │   │       │   │   ├── table_utils.js
│       │   │       │   │   ├── tooltip.js
│       │   │       │   │   └── vue_rack.js
│       │   │       │   ├── portadmin.js
│       │   │       │   ├── porttable.js
│       │   │       │   ├── radius.js
│       │   │       │   ├── report.js
│       │   │       │   ├── seeddb.js
│       │   │       │   ├── seeddb_netbox.js
│       │   │       │   ├── seeddb_netbox_wizard.js
│       │   │       │   ├── sensor_details.js
│       │   │       │   ├── statistics.js
│       │   │       │   ├── status2/
│       │   │       │   │   ├── collections.js
│       │   │       │   │   ├── handlebars-helpers.js
│       │   │       │   │   ├── models.js
│       │   │       │   │   ├── status.js
│       │   │       │   │   └── views.js
│       │   │       │   ├── subnetmatrix.js
│       │   │       │   ├── syslogger.js
│       │   │       │   ├── threshold.js
│       │   │       │   ├── watchdog.js
│       │   │       │   └── webfront.js
│       │   │       ├── test/
│       │   │       │   ├── div/
│       │   │       │   │   ├── graph-test.js
│       │   │       │   │   └── numbers-test.js
│       │   │       │   ├── info/
│       │   │       │   │   ├── global_dt_filters-test.js
│       │   │       │   │   ├── modulesort-test.js
│       │   │       │   │   ├── natsort-test.js
│       │   │       │   │   └── table_info_converter-test.js
│       │   │       │   ├── karma.conf.buildserver.js
│       │   │       │   ├── karma.conf.js
│       │   │       │   ├── main_test.js
│       │   │       │   ├── plugins/
│       │   │       │   │   ├── checkbox_selector-test.js
│       │   │       │   │   ├── multiple_select-test.js
│       │   │       │   │   ├── network_tree-test.js
│       │   │       │   │   └── rickshaw-utils-test.js
│       │   │       │   ├── require_config.test.js
│       │   │       │   └── resources/
│       │   │       │       ├── plugins/
│       │   │       │       │   └── header_footer_minimize/
│       │   │       │       │       └── header.html
│       │   │       │       └── templates/
│       │   │       │           └── multipleselect.html
│       │   │       └── treeselect.js
│       │   ├── status2/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── styleguide.py
│       │   ├── syslogger/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── templates/
│       │   │   ├── 404.html
│       │   │   ├── 500.html
│       │   │   ├── _breadcrumbs.html
│       │   │   ├── _breadcrumbs_list.html
│       │   │   ├── account/
│       │   │   │   ├── login.html
│       │   │   │   ├── password_change.html
│       │   │   │   └── signup_closed.html
│       │   │   ├── alertmsg/
│       │   │   │   ├── base.html
│       │   │   │   ├── bgpState/
│       │   │   │   │   └── bgpDown.html
│       │   │   │   └── linkState/
│       │   │   │       └── linkDown.html
│       │   │   ├── alertprofiles/
│       │   │   │   ├── _add_expression_operator_help_modal.html
│       │   │   │   ├── _filter_group_operator_help_modal.html
│       │   │   │   ├── _groups_and_permissions_modal.html
│       │   │   │   ├── _permissions_help_modal.html
│       │   │   │   ├── account_detail.html
│       │   │   │   ├── address_form.html
│       │   │   │   ├── address_list.html
│       │   │   │   ├── base.html
│       │   │   │   ├── base_detail.html
│       │   │   │   ├── base_list.html
│       │   │   │   ├── confirmation_list.html
│       │   │   │   ├── expression_form.html
│       │   │   │   ├── filter_form.html
│       │   │   │   ├── filter_group_form.html
│       │   │   │   ├── filter_group_list.html
│       │   │   │   ├── filter_list.html
│       │   │   │   ├── matchfield_form.html
│       │   │   │   ├── matchfield_list.html
│       │   │   │   ├── paginator.html
│       │   │   │   ├── permissions.html
│       │   │   │   ├── profile.html
│       │   │   │   ├── profile_detail.html
│       │   │   │   ├── sms_list.html
│       │   │   │   ├── subscription_form.html
│       │   │   │   ├── subsection_tabs.html
│       │   │   │   ├── timeperiod_edit.html
│       │   │   │   ├── timeperiod_form.html
│       │   │   │   └── timeperiods.html
│       │   │   ├── allauth/
│       │   │   │   ├── elements/
│       │   │   │   │   ├── button.html
│       │   │   │   │   ├── panel.html
│       │   │   │   │   ├── provider.html
│       │   │   │   │   └── provider_list.html
│       │   │   │   └── layouts/
│       │   │   │       ├── _tabs_list.html
│       │   │   │       ├── base.html
│       │   │   │       └── entrance.html
│       │   │   ├── arnold/
│       │   │   │   ├── back.html
│       │   │   │   ├── base.html
│       │   │   │   ├── choose_detentions.html
│       │   │   │   ├── details.html
│       │   │   │   ├── detainedports.html
│       │   │   │   ├── detention_profiles.html
│       │   │   │   ├── edit_detention_profile.html
│       │   │   │   ├── history.html
│       │   │   │   ├── justifications.html
│       │   │   │   ├── manualdetain-step2.html
│       │   │   │   ├── manualdetain.html
│       │   │   │   ├── quarantinevlans.html
│       │   │   │   ├── search.html
│       │   │   │   └── tabs.html
│       │   │   ├── auditlog/
│       │   │   │   ├── _logentry_list.html
│       │   │   │   ├── base.html
│       │   │   │   └── overview.html
│       │   │   ├── base.html
│       │   │   ├── business/
│       │   │   │   ├── base.html
│       │   │   │   ├── email.html
│       │   │   │   ├── email.txt
│       │   │   │   ├── frag-report-card.html
│       │   │   │   ├── frag-report-items.html
│       │   │   │   ├── frag-unsubscribe.html
│       │   │   │   ├── report-availability.html
│       │   │   │   └── report.html
│       │   │   ├── components/
│       │   │   │   └── popover/
│       │   │   │       ├── _close_button.html
│       │   │   │       └── _confirm_popover.html
│       │   │   ├── custom_crispy_templates/
│       │   │   │   ├── _form_content.html
│       │   │   │   ├── _form_field.html
│       │   │   │   ├── _form_fields.html
│       │   │   │   ├── field_helptext_as_icon.html
│       │   │   │   ├── flat_fieldset.html
│       │   │   │   ├── flat_form.html
│       │   │   │   ├── form_checkbox.html
│       │   │   │   ├── form_column.html
│       │   │   │   ├── form_div.html
│       │   │   │   ├── form_row.html
│       │   │   │   ├── horizontal_checkbox.html
│       │   │   │   └── submit_field.html
│       │   │   ├── debug.html
│       │   │   ├── devicehistory/
│       │   │   │   ├── _component-search-results.html
│       │   │   │   ├── _component_search_input.html
│       │   │   │   ├── _history_view_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── base_history.html
│       │   │   │   ├── confirm_error.html
│       │   │   │   ├── debug.html
│       │   │   │   ├── delete_module.html
│       │   │   │   ├── frag_moduletable.html
│       │   │   │   ├── history_search.html
│       │   │   │   ├── history_view.html
│       │   │   │   └── register_error.html
│       │   │   ├── footer.html
│       │   │   ├── foundation-5/
│       │   │   │   ├── README.txt
│       │   │   │   ├── errors.html
│       │   │   │   ├── errors_formset.html
│       │   │   │   └── field.html
│       │   │   ├── geomap/
│       │   │   │   ├── geomap-data-kml.xml
│       │   │   │   └── geomap.html
│       │   │   ├── info/
│       │   │   │   ├── _image_help_modal.html
│       │   │   │   ├── _image_upload_header.html
│       │   │   │   ├── _navbar_search_form.html
│       │   │   │   ├── _navbar_search_results.html
│       │   │   │   ├── _search_form.html
│       │   │   │   ├── _search_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── event/
│       │   │   │   │   ├── _about_acknowledge_info.html
│       │   │   │   │   ├── _about_delete_info.html
│       │   │   │   │   ├── _about_maintenance_info.html
│       │   │   │   │   ├── _about_resolve_info.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── details.html
│       │   │   │   │   ├── frag_event_message.html
│       │   │   │   │   └── frag_subject_details.html
│       │   │   │   ├── fragments/
│       │   │   │   │   └── netboxes.html
│       │   │   │   ├── images/
│       │   │   │   │   └── upload.html
│       │   │   │   ├── location/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── fragment_sublocation.html
│       │   │   │   │   ├── locationinfo.html
│       │   │   │   │   ├── locationinfo_main.html
│       │   │   │   │   ├── locationinfo_rooms.html
│       │   │   │   │   ├── locationinfo_sublocations.html
│       │   │   │   │   └── upload.html
│       │   │   │   ├── netboxgroup/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── group_detail.html
│       │   │   │   │   ├── group_edit.html
│       │   │   │   │   └── list_groups.html
│       │   │   │   ├── prefix/
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── details.html
│       │   │   │   │   └── frag_tags.html
│       │   │   │   ├── room/
│       │   │   │   │   ├── _about_the_search_modal.html
│       │   │   │   │   ├── _add_rack_modal.html
│       │   │   │   │   ├── _add_sensor_diff_form.html
│       │   │   │   │   ├── _add_sensor_modal.html
│       │   │   │   │   ├── _add_sensor_single_form.html
│       │   │   │   │   ├── _add_sensor_sum_form.html
│       │   │   │   │   ├── _search_results.html
│       │   │   │   │   ├── base.html
│       │   │   │   │   ├── fragment_rack.html
│       │   │   │   │   ├── fragment_rackpdusensor.html
│       │   │   │   │   ├── fragment_racksensor.html
│       │   │   │   │   ├── netboxview.html
│       │   │   │   │   ├── roominfo.html
│       │   │   │   │   ├── roominfo_devices.html
│       │   │   │   │   ├── roominfo_main.html
│       │   │   │   │   ├── roominfo_racks.html
│       │   │   │   │   ├── roominfo_sensors.html
│       │   │   │   │   └── upload.html
│       │   │   │   └── vlan/
│       │   │   │       ├── _search_results.html
│       │   │   │       ├── base.html
│       │   │   │       └── vlandetails.html
│       │   │   ├── interface_browser/
│       │   │   │   └── base.html
│       │   │   ├── ipam/
│       │   │   │   ├── base.html
│       │   │   │   ├── includes/
│       │   │   │   │   ├── _subnet_diagram_help_modal.html
│       │   │   │   │   ├── allocate-subnet.html
│       │   │   │   │   ├── tree-form-advanced.html
│       │   │   │   │   ├── tree-form.html
│       │   │   │   │   ├── tree-node.html
│       │   │   │   │   └── tree-root.html
│       │   │   │   └── index.html
│       │   │   ├── ipdevinfo/
│       │   │   │   ├── _poe_classification_hint_modal.html
│       │   │   │   ├── _poe_status_hint_modal.html
│       │   │   │   ├── _search_results.html
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-affected.html
│       │   │   │   ├── frag-alerts.html
│       │   │   │   ├── frag-disclaimer.html
│       │   │   │   ├── frag-hostinfo.html
│       │   │   │   ├── frag-ipdevinfo-refresh-button.html
│       │   │   │   ├── frag-ipdevinfo-refresh-error.html
│       │   │   │   ├── frag-ipdevinfo-refresh-ongoing-button.html
│       │   │   │   ├── frag-ipdevinfo.html
│       │   │   │   ├── frag-neighbors.html
│       │   │   │   ├── frag-poe.html
│       │   │   │   ├── frag-port-metrics.html
│       │   │   │   ├── frag-portlist-datatable.html
│       │   │   │   ├── frag-portlist-tabs.html
│       │   │   │   ├── frag-ports.html
│       │   │   │   ├── frag-psutable.html
│       │   │   │   ├── frag-sensors.html
│       │   │   │   ├── frag-sensortable.html
│       │   │   │   ├── frag-services.html
│       │   │   │   ├── frag-sysmetrics.html
│       │   │   │   ├── ipdev-details.html
│       │   │   │   ├── module-details.html
│       │   │   │   ├── module-port-view.html
│       │   │   │   ├── modules.html
│       │   │   │   ├── poegroup-details.html
│       │   │   │   ├── port-details-aggregate-frag.html
│       │   │   │   ├── port-details-api-frag.html
│       │   │   │   ├── port-details-main-frag.html
│       │   │   │   ├── port-details-metrics-frag.html
│       │   │   │   ├── port-details-neighbors-frag.html
│       │   │   │   ├── port-details-recent-alerts-frag.html
│       │   │   │   ├── port-details-sensors-frag.html
│       │   │   │   ├── port-details-stacking-frag.html
│       │   │   │   ├── port-details-vlan-frag.html
│       │   │   │   ├── port-details.html
│       │   │   │   ├── port-legend.html
│       │   │   │   ├── search.html
│       │   │   │   ├── sensor-details.html
│       │   │   │   ├── service-list-table.html
│       │   │   │   ├── service-list.html
│       │   │   │   └── service-matrix.html
│       │   │   ├── l2trace/
│       │   │   │   └── l2trace.html
│       │   │   ├── machinetracker/
│       │   │   │   ├── _ip_search_help_modal.html
│       │   │   │   ├── _mac_search_help_modal.html
│       │   │   │   ├── _netbios_search_help_modal.html
│       │   │   │   ├── _search_help_trigger.html
│       │   │   │   ├── _switch_search_help_modal.html
│       │   │   │   ├── base.html
│       │   │   │   ├── fishy.html
│       │   │   │   ├── interface_tracker.html
│       │   │   │   ├── ip_search.html
│       │   │   │   ├── ip_tracker.html
│       │   │   │   ├── mac_search.html
│       │   │   │   ├── mac_tracker.html
│       │   │   │   ├── netbios_search.html
│       │   │   │   ├── netbios_tracker.html
│       │   │   │   ├── switch_search.html
│       │   │   │   └── uplink_tracker.html
│       │   │   ├── macwatch/
│       │   │   │   ├── addmacwatch.html
│       │   │   │   ├── base.html
│       │   │   │   ├── deletemacwatch.html
│       │   │   │   ├── editmacwatch.html
│       │   │   │   └── list_watches.html
│       │   │   ├── maintenance/
│       │   │   │   ├── _component-browse-location.html
│       │   │   │   ├── _component-browse.html
│       │   │   │   ├── _component-search-results.html
│       │   │   │   ├── _selected-components-list.html
│       │   │   │   ├── back.html
│       │   │   │   ├── base.html
│       │   │   │   ├── calendar.html
│       │   │   │   ├── cancel.html
│       │   │   │   ├── details.html
│       │   │   │   ├── frag-component-trail.html
│       │   │   │   ├── heading.html
│       │   │   │   ├── list.html
│       │   │   │   ├── new_task.html
│       │   │   │   └── tabs.html
│       │   │   ├── messages/
│       │   │   │   ├── base.html
│       │   │   │   ├── list.html
│       │   │   │   ├── save.html
│       │   │   │   └── view.html
│       │   │   ├── mfa/
│       │   │   │   ├── index.html
│       │   │   │   ├── recovery_codes/
│       │   │   │   │   ├── generate.html
│       │   │   │   │   └── index.html
│       │   │   │   └── totp/
│       │   │   │       ├── activate_form.html
│       │   │   │       └── deactivate_form.html
│       │   │   ├── modals/
│       │   │   │   ├── _nav_modal.html
│       │   │   │   ├── _nav_modal_alert.html
│       │   │   │   └── _nav_modal_resolve.html
│       │   │   ├── nav_header.html
│       │   │   ├── navlets/
│       │   │   │   ├── _add_navlet_modal.html
│       │   │   │   ├── _add_navlet_response.html
│       │   │   │   ├── _navlet_item.html
│       │   │   │   ├── _navlet_refresh.html
│       │   │   │   ├── _remove_modal_form.html
│       │   │   │   ├── _remove_navlet_response.html
│       │   │   │   ├── alert_edit.html
│       │   │   │   ├── alert_view.html
│       │   │   │   ├── base.html
│       │   │   │   ├── envrack_edit.html
│       │   │   │   ├── envrack_view.html
│       │   │   │   ├── error_view.html
│       │   │   │   ├── feedreader_edit.html
│       │   │   │   ├── feedreader_view.html
│       │   │   │   ├── getting_started_view.html
│       │   │   │   ├── graph_edit.html
│       │   │   │   ├── graph_view.html
│       │   │   │   ├── linklist_view.html
│       │   │   │   ├── machinetracker_view.html
│       │   │   │   ├── messages_view.html
│       │   │   │   ├── navblog_view.html
│       │   │   │   ├── pdu_edit.html
│       │   │   │   ├── pdu_view.html
│       │   │   │   ├── portadmin_view.html
│       │   │   │   ├── report_edit.html
│       │   │   │   ├── report_view.html
│       │   │   │   ├── room_location_status_edit.html
│       │   │   │   ├── room_location_status_view.html
│       │   │   │   ├── room_map_view.html
│       │   │   │   ├── sensor_edit.html
│       │   │   │   ├── sensor_view.html
│       │   │   │   ├── status2_edit.html
│       │   │   │   ├── status2_view.html
│       │   │   │   ├── status_edit.html
│       │   │   │   ├── status_view.html
│       │   │   │   ├── ups_edit.html
│       │   │   │   ├── ups_view.html
│       │   │   │   ├── vlangraph_edit.html
│       │   │   │   ├── vlangraph_view.html
│       │   │   │   ├── watchdog_view.html
│       │   │   │   └── welcome_view.html
│       │   │   ├── navurls.html
│       │   │   ├── neighbors/
│       │   │   │   ├── base.html
│       │   │   │   └── frag-tbody.html
│       │   │   ├── netmap/
│       │   │   │   ├── admin.html
│       │   │   │   └── netmap.html
│       │   │   ├── networkexplorer/
│       │   │   │   ├── base.html
│       │   │   │   ├── expand_gwport.html
│       │   │   │   ├── expand_router.html
│       │   │   │   ├── expand_switch.html
│       │   │   │   └── expand_swport.html
│       │   │   ├── portadmin/
│       │   │   │   ├── _feedback_modal.html
│       │   │   │   ├── _messages.html
│       │   │   │   ├── base.html
│       │   │   │   ├── netbox.html
│       │   │   │   ├── portlist.html
│       │   │   │   └── trunk_edit.html
│       │   │   ├── radius/
│       │   │   │   ├── _account_chart_hints_modal.html
│       │   │   │   ├── _account_log_hints_modal.html
│       │   │   │   ├── _error_log_hints_modal.html
│       │   │   │   ├── account_charts.html
│       │   │   │   ├── account_log.html
│       │   │   │   ├── base.html
│       │   │   │   ├── detail.html
│       │   │   │   ├── detail_modal.html
│       │   │   │   ├── details_table.html
│       │   │   │   └── error_log.html
│       │   │   ├── report/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag_matrix_index.html
│       │   │   │   ├── frag_matrix_report.html
│       │   │   │   ├── frag_matrix_report_link.html
│       │   │   │   ├── frag_report_filters.html
│       │   │   │   ├── frag_report_table.html
│       │   │   │   ├── index.html
│       │   │   │   ├── matrix.html
│       │   │   │   ├── report.html
│       │   │   │   └── report_list.html
│       │   │   ├── rest_framework/
│       │   │   │   └── api.html
│       │   │   ├── rrdviewer/
│       │   │   │   ├── base.html
│       │   │   │   └── rrd-details.html
│       │   │   ├── seeddb/
│       │   │   │   ├── _add_patch_modal.html
│       │   │   │   ├── _patch_table_row.html
│       │   │   │   ├── _remove_patch_modal.html
│       │   │   │   ├── _seeddb_check_connectivity_response.html
│       │   │   │   ├── _seeddb_check_connectivity_results.html
│       │   │   │   ├── _seeddb_collected_info.html
│       │   │   │   ├── _seeddb_netbox_form_content.html
│       │   │   │   ├── base.html
│       │   │   │   ├── bulk_import.html
│       │   │   │   ├── delete.html
│       │   │   │   ├── edit.html
│       │   │   │   ├── edit_patch.html
│       │   │   │   ├── edit_prefix.html
│       │   │   │   ├── edit_vlan.html
│       │   │   │   ├── fragments/
│       │   │   │   │   ├── branch.html
│       │   │   │   │   ├── branch_tooltip.html
│       │   │   │   │   └── patches.html
│       │   │   │   ├── index.html
│       │   │   │   ├── list.html
│       │   │   │   ├── list_cables.html
│       │   │   │   ├── list_netbox.html
│       │   │   │   ├── list_patches.html
│       │   │   │   ├── list_tree.html
│       │   │   │   ├── management-profile/
│       │   │   │   │   └── edit.html
│       │   │   │   ├── move.html
│       │   │   │   ├── netbox_wizard.html
│       │   │   │   ├── service_netbox_form.html
│       │   │   │   ├── service_property_form.html
│       │   │   │   ├── tabs_generic.html
│       │   │   │   ├── tabs_vlan.html
│       │   │   │   └── widgets/
│       │   │   │       └── alias_list.html
│       │   │   ├── socialaccount/
│       │   │   │   ├── authentication_error.html
│       │   │   │   ├── connections.html
│       │   │   │   ├── login.html
│       │   │   │   └── snippets/
│       │   │   │       └── login.html
│       │   │   ├── sortedstats/
│       │   │   │   └── sortedstats.html
│       │   │   ├── status2/
│       │   │   │   ├── base.html
│       │   │   │   └── status.html
│       │   │   ├── styleguide/
│       │   │   │   └── sparklines.html
│       │   │   ├── styleguide.html
│       │   │   ├── syslogger/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-errors.html
│       │   │   │   ├── frag-exceptions.html
│       │   │   │   ├── frag-results.html
│       │   │   │   ├── frag-search-form-fieldset.html
│       │   │   │   ├── frag-search.html
│       │   │   │   └── index.html
│       │   │   ├── threshold/
│       │   │   │   ├── _threshold_help_modal.html
│       │   │   │   ├── base.html
│       │   │   │   ├── frag-thresholdlist.html
│       │   │   │   └── set_threshold.html
│       │   │   ├── toolbar.html
│       │   │   ├── useradmin/
│       │   │   │   ├── _confirm_token_delete.html
│       │   │   │   ├── account_detail.html
│       │   │   │   ├── account_list.html
│       │   │   │   ├── base.html
│       │   │   │   ├── delete.html
│       │   │   │   ├── feedback.html
│       │   │   │   ├── frag-auditlog.html
│       │   │   │   ├── frag-external-account-fieldset.html
│       │   │   │   ├── group_detail.html
│       │   │   │   ├── group_list.html
│       │   │   │   ├── jwt_created.html
│       │   │   │   ├── jwt_detail.html
│       │   │   │   ├── jwt_edit.html
│       │   │   │   ├── jwt_list.html
│       │   │   │   ├── jwt_not_enabled.html
│       │   │   │   ├── jwt_not_enabled_content.html
│       │   │   │   ├── not-logged-in.html
│       │   │   │   ├── tabs.html
│       │   │   │   ├── token_card_style.html
│       │   │   │   ├── token_detail.html
│       │   │   │   ├── token_edit.html
│       │   │   │   └── token_list.html
│       │   │   ├── watchdog/
│       │   │   │   ├── base.html
│       │   │   │   ├── frag_overview.html
│       │   │   │   └── frag_tests.html
│       │   │   └── webfront/
│       │   │       ├── _about_audit_logging_modal.html
│       │   │       ├── _dashboard_nav.html
│       │   │       ├── _dashboard_nav_shared_indicator.html
│       │   │       ├── _dashboard_navlets.html
│       │   │       ├── _dashboard_search_form.html
│       │   │       ├── _dashboard_search_results.html
│       │   │       ├── _dashboard_set_default_response.html
│       │   │       ├── _dashboard_settings_columns_form.html
│       │   │       ├── _dashboard_settings_delete_confirmation.html
│       │   │       ├── _dashboard_settings_form.html
│       │   │       ├── _dashboard_settings_shared_form.html
│       │   │       ├── _dashboard_subscribe_button.html
│       │   │       ├── _import_dashboard_form_modal.html
│       │   │       ├── _lightbox_gallery.html
│       │   │       ├── _navbar_link_form.html
│       │   │       ├── _qr_code.html
│       │   │       ├── about.html
│       │   │       ├── index.html
│       │   │       ├── login.html
│       │   │       ├── preferences.html
│       │   │       └── toolbox.html
│       │   ├── threshold/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── useradmin/
│       │   │   ├── __init__.py
│       │   │   ├── forms.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   ├── utils.py
│       │   ├── watchdog/
│       │   │   ├── __init__.py
│       │   │   ├── urls.py
│       │   │   └── views.py
│       │   └── webfront/
│       │       ├── __init__.py
│       │       ├── forms.py
│       │       ├── urls.py
│       │       ├── utils.py
│       │       └── views.py
│       └── wsgi.py
├── requirements/
│   ├── base.txt
│   ├── django42.txt
│   ├── django50.txt
│   ├── django51.txt
│   ├── django52.txt
│   └── optional.txt
├── requirements.txt
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   ├── free-port.sh
│   ├── functional/
│   │   ├── __init__.py
│   │   ├── arnold_test.py
│   │   ├── conftest.py
│   │   ├── geomap_test.py
│   │   ├── ipdevinfo_test.py
│   │   ├── navbar_test.py
│   │   ├── netmap_test.py
│   │   ├── room_test.py
│   │   └── status_test.py
│   ├── integration/
│   │   ├── __init__.py
│   │   ├── alertengine_test.py
│   │   ├── api_test.py
│   │   ├── auditlog_test.py
│   │   ├── bin_test.py
│   │   ├── bulkimport_test.py
│   │   ├── collectstatic_test.py
│   │   ├── conftest.py
│   │   ├── django_check_test.py
│   │   ├── djangodb_test.py
│   │   ├── event_test.py
│   │   ├── eventengine/
│   │   │   ├── __init__.py
│   │   │   ├── alerts_test.py
│   │   │   ├── boxdown_test.py
│   │   │   ├── juniper_alert_count_test.py
│   │   │   ├── severity_test.py
│   │   │   └── upgrade_test.py
│   │   ├── ipdevpoll/
│   │   │   ├── __init__.py
│   │   │   ├── db_test.py
│   │   │   ├── plugins/
│   │   │   │   ├── entity_test.py
│   │   │   │   ├── juniper_alarm_test.py
│   │   │   │   ├── paloaltoarp_test.py
│   │   │   │   ├── snmpcheck_test.py
│   │   │   │   └── typeoid_test.py
│   │   │   ├── pool_test.py
│   │   │   └── utils_test.py
│   │   ├── jwt_refresh_endpoint_test.py
│   │   ├── l2trace_test.py
│   │   ├── logs_test.py
│   │   ├── maintengine_test.py
│   │   ├── mibs/
│   │   │   ├── arista_vrf_mib_test.py
│   │   │   ├── ip_mib_test.py
│   │   │   ├── juniper_alarm_mib_test.py
│   │   │   ├── memory_test.py
│   │   │   ├── sensors_test.py
│   │   │   └── wlsx_systemext_mib_test.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   ├── account_test.py
│   │   │   ├── alert_test.py
│   │   │   ├── alerthistvarmap_test.py
│   │   │   ├── eventvarmap_test.py
│   │   │   ├── fields_test.py
│   │   │   ├── model_test.py
│   │   │   ├── netbox_test.py
│   │   │   ├── netbox_type_test.py
│   │   │   ├── oui_test.py
│   │   │   └── rack_test.py
│   │   ├── networkexplorer_test.py
│   │   ├── pping_test.py
│   │   ├── querysets_test.py
│   │   ├── report/
│   │   │   ├── __init__.py
│   │   │   └── generator_test.py
│   │   ├── seeddb_test.py
│   │   ├── smidump_test.py
│   │   ├── smsd_test.py
│   │   ├── snmp_fixtures/
│   │   │   ├── P8652.snmprec
│   │   │   ├── T3611.snmprec
│   │   │   ├── apc-pdu.snmprec
│   │   │   ├── arista.snmprec
│   │   │   ├── arista@IOT.snmprec
│   │   │   ├── arista@MGMT.snmprec
│   │   │   ├── arista@STUDENT.snmprec
│   │   │   ├── arista@VR.snmprec
│   │   │   ├── aruba-wlc.snmprec
│   │   │   ├── cisco-memory.snmprec
│   │   │   ├── hp-memory.snmprec
│   │   │   ├── juniper-alarm-none.snmprec
│   │   │   ├── juniper-alarm.snmprec
│   │   │   ├── juniper-memory.snmprec
│   │   │   ├── public.snmprec
│   │   │   ├── raritan.snmprec
│   │   │   └── snmpwalk.snmprec
│   │   ├── snmp_walk_test.py
│   │   ├── snmptrapd_test.py
│   │   ├── sql_test.py
│   │   ├── statemon/
│   │   │   ├── __init__.py
│   │   │   └── radius_test.py
│   │   ├── statemondb_test.py
│   │   ├── thresholdmon/
│   │   │   └── test_events.py
│   │   ├── update_ouis_test.py
│   │   ├── watchdog_test.py
│   │   ├── web/
│   │   │   ├── __init__.py
│   │   │   ├── ajax_test.py
│   │   │   ├── alertprofiles_test.py
│   │   │   ├── arnold_test.py
│   │   │   ├── auth/
│   │   │   │   ├── auth_test.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── ldap_auth_backend_test.py
│   │   │   │   ├── login_redirect_test.py
│   │   │   │   ├── sudo_test.py
│   │   │   │   └── utils_test.py
│   │   │   ├── crawler_test.py
│   │   │   ├── devicehistory/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── componentsearch_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── devicehistory_test.py
│   │   │   ├── geomap_test.py
│   │   │   ├── graphite_test.py
│   │   │   ├── info/
│   │   │   │   ├── info_test.py
│   │   │   │   ├── location_test.py
│   │   │   │   ├── room_test.py
│   │   │   │   └── search_test.py
│   │   │   ├── ipam/
│   │   │   │   ├── api_test.py
│   │   │   │   ├── util_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── ipdevinfo_test.py
│   │   │   ├── jwt_test.py
│   │   │   ├── machinetracker_test.py
│   │   │   ├── maintenance/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── utils_test.py
│   │   │   │   └── views_test.py
│   │   │   ├── messages_test.py
│   │   │   ├── navlets_test.py
│   │   │   ├── netboxtype_test.py
│   │   │   ├── netmap_test.py
│   │   │   ├── portadmin_test.py
│   │   │   ├── prefixviewset_test.py
│   │   │   ├── radius_test.py
│   │   │   ├── seeddb_netbox_test.py
│   │   │   ├── status_test.py
│   │   │   ├── templatesyntax_test.py
│   │   │   ├── threshold_test.py
│   │   │   ├── useradmin_test.py
│   │   │   └── webfront_test.py
│   │   └── widget_test.py
│   ├── javascript-test.sh
│   ├── requirements.txt
│   ├── setup_test_config.py
│   ├── test-data.sql
│   └── unittests/
│       ├── Snmp/
│       │   ├── Snmp_test.py
│       │   ├── __init__.py
│       │   ├── encodings_test.py
│       │   └── profile_test.py
│       ├── __init__.py
│       ├── alertengine/
│       │   ├── __init__.py
│       │   ├── accountalertqueue_test.py
│       │   └── base_test.py
│       ├── api/
│       │   ├── __init__.py
│       │   ├── api_test.py
│       │   └── jwtpermission_test.py
│       ├── arnold/
│       │   ├── __init__.py
│       │   ├── arnold_memo_test.py
│       │   ├── arnold_should_detain_test.py
│       │   ├── arnold_snmp_test.py
│       │   └── arnold_test.py
│       ├── asyncdns_test.py
│       ├── buildconf_test.py
│       ├── business/
│       │   ├── __init__.py
│       │   └── business_test.py
│       ├── config_test.py
│       ├── config_toml_test.py
│       ├── conftest.py
│       ├── dhcpstats/
│       │   ├── common_test.py
│       │   └── kea_dhcp_test.py
│       ├── django/
│       │   ├── __init__.py
│       │   ├── aliases_field_test.py
│       │   ├── filter_test.py
│       │   ├── formats_test.py
│       │   ├── forms_test.py
│       │   ├── settings_test.py
│       │   ├── templatetags/
│       │   │   ├── __init__.py
│       │   │   ├── info_test.py
│       │   │   ├── popover_test.py
│       │   │   └── string_manipulation_test.py
│       │   ├── utils_test.py
│       │   └── validators_test.py
│       ├── eventengine/
│       │   ├── __init__.py
│       │   ├── alerts_test.py
│       │   ├── engine_test.py
│       │   ├── plugin_test.py
│       │   └── severity_test.py
│       ├── general/
│       │   ├── __init__.py
│       │   ├── bitvector_test.py
│       │   ├── bulkparse_test.py
│       │   ├── config_test.py
│       │   ├── conftest.py
│       │   ├── daemon_test.py
│       │   ├── logengine_test.py
│       │   ├── login_not_required_backport_test.py
│       │   ├── modpython_test.py
│       │   ├── objectcache_test.py
│       │   ├── prefix_ip_collector_test.py
│       │   ├── pwhash_test.py
│       │   ├── test_tableformat.py
│       │   ├── util_test.py
│       │   ├── web_middleware_test.py
│       │   └── webfront_test.py
│       ├── info/
│       │   ├── __init__.py
│       │   ├── room_views_test.py
│       │   └── views_test.py
│       ├── ipdevpoll/
│       │   ├── __init__.py
│       │   ├── config_test.py
│       │   ├── descrparsers_test.py
│       │   ├── dnsname_test.py
│       │   ├── interfaces_test.py
│       │   ├── ipdevpoll_test.py
│       │   ├── mibs_test.py
│       │   ├── modules_test.py
│       │   ├── neighbor_test.py
│       │   ├── plugins_arp_test.py
│       │   ├── plugins_lldp_test.py
│       │   ├── plugins_paloaltoarp_test.py
│       │   ├── plugins_snmpcheck_test.py
│       │   ├── pool_test.py
│       │   ├── prefix_test.py
│       │   ├── schedule_test.py
│       │   ├── shadows_adjacency_test.py
│       │   ├── shadows_test.py
│       │   ├── snmp/
│       │   │   ├── __init__.py
│       │   │   └── common_test.py
│       │   ├── storage_test.py
│       │   ├── system_test.py
│       │   ├── timestamps_test.py
│       │   └── utils_test.py
│       ├── jwtconf_test.py
│       ├── logs_test.py
│       ├── macaddress/
│       │   ├── __init__.py
│       │   └── macaddress_test.py
│       ├── metrics/
│       │   ├── __init__.py
│       │   ├── data_test.py
│       │   ├── graphs_test.py
│       │   ├── names_test.py
│       │   ├── templates_test.py
│       │   └── thresholds_test.py
│       ├── mibs/
│       │   ├── __init__.py
│       │   ├── entity_mib_test.py
│       │   ├── lldp_mib_test.py
│       │   ├── mibretriever_test.py
│       │   ├── qbridge_mib_test.py
│       │   └── types_test.py
│       ├── models/
│       │   ├── event_test.py
│       │   ├── fields_test.py
│       │   ├── jwtrefreshtoken_test.py
│       │   ├── netbox_test.py
│       │   ├── sensor_test.py
│       │   └── varmap_test.py
│       ├── napalm_test.py
│       ├── natsort_test.py
│       ├── netmap/
│       │   ├── __init__.py
│       │   ├── cache_test.py
│       │   ├── metaclass_testcase.py
│       │   ├── metadata_json_test.py
│       │   ├── metadata_nx_test.py
│       │   ├── multidigraph_to_undirect_test.py
│       │   ├── stubs_test.py
│       │   ├── topology_layer2_testcase.py
│       │   ├── topology_layer3_testcase.py
│       │   └── topology_testcase.py
│       ├── pgsync_test.py
│       ├── portadmin/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── napalm/
│       │   │   ├── __init__.py
│       │   │   ├── conftest.py
│       │   │   ├── juniper_poe_test.py
│       │   │   └── juniper_test.py
│       │   ├── portadmin_poe_cisco_test.py
│       │   ├── portadmin_test.py
│       │   ├── portadmin_util_test.py
│       │   └── snmputils_test.py
│       ├── report/
│       │   ├── __init__.py
│       │   ├── iptools_test.py
│       │   └── util_test.py
│       ├── seeddb/
│       │   ├── management_profile_test.py
│       │   └── seeddb_test.py
│       ├── smsd/
│       │   ├── __init__.py
│       │   ├── dispatcher_test.py
│       │   └── gammudispatcher_test.py
│       ├── snmptrapd/
│       │   ├── __init__.py
│       │   ├── plugin_test.py
│       │   └── weathergoose_test.py
│       ├── statemon/
│       │   ├── conftest.py
│       │   ├── db_test.py
│       │   ├── host_test.py
│       │   ├── icmp_test.py
│       │   └── runqueue_test.py
│       ├── thresholdmon_test.py
│       ├── topology/
│       │   └── analyze_test.py
│       ├── watchdog/
│       │   └── tests_test.py
│       └── web/
│           ├── __init__.py
│           ├── auth/
│           │   ├── allauth_config_test.py
│           │   ├── allauth_views_test.py
│           │   ├── backends_test.py
│           │   └── remote_user_test.py
│           ├── geomap/
│           │   ├── __init__.py
│           │   └── utils_test.py
│           ├── ipam/
│           │   ├── __init__.py
│           │   ├── prefix_tree_test.py
│           │   └── util_test.py
│           ├── ipdevinfo_test.py
│           ├── jwtgen_test.py
│           ├── ldapauth_test.py
│           ├── maintenance/
│           │   ├── __init__.py
│           │   ├── forms_test.py
│           │   └── utils_test.py
│           ├── modals_test.py
│           ├── navlets_test.py
│           ├── portadmin/
│           │   ├── __init__.py
│           │   ├── utils_test.py
│           │   └── views_test.py
│           ├── qrcode_test.py
│           ├── servicecheckers_test.py
│           ├── sortedstats/
│           │   ├── sortedstats_test.py
│           │   └── sortedstatsconfig_test.py
│           ├── threshold_test.py
│           ├── urls_test.py
│           └── webfront_test.py
├── tools/
│   ├── README
│   ├── buglog.py
│   ├── docker/
│   │   ├── build.sh
│   │   ├── doc-watch.sh
│   │   ├── full-nav-restore.sh
│   │   ├── graphite/
│   │   │   ├── Dockerfile
│   │   │   ├── carbon.conf
│   │   │   └── supervisord.conf
│   │   ├── graphite.conf
│   │   ├── nav-apache-site.conf
│   │   ├── nav-start.sh
│   │   ├── run.sh
│   │   ├── sass-watch.sh
│   │   ├── supervisord.conf
│   │   ├── syncdb.sh
│   │   └── web.sh
│   ├── dump-remote-db.sh
│   ├── eventgenerators/
│   │   ├── boxevent.py
│   │   ├── devicenotice.py
│   │   ├── genericstate.py
│   │   ├── linkevent.py
│   │   ├── moduleevent.py
│   │   ├── servicestate.py
│   │   ├── snmpevent.py
│   │   └── thresholdstate.py
│   ├── forward/
│   │   ├── Dockerfile
│   │   └── snmp_forward.sh
│   ├── iana-enterprise.py
│   ├── release/
│   │   ├── announcement.py
│   │   ├── announcement.toml
│   │   └── templates/
│   │       └── announcement.md.j2
│   ├── reset-db-from-remote.sh
│   ├── reset-jwt-keys.sh
│   ├── restore-db.sh
│   ├── snmpdv3/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── snmpd.conf
│   ├── testsql.sh
│   ├── vendor.py
│   └── whatsgone.sh
├── tox.ini
├── version.sh
└── webpack.config.js
Download .txt
Showing preview only (914K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (10418 symbols across 1018 files)

FILE: checks/check_test_names.py
  function get_new_test_names_from_diff (line 36) | def get_new_test_names_from_diff(diff: str) -> list[tuple[str, str]]:
  function check_name (line 58) | def check_name(name: str) -> bool:
  function get_diff_staged (line 67) | def get_diff_staged() -> str:
  function get_diff_base (line 76) | def get_diff_base(base: str) -> str:
  function get_diff_files (line 95) | def get_diff_files(files: list[str]) -> str:
  function format_plain (line 113) | def format_plain(violations, total):
  function format_markdown (line 129) | def format_markdown(violations, total):
  function main (line 161) | def main():

FILE: contrib/scripts/isc_dhpcd_graphite/isc_dhpcd_graphite.py
  function parse_args (line 42) | def parse_args():
  function exec_dhcpd_pools (line 119) | def exec_dhcpd_pools(config_file, cmd_path=DEFAULT_CMD_PATH):
  function render (line 129) | def render(jsonblob, prefix, protocol=DEFAULT_PROTOCOL):
  function _render_text (line 135) | def _render_text(jsonblob, prefix):
  function _render_pickle (line 145) | def _render_pickle(jsonblob, prefix, protocol):
  function _tuplify (line 156) | def _tuplify(jsonblob, prefix):
  function _clean_vlan (line 171) | def _clean_vlan(location):
  function send_to_graphite (line 180) | def send_to_graphite(metrics_blob, server, port):
  function main (line 194) | def main():

FILE: doc/conf.py
  function setup (line 252) | def setup(app):

FILE: doc/exts/alerttypes.py
  function main (line 35) | def main():

FILE: doc/exts/xref.py
  function xref (line 8) | def xref(typ, rawtext, text, lineno, inliner, options={}, content=[]):
  function get_refs (line 35) | def get_refs(app):
  function setup (line 40) | def setup(app):

FILE: python/nav/Snmp/__init__.py
  function safestring (line 49) | def safestring(string, encodings_to_try=('utf-8', 'latin-1')):

FILE: python/nav/Snmp/defines.py
  class SecurityLevel (line 21) | class SecurityLevel(Enum):
  class AuthenticationProtocol (line 29) | class AuthenticationProtocol(Enum):
  class PrivacyProtocol (line 40) | class PrivacyProtocol(Enum):

FILE: python/nav/Snmp/errors.py
  class SnmpError (line 4) | class SnmpError(GeneralException):
  class TimeOutException (line 8) | class TimeOutException(SnmpError):
  class NameResolverException (line 12) | class NameResolverException(SnmpError):
  class NetworkError (line 16) | class NetworkError(SnmpError):
  class AgentError (line 20) | class AgentError(SnmpError):
  class EndOfMibViewError (line 24) | class EndOfMibViewError(AgentError):
  class UnsupportedSnmpVersionError (line 28) | class UnsupportedSnmpVersionError(SnmpError):
  class NoSuchObjectError (line 32) | class NoSuchObjectError(SnmpError):
  class SNMPv3ConfigurationError (line 36) | class SNMPv3ConfigurationError(SnmpError):

FILE: python/nav/Snmp/profile.py
  function get_snmp_session_for_profile (line 25) | def get_snmp_session_for_profile(profile: ManagementProfile) -> Callable:

FILE: python/nav/Snmp/pynetsnmp.py
  class Snmp (line 82) | class Snmp(object):
    method __init__ (line 88) | def __init__(
    method _verify_snmpv3_params (line 143) | def _verify_snmpv3_params(self):
    method _build_cmdline (line 169) | def _build_cmdline(self):
    method __del__ (line 197) | def __del__(self):
    method get (line 201) | def get(self, query="1.3.6.1.2.1.1.1.0"):
    method translate_type (line 219) | def translate_type(type):
    method set (line 228) | def set(self, query, type, value):
    method multi_set (line 246) | def multi_set(self, varbinds):
    method walk (line 258) | def walk(self, query="1.3.6.1.2.1.1.1.0"):
    method jog (line 290) | def jog(self, query="1.3.6.1.2.1.1.1.0"):
    method bulkwalk (line 310) | def bulkwalk(self, query="1.3.6.1.2.1.1.1.0", strip_prefix=False):
  class _MySnmpSession (line 356) | class _MySnmpSession(Session):
    method sget (line 362) | def sget(self, oids):
    method sgetnext (line 376) | def sgetnext(self, root):
    method sgetbulk (line 390) | def sgetbulk(self, nonrepeaters, maxrepetitions, oids):
    method sset (line 408) | def sset(self, varbinds):
  function converts (line 436) | def converts(asn_type):
  function asn_integer (line 450) | def asn_integer(value):
  function asn_unsigned (line 456) | def asn_unsigned(value):
  function asn_timeticks (line 462) | def asn_timeticks(value):
  function asn_ipaddress (line 468) | def asn_ipaddress(value):
  function asn_object_id (line 475) | def asn_object_id(value):
  function asn_octet_str (line 481) | def asn_octet_str(value):
  function asn_counter64 (line 489) | def asn_counter64(value):
  function snmp_api_errstring (line 500) | def snmp_api_errstring(err_code):
  function snmp_errstring (line 506) | def snmp_errstring(err_status):
  function _raise_on_error (line 512) | def _raise_on_error(err_code):
  function _raise_on_protocol_error (line 528) | def _raise_on_protocol_error(response):

FILE: python/nav/__init__.py
  class ObjectCache (line 27) | class ObjectCache(dict):
    method __setitem__ (line 34) | def __setitem__(self, key, item):
    method __delitem__ (line 41) | def __delitem__(self, key):
    method cache (line 45) | def cache(self, item):
    method invalidate (line 49) | def invalidate(self):
    method refresh (line 61) | def refresh(self):
  class CacheableObject (line 73) | class CacheableObject(object):
    method __init__ (line 79) | def __init__(self, object_=None):
    method __setattr__ (line 85) | def __setattr__(self, name, item):
    method __getattr__ (line 98) | def __getattr__(self, name):
    method is_cached (line 104) | def is_cached(self):
    method is_invalid (line 108) | def is_invalid(self):
    method refresh (line 113) | def refresh(self):
    method invalidate (line 117) | def invalidate(self):
    method age (line 125) | def age(self):
    method __repr__ (line 134) | def __repr__(self):
    method __str__ (line 143) | def __str__(self):
  class CacheError (line 147) | class CacheError(Exception):

FILE: python/nav/activeipcollector/collector.py
  function collect (line 27) | def collect(days=None):
  function get_interval_query (line 53) | def get_interval_query(intervals):
  function get_static_query (line 82) | def get_static_query():
  function get_intervals (line 101) | def get_intervals(days):

FILE: python/nav/activeipcollector/manager.py
  function run (line 35) | def run(days=None):
  function store (line 40) | def store(data):
  function store_tuple (line 54) | def store_tuple(db_tuple):
  function find_range (line 74) | def find_range(prefix):
  function get_timestamp (line 88) | def get_timestamp(timestamp: Optional[datetime.datetime] = None) -> int:

FILE: python/nav/alertengine/base.py
  function check_alerts (line 53) | def check_alerts(debug=False):
  function handle_new_alerts (line 163) | def handle_new_alerts(new_alerts):
  function _check_match_and_permission (line 244) | def _check_match_and_permission(
  function _check_permissions (line 283) | def _check_permissions(
  function handle_queued_alerts (line 321) | def handle_queued_alerts(queued_alerts, now=None):
  function process_single_queued_notification (line 388) | def process_single_queued_notification(queued_alert, now):
  function _verify_daily_dispatch (line 471) | def _verify_daily_dispatch(queued_alert, now, _logger=_logger):
  function _verify_weekly_dispatch (line 494) | def _verify_weekly_dispatch(queued_alert, now, _logger=_logger):
  function _verify_next_dispatch (line 524) | def _verify_next_dispatch(queued_alert, now, _logger=_logger):
  function _get_number_of_timeperiods_today (line 554) | def _get_number_of_timeperiods_today(alertprofile, now):
  function _calculate_timeperiod_start (line 566) | def _calculate_timeperiod_start(timeperiod, now=None):
  function alert_should_be_ignored (line 584) | def alert_should_be_ignored(queued_alert, subscription, now):
  function check_alert_against_filtergroupcontents (line 600) | def check_alert_against_filtergroupcontents(alert, filtergroupcontents, ...
  function clear_blacklisted_status_of_alert_senders (line 653) | def clear_blacklisted_status_of_alert_senders():

FILE: python/nav/alertengine/dispatchers/__init__.py
  class Dispatcher (line 44) | class Dispatcher(object):
    method __init__ (line 47) | def __init__(self, config=None):
    method send (line 50) | def send(self, address, alert, language='en'):
    method get_message (line 59) | def get_message(self, alert, language, message_type):
    method get_fallback_message (line 66) | def get_fallback_message(self, alert, language, message_type):
    method is_valid_address (line 85) | def is_valid_address(address):
  class DispatcherException (line 90) | class DispatcherException(Exception):
  class FatalDispatcherException (line 97) | class FatalDispatcherException(DispatcherException):
  class InvalidAlertAddressError (line 104) | class InvalidAlertAddressError(Exception):
  function is_valid_email (line 111) | def is_valid_email(address):

FILE: python/nav/alertengine/dispatchers/email_dispatcher.py
  class Email (line 34) | class Email(Dispatcher):
    method send (line 37) | def send(self, address, alert, language='en'):
    method is_valid_address (line 80) | def is_valid_address(address):

FILE: python/nav/alertengine/dispatchers/slack_dispatcher.py
  class Slack (line 33) | class Slack(Dispatcher):
    method __init__ (line 38) | def __init__(self, *args, **kwargs):
    method send (line 47) | def send(self, address, alert, language='en'):
    method _register_failure_for (line 78) | def _register_failure_for(self, address):
    method _is_still_backing_off_for (line 82) | def _is_still_backing_off_for(self, address):
    method is_valid_address (line 90) | def is_valid_address(address):

FILE: python/nav/alertengine/dispatchers/sms_dispatcher.py
  class Sms (line 30) | class Sms(Dispatcher):
    method send (line 33) | def send(self, address, alert, language='en'):
    method get_fallback_message (line 60) | def get_fallback_message(self, alert, language, message_type):
    method is_valid_address (line 75) | def is_valid_address(address):

FILE: python/nav/arnold.py
  class Memo (line 58) | class Memo(object):
    method __init__ (line 61) | def __init__(self, func):
    method __call__ (line 65) | def __call__(self, filename):
    method is_changed (line 74) | def is_changed(self, filename):
    method store (line 81) | def store(self, filename):
  class ChangePortStatusError (line 89) | class ChangePortStatusError(GeneralException):
  class ChangePortVlanError (line 95) | class ChangePortVlanError(GeneralException):
  class NoDatabaseInformationError (line 101) | class NoDatabaseInformationError(GeneralException):
  class PortNotFoundError (line 107) | class PortNotFoundError(GeneralException):
  class UnknownTypeError (line 113) | class UnknownTypeError(GeneralException):
  class DbError (line 119) | class DbError(GeneralException):
  class NotSupportedError (line 125) | class NotSupportedError(GeneralException):
  class NoSuchProgramError (line 131) | class NoSuchProgramError(GeneralException):
  class DetainmentNotAllowedError (line 137) | class DetainmentNotAllowedError(GeneralException):
  class WrongCatidError (line 143) | class WrongCatidError(DetainmentNotAllowedError):
  class AlreadyBlockedError (line 149) | class AlreadyBlockedError(DetainmentNotAllowedError):
  class InExceptionListError (line 155) | class InExceptionListError(DetainmentNotAllowedError):
  class FileError (line 161) | class FileError(GeneralException):
  class BlockonTrunkError (line 167) | class BlockonTrunkError(DetainmentNotAllowedError):
  function find_id_information (line 173) | def find_id_information(ip_or_mac, limit, trunk_ok=False):
  function find_input_type (line 232) | def find_input_type(ip_or_mac):
  function dictfetchall (line 251) | def dictfetchall(cursor):
  function create_candidates (line 257) | def create_candidates(caminfos, trunk_ok=False):
  function find_computer_info (line 281) | def find_computer_info(ip_or_mac, trunk_ok=False):
  function disable (line 286) | def disable(candidate, justification, username, comment="", autoenablest...
  function quarantine (line 310) | def quarantine(candidate, qvlan, justification, username, comment="", au...
  function check_target (line 335) | def check_target(target, trunk_ok=False):
  function check_identity (line 343) | def check_identity(candidate):
  function update_identity (line 364) | def update_identity(identity, justification, autoenablestep):
  function create_event (line 378) | def create_event(identity, comment, username):
  function raise_if_detainment_not_allowed (line 391) | def raise_if_detainment_not_allowed(interface, trunk_ok=False):
  function open_port (line 406) | def open_port(identity, username, eventcomment=""):
  function change_port_status (line 445) | def change_port_status(
  function change_port_vlan (line 489) | def change_port_vlan(identity, vlan):
  function sendmail (line 518) | def sendmail(from_email, toaddr, subject, msg):
  function get_host_name (line 528) | def get_host_name(ip):
  function get_netbios (line 540) | def get_netbios(ip):
  function check_non_block (line 551) | def check_non_block(ip):
  function compute_octet_string (line 572) | def compute_octet_string(hexstring, port, action='enable'):
  function parse_nonblock_file (line 591) | def parse_nonblock_file(filename):
  function get_config (line 622) | def get_config(configfile):
  function is_inside_vlans (line 629) | def is_inside_vlans(ip, vlans):

FILE: python/nav/asyncdns.py
  function reverse_lookup (line 65) | def reverse_lookup(addresses):
  function forward_lookup (line 75) | def forward_lookup(names):
  class Resolver (line 85) | class Resolver(object):
    method __init__ (line 88) | def __init__(self):
    method resolve (line 96) | def resolve(self, names):
    method lookup (line 133) | def lookup(self, name):
    method _extract_records (line 138) | def _extract_records(result, name):
    method _save_result (line 141) | def _save_result(self, result):
    method _errback (line 149) | def _errback(failure, host):
    method _save_error (line 153) | def _save_error(self, failure):
    method _finish (line 157) | def _finish(self, _):
  class ForwardResolver (line 161) | class ForwardResolver(Resolver):
    method lookup (line 168) | def lookup(self, name):
    method _extract_records (line 178) | def _extract_records(result, name):
  class ReverseResolver (line 196) | class ReverseResolver(Resolver):
    method lookup (line 199) | def lookup(self, address):
    method _extract_records (line 206) | def _extract_records(result, ip):

FILE: python/nav/auditlog/__init__.py
  function find_modelname (line 19) | def find_modelname(obj):

FILE: python/nav/auditlog/api.py
  class LGFKRelatedField (line 37) | class LGFKRelatedField(serializers.RelatedField):
    method to_representation (line 42) | def to_representation(self, value):
  function _collect_entity_references (line 46) | def _collect_entity_references(entries):
  function _batch_resolve_objects (line 59) | def _batch_resolve_objects(entries):
  function _resolve_entity (line 84) | def _resolve_entity(log_entry, model_field, pk_field, sortkey_field, obj...
  class LogEntrySerializer (line 111) | class LogEntrySerializer(serializers.ModelSerializer):
    class Meta (line 118) | class Meta:
  class LogEntrySerializerV2 (line 134) | class LogEntrySerializerV2(serializers.ModelSerializer):
    class Meta (line 141) | class Meta:
    method _object_cache (line 157) | def _object_cache(self):
    method get_actor (line 160) | def get_actor(self, obj):
    method get_object (line 165) | def get_object(self, obj):
    method get_target (line 170) | def get_target(self, obj):
  class MultipleFilter (line 176) | class MultipleFilter(filters.BaseFilterBackend):
    method filter_queryset (line 183) | def filter_queryset(self, request, queryset, view):
  class NetboxFilter (line 194) | class NetboxFilter(filters.BaseFilterBackend):
    method filter_queryset (line 202) | def filter_queryset(self, request, queryset, view):
  class NAVDefaultsMixin (line 221) | class NAVDefaultsMixin(object):
  class LogEntryViewSet (line 230) | class LogEntryViewSet(NAVDefaultsMixin, viewsets.ReadOnlyModelViewSet):
  class LogEntryViewSetV2 (line 256) | class LogEntryViewSetV2(NAVDefaultsMixin, viewsets.ReadOnlyModelViewSet):
    method list (line 281) | def list(self, request, *args, **kwargs):
    method retrieve (line 292) | def retrieve(self, request, *args, **kwargs):

FILE: python/nav/auditlog/apps.py
  class AuditlogConfig (line 18) | class AuditlogConfig(AppConfig):

FILE: python/nav/auditlog/models.py
  class LogEntry (line 32) | class LogEntry(models.Model):
    method add_log_entry (line 74) | def add_log_entry(
    method add_create_entry (line 113) | def add_create_entry(actor, obj):
    method add_delete_entry (line 128) | def add_delete_entry(actor, obj, template=None):
    method add_edit_entry (line 137) | def add_edit_entry(actor, old, new, attribute, include_values=True):
    method compare_objects (line 175) | def compare_objects(actor, old, new, attribute_list, censored_attribut...
    method __str__ (line 197) | def __str__(self):

FILE: python/nav/auditlog/utils.py
  function get_auditlog_entries (line 27) | def get_auditlog_entries(

FILE: python/nav/auditlog/views.py
  class AuditlogOverview (line 29) | class AuditlogOverview(TemplateView):
    method get_context_data (line 33) | def get_context_data(self, **kwargs):
  class AuditlogNetboxDetail (line 48) | class AuditlogNetboxDetail(AuditlogOverview):
    method get_context_data (line 51) | def get_context_data(self, **kwargs):
    method get_api_parameters (line 61) | def get_api_parameters(self):

FILE: python/nav/bin/alertengine.py
  function main (line 70) | def main():
  function parse_args (line 188) | def parse_args():
  function signalhandler (line 209) | def signalhandler(signum, _):
  function loginitsmtp (line 227) | def loginitsmtp(loglevel, mailaddr, fromaddr, mailserver):
  function usage (line 252) | def usage():
  function setdelay (line 257) | def setdelay(sec):

FILE: python/nav/bin/autoenable.py
  function main (line 47) | def main():

FILE: python/nav/bin/cisco_auth_sessions.py
  function main (line 52) | def main():
  function reactor_main (line 74) | def reactor_main(netbox, port, timeout):
  function query_and_display (line 83) | async def query_and_display(netbox, port, timeout):
  function process_auth_sessions (line 110) | def process_auth_sessions(sessions):
  function display_results (line 138) | def display_results(sessions, ifnames, ifaliases):
  function print_header (line 208) | def print_header(netbox, port):
  function failure_handler (line 216) | def failure_handler(failure):
  function endit (line 223) | def endit(result):
  function parse_args (line 233) | def parse_args():
  function device (line 270) | def device(devicestring):
  function _create_agentproxy (line 301) | def _create_agentproxy(netbox, port, timeout=TIMEOUT):

FILE: python/nav/bin/collect_active_ip.py
  function main (line 38) | def main(args=None):
  function exit_if_already_running (line 48) | def exit_if_already_running():
  function run (line 58) | def run(days):
  function get_parser (line 66) | def get_parser():

FILE: python/nav/bin/dhcpstats.py
  function main (line 46) | def main():
  function parse_args (line 64) | def parse_args():
  function collect_stats (line 79) | def collect_stats(config):
  function get_clients (line 123) | def get_clients(config):
  function exit_if_already_running (line 171) | def exit_if_already_running():

FILE: python/nav/bin/emailreports.py
  function main (line 35) | def main(args=None):
  function get_parser (line 43) | def get_parser():

FILE: python/nav/bin/ipdevpolld.py
  function main (line 20) | def main():

FILE: python/nav/bin/macwatch.py
  function prioritize_location (line 47) | def prioritize_location(cam_objects):
  function post_event (line 73) | def post_event(mac_watch, cam):
  function find_the_latest (line 103) | def find_the_latest(macwatch_matches):
  function delete_unwanted_matches (line 114) | def delete_unwanted_matches(macwatch_matches):
  function main (line 130) | def main():

FILE: python/nav/bin/mailin.py
  function main (line 46) | def main():
  function parse_args (line 74) | def parse_args():
  function read_and_process_input (line 95) | def read_and_process_input(plugins, test=False):
  function add_mailin_subsystem (line 126) | def add_mailin_subsystem():
  function load_plugins (line 138) | def load_plugins(paths):
  function authorize_match (line 159) | def authorize_match(plugin, msg):
  function init_logging (line 184) | def init_logging(filename):

FILE: python/nav/bin/maintengine.py
  function main (line 37) | def main():

FILE: python/nav/bin/navcheckservice.py
  function main (line 38) | def main():
  function parse_args (line 68) | def parse_args():
  function read_checker_args (line 92) | def read_checker_args(checker):

FILE: python/nav/bin/navclean.py
  function main (line 38) | def main():
  function make_argparser (line 90) | def make_argparser():
  function validate_sql (line 147) | def validate_sql(sql, args):
  function postgresql_datetime (line 160) | def postgresql_datetime(value):
  function postgresql_interval (line 166) | def postgresql_interval(value):
  function get_selected_cleaners (line 172) | def get_selected_cleaners(
  class RecordCleaner (line 190) | class RecordCleaner:
    method __init__ (line 196) | def __init__(self, connection):
    method filter (line 199) | def filter(self, expiry):
    method sql (line 203) | def sql(self, expiry):
    method clean (line 212) | def clean(self, expiry: str, dry_run: bool = False):
  class ArpDeleter (line 220) | class ArpDeleter(RecordCleaner):
  class ArpCloser (line 225) | class ArpCloser(RecordCleaner):
    method sql (line 232) | def sql(self, expiry):
  class CamDeleter (line 261) | class CamDeleter(RecordCleaner):
  class RadiusAcctDeleter (line 266) | class RadiusAcctDeleter(RecordCleaner):
  class RadiusLogDeleter (line 276) | class RadiusLogDeleter(RecordCleaner):
  class NetboxDeleter (line 281) | class NetboxDeleter(RecordCleaner):
  class SessionDeleter (line 286) | class SessionDeleter(RecordCleaner):
    method clean (line 292) | def clean(self, expiry, dry_run=False):

FILE: python/nav/bin/navdf.py
  function main (line 30) | def main():
  function parse_args (line 42) | def parse_args():

FILE: python/nav/bin/navdump.py
  function main (line 38) | def main():
  function parse_args (line 77) | def parse_args():
  function warn (line 119) | def warn(msg):
  function fail (line 123) | def fail(resultcode, msg):
  function header (line 128) | def header(definition):
  function lineout (line 134) | def lineout(line):
  class Handlers (line 141) | class Handlers(object):
    method netbox (line 145) | def netbox():
    method management_profile (line 170) | def management_profile():
    method org (line 182) | def org():
    method netboxgroup (line 194) | def netboxgroup():
    method device_group (line 201) | def device_group():
    method usage (line 206) | def usage():
    method location (line 213) | def location():
    method room (line 225) | def room():
    method type (line 242) | def type():
    method vendor (line 254) | def vendor():
    method prefix (line 261) | def prefix():
    method service (line 285) | def service():

FILE: python/nav/bin/naventity.py
  function main (line 45) | def main():
  function reactor_main (line 57) | def reactor_main(box, portnumber, timeout=TIMEOUT):
  function collect_entities (line 70) | async def collect_entities(netbox, portnumber, timeout=TIMEOUT):
  function make_graph (line 81) | def make_graph(entities, netbox):
  function print_graph (line 93) | def print_graph(graph):
  function failure_handler (line 102) | def failure_handler(failure):
  function endit (line 109) | def endit(result):
  function parse_args (line 119) | def parse_args():
  function device (line 150) | def device(devicestring):
  function _create_agentproxy (line 181) | def _create_agentproxy(netbox, portnumber, timeout=TIMEOUT):
  class GraphTraversal (line 199) | class GraphTraversal(asciitree.Traversal):
    method __init__ (line 200) | def __init__(self, graph):
    method get_children (line 204) | def get_children(self, node):
    method get_text (line 207) | def get_text(self, node):
    method get_roots (line 223) | def get_roots(self):

FILE: python/nav/bin/navmain.py
  function main (line 49) | def main(args=None):
  function make_argparser (line 61) | def make_argparser():
  function _add_bespoke_subparsers (line 99) | def _add_bespoke_subparsers(subparsers):
  function verify_root (line 141) | def verify_root():
  function service_iterator (line 148) | def service_iterator(query_list, func):
  function action_iterator (line 162) | def action_iterator(query_list, action, ok_string, fail_string, verbose=...
  function c_info (line 205) | def c_info(args):
  function c_list (line 241) | def c_list(args):
  function c_start (line 246) | def c_start(args):
  function c_stop (line 260) | def c_stop(args):
  function c_restart (line 267) | def c_restart(args):
  function c_status (line 275) | def c_status(args):
  function c_version (line 288) | def c_version(_args):
  function command_config_where (line 295) | def command_config_where(_args):
  function command_config_path (line 310) | def command_config_path(_args):
  function command_config_install (line 318) | def command_config_install(args):

FILE: python/nav/bin/navoidverify.py
  function main (line 46) | def main():
  function reactor_main (line 63) | def reactor_main(boxes, baseoid):
  function verify (line 69) | async def verify(netbox, oid):
  function endit (line 87) | def endit(_result):
  function parse_args (line 92) | def parse_args():
  function parallel (line 112) | def parallel(iterable, count, func, *args, **kwargs):
  function _create_agentproxy (line 124) | def _create_agentproxy(netbox):

FILE: python/nav/bin/navrefresh.py
  function main (line 34) | def main():
  function send_refresh_events (line 44) | def send_refresh_events(netboxes: list[Netbox], job: str):
  function parse_args (line 52) | def parse_args():
  class SysnamePattern (line 67) | class SysnamePattern(list):
    method __init__ (line 70) | def __init__(self, pattern: str):
  function non_empty_string (line 78) | def non_empty_string(value: str):

FILE: python/nav/bin/navsnmp.py
  function main (line 33) | def main():
  function parse_args (line 45) | def parse_args():
  function get_matching_boxes (line 62) | def get_matching_boxes(patterns):
  function snmp_printer (line 74) | def snmp_printer(netbox):

FILE: python/nav/bin/navstats.py
  class NAVStatsConfig (line 39) | class NAVStatsConfig(NAVConfigParser):
  function main (line 45) | def main():
  function collect_stats (line 51) | def collect_stats(config):
  function collect (line 69) | def collect(metric_path_fmt, query, valueindex):
  function create_metric (line 91) | def create_metric(result, metric_path_fmt, timestamp, valueindex=-1):

FILE: python/nav/bin/navsynctypes.py
  function main (line 56) | def main():
  function print_vendor (line 75) | def print_vendor(vendor: str):
  function print_type (line 85) | def print_type(typ: NetboxType):
  function escape (line 96) | def escape(v):
  function parse_args (line 101) | def parse_args():

FILE: python/nav/bin/navuser.py
  function main (line 33) | def main():
  function listusers (line 40) | def listusers(args):
  function adduser (line 59) | def adduser(args):
  function removeuser (line 80) | def removeuser(args):
  function adminify (line 85) | def adminify(args):
  function passwd (line 106) | def passwd(args):
  function verify (line 135) | def verify(args):
  function lock (line 149) | def lock(args):
  function unlock (line 159) | def unlock(args):
  function usergetter (line 176) | def usergetter(login):
  function parse_args (line 183) | def parse_args():

FILE: python/nav/bin/netbiostracker.py
  function main (line 35) | def main():

FILE: python/nav/bin/pping.py
  function main (line 46) | def main():
  function make_argparser (line 58) | def make_argparser():
  class Pinger (line 66) | class Pinger(object):
    method __init__ (line 67) | def __init__(self, socket=None, foreground=False):
    method update_host_list (line 87) | def update_host_list(self):
    method generate_events (line 121) | def generate_events(self):
    method main (line 183) | def main(self):
    method signalhandler (line 211) | def signalhandler(self, signum, _frame):
  function start (line 230) | def start(foreground, socket):

FILE: python/nav/bin/radiusparser.py
  function main (line 53) | def main(args=None):
  function parse_octals (line 175) | def parse_octals(line):
  function pid_running (line 186) | def pid_running(pidfile="/tmp/radiusparser_po.pid"):
  class Tail (line 228) | class Tail(object):
    method __init__ (line 231) | def __init__(
    method _recompute_rate (line 272) | def _recompute_rate(self, n, start, stop):
    method _fill_cache (line 306) | def _fill_cache(self):
    method _dequeue (line 325) | def _dequeue(self):
    method _reset (line 335) | def _reset(self):
    method nextline (line 343) | def nextline(self):
    method close (line 371) | def close(self):
    method __iter__ (line 378) | def __iter__(self):
    method next (line 387) | def next(self):
  function parse_line (line 409) | def parse_line(line):
  class Row (line 439) | class Row:
    method __init__ (line 440) | def __init__(self, m):
    method __getattr__ (line 444) | def __getattr__(self, attr):
    method __repr__ (line 450) | def __repr__(self):
    method __str__ (line 453) | def __str__(self):
  function iter_lines (line 457) | def iter_lines(file):

FILE: python/nav/bin/servicemon.py
  class Controller (line 41) | class Controller:
    method __init__ (line 42) | def __init__(self, foreground=False):
    method get_checkers (line 60) | def get_checkers(self):
    method main (line 87) | def main(self):
    method signalhandler (line 123) | def signalhandler(self, signum, _):
  function main (line 143) | def main(args=None):
  function parse_args (line 168) | def parse_args():

FILE: python/nav/bin/smsd.py
  function main (line 66) | def main():
  function parse_args (line 285) | def parse_args():
  function setdelay (line 347) | def setdelay(seconds):
  function resetdelay (line 356) | def resetdelay():
  function increasedelay (line 364) | def increasedelay(seconds, delayfactor, maxdelay):
  function backoff (line 373) | def backoff(seconds, error, retryvars):
  function backoffaction (line 411) | def backoffaction(error, retrylimitaction):
  function signalhandler (line 460) | def signalhandler(signum, _):
  function loginitsmtp (line 481) | def loginitsmtp(loglevel, mailaddr, fromaddr, mailserver):

FILE: python/nav/bin/snmptrapd.py
  function main (line 61) | def main():
  function parse_args (line 160) | def parse_args():
  function Address (line 183) | def Address(address):
  function trap_handler (line 197) | def trap_handler(trap):
  function _log_trap_handle_result (line 234) | def _log_trap_handle_result(handled_by, trap):
  function verify_subsystem (line 254) | def verify_subsystem():
  function signal_handler (line 265) | def signal_handler(signum, _):
  class SnmptrapdConfig (line 280) | class SnmptrapdConfig(NAVConfigParser):

FILE: python/nav/bin/sortedstats_cacher.py
  function main (line 21) | def main():
  function run (line 31) | def run(timeframe, config):
  function get_parser (line 42) | def get_parser():
  function exit_if_running (line 53) | def exit_if_running(pidfile):

FILE: python/nav/bin/start_arnold.py
  function main (line 65) | def main(args=None):
  function print_detention_profiles (line 92) | def print_detention_profiles():
  function get_addresses_to_detain (line 100) | def get_addresses_to_detain(options):
  function parse_input (line 113) | def parse_input(lines):
  function detain (line 143) | def detain(address, profile, comment=''):
  function find_duration (line 176) | def find_duration(candidate, profile):
  function report_detentions (line 207) | def report_detentions(profile, detentions):
  function find_contact_addresses (line 239) | def find_contact_addresses(detentions):
  function get_organization (line 265) | def get_organization(ip):
  function parse_command_options (line 277) | def parse_command_options():
  function valid_profile (line 303) | def valid_profile(detention_profile_id):

FILE: python/nav/bin/t1000.py
  function main (line 57) | def main():
  function pursue (line 93) | def pursue(identity, candidate):
  function is_detained_by_profile (line 128) | def is_detained_by_profile(identity):
  function find_autoenable_step (line 136) | def find_autoenable_step(identity):
  function should_pursue (line 148) | def should_pursue(identity, profile):
  function detain (line 163) | def detain(identity, candidate):

FILE: python/nav/bin/update_ouis.py
  function main (line 45) | def main():
  function run (line 53) | def run():
  function _download_oui_file (line 65) | def _download_oui_file(url: str) -> str:
  function _parse_ouis (line 74) | def _parse_ouis(oui_data: str) -> Generator[Tuple[str, str], None, None]:
  function _parse_line (line 91) | def _parse_line(line: str) -> Tuple[str, str]:
  function _update_database (line 98) | def _update_database(ouis: Iterable[Tuple[str, str]]):

FILE: python/nav/bitvector.py
  class BitVector (line 23) | class BitVector(object):
    method __init__ (line 34) | def __init__(self, octetstring):
    method to_bytes (line 37) | def to_bytes(self):
    method __len__ (line 40) | def __len__(self):
    method __repr__ (line 43) | def __repr__(self):
    method __setitem__ (line 46) | def __setitem__(self, posn, val):
    method __getitem__ (line 61) | def __getitem__(self, posn):
    method from_hex (line 79) | def from_hex(cls, hexstring):
    method to_binary (line 88) | def to_binary(self):
    method to_hex (line 98) | def to_hex(self):
    method reverse (line 103) | def reverse(self):
    method get_set_bits (line 110) | def get_set_bits(self):

FILE: python/nav/bootstrap.py
  function bootstrap_django (line 30) | def bootstrap_django(caller=None):

FILE: python/nav/bulkimport.py
  function _get_aliases (line 39) | def _get_aliases(aliases: str) -> list[str]:
  function _validate_aliases (line 45) | def _validate_aliases(aliases: str) -> None:
  class BulkImporter (line 52) | class BulkImporter:
    method __init__ (line 55) | def __init__(self, parser):
    method __iter__ (line 58) | def __iter__(self):
    method __next__ (line 61) | def __next__(self):
    method _decode_as_utf8 (line 72) | def _decode_as_utf8(row):
    method _create_objects_from_row (line 79) | def _create_objects_from_row(self, row):
  class NetboxImporter (line 88) | class NetboxImporter(BulkImporter):
    method _create_objects_from_row (line 91) | def _create_objects_from_row(self, row):
    method _get_netbox_from_row (line 117) | def _get_netbox_from_row(row):
    method _get_management_profiles (line 134) | def _get_management_profiles(netbox, profile_names):
    method _get_netboxinfo_from_function (line 147) | def _get_netboxinfo_from_function(netbox, function):
    method _get_groups_from_group (line 154) | def _get_groups_from_group(netbox, netboxgroup):
    method _parse_data (line 165) | def _parse_data(datastring):
  class ServiceImporter (line 173) | class ServiceImporter(BulkImporter):
    method _create_objects_from_row (line 176) | def _create_objects_from_row(self, row):
    method _get_handler_descr (line 193) | def _get_handler_descr(handler):
    method _get_service_properties (line 200) | def _get_service_properties(service, args):
    method _validate_handler_args (line 208) | def _validate_handler_args(handler_descr, service_args):
  class LocationImporter (line 221) | class LocationImporter(BulkImporter):
    method _create_objects_from_row (line 224) | def _create_objects_from_row(self, row):
  class RoomImporter (line 241) | class RoomImporter(BulkImporter):
    method _create_objects_from_row (line 244) | def _create_objects_from_row(self, row):
  class ManagementProfileImporter (line 264) | class ManagementProfileImporter(BulkImporter):
    method _create_objects_from_row (line 267) | def _create_objects_from_row(self, row):
  class OrgImporter (line 280) | class OrgImporter(BulkImporter):
    method _create_objects_from_row (line 283) | def _create_objects_from_row(self, row):
  class PrefixImporter (line 299) | class PrefixImporter(BulkImporter):
    method _create_objects_from_row (line 302) | def _create_objects_from_row(self, row):
  class UsageImporter (line 330) | class UsageImporter(BulkImporter):
    method _create_objects_from_row (line 333) | def _create_objects_from_row(self, row):
  class NetboxTypeImporter (line 339) | class NetboxTypeImporter(BulkImporter):
    method _create_objects_from_row (line 342) | def _create_objects_from_row(self, row):
  class VendorImporter (line 356) | class VendorImporter(BulkImporter):
    method _create_objects_from_row (line 359) | def _create_objects_from_row(self, row):
  class NetboxGroupImporter (line 365) | class NetboxGroupImporter(BulkImporter):
    method _create_objects_from_row (line 368) | def _create_objects_from_row(self, row):
  class CablingImporter (line 376) | class CablingImporter(BulkImporter):
    method _create_objects_from_row (line 379) | def _create_objects_from_row(self, row):
  class PatchImporter (line 393) | class PatchImporter(BulkImporter):
    method _create_objects_from_row (line 396) | def _create_objects_from_row(self, row):
  function get_object_or_fail (line 408) | def get_object_or_fail(cls, **kwargs):
  function raise_if_exists (line 426) | def raise_if_exists(cls, **kwargs):
  class BulkImportError (line 438) | class BulkImportError(BulkParseError):
  class DoesNotExist (line 444) | class DoesNotExist(BulkImportError):
  class MultipleObjectsReturned (line 450) | class MultipleObjectsReturned(BulkImportError):
  class AlreadyExists (line 456) | class AlreadyExists(BulkImportError):
  class InvalidValue (line 462) | class InvalidValue(BulkImportError):
  function reset_object_foreignkeys (line 468) | def reset_object_foreignkeys(obj):
  function get_foreign_key_fields (line 481) | def get_foreign_key_fields(obj):

FILE: python/nav/bulkparse.py
  class BulkParser (line 38) | class BulkParser:
    method __init__ (line 46) | def __init__(self, data, delimiter=None):
    method __iter__ (line 78) | def __iter__(self):
    method __next__ (line 81) | def __next__(self):
    method _strip_cell_whitespace (line 94) | def _strip_cell_whitespace(row):
    method validate_row (line 107) | def validate_row(self, row):
    method is_valid_fieldvalue (line 118) | def is_valid_fieldvalue(self, fieldname, value):
    method get_header (line 127) | def get_header(cls):
  class CommentStripper (line 150) | class CommentStripper:
    method __init__ (line 155) | def __init__(self, source_iterator):
    method __iter__ (line 158) | def __iter__(self):
    method __next__ (line 161) | def __next__(self):
  function validate_attribute_list (line 167) | def validate_attribute_list(value):
  class NetboxBulkParser (line 184) | class NetboxBulkParser(BulkParser):
    method _validate_ip (line 201) | def _validate_ip(value):
    method _validate_data (line 210) | def _validate_data(datastring):
  class ManagementProfileBulkParser (line 222) | class ManagementProfileBulkParser(BulkParser):
    method _validate_configuration (line 236) | def _validate_configuration(configuration):
    method _validate_protocol (line 246) | def _validate_protocol(protocol):
  class UsageBulkParser (line 251) | class UsageBulkParser(BulkParser):
    method _validate_usageid (line 260) | def _validate_usageid(cls, value):
  class LocationBulkParser (line 264) | class LocationBulkParser(BulkParser):
    method _validate_locationid (line 272) | def _validate_locationid(cls, value):
  class OrgBulkParser (line 276) | class OrgBulkParser(BulkParser):
    method _validate_orgid (line 286) | def _validate_orgid(cls, value):
  class PrefixBulkParser (line 290) | class PrefixBulkParser(BulkParser):
    method _validate_netaddr (line 297) | def _validate_netaddr(value):
    method _validate_vlan (line 306) | def _validate_vlan(vlan):
  class RoomBulkParser (line 316) | class RoomBulkParser(BulkParser):
    method _validate_roomid (line 326) | def _validate_roomid(cls, value):
    method _validate_position (line 330) | def _validate_position(cls, value):
  class ServiceBulkParser (line 334) | class ServiceBulkParser(BulkParser):
  class NetboxGroupBulkParser (line 343) | class NetboxGroupBulkParser(BulkParser):
  class NetboxTypeBulkParser (line 350) | class NetboxTypeBulkParser(BulkParser):
  class VendorBulkParser (line 357) | class VendorBulkParser(BulkParser):
    method _validate_vendorid (line 365) | def _validate_vendorid(cls, value):
  class CablingBulkParser (line 369) | class CablingBulkParser(BulkParser):
  class PatchBulkParser (line 376) | class PatchBulkParser(BulkParser):
  class BulkParseError (line 386) | class BulkParseError(GeneralException):
    method __repr__ (line 389) | def __repr__(self):
  class RequiredFieldMissing (line 393) | class RequiredFieldMissing(BulkParseError):
    method __init__ (line 396) | def __init__(self, line_num, missing_field):
    method __str__ (line 401) | def __str__(self):
  class InvalidFieldValue (line 409) | class InvalidFieldValue(BulkParseError):
    method __init__ (line 412) | def __init__(self, line_num, field, value):
    method __str__ (line 418) | def __str__(self):

FILE: python/nav/colors.py
  function colorize (line 67) | def colorize(color):
  function print_color (line 93) | def print_color(string, color, newline=True):
  function set_foreground (line 100) | def set_foreground(color):
  function reset_foreground (line 107) | def reset_foreground():
  function get_terminal_width (line 114) | def get_terminal_width():

FILE: python/nav/config/__init__.py
  function get_config_locations (line 60) | def get_config_locations() -> Iterator[Path]:
  function list_config_files_from_dir (line 73) | def list_config_files_from_dir(dirname, suffix="conf"):
  function find_config_dir (line 83) | def find_config_dir(suffix="conf"):
  function read_flat_config (line 89) | def read_flat_config(config_file, delimiter='='):
  function getconfig (line 120) | def getconfig(configfile, defaults=None):
  class NAVConfigParser (line 147) | class NAVConfigParser(configparser.ConfigParser):
    method __init__ (line 165) | def __init__(self, default_config=None, default_config_files=None):
    method read_all (line 177) | def read_all(self):
  class NavConfigParserDefaultSection (line 194) | class NavConfigParserDefaultSection(object):
    method __init__ (line 204) | def __init__(self, section):
    method get (line 208) | def get(self, *args):
    method getboolean (line 211) | def getboolean(self, *args):
  function find_config_file (line 215) | def find_config_file(filename):
  function open_configfile (line 232) | def open_configfile(filename):
  function install_example_config_files (line 244) | def install_example_config_files(target_directory, overwrite=False, call...
  function _config_resource_walk (line 260) | def _config_resource_walk(source=''):
  function _install_single_config_resource_ (line 278) | def _install_single_config_resource_(source, target, overwrite=False):
  function verify_nav_config (line 298) | def verify_nav_config(config):
  function _is_directory_writable_by_user (line 340) | def _is_directory_writable_by_user(directory, username):
  class ConfigurationError (line 358) | class ConfigurationError(GeneralException):

FILE: python/nav/config/toml.py
  class TOMLConfigParser (line 36) | class TOMLConfigParser(UserDict):
    method __init__ (line 50) | def __init__(
    method __getitem__ (line 64) | def __getitem__(self, key):
    method read_file (line 72) | def read_file(self, fp):
    method read_string (line 77) | def read_string(self, s: str, /, *, parse_float=float):
    method _merge_with_default (line 82) | def _merge_with_default(self, configdict):
    method _read (line 85) | def _read(self, filename):
  function merge_dict_with_defaults (line 98) | def merge_dict_with_defaults(data, defaults):

FILE: python/nav/daemon.py
  class DaemonError (line 51) | class DaemonError(Exception):
  class UserNotFoundError (line 57) | class UserNotFoundError(DaemonError):
    method __init__ (line 60) | def __init__(self, username):
    method __str__ (line 64) | def __str__(self):
  class SwitchUserError (line 68) | class SwitchUserError(DaemonError):
    method __init__ (line 71) | def __init__(self, olduid, oldgid, newuid, newgid):
    method __str__ (line 78) | def __str__(self):
  class AlreadyRunningError (line 87) | class AlreadyRunningError(DaemonError):
    method __init__ (line 90) | def __init__(self, pid):
    method __str__ (line 94) | def __str__(self):
  class PidFileReadError (line 98) | class PidFileReadError(DaemonError):
    method __init__ (line 101) | def __init__(self, pidfile):
    method __str__ (line 105) | def __str__(self):
  class PidFileWriteError (line 109) | class PidFileWriteError(DaemonError):
    method __init__ (line 112) | def __init__(self, pidfile, error):
    method __str__ (line 117) | def __str__(self):
  class ForkError (line 124) | class ForkError(DaemonError):
    method __init__ (line 127) | def __init__(self, forkno, error):
    method __str__ (line 132) | def __str__(self):
  function switchuser (line 139) | def switchuser(username):
  function justme (line 203) | def justme(pidfile):
  function writepidfile (line 256) | def writepidfile(pidfile):
  function pidfile_path (line 275) | def pidfile_path(pidfile):
  function redirect_std_fds (line 283) | def redirect_std_fds(stdin=None, stdout=None, stderr=None):
  function daemonize (line 317) | def daemonize(pidfile, stdin=None, stdout=None, stderr=None):
  function daemonexit (line 382) | def daemonexit(pidfile):
  function safesleep (line 409) | def safesleep(delay):
  function signame (line 435) | def signame(signum):

FILE: python/nav/db/__init__.py
  class ConnectionObject (line 39) | class ConnectionObject(nav.CacheableObject):
    method __init__ (line 45) | def __init__(self, object_, key):
    method is_invalid (line 50) | def is_invalid(self):
    method ping (line 70) | def ping(self):
  function escape (line 82) | def escape(string):
  function get_connection_parameters (line 93) | def get_connection_parameters(script_name='default', database='nav'):
  function get_connection_string (line 131) | def get_connection_string(db_params=None, script_name='default'):
  function getConnection (line 156) | def getConnection(scriptName, database='nav'):
  function closeConnections (line 192) | def closeConnections():
  function commit_all_connections (line 201) | def commit_all_connections():
  function retry_on_db_loss (line 208) | def retry_on_db_loss(count=3, delay=2, fallback=None, also_handled=None):
  class ConnectionParameters (line 263) | class ConnectionParameters(object):
    method __init__ (line 266) | def __init__(self, dbhost, dbport, dbname, user, password):
    method from_config (line 274) | def from_config(cls):
    method from_environment (line 279) | def from_environment(cls):
    method for_postgres_user (line 288) | def for_postgres_user(cls):
    method export (line 302) | def export(self, environ):
    method as_tuple (line 318) | def as_tuple(self):
    method __str__ (line 322) | def __str__(self):

FILE: python/nav/debug.py
  function calltracer (line 24) | def calltracer(function, logfunction=print):
  function log_stacktrace (line 53) | def log_stacktrace(logger, stacktrace):
  function _dumpvars (line 85) | def _dumpvars(varitems):
  function log_last_django_query (line 93) | def log_last_django_query(logger):

FILE: python/nav/dhcpstats/common.py
  function fetch_graph_urls_for_prefixes (line 45) | def fetch_graph_urls_for_prefixes(prefixes: list[IPy.IP]) -> list[str]:
  function fetch_paths_from_graphite (line 108) | def fetch_paths_from_graphite():
  function group_paths (line 143) | def group_paths(paths: list["DhcpPath"]):
  function drop_groups_not_in_prefixes (line 156) | def drop_groups_not_in_prefixes(
  function range_str (line 171) | def range_str(first_ip: IPy.IP, last_ip: IPy.IP):
  class DhcpPath (line 203) | class DhcpPath:
    method from_graphite_path (line 244) | def from_graphite_path(cls, graphite_path: str):
    method from_external_info (line 310) | def from_external_info(
    method to_graphite_path (line 353) | def to_graphite_path(self, metric_name, wildcard_for_group=False):
    method intersects (line 375) | def intersects(self, prefixes: Iterable[IPy.IP]):
    method _unescape_graphite_address (line 388) | def _unescape_graphite_address(escaped_address: str) -> IPy.IP:
    method _check_ip_pair (line 400) | def _check_ip_pair(first_ip: IPy.IP, last_ip: IPy.IP):
    method is_standalone (line 415) | def is_standalone(self):

FILE: python/nav/dhcpstats/errors.py
  class CommunicationError (line 21) | class CommunicationError(GeneralException):
  class KeaUnexpected (line 25) | class KeaUnexpected(CommunicationError):
  class KeaError (line 29) | class KeaError(CommunicationError):
  class KeaUnsupported (line 33) | class KeaUnsupported(CommunicationError):
  class KeaEmpty (line 37) | class KeaEmpty(CommunicationError):
  class KeaConflict (line 41) | class KeaConflict(CommunicationError):

FILE: python/nav/dhcpstats/kea_dhcp.py
  class Pool (line 48) | class Pool:
    method __str__ (line 64) | def __str__(self):
  class Client (line 75) | class Client:
    method __init__ (line 91) | def __init__(
    method __str__ (line 143) | def __str__(self):
    method fetch_stats (line 149) | def fetch_stats(self) -> list[GraphiteMetric]:
    method _fetch_raw_stats (line 204) | def _fetch_raw_stats(self) -> dict:
    method _fetch_kea_config (line 212) | def _fetch_kea_config(self) -> dict:
    method _fetch_kea_config_hash (line 230) | def _fetch_kea_config_hash(self) -> Optional[str]:
    method _send_query (line 245) | def _send_query(self, command: str, **kwargs) -> dict:
    method _create_session (line 339) | def _create_session(self) -> Session:
    method _subnets_of_kea_config (line 398) | def _subnets_of_kea_config(self, config: dict) -> Iterator[dict]:
    method _pools_of_subnet (line 413) | def _pools_of_subnet(self, subnet: dict) -> Iterator[Pool]:
    method _stats_of_pool (line 465) | def _stats_of_pool(self, raw_stats: dict, pool: Pool) -> Iterator[Grap...
    method _bounds_of_pool_range (line 506) | def _bounds_of_pool_range(self, pool_range: str) -> tuple[IP, IP]:
    method _group_name_of_pool (line 530) | def _group_name_of_pool(self, pool: dict) -> Optional[str]:
    method _log_consistency_with_upstream_pools (line 547) | def _log_consistency_with_upstream_pools(self, local_pools: list):
    method _log_runtime (line 570) | def _log_runtime(
  function _extract_pool_stat (line 586) | def _extract_pool_stat(raw_stats: dict, pool: Pool, name: str) -> int:
  class _KeaStatus (line 606) | class _KeaStatus(IntEnum):
    method describe (line 616) | def describe(cls, status: int) -> str:
  function _raise_for_kea_status (line 623) | def _raise_for_kea_status(status: int):

FILE: python/nav/django/apps.py
  class NavDjangoConfig (line 4) | class NavDjangoConfig(AppConfig):

FILE: python/nav/django/context_processors.py
  function debug (line 43) | def debug(_request):
  function account_processor (line 57) | def account_processor(request):
  function nav_version (line 117) | def nav_version(_request):
  function footer_info (line 123) | def footer_info(_request):
  function toolbox (line 127) | def toolbox(request):
  function graphite_base (line 131) | def graphite_base(_request):
  function auth (line 136) | def auth(request):

FILE: python/nav/django/decorators.py
  function require_admin (line 24) | def require_admin(func):

FILE: python/nav/django/filter.py
  class NAVExceptionReporterFilter (line 35) | class NAVExceptionReporterFilter(SafeExceptionReporterFilter):
    method get_post_parameters (line 38) | def get_post_parameters(self, request):

FILE: python/nav/django/forms.py
  class CIDRField (line 31) | class CIDRField(forms.CharField):
    method clean (line 34) | def clean(self, value):
  class PointField (line 41) | class PointField(forms.CharField):
    method clean (line 44) | def clean(self, value):
  class JSONWidget (line 50) | class JSONWidget(Textarea):
    method _render_value (line 51) | def _render_value(self, value):
    method render (line 64) | def render(self, name, value, attrs=None, renderer=None):
  class HStoreField (line 70) | class HStoreField(Field):
    method __init__ (line 71) | def __init__(self, **params):
    method to_python (line 75) | def to_python(self, value):
  function validate_aliases (line 79) | def validate_aliases(aliases: list[str]) -> list[str]:
  class AliasListWidget (line 104) | class AliasListWidget(forms.Widget):
    method get_context (line 109) | def get_context(self, name, value, attrs):
    method value_from_datadict (line 116) | def value_from_datadict(self, data, files, name):
  class AliasListField (line 120) | class AliasListField(forms.Field):
    method __init__ (line 125) | def __init__(self, *args, verbose_name='entry', **kwargs):
    method prepare_value (line 133) | def prepare_value(self, value):
    method clean (line 138) | def clean(self, value):
  function _parse_json_list (line 142) | def _parse_json_list(value):

FILE: python/nav/django/legacy.py
  class LegacyCleanupMiddleware (line 23) | class LegacyCleanupMiddleware(MiddlewareMixin):
    method process_response (line 29) | def process_response(self, _request, response):

FILE: python/nav/django/settings.py
  function _login_not_required (line 36) | def _login_not_required(view_func):
  class Suppress503 (line 74) | class Suppress503(logging.Filter):
    method filter (line 82) | def filter(self, record):

FILE: python/nav/django/templatetags/breadcrumbs.py
  function _get_breadcrumb_config (line 10) | def _get_breadcrumb_config():
  function to_breadcrumbs (line 46) | def to_breadcrumbs(path):
  function clean_path (line 70) | def clean_path(path):

FILE: python/nav/django/templatetags/date_and_time.py
  function default_datetime (line 12) | def default_datetime(value):
  function short_time_format (line 23) | def short_time_format(value):
  function remove_microseconds (line 35) | def remove_microseconds(delta):

FILE: python/nav/django/templatetags/forms.py
  function is_checkbox (line 11) | def is_checkbox(field):
  function show_field (line 16) | def show_field(field):

FILE: python/nav/django/templatetags/info.py
  function time_since (line 32) | def time_since(timestamp):
  function days_since (line 51) | def days_since(timestamp):
  function _is_more_or_less_now (line 66) | def _is_more_or_less_now(timestamp):
  function is_max_timestamp (line 73) | def is_max_timestamp(timestamp):
  function run (line 82) | def run(function, arg):
  function get_attr (line 88) | def get_attr(value, arg):
  function find_attr (line 103) | def find_attr(obj, attrlist):
  function lookup (line 117) | def lookup(value, key):
  function interval (line 123) | def interval(value):
  function add_interval (line 134) | def add_interval(value, seconds):
  function get_graph_url (line 150) | def get_graph_url(obj, time_frame):
  function get_netbox_availability (line 155) | def get_netbox_availability(netbox, time_frame):
  function get_value (line 168) | def get_value(something, key):
  function sortdict (line 177) | def sortdict(dictionary, reverse=False):
  function is_list (line 183) | def is_list(value):
  function highlight (line 189) | def highlight(text, query):
  function dunderless (line 200) | def dunderless(mapping):

FILE: python/nav/django/templatetags/maintenance.py
  function model_verbose_name (line 26) | def model_verbose_name(model):
  function component_name (line 37) | def component_name(component):
  function component_description (line 51) | def component_description(component):
  function component_db_table (line 63) | def component_db_table(component):

FILE: python/nav/django/templatetags/popover.py
  function confirm_popover (line 23) | def confirm_popover(
  function popover_close_button (line 74) | def popover_close_button(text: str = "Cancel", classes: str = "secondary...
  class PopoverNode (line 91) | class PopoverNode(template.Node):
    method __init__ (line 94) | def __init__(
    method render (line 118) | def render(self, context):
  function _build_trigger_html (line 167) | def _build_trigger_html(element, id_value, text, classes):
  function _parse_popover_kwargs (line 181) | def _parse_popover_kwargs(bits, tag_name):
  function _validate_popover_params (line 211) | def _validate_popover_params(trigger_element, size, side, align, tag_name):
  function do_popover (line 239) | def do_popover(parser, token):
  function _strip_quotes (line 298) | def _strip_quotes(value):
  function _parse_bool (line 308) | def _parse_bool(value):

FILE: python/nav/django/templatetags/port_info.py
  function get_direction_class (line 10) | def get_direction_class(direction):

FILE: python/nav/django/templatetags/portadmin.py
  function drawLight (line 7) | def drawLight(value):

FILE: python/nav/django/templatetags/query.py
  function query (line 26) | def query(viewname, **kwargs):

FILE: python/nav/django/templatetags/radius.py
  function time_from_seconds (line 10) | def time_from_seconds(value):

FILE: python/nav/django/templatetags/report.py
  function get_item (line 13) | def get_item(value, arg):
  function escapeslash (line 19) | def escapeslash(value):
  function report (line 24) | def report(name, **kwargs):

FILE: python/nav/django/templatetags/silent_include.py
  class IncludeNode (line 14) | class IncludeNode(template.Node):
    method __init__ (line 15) | def __init__(self, template_name):
    method render (line 18) | def render(self, context):
  function try_to_include (line 32) | def try_to_include(_, token):

FILE: python/nav/django/templatetags/string_manipulation.py
  function shorten_ifname (line 11) | def shorten_ifname(ifname):  # pragma: nocover
  function deep_urlize (line 20) | def deep_urlize(value):
  function starts_with (line 28) | def starts_with(value, arg):

FILE: python/nav/django/templatetags/thresholds.py
  function find_rules (line 26) | def find_rules(metrics):
  function find_thresholds (line 49) | def find_thresholds(metric):

FILE: python/nav/django/templatetags/tools.py
  function get_tool (line 24) | def get_tool(tool_list, tool_name):

FILE: python/nav/django/templatetags/watchdog.py
  function map_to_class (line 25) | def map_to_class(status):
  function map_to_faclass (line 33) | def map_to_faclass(status):

FILE: python/nav/django/utils.py
  function reverse_with_query (line 29) | def reverse_with_query(viewname, **kwargs):
  function get_verbose_name (line 36) | def get_verbose_name(model, lookup):
  function pformat_request (line 63) | def pformat_request(request: HttpRequest, function, *attributes) -> None:
  function get_model_and_name (line 99) | def get_model_and_name(rel):
  function get_all_related_objects (line 107) | def get_all_related_objects(model):
  function get_all_related_many_to_many_objects (line 116) | def get_all_related_many_to_many_objects(model):
  function get_os_version (line 125) | def get_os_version():

FILE: python/nav/django/validators.py
  function is_valid_point_string (line 26) | def is_valid_point_string(point_string):
  class JSONBytesEncoder (line 40) | class JSONBytesEncoder(json.JSONEncoder):
    method default (line 41) | def default(self, obj):
  function validate_hstore (line 47) | def validate_hstore(value):

FILE: python/nav/django/views.py
  function custom_500 (line 24) | def custom_500(request):
  function force_500 (line 39) | def force_500(request):

FILE: python/nav/django/widgets.py
  class PointInput (line 21) | class PointInput(forms.TextInput):
    method render (line 22) | def render(self, name, value, *args, **kwargs):

FILE: python/nav/errors.py
  class GeneralException (line 19) | class GeneralException(Exception):
    method __str__ (line 23) | def __str__(self):
  class ConfigurationError (line 32) | class ConfigurationError(GeneralException):
  class BasepathError (line 36) | class BasepathError(ConfigurationError):
  class RedirectError (line 40) | class RedirectError(GeneralException):
  class NoServicesFound (line 46) | class NoServicesFound(GeneralException):
  class NoNetboxTypeError (line 50) | class NoNetboxTypeError(GeneralException):

FILE: python/nav/event.py
  class Event (line 29) | class Event(dict):
    method __init__ (line 37) | def __init__(
    method __repr__ (line 64) | def __repr__(self):
    method post (line 85) | def post(self):
    method delete (line 89) | def delete(self):
  class EventQ (line 109) | class EventQ(object):
    method _get_connection (line 113) | def _get_connection(cls):
    method allocate_id (line 122) | def allocate_id(cls):
    method post_event (line 133) | def post_event(cls, event):
    method consume_events (line 182) | def consume_events(cls, target):
    method delete_event (line 226) | def delete_event(cls, eventqid):
  class EventIdAllocationError (line 240) | class EventIdAllocationError(GeneralException):
  class EventAlreadyPostedError (line 246) | class EventAlreadyPostedError(GeneralException):
  class EventIncompleteError (line 252) | class EventIncompleteError(GeneralException):
  class EventNotPostedError (line 258) | class EventNotPostedError(GeneralException):
  function create_type_hierarchy (line 265) | def create_type_hierarchy(hierarchy):

FILE: python/nav/event2.py
  class EventFactory (line 25) | class EventFactory(object):
    method __init__ (line 28) | def __init__(self, source, target, event_type, start_type=None, end_ty...
    method base (line 44) | def base(self, device=None, netbox=None, subid='', varmap=None, alert_...
    method start (line 79) | def start(self, device=None, netbox=None, subid='', varmap=None, alert...
    method end (line 85) | def end(self, device=None, netbox=None, subid='', varmap=None, alert_t...
    method notify (line 91) | def notify(self, device=None, netbox=None, subid='', varmap=None, aler...

FILE: python/nav/eventengine/__init__.py
  function get_eventengine_output (line 21) | def get_eventengine_output(timeout=10):

FILE: python/nav/eventengine/alerts.py
  class AlertGenerator (line 40) | class AlertGenerator(dict):
    method __init__ (line 43) | def __init__(self, event):
    method __repr__ (line 68) | def __repr__(self):
    method __bool__ (line 77) | def __bool__(self):
    method make_alert (line 84) | def make_alert(self):
    method make_alert_history (line 106) | def make_alert_history(self):
    method _resolve_alert_history (line 132) | def _resolve_alert_history(self):
    method _update_history_vars (line 139) | def _update_history_vars(self, alert):
    method _find_existing_alert_history (line 145) | def _find_existing_alert_history(self):
    method post (line 148) | def post(self, post_alert=True, set_state=True):
    method _post_alert (line 175) | def _post_alert(self, history=None):
    method _post_alert_history (line 184) | def _post_alert_history(self):
    method _post_alert_messages (line 193) | def _post_alert_messages(self, obj):
    method _make_messages (line 209) | def _make_messages(self):
    method is_event_duplicate (line 214) | def is_event_duplicate(self):
    method get_alert_type (line 224) | def get_alert_type(self):
  function ensure_alert_templates_are_available (line 245) | def ensure_alert_templates_are_available():
  function render_templates (line 257) | def render_templates(alert):
  function _render_template (line 280) | def _render_template(details, alert):
  function get_list_of_templates_for (line 295) | def get_list_of_templates_for(event_type, alert_type="default"):

FILE: python/nav/eventengine/config.py
  class EventEngineConfig (line 25) | class EventEngineConfig(NAVConfigParser):
    method get_timeout_for (line 42) | def get_timeout_for(self, option):
    method get_timeouts_for (line 58) | def get_timeouts_for(self, *options):

FILE: python/nav/eventengine/daemon.py
  function main (line 35) | def main():
  function parse_options (line 47) | def parse_options():
  function make_option_parser (line 54) | def make_option_parser():
  function exit_if_already_running (line 75) | def exit_if_already_running():
  function daemonize (line 84) | def daemonize():
  function install_signal_handlers (line 94) | def install_signal_handlers():
  function sigterm_handler (line 100) | def sigterm_handler(signum, _frame):
  function sighup_handler (line 108) | def sighup_handler(_signum, _frame):
  function start_engine (line 118) | def start_engine():

FILE: python/nav/eventengine/engine.py
  function harakiri (line 48) | def harakiri():
  function retry_on_db_loss (line 54) | def retry_on_db_loss():
  function swallow_unhandled_exceptions (line 63) | def swallow_unhandled_exceptions(func):
  class EventEngine (line 80) | class EventEngine(object):
    method __init__ (line 94) | def __init__(self, target="eventEngine", config=EVENTENGINE_CONF):
    method _notifysleep (line 107) | def _notifysleep(self, delay):
    method start (line 135) | def start(self):
    method _load_severity_rules (line 146) | def _load_severity_rules():
    method _start_export_script (line 150) | def _start_export_script(self):
    method _listen (line 164) | def _listen():
    method _load_new_events_and_reschedule (line 173) | def _load_new_events_and_reschedule(self):
    method _has_overdue_callbacks (line 179) | def _has_overdue_callbacks(self):
    method _schedule_next_queuecheck (line 184) | def _schedule_next_queuecheck(self, delay=0, action=None):
    method load_new_events (line 192) | def load_new_events(self):
    method _log_task_queue (line 245) | def _log_task_queue(self):
    method _post_generic_alert (line 262) | def _post_generic_alert(self, event):
    method _box_is_on_maintenance (line 287) | def _box_is_on_maintenance(event):
    method handle_event (line 297) | def handle_event(self, event):
    method schedule (line 329) | def schedule(self, delay, action, args=()):
    method cancel (line 341) | def cancel(self, task):

FILE: python/nav/eventengine/export.py
  class StreamExporter (line 37) | class StreamExporter(object):
    method __init__ (line 40) | def __init__(self, command):
    method run (line 45) | def run(self):
    method is_ok (line 51) | def is_ok(self):
    method export (line 73) | def export(self, alert):
    method _send_string (line 84) | def _send_string(self, string):

FILE: python/nav/eventengine/plugin.py
  class UnsupportedEvent (line 22) | class UnsupportedEvent(ValueError):
  class EventHandler (line 28) | class EventHandler(object):
    method can_handle (line 32) | def can_handle(cls, event):
    method __init__ (line 42) | def __init__(self, event, engine):
    method handle (line 58) | def handle(self):
    method load_and_find_subclasses (line 63) | def load_and_find_subclasses(cls, package_names=None):
    method _box_is_on_maintenance (line 77) | def _box_is_on_maintenance(self):
  function _load_all_modules_in_package (line 83) | def _load_all_modules_in_package(package_name):
  function _find_package_modules (line 91) | def _find_package_modules(package_name):
  function _get_recursive_subclasses (line 104) | def _get_recursive_subclasses(cls, subclasses=None):

FILE: python/nav/eventengine/plugins/aggregatelinkstate.py
  class AggregateLinkStateHandler (line 21) | class AggregateLinkStateHandler(EventHandler):
    method handle (line 26) | def handle(self):
    method _handle_duplicate (line 60) | def _handle_duplicate(self, alert, existing_alert):
    method _ignore (line 74) | def _ignore(self, msg):

FILE: python/nav/eventengine/plugins/bgpstate.py
  class BGPStateHandler (line 22) | class BGPStateHandler(delayedstate.DelayedStateHandler):
    method get_target (line 29) | def get_target(self):
    method _get_up_alert (line 36) | def _get_up_alert(self):
    method _get_down_alert (line 41) | def _get_down_alert(self):
    method _post_down_warning (line 50) | def _post_down_warning(self):
    method _is_peer_down (line 53) | def _is_peer_down(self):

FILE: python/nav/eventengine/plugins/boxstate.py
  class BoxStateHandler (line 23) | class BoxStateHandler(delayedstate.DelayedStateHandler):
    method _is_internally_down (line 30) | def _is_internally_down(self):
    method _set_internal_state_down (line 34) | def _set_internal_state_down(self):
    method _set_internal_state_up (line 39) | def _set_internal_state_up(self):
    method _set_internal_state (line 42) | def _set_internal_state(self, state):
    method get_target (line 47) | def get_target(self):
    method _get_up_alert (line 50) | def _get_up_alert(self):
    method _post_down_warning (line 56) | def _post_down_warning(self):
    method _get_down_alert (line 71) | def _get_down_alert(self):

FILE: python/nav/eventengine/plugins/delayedstate.py
  class DelayedStateHandler (line 25) | class DelayedStateHandler(EventHandler):
    method __init__ (line 38) | def __init__(self, *args, **kwargs):
    method _set_wait_times (line 43) | def _set_wait_times(self):
    method handle (line 51) | def handle(self):
    method _handle_start (line 63) | def _handle_start(self):
    method _set_internal_state_down (line 100) | def _set_internal_state_down(self):
    method _set_internal_state_up (line 107) | def _set_internal_state_up(self):
    method _is_internally_down (line 114) | def _is_internally_down(self):
    method get_target (line 124) | def get_target(self):
    method _handle_end (line 128) | def _handle_end(self):
    method _get_up_alert (line 162) | def _get_up_alert(self):
    method _is_duplicate (line 165) | def _is_duplicate(self):
    method _get_waiting (line 169) | def _get_waiting(self):
    method _make_down_warning (line 178) | def _make_down_warning(self, _comment=None):
    method _post_down_warning (line 196) | def _post_down_warning(self):
    method _make_down_alert (line 200) | def _make_down_alert(self, _comment=None):
    method _get_down_alert (line 214) | def _get_down_alert(self):
    method _verify_shadow (line 224) | def _verify_shadow(self):
    method schedule (line 232) | def schedule(self, delay, action, args=()):
    method deschedule (line 237) | def deschedule(self):

FILE: python/nav/eventengine/plugins/juniperalertcount.py
  class JuniperAlertCountHandler (line 24) | class JuniperAlertCountHandler(EventHandler):
    method handle (line 32) | def handle(self):
    method _handle_start (line 45) | def _handle_start(self):
    method _handle_end (line 77) | def _handle_end(self):
    method get_target (line 101) | def get_target(self):
    method _delete_event_with_incorrect_alert_type (line 104) | def _delete_event_with_incorrect_alert_type(

FILE: python/nav/eventengine/plugins/linkstate.py
  class LinkStateHandler (line 27) | class LinkStateHandler(delayedstate.DelayedStateHandler):
    method __init__ (line 36) | def __init__(self, *args, **kwargs):
    method get_target (line 40) | def get_target(self):
    method get_link_partner (line 46) | def get_link_partner(self):
    method handle (line 50) | def handle(self):
    method _handle_end (line 55) | def _handle_end(self):
    method _set_internal_state_down (line 59) | def _set_internal_state_down(self):
    method _set_internal_state_up (line 62) | def _set_internal_state_up(self):
    method _set_ifoperstatus (line 65) | def _set_ifoperstatus(self, ifoperstatus):
    method _get_up_alert (line 71) | def _get_up_alert(self):
    method _get_down_alert (line 79) | def _get_down_alert(self):
    method _post_down_warning (line 99) | def _post_down_warning(self):
    method _hold_back_alert_due_to_redundancy_limit (line 102) | def _hold_back_alert_due_to_redundancy_limit(self):
    method _hold_back_alert_due_to_vlan_mismatch (line 117) | def _hold_back_alert_due_to_vlan_mismatch(self):
    method _get_target_vlans (line 138) | def _get_target_vlans(self):
    method _post_event_if_aggregate_degraded (line 153) | def _post_event_if_aggregate_degraded(self):
    method _post_event_if_aggregate_restored (line 162) | def _post_event_if_aggregate_restored(self):
    method _get_aggregate_link_event (line 171) | def _get_aggregate_link_event(self, start):
    method _is_a_master_for_virtualized_instances (line 199) | def _is_a_master_for_virtualized_instances(self):
    method _copy_event_for_instances (line 203) | def _copy_event_for_instances(self):
    method _copy_event_for_instance (line 209) | def _copy_event_for_instance(self, netbox, instance, ifc):
  class LinkStateConfiguration (line 228) | class LinkStateConfiguration(object):
    method __init__ (line 231) | def __init__(self, config):
    method get_vlan_limit_set (line 234) | def get_vlan_limit_set(self):
    method alert_only_on_redundancy_loss (line 247) | def alert_only_on_redundancy_loss(self):

FILE: python/nav/eventengine/plugins/maintenancestate.py
  class MaintenanceStateHandler (line 22) | class MaintenanceStateHandler(EventHandler):
    method handle (line 27) | def handle(self):
    method _post_alert (line 37) | def _post_alert(self, event):

FILE: python/nav/eventengine/plugins/modulestate.py
  class ModuleStateHandler (line 25) | class ModuleStateHandler(delayedstate.DelayedStateHandler):
    method get_target (line 35) | def get_target(self):
    method _is_internally_down (line 41) | def _is_internally_down(self):
    method _get_up_alert (line 45) | def _get_up_alert(self):
    method _set_internal_state_down (line 50) | def _set_internal_state_down(self):
    method _set_internal_state_up (line 56) | def _set_internal_state_up(self):
    method _get_down_alert (line 62) | def _get_down_alert(self):
    method _get_alert (line 74) | def _get_alert(self):
    method _post_down_warning (line 81) | def _post_down_warning(self):
    method _is_chassis_down (line 96) | def _is_chassis_down(self):

FILE: python/nav/eventengine/plugins/servicestate.py
  class ServiceStateHandler (line 25) | class ServiceStateHandler(EventHandler):
    method handle (line 30) | def handle(self):
    method _update_service (line 44) | def _update_service(self):
    method _set_alert_type (line 55) | def _set_alert_type(alert, service):
    method _populate_alert (line 60) | def _populate_alert(self, alert):

FILE: python/nav/eventengine/plugins/snmpagentstate.py
  class SnmpAgentStateHandler (line 23) | class SnmpAgentStateHandler(DelayedStateHandler):
    method get_target (line 30) | def get_target(self):
    method _get_up_alert (line 33) | def _get_up_alert(self):
    method _get_down_alert (line 38) | def _get_down_alert(self):
    method _is_netbox_currently_up (line 49) | def _is_netbox_currently_up(self):
    method _post_down_warning (line 53) | def _post_down_warning(self):

FILE: python/nav/eventengine/plugins/thresholdstate.py
  class ThresholdStateHandler (line 22) | class ThresholdStateHandler(EventHandler):
    method handle (line 27) | def handle(self):
    method _post_alert (line 37) | def _post_alert(self, event):

FILE: python/nav/eventengine/plugins/upgrade.py
  class UpgradeHandler (line 22) | class UpgradeHandler(EventHandler):
    method handle (line 27) | def handle(self):
    method _post_alert (line 37) | def _post_alert(self, event):

FILE: python/nav/eventengine/severity.py
  class Expression (line 54) | class Expression(typing.NamedTuple):
  class Severity (line 71) | class Severity(int):
    method __new__ (line 74) | def __new__(cls, *args, **kwargs):
    method __add__ (line 78) | def __add__(self, value: int):
    method __sub__ (line 81) | def __sub__(self, value: int):
  class SeverityRules (line 85) | class SeverityRules(tuple):
    method __new__ (line 94) | def __new__(cls, rules: typing.Sequence[Rule]):
    method load_from_file (line 99) | def load_from_file(cls, filename: str = CONFIG_FILE) -> 'SeverityRules':
    method load (line 112) | def load(cls, string_or_stream: typing.Union[str, typing.IO]) -> 'Seve...
    method evaluate (line 118) | def evaluate(self, alert: AlertObject) -> Severity:
    method _parse_raw_severity_rules (line 139) | def _parse_raw_severity_rules(
    method _parse_rule_sublist (line 158) | def _parse_rule_sublist(
    method _parse_modifier (line 191) | def _parse_modifier(value: typing.Union[str, int]) -> SeverityModifier:
    method _translate_rule (line 211) | def _translate_rule(cls, rule: Rule):

FILE: python/nav/eventengine/topology.py
  function netbox_appears_reachable (line 29) | def netbox_appears_reachable(netbox):
  function get_path_to_netbox (line 44) | def get_path_to_netbox(netbox):
  function _path_exists (line 117) | def _path_exists(graph, source, target):
  function get_graph_for_vlan (line 125) | def get_graph_for_vlan(vlan):
  function strip_down_nodes_from_graph (line 162) | def strip_down_nodes_from_graph(graph, keep=None):
  function strip_down_links_from_graph (line 175) | def strip_down_links_from_graph(graph):
  class NAVServer (line 199) | class NAVServer(object):
    method make_for (line 205) | def make_for(cls, dest):
    method __init__ (line 216) | def __init__(self, ip):
    method get_prefix (line 221) | def get_prefix(self):
    method add_to_graph (line 227) | def add_to_graph(self, graph):
    method get_switches_from_cam (line 232) | def get_switches_from_cam(self):
    method get_mac_from_arp (line 243) | def get_mac_from_arp(self):
    method __repr__ (line 251) | def __repr__(self):
  function get_source_address_for (line 255) | def get_source_address_for(dest):
  function _get_target_dgram_addr (line 279) | def _get_target_dgram_addr(target):

FILE: python/nav/eventengine/unresolved.py
  function get_map (line 27) | def get_map():
  function update (line 32) | def update():
  function refers_to_unresolved_alert (line 39) | def refers_to_unresolved_alert(event):

FILE: python/nav/ip.py
  class IP (line 25) | class IP(IPy.IP):
    method __cmp__ (line 32) | def __cmp__(self, other):
    method __eq__ (line 41) | def __eq__(self, other):
    method __hash__ (line 47) | def __hash__(self):

FILE: python/nav/ipdevpoll/__init__.py
  class Plugin (line 31) | class Plugin(object):
    method __init__ (line 41) | def __init__(self, netbox, agent, containers, config: IpdevpollConfig ...
    method __str__ (line 56) | def __str__(self):
    method __repr__ (line 59) | def __repr__(self):
    method handle (line 62) | def handle(self):
    method can_handle (line 67) | def can_handle(cls, netbox):
    method _verify_vendor_restriction (line 84) | def _verify_vendor_restriction(cls, netbox):
    method on_plugin_load (line 94) | def on_plugin_load(cls):
    method name (line 103) | def name(self):
    method full_name (line 107) | def full_name(self):
    method _get_netbox_list (line 111) | def _get_netbox_list(self):

FILE: python/nav/ipdevpoll/config.py
  class IpdevpollConfig (line 29) | class IpdevpollConfig(NAVConfigParser):
  function get_job_descriptions (line 95) | def get_job_descriptions(config=None):
  function get_jobs (line 100) | def get_jobs(config=None):
  function get_job_sections (line 116) | def get_job_sections(config):
  function get_netbox_filter (line 121) | def get_netbox_filter(section, config=None):
  class JobDescriptor (line 133) | class JobDescriptor(object):
    method __init__ (line 136) | def __init__(self, name, interval, intensity, plugins, description=''):
    method from_config_section (line 144) | def from_config_section(cls, config, section):
  function _parse_plugins (line 177) | def _parse_plugins(value):
  function _parse_description (line 184) | def _parse_description(descr):
  class InvalidJobSectionName (line 189) | class InvalidJobSectionName(ConfigurationError):

FILE: python/nav/ipdevpoll/control.py
  function get_process_command (line 21) | def get_process_command():

FILE: python/nav/ipdevpoll/daemon.py
  class NetboxAction (line 48) | class NetboxAction(argparse.Action):
    method __call__ (line 49) | def __call__(self, parser, namespace, values, option_string=None):
  class IPDevPollProcess (line 75) | class IPDevPollProcess(object):
    method __init__ (line 78) | def __init__(self, options):
    method run (line 85) | def run(self):
    method install_sighandlers (line 102) | def install_sighandlers(self):
    method setup_scheduling (line 111) | def setup_scheduling(self):
    method setup_worker (line 143) | def setup_worker(self):
    method setup_single_job (line 159) | def setup_single_job(self):
    method setup_multiprocess (line 188) | def setup_multiprocess(self, process_count, max_jobs):
    method sighup_handler (line 217) | def sighup_handler(self, _signum, _frame):
    method sigterm_handler (line 226) | def sigterm_handler(self, signum, _frame):
    method sigusr1_handler (line 232) | def sigusr1_handler(self, _signum, _frame):
    method sigusr2_handler (line 238) | def sigusr2_handler(self, _signum, _frame):
    method shutdown (line 244) | def shutdown(self):
    method _log_shutdown_time (line 249) | def _log_shutdown_time(self):
  class CommandProcessor (line 257) | class CommandProcessor(object):
    method __init__ (line 262) | def __init__(self):
    method parse_options (line 266) | def parse_options(self):
    method make_option_parser (line 287) | def make_option_parser(self):
    method run (line 394) | def run(self):
    method init_logging (line 418) | def init_logging(self, stderr_only=False):
    method exit_if_already_running (line 445) | def exit_if_already_running(self):
    method daemonize (line 453) | def daemonize(self):
    method start_ipdevpoll (line 463) | def start_ipdevpoll(self):
    method _joblist (line 469) | def _joblist():
    method _list_jobs (line 476) | def _list_jobs(*_args, **_kwargs):
    method _list_plugins (line 484) | def _list_plugins(*_args, **_kwargs):
  function main (line 490) | def main():

FILE: python/nav/ipdevpoll/dataloader.py
  function load_netbox (line 52) | def load_netbox(netbox_id):
  class NetboxLoader (line 65) | class NetboxLoader(dict):
    method __init__ (line 76) | def __init__(self):
    method load_all_s (line 82) | def load_all_s(self):
    method load_all (line 163) | def load_all(self):
  function is_netbox_changed (line 168) | def is_netbox_changed(netbox1, netbox2):
  function load_last_updated_times (line 202) | def load_last_updated_times():

FILE: python/nav/ipdevpoll/db.py
  class ResetDBConnectionError (line 39) | class ResetDBConnectionError(Exception):
  function django_debug_cleanup (line 43) | def django_debug_cleanup():
  function sum_django_queries_runtime (line 71) | def sum_django_queries_runtime():
  function cleanup_django_debug_after (line 77) | def cleanup_django_debug_after(func):
  function run_in_thread (line 93) | def run_in_thread(func, *args, **kwargs):
  function reset_connection_on_interface_error (line 103) | def reset_connection_on_interface_error(func):
  function synchronous_db_access (line 135) | def synchronous_db_access(func):
  function purge_old_job_log_entries (line 148) | def purge_old_job_log_entries():
  function delete_stale_job_refresh_notifications (line 168) | def delete_stale_job_refresh_notifications():
  function subscribe_to_event_notifications (line 183) | def subscribe_to_event_notifications(trigger: Optional[Callable] = None):
  function resubscribe_to_event_notifications (line 204) | def resubscribe_to_event_notifications():
  function _remove_postgres_reader_and_get_its_trigger_function (line 226) | def _remove_postgres_reader_and_get_its_trigger_function():
  function resubscribe_on_connection_loss (line 242) | def resubscribe_on_connection_loss(func):
  class PostgresNotifyReader (line 258) | class PostgresNotifyReader(abstract.FileDescriptor):
    method __init__ (line 267) | def __init__(
    method fileno (line 283) | def fileno(self):
    method doRead (line 288) | def doRead(self):
    method schedule_trigger (line 310) | def schedule_trigger(self):
  function _is_a_new_ipdevpoll_event (line 320) | def _is_a_new_ipdevpoll_event(notification):

FILE: python/nav/ipdevpoll/descrparsers.py
  function parse_ntnu_convention (line 59) | def parse_ntnu_convention(sysname, ifalias):
  function parse_uninett_convention (line 99) | def parse_uninett_convention(_sysname, ifalias):

FILE: python/nav/ipdevpoll/epollreactor2.py
  class EPollReactor2 (line 30) | class EPollReactor2(epollreactor.EPollReactor):
    method _remove (line 35) | def _remove(self, xer, primary, other, selectables, event, antievent):
  function install (line 67) | def install():

FILE: python/nav/ipdevpoll/jobs.py
  class AbortedJobError (line 46) | class AbortedJobError(Exception):
    method __init__ (line 49) | def __init__(self, msg, cause=None):
    method __str__ (line 53) | def __str__(self):
  class SuggestedReschedule (line 57) | class SuggestedReschedule(AbortedJobError):
    method __init__ (line 63) | def __init__(self, msg=None, cause=None, delay=60):
  class JobHandler (line 70) | class JobHandler(object):
    method __init__ (line 85) | def __init__(self, name, netbox, plugins=None, interval=None):
    method _create_agentproxy (line 99) | def _create_agentproxy(self):
    method _destroy_agentproxy (line 132) | def _destroy_agentproxy(self):
    method _find_plugins (line 139) | def _find_plugins(self):
    method _get_valid_plugins (line 161) | def _get_valid_plugins(self):
    method _get_willing_plugins (line 174) | def _get_willing_plugins(self, plugin_classes):
    method _iterate_plugins (line 205) | def _iterate_plugins(self, plugins):
    method run (line 254) | def run(self):
    method cancel (line 355) | def cancel(self):
    method _reset_timers (line 363) | def _reset_timers(self):
    method _start_plugin_timer (line 367) | def _start_plugin_timer(self, plugin):
    method _stop_plugin_timer (line 372) | def _stop_plugin_timer(self, result=None):
    method _log_timings (line 377) | def _log_timings(self):
    method get_current_runtime (line 403) | def get_current_runtime(self):
    method _save_container (line 407) | def _save_container(self):
    method _prepare_containers_for_save (line 430) | def _prepare_containers_for_save(self):
    method _cleanup_containers_after_save (line 436) | def _cleanup_containers_after_save(self):
    method _log_timed_result (line 461) | def _log_timed_result(self, res, msg):
    method _perform_save (line 464) | def _perform_save(self):
    method _log_containers (line 496) | def _log_containers(self, prefix=None):
    method _populate_storage_queue (line 504) | def _populate_storage_queue(self):
    method _container_factory (line 517) | def _container_factory(self, container_class, key, *args, **kwargs):
    method _raise_if_cancelled (line 521) | def _raise_if_cancelled(self):
    method get_instance_count (line 527) | def get_instance_count(cls):
    method _log_job_externally (line 535) | def _log_job_externally(self, success=True):

FILE: python/nav/ipdevpoll/log.py
  class ContextFormatter (line 25) | class ContextFormatter(Formatter):
    method __init__ (line 34) | def __init__(self, pidlog=False):
    method format (line 45) | def format(self, record):
    method _set_context (line 51) | def _set_context(self, record):
    method _set_format (line 63) | def _set_format(self, fmt):
  class ContextLogger (line 68) | class ContextLogger(object):
    method __init__ (line 92) | def __init__(self, suffix=None, context_vars=None):
    method __get__ (line 99) | def __get__(self, obj, owner=None):
    method _logger_name (line 119) | def _logger_name(self, klass):
    method __set__ (line 128) | def __set__(self, obj, value):
    method __delete__ (line 131) | def __delete__(self, obj):
  function _context_search (line 140) | def _context_search(frame, maxdepth=10):
  function _stack_iter (line 146) | def _stack_iter(frame):
  function _first_true (line 156) | def _first_true(sequence):
  function _get_context_from_frame (line 166) | def _get_context_from_frame(frame):

FILE: python/nav/ipdevpoll/neighbor.py
  function get_netbox_macs (line 47) | def get_netbox_macs():
  function _get_netbox_macs (line 56) | def _get_netbox_macs():
  function _mac_is_ignored (line 70) | def _mac_is_ignored(mac):
  function get_netbox_catids (line 79) | def get_netbox_catids():
  function _get_netbox_catids (line 84) | def _get_netbox_catids():
  class Neighbor (line 99) | class Neighbor(object):
    method __init__ (line 104) | def __init__(self, record, local_address=None):
    method identify (line 129) | def identify(self):
    method _identify_netbox (line 136) | def _identify_netbox(self):
    method _identify_interfaces (line 139) | def _identify_interfaces(self):
    method _netbox_from_mac (line 142) | def _netbox_from_mac(self, mac):
    method _netbox_from_ip (line 147) | def _netbox_from_ip(self, ip):
    method _netbox_from_sysname (line 171) | def _netbox_from_sysname(self, sysname):
    method _netbox_query (line 194) | def _netbox_query(self, query):
    method _interfaces_from_name (line 215) | def _interfaces_from_name(self, name):
    method _interface_query (line 247) | def _interface_query(self, query):
    method __repr__ (line 259) | def __repr__(self):

FILE: python/nav/ipdevpoll/plugins/__init__.py
  class PluginImportError (line 33) | class PluginImportError(GeneralException):
  function import_plugins (line 37) | def import_plugins():
  function import_plugin (line 53) | def import_plugin(config, alias):
  function get_plugin_from_module (line 85) | def get_plugin_from_module(module_):

FILE: python/nav/ipdevpoll/plugins/arp.py
  class Arp (line 57) | class Arp(Plugin):
    method can_handle (line 65) | def can_handle(cls, netbox):
    method handle (line 71) | def handle(self):
    method _check_and_update_prefix_cache (line 103) | def _check_and_update_prefix_cache(cls):
    method _is_arp_already_collected (line 109) | def _is_arp_already_collected(self):
    method _get_ip_mib (line 114) | def _get_ip_mib(self):
    method is_arista (line 121) | def is_arista(self):
    method _process_data (line 130) | def _process_data(self, mappings):
    method _load_existing_mappings (line 166) | def _load_existing_mappings(self):
    method _update_prefix_cache (line 188) | def _update_prefix_cache(cls):
    method _load_prefixes_synchronously (line 195) | def _load_prefixes_synchronously(cls):
    method _update_prefix_cache_with_result (line 199) | def _update_prefix_cache_with_result(cls, prefixes):
    method _make_new_mappings (line 208) | def _make_new_mappings(self, mappings):
    method _expire_arp_records (line 232) | def _expire_arp_records(self, arp_ids):
    method _find_largest_matching_prefix (line 247) | def _find_largest_matching_prefix(self, ip):
  function ipv6_address_in_mappings (line 259) | def ipv6_address_in_mappings(mappings):

FILE: python/nav/ipdevpoll/plugins/bgp.py
  class BGP (line 29) | class BGP(Plugin):
    method can_handle (line 33) | def can_handle(cls, netbox):
    method handle (line 39) | def handle(self):
    method _make_gwpeer (line 56) | def _make_gwpeer(self, bgp_peer_state):
    method _get_supported_mib (line 72) | def _get_supported_mib(self):

FILE: python/nav/ipdevpoll/plugins/bridge.py
  class Bridge (line 35) | class Bridge(Plugin):
    method handle (line 39) | def handle(self):
    method _save_bridge_address (line 47) | def _save_bridge_address(self, bridge_address):
    method _set_port_numbers (line 56) | def _set_port_numbers(self, baseports):

FILE: python/nav/ipdevpoll/plugins/cam.py
  class Cam (line 33) | class Cam(Plugin):
    method can_handle (line 58) | def can_handle(cls, netbox):
    method _has_interfaces (line 64) | def _has_interfaces(cls, netbox):
    method handle (line 68) | def handle(self):
    method _get_dot1d_mac_port_mapping (line 95) | def _get_dot1d_mac_port_mapping(self):
    method _get_dot1q_mac_port_mapping (line 109) | def _get_dot1q_mac_port_mapping(self):
    method _get_baseports (line 123) | def _get_baseports(self):
    method _get_bridge (line 130) | def _get_bridge(self):
    method _get_dot1d_instances (line 137) | def _get_dot1d_instances(self):
    method _log_fdb_stats (line 142) | def _log_fdb_stats(self, prefix, fdb):
    method _classify_ports (line 148) | def _classify_ports(self):
    method _store_cam_records (line 162) | def _store_cam_records(self):
    method _store_adjacency_candidates (line 169) | def _store_adjacency_candidates(self):
    method _make_candidates (line 181) | def _make_candidates(self, port, candidates):
    method _factory_netbox (line 191) | def _factory_netbox(self, netboxid):
    method _factory_interface (line 196) | def _factory_interface(self, ifindex):
    method _factory_candidate (line 202) | def _factory_candidate(self, port, candidate):
    method _get_dot1d_stp_blocking (line 219) | def _get_dot1d_stp_blocking(self):
    method _log_blocking_ports (line 236) | def _log_blocking_ports(self, blocking):
    method _store_blocking_ports (line 248) | def _store_blocking_ports(self, blocking):

FILE: python/nav/ipdevpoll/plugins/cdp.py
  class CDP (line 37) | class CDP(Plugin):
    method can_handle (line 51) | def can_handle(cls, netbox):
    method _has_interfaces (line 57) | def _has_interfaces(cls, netbox):
    method handle (line 61) | def handle(self):
    method _get_stampcheck (line 96) | def _get_stampcheck(self, mib):
    method _get_cached_neighbors (line 104) | def _get_cached_neighbors(self):
    method _save_cached_neighbors (line 115) | def _save_cached_neighbors(self, neighbors):
    method _process_neighbors (line 125) | def _process_neighbors(self):
    method _process_identified (line 134) | def _process_identified(self, identified):
    method _store_candidates (line 144) | def _store_candidates(self, neighbor):
    method _store_candidate (line 150) | def _store_candidate(self, neighbor, interface):
    method _process_unidentified (line 169) | def _process_unidentified(self, unidentified):
    method _store_unidentified (line 173) | def _store_unidentified(self, record):
  class CDPNeighbor (line 186) | class CDPNeighbor(Neighbor):
    method _identify_netbox (line 189) | def _identify_netbox(self):
    method _identify_interfaces (line 211) | def _identify_interfaces(self):
  function looks_like_binary_garbage (line 215) | def looks_like_binary_garbage(deviceid):

FILE: python/nav/ipdevpoll/plugins/ciscovlan.py
  class CiscoVlan (line 35) | class CiscoVlan(Plugin):
    method can_handle (line 41) | def can_handle(cls, netbox):
    method handle (line 50) | def handle(self):
    method _get_ifindexes (line 72) | def _get_ifindexes(self):
    method _store_access_ports (line 77) | def _store_access_ports(self, vlan_membership):
    method _store_trunk_ports (line 90) | def _store_trunk_ports(self, native_vlans, enabled_vlans):
    method _store_vlan_ifc_relationships (line 112) | def _store_vlan_ifc_relationships(self, routed_vlans):

FILE: python/nav/ipdevpoll/plugins/debugging.py
  class Crash (line 52) | class Crash(Plugin):
    method handle (line 55) | def handle(self):
  class Error (line 59) | class Error(Plugin):
    method handle (line 62) | def handle(self):
    method error (line 67) | def error(self, deferred):
  class Fail (line 74) | class Fail(Plugin):
    method handle (line 77) | def handle(self):
  class Sleep (line 83) | class Sleep(Plugin):
    method handle (line 86) | def handle(self):
  class Noop (line 92) | class Noop(Plugin):
    method handle (line 95) | def handle(self):

FILE: python/nav/ipdevpoll/plugins/dnsname.py
  class DnsName (line 36) | class DnsName(Plugin):
    method can_handle (line 40) | def can_handle(netbox):
    method handle (line 44) | def handle(self):
    method _handle_failure (line 54) | def _handle_failure(self, failure, ip=None):
    method _find_ptr_response (line 64) | def _find_ptr_response(self, dns_response):
    method _log_name (line 90) | def _log_name(self, dns_name):
    method _verify_name_change (line 103) | def _verify_name_change(self, new_name):

FILE: python/nav/ipdevpoll/plugins/dot1q.py
  class Dot1q (line 40) | class Dot1q(Plugin):
    method __init__ (line 46) | def __init__(self, *args, **kwargs):
    method _remap_vlan (line 51) | def _remap_vlan(self, vlan_ident):
    method handle (line 56) | def handle(self):
    method _process_pvids (line 76) | def _process_pvids(self):
    method _set_port_pvid (line 89) | def _set_port_pvid(self, port, pvid):
    method _get_tagging_info (line 99) | def _get_tagging_info(self):
    method _retrieve_vlan_ports (line 116) | def _retrieve_vlan_ports(self):
    method _find_trunkports (line 127) | def _find_trunkports(self, egress, untagged):
    method _store_trunkports (line 148) | def _store_trunkports(self, trunkports):
    method _set_trunkport (line 152) | def _set_trunkport(self, port, vlans):
    method _get_vlan_names (line 169) | def _get_vlan_names(self):
  function vlan_list_to_hex (line 184) | def vlan_list_to_hex(vlans):

FILE: python/nav/ipdevpoll/plugins/entity.py
  class Entity (line 36) | class Entity(Plugin):
    method __init__ (line 39) | def __init__(self, *args, **kwargs):
    method on_plugin_load (line 46) | def on_plugin_load(cls):
    method handle (line 52) | def handle(self):
    method _need_to_collect (line 64) | def _need_to_collect(self):
    method _process_entities (line 71) | def _process_entities(self, result):
    method _fix_hierarchy (line 81) | def _fix_hierarchy(self, containers):
    method _container_from_entity (line 127) | def _container_from_entity(self, ent):

FILE: python/nav/ipdevpoll/plugins/extremevlan.py
  class ExtremeVlan (line 34) | class ExtremeVlan(Plugin):
    method __init__ (line 37) | def __init__(self, *args, **kwargs):
    method can_handle (line 44) | def can_handle(cls, netbox):
    method handle (line 52) | def handle(self):
    method _get_vlan_data (line 59) | def _get_vlan_data(self):
    method _consolidate_vlan_config (line 72) | def _consolidate_vlan_config(self, vlan_ports, ifindex_vlan):
    method _portnums_to_ifindexes (line 84) | def _portnums_to_ifindexes(self, portnums):
    method _store_access_ports (line 91) | def _store_access_ports(self, vlan_config):
    method _store_trunk_ports (line 99) | def _store_trunk_ports(self, vlan_config):

FILE: python/nav/ipdevpoll/plugins/interfaces.py
  class Interfaces (line 43) | class Interfaces(Plugin):
    method __init__ (line 46) | def __init__(self, *args, **kwargs):
    method handle (line 52) | def handle(self):
    method _get_iftable_columns (line 61) | def _get_iftable_columns(self):
    method _process_interfaces (line 78) | def _process_interfaces(self, result):
    method _convert_row_to_container (line 93) | def _convert_row_to_container(self, netbox, ifindex, row):
    method _extract_interface_speed (line 129) | def _extract_interface_speed(speed, highspeed, always_use_highspeed=Fa...
    method _get_stack_status (line 151) | def _get_stack_status(self, interfaces):
    method _get_ifalias_from_lower_layers (line 171) | def _get_ifalias_from_lower_layers(self, stack):
    method _create_stack_containers (line 192) | def _create_stack_containers(self, stacklist):
    method _retrieve_duplex (line 199) | def _retrieve_duplex(self, interfaces):
  function typesafe_binary_mac_to_hex (line 214) | def typesafe_binary_mac_to_hex(octets):

FILE: python/nav/ipdevpoll/plugins/juniperalarm.py
  class JuniperChassisAlarm (line 44) | class JuniperChassisAlarm(Plugin):
    method handle (line 60) | def handle(self):
    method _get_last_count (line 99) | def _get_last_count(self, variable: str):
    method _post_yellow_alarm_count_non_zero (line 111) | def _post_yellow_alarm_count_non_zero(self, count: int):
    method _post_yellow_alarm_count_zero (line 114) | def _post_yellow_alarm_count_zero(self):
    method _post_red_alarm_count_non_zero (line 117) | def _post_red_alarm_count_non_zero(self, count: int):
    method _post_red_alarm_count_zero (line 120) | def _post_red_alarm_count_zero(self):
    method _create_or_update_new_alarm_count (line 123) | def _create_or_update_new_alarm_count(self, count: int, variable: str):

FILE: python/nav/ipdevpoll/plugins/juniperdot1q.py
  class JuniperDot1q (line 49) | class JuniperDot1q(dot1q.Dot1q):
    method __init__ (line 52) | def __init__(self, *args, **kwargs):
    method handle (line 59) | def handle(self):
    method _remap_vlan (line 66) | def _remap_vlan(self, vlan_ident):
    method _retrieve_vlan_ports (line 79) | def _retrieve_vlan_ports(self):
    method __is_a_moronic_juniper_device (line 94) | def __is_a_moronic_juniper_device(self):
    method __get_jnx_ex_vlan_tag (line 101) | def __get_jnx_ex_vlan_tag(self):

FILE: python/nav/ipdevpoll/plugins/linkaggregate.py
  class LinkAggregate (line 26) | class LinkAggregate(Plugin):
    method __init__ (line 29) | def __init__(self, *args, **kwargs):
    method handle (line 35) | def handle(self):
    method _convert_to_interfaces (line 43) | def _convert_to_interfaces(self, aggregatedict):
    method _get_interface (line 53) | def _get_interface(self, ifindex):
    method _log_aggregates (line 61) | def _log_aggregates(self, aggregates):
    method _create_aggregate_containers (line 74) | def _create_aggregate_containers(self, aggregates):

FILE: python/nav/ipdevpoll/plugins/linkstate.py
  class LinkState (line 27) | class LinkState(Plugin):
    method handle (line 31) | def handle(self):
    method _put_results (line 44) | def _put_results(self, results):
    method _update_interface (line 50) | def _update_interface(self, netbox, ifindex, row):

FILE: python/nav/ipdevpoll/plugins/lldp.py
  class LLDP (line 39) | class LLDP(Plugin):
    method can_handle (line 54) | def can_handle(cls, netbox):
    method _has_interfaces (line 60) | def _has_interfaces(cls, netbox):
    method handle (line 64) | def handle(self):
    method _get_cached_remote_table (line 98) | def _get_cached_remote_table(self):
    method _save_cached_remote_table (line 109) | def _save_cached_remote_table(self, remote_table):
    method _get_chassis_id (line 120) | def _get_chassis_id(self, mib):
    method _get_stampcheck (line 145) | def _get_stampcheck(self, mib):
    method _process_remote (line 155) | def _process_remote(self):
    method _process_identified (line 164) | def _process_identified(self, identified):
    method _store_candidates (line 173) | def _store_candidates(self, neighbor):
    method _store_candidate (line 179) | def _store_candidate(self, neighbor, interface):
    method _process_unidentified (line 198) | def _process_unidentified(self, unidentified):
    method _store_unidentified (line 202) | def _store_unidentified(self, record):
  class LLDPNeighbor (line 215) | class LLDPNeighbor(Neighbor):
    method _identify_netbox (line 218) | def _identify_netbox(self):
    method _netbox_from_local (line 238) | def _netbox_from_local(self, chassid):
    method _identify_interfaces (line 258) | def _identify_interfaces(self):
    method _interfaces_from_local (line 284) | def _interfaces_from_local(self, portid):
    method _interfaces_from_mac (line 299) | def _interfaces_from_mac(self, mac):
    method _interfaces_from_ip (line 303) | def _interfaces_from_ip(self, ip):

FILE: python/nav/ipdevpoll/plugins/modules.py
  class Modules (line 41) | class Modules(Plugin):
    method __init__ (line 44) | def __init__(self, *args, **kwargs):
    method on_plugin_load (line 51) | def on_plugin_load(cls):
    method handle (line 57) | def handle(self):
    method _need_to_collect (line 68) | def _need_to_collect(self):
    method _device_from_entity (line 75) | def _device_from_entity(self, ent):
    method _module_from_entity (line 100) | def _module_from_entity(self, ent):
    method _process_modules (line 113) | def _process_modules(self, entities):
    method _process_ports (line 130) | def _process_ports(self, entities, module_containers):
    method _process_entities (line 158) | def _process_entities(self, result):
  function get_ignored_serials (line 167) | def get_ignored_serials(config: configparser.ConfigParser) -> list[str]:

FILE: python/nav/ipdevpoll/plugins/paloaltoarp.py
  class PaloaltoArp (line 40) | class PaloaltoArp(Arp):
    method can_handle (line 43) | def can_handle(cls, netbox):
    method handle (line 49) | def handle(self):
    method _has_paloalto_configurations (line 65) | def _has_paloalto_configurations(netbox: Netbox):
    method _get_paloalto_configurations (line 75) | def _get_paloalto_configurations(netbox: Netbox):
    method _get_paloalto_arp_mappings (line 84) | def _get_paloalto_arp_mappings(self, address: IP, key: str):
    method _do_request (line 95) | def _do_request(self, address: IP, key: str):
  function _parse_arp (line 129) | def _parse_arp(arpbytes: bytes) -> list[tuple[str, IP, str]]:
  function _paloalto_profile_queryset (line 150) | def _paloalto_profile_queryset(netbox: Netbox):

FILE: python/nav/ipdevpoll/plugins/poe.py
  class Poe (line 32) | class Poe(Plugin):
    method __init__ (line 35) | def __init__(self, *args, **kwargs):
    method handle (line 40) | def handle(self):
    method _is_cisco (line 64) | def _is_cisco(self):
    method _map_cisco_power_ports_to_ifindex (line 71) | def _map_cisco_power_ports_to_ifindex(self):
    method _process_groups (line 96) | def _process_groups(self, groups, phy_indices):
    method _update_group (line 101) | def _update_group(self, netbox, index, row, phy_index):
    method _process_ports (line 110) | def _process_ports(self, ports, ifindices):
    method _update_port (line 115) | def _update_port(self, netbox, index, row, ifindex):
    method _resolve_ifindex (line 137) | def _resolve_ifindex(self, phy_indices, alias_mapping):
    method _log_invalid_portgroups (line 151) | def _log_invalid_portgroups(self):

FILE: python/nav/ipdevpoll/plugins/prefix.py
  class Prefix (line 60) | class Prefix(Plugin):
    method on_plugin_load (line 67) | def on_plugin_load(cls):
    method handle (line 73) | def handle(self):
    method _get_ifc_aliases (line 120) | def _get_ifc_aliases(self):
    method _ignore_index_exceptions (line 123) | def _ignore_index_exceptions(self, failure, mib):
    method _get_adminup_ifcs (line 134) | def _get_adminup_ifcs(self):
    method create_containers (line 140) | def create_containers(
    method get_vlan_interfaces (line 174) | def get_vlan_interfaces(self):
    method _ignore_timeout (line 199) | def _ignore_timeout(self, failure, result=None):
    method _prefix_should_be_ignored (line 210) | def _prefix_should_be_ignored(self, prefix):
  function get_ignored_prefixes (line 217) | def get_ignored_prefixes(config):
  function _convert_string_to_prefix (line 228) | def _convert_string_to_prefix(string):
  class IgnoredPrefix (line 237) | class IgnoredPrefix(IP):
    method __init__ (line 262) | def __init__(self, string):
    method matches (line 273) | def matches(self, prefix):

FILE: python/nav/ipdevpoll/plugins/propserial.py
  class ProprietarySerial (line 46) | class ProprietarySerial(Plugin):
    method handle (line 52) | def handle(self):
    method _set_chassis_serial (line 66) | def _set_chassis_serial(self, serial, source):

FILE: python/nav/ipdevpoll/plugins/psu.py
  class PowerSupplyUnit (line 64) | class PowerSupplyUnit(Plugin):
    method __init__ (line 67) | def __init__(self, *args, **kwargs):
    method handle (line 75) | def handle(self):
    method _handle_unit (line 99) | def _handle_unit(self, in_unit):
  function get_mibretrievers_from_vendor_id (line 115) | def get_mibretrievers_from_vendor_id(vendor_id, agent_proxy):

FILE: python/nav/ipdevpoll/plugins/psuwatch.py
  class PowerSupplyOrFanStateWatcher (line 46) | class PowerSupplyOrFanStateWatcher(Plugin):
    method __init__ (line 49) | def __init__(self, *args, **kwargs):
    method handle (line 57) | def handle(self):
    method _retrieve_current_unit_state (line 71) | def _retrieve_current_unit_state(self, unit):
    method _handle_state_change (line 90) | def _handle_state_change(self, unit, new_state):
    method _get_database_unit_list (line 101) | def _get_database_unit_list(self):
    method _update_internal_state (line 105) | def _update_internal_state(unit, new_state):
    method _post_event (line 120) | def _post_event(self, unit, new_state):

FILE: python/nav/ipdevpoll/plugins/sensors.py
  class Sensors (line 47) | class Sensors(Plugin):
    method on_plugin_load (line 51) | def on_plugin_load(cls):
    method handle (line 58) | def handle(self):
    method mibfactory (line 83) | def mibfactory(self):
    method _store_sensors (line 102) | def _store_sensors(self, result):
  function loadmodules (line 144) | def loadmodules(config):
  function get_mib_map (line 153) | def get_mib_map(config):
  function _translate_enterprise_id (line 181) | def _translate_enterprise_id(name):
  function _expand_module_names (line 192) | def _expand_module_names(names):
  function _find_submodules (line 202) | def _find_submodules(name):
  function _get_space_separated_list (line 214) | def _get_space_separated_list(config, section, option):

FILE: python/nav/ipdevpoll/plugins/snmpcheck.py
  class SnmpCheck (line 36) | class SnmpCheck(Plugin):
    method can_handle (line 46) | def can_handle(cls, netbox):
    method __init__ (line 49) | def __init__(self, *args, **kwargs):
    method handle (line 53) | def handle(self):
    method _do_check (line 68) | def _do_check(self):
    method _mark_as_down (line 80) | def _mark_as_down(self):
    method _mark_as_up (line 86) | def _mark_as_up(self):
    method _save_state (line 91) | def _save_state(self, state):
    method _dispatch_down_event (line 99) | def _dispatch_down_event(self):
    method _dispatch_up_event (line 103) | def _dispatch_up_event(self):
    method _currently_down (line 107) | def _currently_down(self):

FILE: python/nav/ipdevpoll/plugins/staticroutes.py
  class StaticRoutes (line 32) | class StaticRoutes(Plugin):
    method on_plugin_load (line 40) | def on_plugin_load(cls):
    method can_handle (line 47) | def can_handle(cls, netbox):
    method handle (line 53) | def handle(self):
    method collect_routes (line 63) | def collect_routes(self):
    method route_to_containers (line 93) | def route_to_containers(self, route, descr=None):
    method is_wanted_route (line 113) | def is_wanted_route(cls, route):
  function get_throttle_delay (line 132) | def get_throttle_delay(config):

FILE: python/nav/ipdevpoll/plugins/statmulticast.py
  class StatMulticast (line 33) | class StatMulticast(Plugin):
    method handle (line 37) | def handle(self):
    method _collect_hp_multicast (line 43) | def _collect_hp_multicast(self):
    method _count_ports_by_group (line 60) | def _count_ports_by_group(report):
    method _make_metrics_from_counts (line 70) | def _make_metrics_from_counts(self, count_report, timestamp=None):

FILE: python/nav/ipdevpoll/plugins/statports.py
  class StatPorts (line 72) | class StatPorts(Plugin):
    method can_handle (line 74) | def can_handle(cls, netbox):
    method handle (line 79) | def handle(self):
    method _get_stats (line 93) | def _get_stats(self):
    method _make_metrics (line 111) | def _make_metrics(self, stats, netboxes, timestamp=None):
    method _log_instance_details (line 136) | def _log_instance_details(self):
  function use_hc_counters (line 152) | def use_hc_counters(row):

FILE: python/nav/ipdevpoll/plugins/statsensors.py
  class StatSensors (line 35) | class StatSensors(Plugin):
    method can_handle (line 43) | def can_handle(cls, netbox):
    method _has_sensors (line 53) | def _has_sensors(cls, netbox):
    method handle (line 57) | def handle(self):
    method _get_sensors (line 74) | def _get_sensors(self):
    method _response_to_metrics (line 78) | def _response_to_metrics(self, result, sensors, netboxes):
  function convert_to_precision (line 102) | def convert_to_precision(value, sensor):

FILE: python/nav/ipdevpoll/plugins/statsystem.py
  class StatSystem (line 73) | class StatSystem(Plugin):
    method handle (line 77) | def handle(self):
    method _collect_bandwidth (line 92) | def _collect_bandwidth(self, netboxes):
    method _collect_bandwidth_from_mib (line 106) | def _collect_bandwidth_from_mib(self, mib, netboxes):
    method _collect_cpu (line 136) | def _collect_cpu(self, netboxes):
    method _get_cpu_loadavg (line 150) | def _get_cpu_loadavg(self, mib, netboxes):
    method _get_cpu_utilization (line 167) | def _get_cpu_utilization(self, mib, netboxes):
    method _mibs_for_me (line 182) | def _mibs_for_me(self, mib_class_dict):
    method _collect_sysuptime (line 190) | def _collect_sysuptime(self, netboxes):
    method _collect_power (line 205) | def _collect_power(self, netboxes):
    method _collect_memory (line 227) | def _collect_memory(self, netboxes):

FILE: python/nav/ipdevpoll/plugins/system.py
  class System (line 35) | class System(Plugin):
    method handle (line 39) | def handle(self):
    method _set_device_version (line 49) | def _set_device_version(self, version):
  function parse_version (line 90) | def parse_version(sysdescr):

FILE: python/nav/ipdevpoll/plugins/typeoid.py
  class InvalidResponseError (line 41) | class InvalidResponseError(Exception):
  class TypeOid (line 45) | class TypeOid(Plugin):
    method __init__ (line 48) | def __init__(self, *args, **kwargs):
    method handle (line 54) | def handle(self):
    method _fetch_sysobjectid (line 63) | def _fetch_sysobjectid(self):
    method _is_sysobjectid_changed (line 73) | def _is_sysobjectid_changed(self, oid):
    method _switch_type (line 78) | def _switch_type(self, oid):
    method _get_type_from_oid (line 86) | def _get_type_from_oid(oid):
    method _set_type (line 94) | def _set_type(self, new_type):
    method _send_signal_if_changed_from_known_to_new_type (line 109) | def _send_signal_if_changed_from_known_to_new_type(self, new_type):
    method _create_new_type (line 116) | def _create_new_type(self, oid):
    method _get_vendor (line 136) | def _get_vendor(cls, sysobjectid):
    method _make_new_vendor (line 148) | def _make_new_vendor(cls, sysobjectid):
  function type_to_string (line 162) | def type_to_string(type_):

FILE: python/nav/ipdevpoll/plugins/uptime.py
  class Uptime (line 30) | class Uptime(Plugin):
    method handle (line 34) | def handle(self):
    method _get_timestamps (line 46) | def _get_timestamps(self):
  function get_upsince (line 61) | def get_upsince(timestamp, ticks):

FILE: python/nav/ipdevpoll/plugins/virtualrouter.py
  class VirtualRouter (line 27) | class VirtualRouter(Plugin):
    method can_handle (line 43) | def can_handle(cls, netbox):
    method __init__ (line 47) | def __init__(self, *args, **kwargs):
    method handle (line 52) | def handle(self):
    method gwportprefixes_found (line 66) | def gwportprefixes_found(self):
    method update_containers_with (line 73) | def update_containers_with(self, addresses, from_mib=None):

FILE: python/nav/ipdevpoll/pool.py
  function initialize_worker (line 35) | def initialize_worker():
  class Cancel (line 44) | class Cancel(amp.Command):
  class Shutdown (line 53) | class Shutdown(amp.Command):
  class Ping (line 60) | class Ping(amp.Command):
  class Job (line 67) | class Job(amp.Command):
  class JobHandler (line 84) | class JobHandler(amp.CommandLocator):
    method __init__ (line 89) | def __init__(self):
    method job_done (line 94) | def job_done(self, result, serial):
    method execute_job (line 103) | def execute_job(self, netbox, job, plugins, interval, serial):
    method cancel (line 126) | def cancel(self, serial):
    method shutdown (line 133) | def shutdown(self):
    method ping (line 139) | def ping(self):
    method log_jobs (line 143) | def log_jobs(self):
  class ProcessAMP (line 150) | class ProcessAMP(amp.AMP):
    method __init__ (line 153) | def __init__(self, is_worker, **kwargs):
    method makeConnection (line 158) | def makeConnection(self, transport):
    method connectionLost (line 180) | def connectionLost(self, reason):
  class InlinePool (line 191) | class InlinePool(object):
    method __init__ (line 194) | def __init__(self):
    method job_done (line 197) | def job_done(self, result, deferred):
    method execute_job (line 203) | def execute_job(self, job, netbox, plugins=None, interval=None):
    method cancel (line 211) | def cancel(self, deferred):
  class Worker (line 217) | class Worker(object):
    method __init__ (line 223) | def __init__(self, pool, threadpoolsize, max_jobs):
    method __repr__ (line 238) | def __repr__(self):
    method start (line 252) | def start(self):
    method pid (line 278) | def pid(self):
    method done (line 287) | def done(self):
    method _worker_died (line 291) | def _worker_died(self, _process, _reason):
    method _euthanize_unresponsive_worker (line 303) | def _euthanize_unresponsive_worker(self, timeout=10):
    method execute (line 334) | def execute(self, serial, command, **kwargs):
    method responds_to_ping (line 354) | def responds_to_ping(self, timeout=10):
    method cancel (line 369) | def cancel(self, serial):
  class WorkerPool (line 374) | class WorkerPool(object):
    method __init__ (line 380) | def __init__(self, workers, max_jobs, threadpoolsize=None):
    method worker_died (line 391) | def worker_died(self, worker):
    method _spawn_worker (line 398) | def _spawn_worker(self):
    method _cleanup (line 402) | def _cleanup(self, result, deferred):
    method _execute (line 408) | def _execute(self, command, **kwargs):
    method cancel (line 421) | def cancel(self, deferred):
    method execute_job (line 429) | def execute_job(self, job, netbox, plugins=None, interval=None):
    method log_summary (line 445) | def log_summary(self):
  class HackLog (line 454) | class HackLog(object):
    method msg (line 459) | def msg(data, **_kwargs):

FILE: python/nav/ipdevpoll/schedule.py
  class NetboxJobScheduler (line 52) | class NetboxJobScheduler(object):
    method __init__ (line 66) | def __init__(self, job, netbox, pool):
    method get_current_runtime (line 83) | def get_current_runtime(self):
    method start (line 87) | def start(self):
    method cancel (line 92) | def cancel(self):
    method cancel_running_job (line 122) | def cancel_running_job(self):
    method run_job (line 127) | def run_job(self, dummy=None):
    method is_running (line 177) | def is_running(self):
    method _adjust_intensity_on_snmperror (line 181) | def _adjust_intensity_on_snmperror(cls, failure):
    method _update_counters (line 192) | def _update_counters(self, success):
    method _reschedule_on_success (line 198) | def _reschedule_on_success(self, result):
    method _reschedule_on_failure (line 209) | def _reschedule_on_failure(self, failure):
    method _log_finished_job (line 221) | def _log_finished_job(self, success=True):
    method get_runtime (line 241) | def get_runtime(self):
    method get_time_to_next_run (line 245) | def get_time_to_next_run(self):
    method reschedule (line 250) | def reschedule(self, delay):
    method _log_unhandled_error (line 271) | def _log_unhandled_error(self, failure):
    method _unregister_handler (line 277) | def _unregister_handler(self, result):
    method count_job (line 285) | def count_job(self):
    method uncount_job (line 291) | def uncount_job(self):
    method get_job_count (line 298) | def get_job_count(self):
    method is_job_limit_reached (line 301) | def is_job_limit_reached(self):
    method is_global_limit_reached (line 306) | def is_global_limit_reached(cls):
    method get_global_job_count (line 311) | def get_global_job_count(cls):
    method queue_myself (line 317) | def queue_myself(self, queue):
    method unqueue_next_job (line 320) | def unqueue_next_job(self):
    method unqueue_next_global_job (line 328) | def unqueue_next_global_job(cls):
    method get_job_queue (line 336) | def get_job_queue(self):
  class JobScheduler (line 342) | class JobScheduler(object):
    method __init__ (line 349) | def __init__(self, job, pool):
    method __repr__ (line 359) | def __repr__(self):
    method get_job_schedulers_by_name (line 363) | def get_job_schedulers_by_name(cls) -> dict[str, 'JobScheduler']:
    method initialize_from_config_and_run (line 368) | def initialize_from_config_and_run(cls, pool, onlyjob=None):
    method run (line 378) | def run(self):
    method _start_netbox_reload_loop (line 384) | def _start_netbox_reload_loop(self):
    method on_netbox_type_changed (line 400) | def on_netbox_type_changed(self, netbox_id, new_type, **_kwargs):
    method _setup_active_job_logging (line 421) | def _setup_active_job_logging(self):
    method _reload_netboxes (line 427) | def _reload_netboxes(self):
    method _process_reloaded_netboxes (line 436) | def _process_reloaded_netboxes(self, result):
    method _handle_reload_failures (line 454) | def _handle_reload_failures(self, failure):
    method add_netbox_scheduler (line 461) | def add_netbox_scheduler(self, netbox_id):
    method cancel_netbox_scheduler (line 467) | def cancel_netbox_scheduler(self, netbox_id):
    method reload (line 475) | def reload(cls):
    method log_active_jobs (line 481) | def log_active_jobs(cls, level=logging.DEBUG):
  class CounterFlusher (line 513) | class CounterFlusher(defaultdict):
    method __init__ (line 519) | def __init__(self, interval=60):
    method start (line 530) | def start(self):
    method increment (line 535) | def increment(self, name):
    method flush (line 539) | def flush(self):
  function handle_incoming_events (line 559) | def handle_incoming_events():
  function _handle_incoming_events (line 566) | def _handle_incoming_events():
  function _reschedule_jobs (line 581) | def _reschedule_jobs(boxes_to_reschedule: dict[tuple[int, str], list[Eve...
  function _event_pre_filter (line 600) | def _event_pre_filter(event: EventQueue):
  function _is_valid_refresh_event (line 614) | def _is_valid_refresh_event(event: EventQueue) -> bool:
  function _get_valid_job_names (line 631) | def _get_valid_job_names() -> set[str]:
  function _is_refresh_event_for_me (line 636) | def _is_refresh_event_for_me(event: EventQueue):

FILE: python/nav/ipdevpoll/shadows/__init__.py
  class NetboxType (line 91) | class NetboxType(Shadow):
    method get_enterprise_id (line 95) | def get_enterprise_id(self):
  class NetboxInfo (line 113) | class NetboxInfo(Shadow):
    method get_dependencies (line 118) | def get_dependencies(cls):
  class Vendor (line 136) | class Vendor(Shadow):
  class Module (line 140) | class Module(Shadow):
    method __init__ (line 145) | def __init__(self, *args, **kwargs):
    method prepare_for_save (line 150) | def prepare_for_save(cls, containers):
    method _resolve_actual_duplicate_names (line 155) | def _resolve_actual_duplicate_names(cls, containers):
    method prepare (line 180) | def prepare(self, containers):
    method _fix_binary_garbage (line 186) | def _fix_binary_garbage(self):
    method _fix_missing_name (line 193) | def _fix_missing_name(self):
    method _resolve_duplicate_names (line 197) | def _resolve_duplicate_names(self):
    method _find_name_duplicates (line 225) | def _find_name_duplicates(self):
    method _handle_missing_modules (line 240) | def _handle_missing_modules(cls, containers):
    method cleanup (line 275) | def cleanup(self, containers):
    method _handle_new_module (line 278) | def _handle_new_module(self):
    method cleanup_after_save (line 294) | def cleanup_after_save(cls, containers):
  class Device (line 299) | class Device(Shadow):
    method __init__ (line 304) | def __init__(self, *args, **kwargs):
    method prepare (line 308) | def prepare(self, containers):
    method _fix_binary_garbage (line 312) | def _fix_binary_garbage(self):
    method _detect_version_changes (line 327) | def _detect_version_changes(self):
    method cleanup (line 348) | def cleanup(self, containers):
    method _post_events_version_changes (line 352) | def _post_events_version_changes(self, containers):
  class Location (line 367) | class Location(Shadow):
  class Room (line 371) | class Room(Shadow):
  class Category (line 375) | class Category(Shadow):
  class Organization (line 379) | class Organization(Shadow):
  class Usage (line 383) | class Usage(Shadow):
  class Vlan (line 387) | class Vlan(Shadow):
    method prepare (line 390) | def prepare(self, containers):
    method save (line 403) | def save(self, containers):
    method get_existing_model (line 414) | def get_existing_model(self, containers=None):
    method _has_no_prefixes (line 458) | def _has_no_prefixes(self, containers):
    method _revert_vlan_on_type_change_to_scope (line 464) | def _revert_vlan_on_type_change_to_scope(self, containers):
    method _is_type_changed_to_static (line 478) | def _is_type_changed_to_static(self, containers):
    method _ignore_unknown_organizations (line 488) | def _ignore_unknown_organizations(self):
    method _ignore_unknown_usages (line 495) | def _ignore_unknown_usages(self):
    method _get_my_prefixes (line 500) | def _get_my_prefixes(self, containers):
    method _get_vlan_from_my_prefixes (line 509) | def _get_vlan_from_my_prefixes(self, containers):
    method _log_if_multiple_prefixes (line 530) | def _log_if_multiple_prefixes(self, prefix_containers):
    method _guesstimate_net_type (line 538) | def _guesstimate_net_type(self, containers):
    method _get_router_count_for_prefix (line 587) | def _get_router_count_for_prefix(net_address, include_netboxid=None):
    method _get_virtual_address_count (line 609) | def _get_virtual_address_count(net_address):
  class GwPortPrefix (line 625) | class GwPortPrefix(Shadow):
    method cleanup_after_save (line 630) | def cleanup_after_save(cls, containers):
    method _delete_missing_addresses (line 634) | def _delete_missing_addresses(cls, containers):
    method _get_missing_addresses (line 651) | def _get_missing_addresses(cls, containers):
    method _parse_description (line 659) | def _parse_description(self, containers):
    method _are_description_variables_present (line 679) | def _are_description_variables_present(self):
    method _parse_description_with_all_parsers (line 688) | def _parse_description_with_all_parsers(self):
    method _update_with_parsed_description_data (line 697) | def _update_with_parsed_description_data(self, data, containers):
    method prepare (line 719) | def prepare(self, containers):
  class NetType (line 723) | class NetType(Shadow):
    method get (line 727) | def get(cls, net_type_id):
  class SwPortVlan (line 734) | class SwPortVlan(Shadow):
  class Arp (line 738) | class Arp(Shadow):
    method save (line 741) | def save(self, containers):
  class SwPortAllowedVlan (line 753) | class SwPortAllowedVlan(Shadow):
  class Sensor (line 758) | class Sensor(Shadow):
    method cleanup_after_save (line 763) | def cleanup_after_save(cls, containers):
    method _delete_missing_sensors (line 767) | def _delete_missing_sensors(cls, containers):
    method _get_missing_sensors (line 784) | def _get_missing_sensors(cls, containers):
    method prepare (line 792) | def prepare(self, containers):
  class PowerSupplyOrFan (line 806) | class PowerSupplyOrFan(Shadow):
    method __init__ (line 810) | def __init__(self, *args, **kwargs):
    method prepare (line 814) | def prepare(self, containers):
    method cleanup (line 820) | def cleanup(self, containers):
    method _handle_new_psu_or_fan (line 823) | def _handle_new_psu_or_fan(self):
    method cleanup_after_save (line 839) | def cleanup_after_save(cls, containers):
    method _delete_missing_psus_and_fans (line 844) | def _delete_missing_psus_and_fans(cls, containers):
    method _get_missing_psus_and_fans (line 862) | def _get_missing_psus_and_fans(cls, containers):
    method _alert_missing_devices_are_deleted (line 871) | def _alert_missing_devices_are_deleted(cls, deleted_psus_and_fans):
  class POEPort (line 888) | class POEPort(Shadow):
    method cleanup_after_save (line 893) | def cleanup_after_save(cls, containers):
  class POEGroup (line 899) | class POEGroup(Shadow):
    method cleanup_after_save (line 905) | def cleanup_after_save(cls, containers):
    method prepare (line 910) | def prepare(self, containers):

FILE: python/nav/ipdevpoll/shadows/adjacency.py
  class AdjacencyManager (line 55) | class AdjacencyManager(DefaultManager):
    method __init__ (line 62) | def __init__(self, *args, **kwargs):
    method prepare (line 66) | def prepare(self):
    method _load_existing (line 70) | def _load_existing(self):
    method _map_existing (line 74) | def _map_existing(self):
    method cleanup (line 96) | def cleanup(self):
    method _handle_missing (line 100) | def _handle_missing(self):
    method _delete_expired (line 114) | def _delete_expired(self):
  class AdjacencyCandidate (line 121) | class AdjacencyCandidate(Shadow):
    method get_existing_model (line 125) | def get_existing_model(self, containers=None):
    method save (line 129) | def save(self, containers=None):
    method sentinel (line 135) | def sentinel(cls, containers, source):
  function candidate_key (line 148) | def candidate_key(cand):
  class UnrecognizedNeighborManager (line 162) | class UnrecognizedNeighborManager(DefaultManager):
    method __init__ (line 169) | def __init__(self, *args, **kwargs):
    method prepare (line 173) | def prepare(self):
    method _find_candidate_sources (line 180) | def _find_candidate_sources(self):
    method _load_and_map_existing (line 186) | def _load_and_map_existing(self):
    method make_key (line 198) | def make_key(obj):
    method cleanup (line 201) | def cleanup(self):
  class UnrecognizedNeighbor (line 214) | class UnrecognizedNeighbor(Shadow):
    method prepare (line 219) | def prepare(self, _=None):
    method save (line 232) | def save(self, containers=None):
    method sentinel (line 238) | def sentinel(cls, containers, source):

FILE: python/nav/ipdevpoll/shadows/cam.py
  class CamManager (line 69) | class CamManager(DefaultManager):
    method __init__ (line 79) | def __init__(self, *args, **kwargs):
    method prepare (line 83) | def prepare(self):
    method _remove_sentinel (line 89) | def _remove_sentinel(self):
    method _load_open_records (line 93) | def _load_open_records(self):
    method _map_found_to_open (line 103) | def _map_found_to_open(self):
    method _log_stats (line 112) | def _log_stats(self):
    method save (line 129) | def save(self):
    method _get_port_for (line 154) | def _get_port_for(self, ifindex):
    method _get_saved_ifname_for (line 165) | def _get_saved_ifname_for(self, ifindex):
    method cleanup (line 176) | def cleanup(self):
    method _close_missing (line 181) | def _close_missing(cls, cam_detail):
    method add_sentinel (line 195) | def add_sentinel(cls, containers):

FILE: python/nav/ipdevpoll/shadows/entity.py
  class EntityManager (line 41) | class EntityManager(DefaultManager):
    method __init__ (line 44) | def __init__(self, *args, **kwargs):
    method save (line 52) | def save(self):
    method prepare (line 57) | def prepare(self):
    method _delete_missing (line 76) | def _delete_missing(self):
    method get_purge_list (line 102) | def get_purge_list(self):
    method _build_dependency_graph (line 139) | def _build_dependency_graph(self):
    method _verify_stack_degradation (line 152) | def _verify_stack_degradation(self, missing):
    method get_managed (line 173) | def get_managed(self):
  function entitykey (line 186) | def entitykey(ent):
  function parententitykey (line 194) | def parententitykey(ent):
  class NetboxEntity (line 203) | class NetboxEntity(Shadow):
    method __init__ (line 209) | def __init__(self, *args, **kwargs):
    method __setattr__ (line 216) | def __setattr__(self, key, value):
    method save (line 223) | def save(self, containers):
    method _check_for_resolved_chassis_outage (line 227) | def _check_for_resolved_chassis_outage(self):
    method prepare (line 235) | def prepare(self, containers):
    method cleanup (line 238) | def cleanup(self, containers):
    method _handle_new_entity (line 241) | def _handle_new_entity(self):
    method get_chassis_entities (line 253) | def get_chassis_entities(cls, containers):
    method get_root_entities (line 269) | def get_root_entities(cls, containers):
  class EntityIndex (line 283) | class EntityIndex(object):
    method __init__ (line 289) | def __init__(self, entities):
    method match (line 295) | def match(self, entity):
    method index_by_id (line 314) | def index_by_id(self):
    method index_by_serial (line 321) | def index_by_serial(self):
    method index_by_name (line 333) | def index_by_name(self):

FILE: python/nav/ipdevpoll/shadows/gwpeers.py
  class GatewayPeerSessionManager (line 37) | class GatewayPeerSessionManager(DefaultManager):
    method __init__ (line 42) | def __init__(self, *args, **kwargs):
    method prepare (line 48) | def prepare(self):
    method _load_existing_sessions (line 55) | def _load_existing_sessions(self):
    method _map_known_sessions (line 60) | def _map_known_sessions(self):
    method _map_unknown_sessions (line 67) | def _map_unknown_sessions(self):
    method cleanup (line 71) | def cleanup(self):
  class GatewayPeerSession (line 81) | class GatewayPeerSession(Shadow):
    method save (line 88) | def save(self, containers):
    method _verify_state_changes (line 92) | def _verify_state_changes(self, containers):
    method _log_all_state_changes (line 120) | def _log_all_state_changes(self, containers):
    method _make_bgpstate_event (line 145) | def _make_bgpstate_event(self, start=True, is_adminstatus=False):
    method _get_peer_name (line 171) | def _get_peer_name(self):
    method _get_peer_id (line 184) | def _get_peer_id(self):
    method is_ibgp (line 191) | def is_ibgp(self):
  function should_alert_on_ibgp (line 196) | def should_alert_on_ibgp():

FILE: python/nav/ipdevpoll/shadows/interface.py
  class InterfaceManager (line 39) | class InterfaceManager(DefaultManager):
    method __init__ (line 47) | def __init__(self, *args, **kwargs):
    method prepare (line 52) | def prepare(self):
    method _reset_baseport_numbers (line 68) | def _reset_baseport_numbers(self):
    method _load_existing_objects (line 80) | def _load_existing_objects(self):
    method _make_maps (line 86) | def _make_maps(self, db_ifcs):
    method _find_existing_for (line 106) | def _find_existing_for(self, snmp_ifc):
    method _resolve_changed_ifindexes (line 137) | def _resolve_changed_ifindexes(self):
    method _resolve_linkstate_alerts (line 164) | def _resolve_linkstate_alerts(self):
    method _get_unresolved_linkstate_alerts (line 184) | def _get_unresolved_linkstate_alerts(self):
    method cleanup (line 191) | def cleanup(self):
    method _mark_missing_interfaces (line 199) | def _mark_missing_interfaces(self):
    method _delete_missing_interfaces (line 215) | def _delete_missing_interfaces(self):
    method _get_indexless_ifcs (line 230) | def _get_indexless_ifcs(self):
    method _get_dead_ifcs (line 233) | def _get_dead_ifcs(self):
    method _generate_linkstate_events (line 252) | def _generate_linkstate_events(self):
    method get_linkstate_filter (line 276) | def get_linkstate_filter(self):
  class Interface (line 297) | class Interface(Shadow):
    method is_linkstate_changed (line 302) | def is_linkstate_changed(self):
    method matches_filter (line 305) | def matches_filter(self, linkstate_filter):
    method post_linkstate_event (line 314) | def post_linkstate_event(self):
    method is_admin_up (line 335) | def is_admin_up(self):
    method _make_linkstate_event (line 339) | def _make_linkstate_event(self, start=True):
    method get_existing_model (line 361) | def get_existing_model(self, containers=None):
    method set_existing_model (line 379) | def set_existing_model(self, django_object):
    method _verify_operstatus_change (line 383) | def _verify_operstatus_change(self, stored):
    method prepare (line 389) | def prepare(self, containers):
    method _strip_null_bytes (line 395) | def _strip_null_bytes(self, containers):
    method _set_netbox_if_unset (line 407) | def _set_netbox_if_unset(self, containers):
    method _set_ifindex_if_unset (line 412) | def _set_ifindex_if_unset(self, containers):
    method add_sentinel (line 420) | def add_sentinel(cls, containers):
  class InterfaceStack (line 432) | class InterfaceStack(Shadow):
    method cleanup_after_save (line 437) | def cleanup_after_save(cls, containers):
  class InterfaceAggregate (line 455) | class InterfaceAggregate(Shadow):
    method cleanup_after_save (line 460) | def cleanup_after_save(cls, containers):
  function mapby (line 480) | def mapby(items, *attrs):
  function ifnames (line 487) | def ifnames(ifcs):

FILE: python/nav/ipdevpoll/shadows/netbox.py
  class Netbox (line 28) | class Netbox(Shadow):
    method __init__ (line 32) | def __init__(self, *args, **kwargs):
    method _translate_last_jobs (line 45) | def _translate_last_jobs(netbox):
    method is_up (line 61) | def is_up(self):
    method copy (line 64) | def copy(self, other):
    method prepare (line 78) | def prepare(self, containers):
    method _handle_sysname_conflicts (line 81) | def _handle_sysname_conflicts(self, containers):
    method cleanup_replaced_netbox (line 104) | def cleanup_replaced_netbox(cls, netbox_id, new_type):

FILE: python/nav/ipdevpoll/shadows/prefix.py
  class PrefixManager (line 26) | class PrefixManager(DefaultManager):
    method cleanup (line 29) | def cleanup(self):
    method _get_missing_static_prefixes (line 42) | def _get_missing_static_prefixes(self):
  class Prefix (line 59) | class Prefix(Shadow):
    method save (line 66) | def save(self, containers):
    method _is_not_authorized_to_modify_prefix (line 76) | def _is_not_authorized_to_modify_prefix(self, containers):
    method _is_modification_of_existing_prefix_to_static (line 87) | def _is_modification_of_existing_prefix_to_static(self):
    method add_static_routes_sentinel (line 104) | def add_static_routes_sentinel(cls, containers):

FILE: python/nav/ipdevpoll/shadows/swportblocked.py
  class SwPortBlockedManager (line 25) | class SwPortBlockedManager(DefaultManager):
    method __init__ (line 31) | def __init__(self, *args, **kwargs):
    method prepare (line 35) | def prepare(self):
    method _load_and_map_existing_objects (line 40) | def _load_and_map_existing_objects(self):
    method _find_existing_for (line 54) | def _find_existing_for(self, found_block):
    method cleanup (line 58) | def cleanup(self):
  class SwPortBlocked (line 67) | class SwPortBlocked(Shadow):
    method get_existing_model (line 71) | def get_existing_model(self, containers=None):
    method prepare (line 75) | def prepare(self, containers):
    method save (line 82) | def save(self, containers):

FILE: python/nav/ipdevpoll/snmp/common.py
  function cache_for_session (line 34) | def cache_for_session(func):
  function _cache_result (line 52) | def _cache_result(result, cache, key):
  function throttled (line 57) | def throttled(func):
  class AgentProxyMixIn (line 75) | class AgentProxyMixIn(object):
    method __init__ (line 86) | def __init__(self, *args, **kwargs):
    method __repr__ (line 109) | def __repr__(self):
    method getTable (line 118) | def getTable(self, *args, **kwargs):
    method _get (line 123) | def _get(self, *args, **kwargs):
    method _walk (line 127) | def _walk(self, *args, **kwargs):
    method _getbulk (line 131) | def _getbulk(self, *args, **kwargs):
  class SNMPParameters (line 136) | class SNMPParameters:
    method __post_init__ (line 166) | def __post_init__(self):
    method version_string (line 178) | def version_string(self):
    method factory (line 183) | def factory(
    method get_params_from_ipdevpoll_config (line 218) | def get_params_from_ipdevpoll_config(cls, section: str = "snmp") -> di...
    method as_agentproxy_args (line 236) | def as_agentproxy_args(self) -> dict[str, Any]:
  class SnmpError (line 268) | class SnmpError(Exception):

FILE: python/nav/ipdevpoll/snmp/pynetsnmp.py
  function pynetsnmp_limits_results (line 37) | def pynetsnmp_limits_results():
  class AgentProxy (line 54) | class AgentProxy(common.AgentProxyMixIn, twistedsnmp.AgentProxy):
    method getTable (line 60) | def getTable(self, *args, **kwargs):
    method open (line 65) | def open(self):
    method count_open_sessions (line 75) | def count_open_sessions(cls):

FILE: python/nav/ipdevpoll/storage.py
  class MetaShadow (line 26) | class MetaShadow(type):
    method __init__ (line 40) | def __init__(mcs, name, bases, dct):
  class DefaultManager (line 62) | class DefaultManager(object):
    method __init__ (line 71) | def __init__(self, cls, containers):
    method prepare (line 81) | def prepare(self):
    method save (line 85) | def save(self):
    method cleanup (line 90) | def cleanup(self):
    method get_managed (line 94) | def get_managed(self):
    method __repr__ (line 101) | def __repr__(self):
  class Shadow (line 109) | class Shadow(object, metaclass=MetaShadow):
    method __init__ (line 133) | def __init__(self, *args, **kwargs):
    method __eq__ (line 168) | def __eq__(self, other):
    method __hash__ (line 200) | def __hash__(self):
    method __ne__ (line 203) | def __ne__(self, other):
    method __repr__ (line 206) | def __repr__(self):
    method __setattr__ (line 215) | def __setattr__(self, attr, value):
    method is_shadowy_attribute (line 237) | def is_shadowy_attribute(cls, attr):
    method copy (line 244) | def copy(self, other):
    method get_dependencies (line 255) | def get_dependencies(cls):
    method get_touched (line 276) | def get_touched(self):
    method convert_to_model (line 285) | def convert_to_model(self, containers=None):
    method get_primary_key_attribute (line 321) | def get_primary_key_attribute(self):
    method get_primary_key (line 327) | def get_primary_key(self):
    method set_primary_key (line 332) | def set_primary_key(self, value):
    method get_existing_model (line 337) | def get_existing_model(self, containers=None):
    method set_existing_model (line 415) | def set_existing_model(self, django_object):
    method prepare_for_save (line 430) | def prepare_for_save(cls, containers):
    method cleanup_after_save (line 451) | def cleanup_after_save(cls, containers):
    method prepare (line 470) | def prepare(self, containers):
    method clear_cached_objects (line 484) | def clear_cached_objects(self):
    method save (line 490) | def save(self, containers):
    method update (line 509) | def update(self, containers):
    method get_diff_attrs (line 528) | def get_diff_attrs(self, other):
    method cleanup (line 543) | def cleanup(self, containers):
  function shadowify (line 554) | def shadowify(model):
  function shadowify_queryset (line 568) | def shadowify_queryset(queryset):
  function shadowify_queryset_and_commit (line 576) | def shadowify_queryset_and_commit(queryset):
  class ContainerRepository (line 584) | class ContainerRepository(dict):
    method factory (line 594) | def factory(self, key, container_class, *args, **kwargs):
    method add (line 615) | def add(self, container_class):
    method get (line 629) | def get(self, key, container_class):
    method __repr__ (line 639) | def __repr__(self):
    method sortedkeys (line 643) | def sortedkeys(self):
  function get_shadow_sort_order (line 654) | def get_shadow_sort_order():

FILE: python/nav/ipdevpoll/timestamps.py
  class TimestampChecker (line 31) | class TimestampChecker(object):
    method __init__ (line 60) | def __init__(self, agent, containers, var_name):
    method collect (line 70) | def collect(self, collectors):
    method load (line 90) | def load(self):
    method save (line 115) | def save(self):
    method _get_netbox (line 126) | def _get_netbox(self):
    method is_changed (line 129) | def is_changed(self, max_deviation=60):

FILE: python/nav/ipdevpoll/utils.py
  function fire_eventually (line 42) | def fire_eventually(result):
  function binary_mac_to_hex (line 59) | def binary_mac_to_hex(binary_mac):
  function truncate_mac (line 72) | def truncate_mac(mac):
  function find_prefix (line 82) | def find_prefix(ip, prefix_list):
  function is_invalid_database_string (line 96) | def is_invalid_database_string(string):
  function is_invalid_utf8 (line 105) | def is_invalid_utf8(string):
  function log_unhandled_failure (line 120) | def log_unhandled_failure(logger, failure, msg, *args, **kwargs):
  function get_multibridgemib (line 137) | async def get_multibridgemib(agentproxy) -> "MultiBridgeMib":
  function get_dot1d_instances (line 148) | async def get_dot1d_instances(agentproxy) -> "list[LogicalMibInstance]":
  function get_arista_vrf_instances (line 190) | def get_arista_vrf_instances(agentproxy) -> Deferred:
  function _workaround_broken_aruba_alternate_communities (line 216) | def _workaround_broken_aruba_alternate_communities(

FILE: python/nav/junos/nav_views.py
  function _loadyaml_bypass (line 29) | def _loadyaml_bypass(yaml_file):

FILE: python/nav/jwtconf.py
  class LocalJWTConfig (line 16) | class LocalJWTConfig:
  class JWTConf (line 26) | class JWTConf(NAVConfigParser):
    method get_issuers_setting (line 34) | def get_issuers_setting(self) -> dict[str, Any]:
    method get_local_config (line 48) | def get_local_config(self) -> LocalJWTConfig:
    method _get_local_config (line 59) | def _get_local_config(self) -> LocalJWTConfig:
    method _get_settings_for_external_tokens (line 74) | def _get_settings_for_external_tokens(self):
    method _read_key_from_path (line 102) | def _read_key_from_path(self, path):
    method _validate_key (line 115) | def _validate_key(self, key):
    method _validate_type (line 120) | def _validate_type(self, key_type):
    method _validate_issuer (line 127) | def _validate_issuer(self, section):
    method _validate_audience (line 142) | def _validate_audience(self, audience):
    method _get_nav_token_config_option (line 147) | def _get_nav_token_config_option(self, option):
    method get_nav_private_key (line 157) | def get_nav_private_key(self):
    method get_nav_public_key (line 161) | def get_nav_public_key(self):
    method get_nav_name (line 165) | def get_nav_name(self):
    method get_access_token_lifetime (line 171) | def get_access_token_lifetime(self):
    method get_refresh_token_lifetime (line 182) | def get_refresh_token_lifetime(self):
    method _get_settings_for_nav_issued_tokens (line 193) | def _get_settings_for_nav_issued_tokens(self):

FILE: python/nav/logengine.py
  function get_exception_dicts (line 66) | def get_exception_dicts(config):
  function create_message (line 153) | def create_message(line, database=None):
  class Message (line 174) | class Message(object):
    method __init__ (line 178) | def __init__(self, time, origin, msgtype, description):
    method find_priority (line 188) | def find_priority(self, msgtype):
    method find_category (line 199) | def find_category(self, origin):
  function find_year (line 207) | def find_year(mnd):
  function find_month (line 215) | def find_month(textual):
  function parse_timestamp (line 236) | def parse_timestamp(timestamp_str: str) -> datetime.datetime:
  function delete_old_messages (line 288) | def delete_old_messages(config):
  function verify_singleton (line 307) | def verify_singleton(quiet=False):
  function get_categories (line 330) | def get_categories(cursor):
  function get_origins (line 339) | def get_origins(cursor):
  function get_types (line 348) | def get_types(cursor):
  function read_log_lines (line 359) | def read_log_lines(config):
  function parse_and_insert (line 403) | def parse_and_insert(
  function insert_message (line 438) | def insert_message(
  function add_category (line 492) | def add_category(category, categories, database):
  function add_origin (line 497) | def add_origin(origin, category, origins, database):
  function add_type (line 509) | def add_type(facility, mnemonic, priorityid, types, database):
  function logengine (line 525) | def logengine(config, options):
  function swallow_all_but_db_exceptions (line 559) | def swallow_all_but_db_exceptions(func):
  function parse_options (line 571) | def parse_options():
  function main (line 593) | def main():

FILE: python/nav/logs.py
  function set_log_config (line 42) | def set_log_config():
  function set_log_levels (line 49) | def set_log_levels():
  function _translate_log_level (line 67) | def _translate_log_level(level):
  function _set_custom_log_file (line 83) | def _set_custom_log_file():
  function _read_dictconfig_from_yaml_file (line 104) | def _read_dictconfig_from_yaml_file():
  function _get_logging_conf (line 116) | def _get_logging_conf():
  function _get_logging_yaml (line 138) | def _get_logging_yaml() -> Optional[dict]:
  function reset_log_levels (line 151) | def reset_log_levels(level=logging.WARNING):
  function reopen_log_files (line 166) | def reopen_log_files():
  function get_logfile_from_logger (line 190) | def get_logfile_from_logger(logger=logging.root):
  function init_stderr_logging (line 214) | def init_stderr_logging(formatter=None, rootlogger=''):
  function init_generic_logging (line 225) | def init_generic_logging(
  function _get_logfile_path (line 270) | def _get_logfile_path(logfile):

FILE: python/nav/macaddress.py
  class MacAddress (line 52) | class MacAddress(object):
    method __init__ (line 64) | def __init__(self, addr):
    method from_octets (line 77) | def from_octets(cls, binary_mac):
    method toint (line 82) | def toint(self):
    method _parse_address_string (line 87) | def _parse_address_string(addr):
    method __str__ (line 102) | def __str__(self):
    method __repr__ (line 115) | def __repr__(self):
    method __lt__ (line 125) | def __lt__(self, other):
    method __le__ (line 128) | def __le__(self, other):
    method __eq__ (line 131) | def __eq__(self, other):
    method __ne__ (line 134) | def __ne__(self, other):
    method __gt__ (line 137) | def __gt__(self, other):
    method __ge__ (line 140) | def __ge__(self, other):
    method _compare (line 143) | def _compare(self, other, method):
    method __hash__ (line 151) | def __hash__(self):
    method to_string (line 154) | def to_string(self, delim=None):
  class MacPrefix (line 168) | class MacPrefix(object):
    method __init__ (line 183) | def __init__(self, prefix, min_prefix_len=MIN_PREFIX_LEN):
    method from_octets (line 199) | def from_octets(cls, binary_mac):
    method __len__ (line 203) | def __len__(self):
    method __getitem__ (line 219) | def __getitem__(self, key):
    method __str__ (line 251) | def __str__(self):
    method __repr__ (line 258) | def __repr__(self):
  function _clean_hexstring (line 265) | def _clean_hexstring(hexstr):
  function _int_to_delimited_hexstring (line 274) | def _int_to_delimited_hexstring(mac_addr, delim, step):
  function octets_to_hexstring (line 281) | def octets_to_hexstring(octets):

FILE: python/nav/mailin/__init__.py
  function make_event (line 27) | def make_event(**kw):
  class Plugin (line 37) | class Plugin(object):
    method __init__ (line 44) | def __init__(self, name, config, logger):
    method init (line 54) | def init(self):
    method accept (line 58) | def accept(self, msg):
    method authorize (line 62) | def authorize(self, msg):
    method process (line 67) | def process(self, msg):

FILE: python/nav/mailin/plugins/kake.py
  class Plugin (line 5) | class Plugin(nav.mailin.Plugin):
    method init (line 6) | def init(self):
    method accept (line 15) | def accept(self, msg):
    method process (line 18) | def process(self, msg):

FILE: python/nav/mailin/plugins/whatsup.py
  class Plugin (line 28) | class Plugin(nav.mailin.Plugin):
    method init (line 29) | def init(self):
    method accept (line 38) | def accept(self, msg):
    method authorize (line 41) | def authorize(self, msg):
    method process (line 44) | def process(self, msg):

FILE: python/nav/maintengine.py
  function schedule (line 45) | def schedule():
  function check_tasks_without_end (line 54) | def check_tasks_without_end():
  function do_state_transitions (line 89) | def do_state_transitions():
  function cancel_tasks_without_components (line 110) | def cancel_tasks_without_components():
  function check_state_differences (line 122) | def check_state_differences():
  function create_event (line 171) | def create_event(subject, state, value, taskid=None):
  function check_devices_on_maintenance (line 213) | def check_devices_on_maintenance():

FILE: python/nav/metrics/__init__.py
  class GraphiteConfigParser (line 23) | class GraphiteConfigParser(NAVConfigParser):

FILE: python/nav/metrics/carbon.py
  class CarbonWarning (line 43) | class CarbonWarning(UserWarning):
  function send_metrics_to (line 49) | def send_metrics_to(metric_tuples, host, port=2003):
  function _handle_error (line 74) | def _handle_error(error, host, port):
  function _reset_warning_registry (line 97) | def _reset_warning_registry():
  function send_metrics (line 109) | def send_metrics(metric_tuples):
  function _socktype_from_addr (line 121) | def _socktype_from_addr(addr):
  function _metric_to_line (line 127) | def _metric_to_line(metric_tuple):
  function metrics_to_packets (line 133) | def metrics_to_packets(metric_tuples):

FILE: python/nav/metrics/data.py
  function get_metric_average (line 40) | def get_metric_average(target, start="-5min", end="now", ignore_unknown=...
  function get_metric_max (line 76) | def get_metric_max(target, start="-5min", end="now"):
  function get_metric_data (line 90) | def get_metric_data(target, start="-5min", end="now"):
  function get_netboxes_availability (line 161) | def get_netboxes_availability(
  function populate_for_interval (line 203) | def populate_for_interval(result, targets, netboxes, start_time, end_time):
  function populate_for_time_frame (line 224) | def populate_for_time_frame(result, targets, netboxes, time_frames):

FILE: python/nav/metrics/errors.py
  class GraphiteUnreachableError (line 19) | class GraphiteUnreachableError(Exception):
    method __init__ (line 22) | def __init__(self, msg, cause=None):

FILE: python/nav/metrics/graphs.py
  function get_sensor_meta (line 29) | def get_sensor_meta(metric_path):
  class Graph (line 126) | class Graph(object):
    method __init__ (line 135) | def __init__(
    method __str__ (line 157) | def __str__(self):
    method __repr__ (line 160) | def __repr__(self):
    method set_timeframe (line 163) | def set_timeframe(self, timeframe):
    method add_target (line 176) | def add_target(self, target):
    method add_magic_target (line 180) | def add_magic_target(self, target):
  function get_simple_graph_url (line 212) | def get_simple_graph_url(
  function get_metric_meta (line 251) | def get_metric_meta(metric_path):
  function extract_series_name (line 289) | def extract_series_name(series):
  function translate_serieslist_to_regex (line 330) | def translate_serieslist_to_regex(series):
  function aliased_series (line 353) | def aliased_series(series_list: str, name: str, **meta: str) -> str:
  function summed_series (line 374) | def summed_series(*series_list: str) -> str:
  function nonempty_series (line 383) | def nonempty_series(series_list: str, x_files_factor: float = 0.0) -> str:
  function json_graph_url (line 398) | def json_graph_url(*series_list: str, title: str) -> str:

FILE: python/nav/metrics/lookup.py
  function lookup (line 30) | def lookup(metric):
  function reverses (line 46) | def reverses(pattern):
  function _reverse_interface (line 64) | def _reverse_interface(sysname, ifname):
  function _reverse_sensor (line 73) | def _reverse_sensor(sysname, name):
  function _reverse_device_cpu (line 80) | def _reverse_device_cpu(sysname, cpuname):
  function _reverse_uptime (line 87) | def _reverse_uptime(sysname):
  function _reverse_device (line 96) | def _reverse_device(sysname):
  function _reverse_prefix (line 101) | def _reverse_prefix(netaddr):
  function _single_like_match (line 108) | def _single_like_match(model, related=None, **kwargs):

FILE: python/nav/metrics/names.py
  class safe_name (line 31) | class safe_name(str):
    method __str__ (line 36) | def __str__(self):
  function escape_metric_name (line 42) | def escape_metric_name(name):
  function join_series (line 56) | def join_series(names):
  function get_all_leaves_below (line 73) | def get_all_leaves_below(top, ignored=None):
  function get_expanded_nodes (line 80) | def get_expanded_nodes(path):
  function get_metric_leaf_children (line 97) | def get_metric_leaf_children(path):
  function get_metric_nonleaf_children (line 110) | def get_metric_nonleaf_children(path):
  function nodewalk (line 123) | def nodewalk(top, ignored=None):
  function raw_metric_query (line 152) | def raw_metric_query(query, operation="find"):

FILE: python/nav/metrics/templates.py
  function metric_prefix_for_ipdevpoll_job (line 25) | def metric_prefix_for_ipdevpoll_job(sysname, job_name):
  function metric_path_for_bandwith (line 32) | def metric_path_for_bandwith(sysname, is_percent):
  function metric_path_for_bandwith_peak (line 40) | def metric_path_for_bandwith_peak(sysname, is_percent):
  function metric_path_for_cpu_load (line 48) | def metric_path_for_cpu_load(sysname, cpu_name, interval):
  function metric_path_for_cpu_utilization (line 57) | def metric_path_for_cpu_utilization(sysname, cpu_name):
  function metric_path_for_interface (line 64) | def metric_path_for_interface(sysname, ifname, counter):
  function metric_path_for_packet_loss (line 72) | def metric_path_for_packet_loss(sysname):
  function metric_path_for_prefix (line 77) | def metric_path_for_prefix(netaddr, metric_name):
  function metric_path_for_roundtrip_time (line 85) | def metric_path_for_roundtrip_time(sysname):
  function metric_prefix_for_sensors (line 90) | def metric_prefix_for_sensors(sysname):
  function metric_path_for_sensor (line 95) | def metric_path_for_sensor(sysname, sensor):
  function metric_path_for_service_availability (line 102) | def metric_path_for_service_availability(sysname, handler, service_id):
  function metric_path_for_service_response_time (line 107) | def metric_path_for_service_response_time(sysname, handler, service_id):
  function metric_path_for_sysuptime (line 112) | def metric_path_for_sysuptime(sysname):
  function metric_path_for_power (line 117) | def metric_path_for_power(sysname, index):
  function metric_prefix_for_cpu (line 122) | def metric_prefix_for_cpu(sysname):
  function metric_prefix_for_device (line 127) | def metric_prefix_for_device(sysname):
  function metric_prefix_for_interface (line 134) | def metric_prefix_for_interface(sysname, ifname):
  function metric_prefix_for_memory (line 141) | def metric_prefix_for_memory(sysname, memory_name):
  function metric_prefix_for_ports (line 149) | def metric_prefix_for_ports(sysname):
  function metric_prefix_for_prefix (line 154) | def metric_prefix_for_prefix(netaddr):
  function metric_prefix_for_service (line 161) | def metric_prefix_for_service(sysname, handler, service_id):
  function metric_prefix_for_system (line 168) | def metric_prefix_for_system(sysname):
  function metric_prefix_for_multicast_group (line 173) | def metric_prefix_for_multicast_group(group):
  function metric_path_for_multicast_usage (line 178) | def metric_path_for_multicast_usage(group, sysname):
  function metric_path_for_dhcp (line 188) | def metric_path_for_dhcp(

FILE: python/nav/metrics/thresholds.py
  class ThresholdEvaluator (line 96) | class ThresholdEvaluator(object):
    method __init__ (line 112) | def __init__(self, target, period=DEFAULT_INTERVAL, raw=False):
    method __repr__ (line 130) | def __repr__(self):
    method get_values (line 135) | def get_values(self):
    method evaluate (line 156) | def evaluate(self, expression, invert=False):
    method _get_matcher (line 177) | def _get_matcher(self, expression):
    method _gt (line 190) | def _gt(self, value, percent, metric):
    method _lt (line 195) | def _lt(self, value, percent, metric):
    method _calculate_current (line 200) | def _calculate_current(self, percent, metric):
  function get_metric_maximum (line 212) | def get_metric_maximum(metric):
  class InvalidExpressionError (line 228) | class InvalidExpressionError(Exception):
  function interval_to_graphite (line 234) | def interval_to_graphite(delta):

FILE: python/nav/mibs/__init__.py
  function reduce_index (line 24) | def reduce_index(result):

FILE: python/nav/mibs/alcatel_ind1_port_mib.py
  class AlcatelInd1PortMib (line 57) | class AlcatelInd1PortMib(MibRetriever):
    method get_all_sensors (line 63) | def get_all_sensors(self):
    method handle_column (line 73) | def handle_column(self, column, config):

FILE: python/nav/mibs/arista_vrf_mib.py
  class AristaVrfMib (line 23) | class AristaVrfMib(mibretriever.MibRetriever):
    method get_vrf_states (line 29) | def get_vrf_states(self, only: str = None) -> Deferred:
  function _vrf_index_to_string (line 46) | def _vrf_index_to_string(index: OID) -> str:

FILE: python/nav/mibs/bgp4_mib.py
  class BGP4Mib (line 32) | class BGP4Mib(mibretriever.MibRetriever):
    method is_supported (line 44) | def is_supported(self):
    method get_bgp_peer_states (line 54) | def get_bgp_peer_states(self):
    method _bgp_row_to_remote_ip (line 95) | def _bgp_row_to_remote_ip(row_index):

FILE: python/nav/mibs/bgp4_v2_mib_juniper.py
  class BGP4V2JuniperMib (line 24) | class BGP4V2JuniperMib(BGP4Mib):
    method _bgp_row_to_remote_ip (line 36) | def _bgp_row_to_remote_ip(row_index):

FILE: python/nav/mibs/bridge_mib.py
  class BridgeMib (line 24) | class BridgeMib(mibretriever.MibRetriever):
    method get_baseport_ifindex_map (line 29) | def get_baseport_ifindex_map(self):
    method get_base_bridge_address (line 39) | def get_base_bridge_address(self):
    method get_forwarding_database (line 44) | def get_forwarding_database(self):
    method get_stp_blocking_ports (line 62) | def get_stp_blocking_ports(self):
    method get_stp_port_states (line 69) | def get_stp_port_states(self):
  class MultiBridgeMib (line 79) | class MultiBridgeMib(BridgeMib, mibretriever.MultiMibMixIn):
    method get_baseport_ifindex_map (line 80) | def get_baseport_ifindex_map(self):
    method get_forwarding_database (line 84) | def get_forwarding_database(self):
    method get_stp_blocking_ports (line 88) | def get_stp_blocking_ports(self):
    method get_stp_port_states (line 100) | def get_stp_port_states(self):

FILE: python/nav/mibs/cd6c_mib.py
  class CD6CMib (line 7) | class CD6CMib(MibRetriever):
    method get_all_sensors (line 33) | def get_all_sensors(self):
    method create_sensor (line 57) | def create_sensor(self, sensor, precision=0, uom=''):

FILE: python/nav/mibs/cisco_auth_framework_mib.py
  class CiscoAuthFrameworkMib (line 28) | class CiscoAuthFrameworkMib(mibretriever.MibRetriever):
    method get_auth_session_vlans (line 33) | async def get_auth_session_vlans(self) -> dict[tuple[int, ...], dict[s...

FILE: python/nav/mibs/cisco_bgp4_mib.py
  class CiscoBGP4Mib (line 24) | class CiscoBGP4Mib(BGP4Mib):
    method _bgp_row_to_remote_ip (line 36) | def _bgp_row_to_remote_ip(row_index):

FILE: python/nav/mibs/cisco_c2900_mib.py
  class CiscoC2900Mib (line 20) | class CiscoC2900Mib(esswitch_mib.ESSwitchMib):

FILE: python/nav/mibs/cisco_cdp_mib.py
  class CiscoCDPMib (line 32) | class CiscoCDPMib(mibretriever.MibRetriever):
    method get_neighbors_last_change (line 37) | def get_neighbors_last_change(self):
    method get_cdp_neighbors (line 45) | def get_cdp_neighbors(self):
    method _get_cdp_cache_table (line 56) | def _get_cdp_cache_table(self):
    method _make_cache_tuple (line 68) | def _make_cache_tuple(index, row):

FILE: python/nav/mibs/cisco_enhanced_memory_pool_mib.py
  class CiscoEnhancedMemoryPoolMib (line 26) | class CiscoEnhancedMemoryPoolMib(mibretriever.MibRetriever):
    method get_memory_usage (line 30) | def get_memory_usage(self):

FILE: python/nav/mibs/cisco_entity_fru_control_mib.py
  class CiscoEntityFruControlMib (line 57) | class CiscoEntityFruControlMib(mibretriever.MibRetriever):
    method __init__ (line 65) | def __init__(self, agent_proxy):
    method _get_fantray_status_table (line 71) | def _get_fantray_status_table(self):
    method _get_power_status_table (line 75) | def _get_power_status_table(self):
    method _translate_fan_status (line 80) | def _translate_fan_status(oper_status):
    method _translate_power_supply_status_value (line 89) | def _translate_power_supply_status_value(oper_status):
    method get_fan_status (line 98) | def get_fan_status(self, internal_id):
    method get_power_supply_status (line 107) | def get_power_supply_status(self, internal_id):
    method get_fan_status_table (line 116) | def get_fan_status_table(self):
    method get_psu_status_table (line 123) | def get_psu_status_table(self):
    method get_power_supplies (line 129) | def get_power_supplies(self):
    method get_fans (line 134) | def get_fans(self):

FILE: python/nav/mibs/cisco_entity_sensor_mib.py
  class CiscoEntitySensorMib (line 20) | class CiscoEntitySensorMib(EntitySensorMib):

FILE: python/nav/mibs/cisco_envmon_mib.py
  class CiscoEnvMonMib (line 36) | class CiscoEnvMonMib(mibretriever.MibRetriever):
    method _get_voltage_sensors (line 39) | def _get_voltage_sensors(self):
    method _get_temperature_sensors (line 50) | def _get_temperature_sensors(self):
    method _get_fanstate_sensors (line 62) | def _get_fanstate_sensors(self):
    method _get_powersupply_sensors (line 73) | def _get_powersupply_sensors(self):
    method _get_voltage_sensor_params (line 85) | def _get_voltage_sensor_params(self, voltage_sensors):
    method _get_temperature_sensor_params (line 117) | def _get_temperature_sensor_params(self, temperature_sensors):
    method _get_fanstate_sensor_params (line 143) | def _get_fanstate_sensor_params(self, fanstate_sensors):
    method _get_powersupply_sensor_params (line 169) | def _get_powersupply_sensor_params(self, powersupply_sensors):
    method get_all_sensors (line 200) | def get_all_sensors(self):

FILE: python/nav/mibs/cisco_hsrp_mib.py
  class CiscoHSRPMib (line 24) | class CiscoHSRPMib(mibretriever.MibRetriever):
    method get_virtual_addresses (line 30) | def get_virtual_addresses(self):

FILE: python/nav/mibs/cisco_ietf_ip_mib.py
  class CiscoIetfIpMib (line 25) | class CiscoIetfIpMib(IpMib):
    method address_index_to_ip (line 40) | def address_index_to_ip(cls, index):
    method prefix_index_to_ip (line 52) | def prefix_index_to_ip(cls, index, prefix_entry=None):
    method get_ifindex_ip_mac_mappings (line 61) | def get_ifindex_ip_mac_mappings(self):
    method get_interface_addresses (line 78) | def get_interface_addresses(self):
    method _binary_mac_to_hex (line 96) | def _binary_mac_to_hex(mac):

FILE: python/nav/mibs/cisco_memory_pool_mib.py
  class CiscoMemoryPoolMib (line 26) | class CiscoMemoryPoolMib(mibretriever.MibRetriever):
    method get_memory_usage (line 30) | def get_memory_usage(self):

FILE: python/nav/mibs/cisco_power_ethernet_ext_mib.py
  class CiscoPowerEthernetExtMib (line 20) | class CiscoPowerEthernetExtMib(mibretriever.MibRetriever):

FILE: python/nav/mibs/cisco_process_mib.py
  class CiscoProcessMib (line 31) | class CiscoProcessMib(mibretriever.MibRetriever):
    method get_cpu_loadavg (line 35) | def get_cpu_loadavg(self):
    method _get_cpu_names (line 56) | def _get_cpu_names(self, indexes):
    method get_cpu_utilization (line 69) | def get_cpu_utilization(self):

FILE: python/nav/mibs/cisco_stack_mib.py
  class CiscoStackMib (line 20) | class CiscoStackMib(mibretriever.MibRetriever):
    method get_bandwidth_percent (line 23) | def get_bandwidth_percent(self):
    method get_bandwidth_percent_peak (line 26) | def get_bandwidth_percent_peak(self):

FILE: python/nav/mibs/cisco_vlan_iftable_relationship_mib.py
  class CiscoVlanIftableRelationshipMib (line 26) | class CiscoVlanIftableRelationshipMib(mibretriever.MibRetriever):
    method get_routed_vlan_ifindexes (line 32) | def get_routed_vlan_ifindexes(self):

FILE: python/nav/mibs/cisco_vlan_membership_mib.py
  class CiscoVlanMembershipMib (line 23) | class CiscoVlanMembershipMib(mibretriever.MibRetriever):
    method get_vlan_membership (line 29) | def get_vlan_membership(self):

FILE: python/nav/mibs/cisco_vtp_mib.py
  class CiscoVTPMib (line 26) | class CiscoVTPMib(mibretriever.MibRetriever):
    method get_trunk_native_vlans (line 30) | def get_trunk_native_vlans(self):
    method get_trunk_enabled_vlans (line 44) | def get_trunk_enabled_vlans(self, as_bitvector=False):
    method get_ethernet_vlan_states (line 83) | def get_ethernet_vlan_states(self):
    method get_operational_vlans (line 97) | def get_operational_vlans(self):
    method retrieve_alternate_bridge_mibs (line 102) | async def retrieve_alternate_bridge_mibs(self) -> list[LogicalMibInsta...

FILE: python/nav/mibs/comet.py
  class Comet (line 39) | class Comet(MibRetriever):
    method get_all_sensors (line 45) | def get_all_sensors(self):
    method get_channels (line 54) | def get_channels(self):
    method get_binary_inputs (line 86) | def get_binary_inputs(self):
  class CometMS (line 136) | class CometMS(MibRetriever):
    method get_all_sensors (line 142) | def get_all_sensors(self):
    method get_channels (line 150) | def get_channels(self):

FILE: python/nav/mibs/comet_t3611.py
  class CometT3611 (line 28) | class CometT3611(mibretriever.MibRetriever):
    method get_all_sensors (line 34) | def get_all_sensors(self):
    method _data_to_sensor (line 49) | def _data_to_sensor(self, result):

FILE: python/nav/mibs/coriant_groove_mib.py
  function filter_port_by_adminstatus (line 28) | def filter_port_by_adminstatus(index, _, filter_data):
  class CoriantGrooveMib (line 136) | class CoriantGrooveMib(MibRetriever):
    method get_all_sensors (line 142) | def get_all_sensors(self):
    method _discover_sensors (line 158) | def _discover_sensors(
    method _make_sensor (line 230) | def _make_sensor(self, index, name, alias, column, config):
    method _get_sensor_description (line 244) | def _get_sensor_description(self, column):
  function _fix_text_columns (line 251) | def _fix_text_columns():

FILE: python/nav/mibs/cpqpower_mib.py
  class CPQPowerMib (line 173) | class CPQPowerMib(mibretriever.MibRetriever):
    method get_all_sensors (line 179) | def get_all_sensors(self):
    method _get_oid (line 188) | def _get_oid(self, column, index):
    method _get_names (line 192) | def _get_names(self):
    method _get_sensors (line 206) | def _get_sensors(self, names, sensors, extra_columns=None, filter=lamb...
    method _mksensors (line 219) | def _mksensors(self, index, row, table, names):

FILE: python/nav/mibs/eltek_distributed_mib.py
  class EltekDistributedMib (line 44) | class EltekDistributedMib(MibRetriever):
    method get_all_sensors (line 50) | def get_all_sensors(self):
    method _verify_sensor (line 61) | def _verify_sensor(self, object_name):

FILE: python/nav/mibs/entity_mib.py
  class EntityMib (line 36) | class EntityMib(mibretriever.MibRetriever):
    method retrieve_alternate_bridge_mibs (line 41) | async def retrieve_alternate_bridge_mibs(self) -> list[LogicalMibInsta...
    method get_last_change_time (line 83) | def get_last_change_time(self):
    method _get_named_table (line 91) | def _get_named_table(self, table_name):
    method get_entity_physical_table (line 99) | def get_entity_physical_table(self):
    method get_useful_physical_table_columns (line 105) | def get_useful_physical_table_columns(self):
    method get_alias_mapping (line 125) | def get_alias_mapping(self):
    method _process_alias_mapping (line 129) | def _process_alias_mapping(self, alias_mapping):
    method get_power_supplies (line 144) | def get_power_supplies(self):
    method get_fans (line 148) | def get_fans(self):
    method __filter_psu_or_fan (line 153) | def __filter_psu_or_fan(self, filter_function):
  class EntityTable (line 164) | class EntityTable(dict):
    method __init__ (line 167) | def __init__(self, mibresult):
    method is_module (line 181) | def is_module(self, entity):
    method is_port (line 190) | def is_port(entity):
    method is_chassis (line 194) | def is_chassis(entity):
    method is_power_supply (line 198) | def is_power_supply(entity):
    method is_fan (line 202) | def is_fan(entity):
    method is_transceiver (line 205) | def is_transceiver(self, entity):
    method get_modules (line 209) | def get_modules(self):
    method get_ports (line 222) | def get_ports(self):
    method get_chassis (line 233) | def get_chassis(self):
    method get_nearest_module_parent (line 245) | def get_nearest_module_parent(self, entity):
    method get_nearest_port_parent (line 259) | def get_nearest_port_parent(self, entity):
    method get_chassis_of (line 273) | def get_chassis_of(self, entity):
    method clean (line 284) | def clean(self):
    method _parse_mfg_date (line 292) | def _parse_mfg_date(self):
    method _strip_whitespace (line 301) | def _strip_whitespace(self):
    method _fix_broken_chassis_relative_positions (line 308) | def _fix_broken_chassis_relative_positions(self):
    method _rename_stack_duplicates (line 324) | def _rename_stack_duplicates(self):
    method _get_non_chassis_duplicates (line 341) | def _get_non_chassis_duplicates(self):
  function parse_dateandtime_tc (line 361) | def parse_dateandtime_tc(value):
  function _entity_to_powersupply_or_fan (line 397) | def _entity_to_powersupply_or_fan(entity):

FILE: python/nav/mibs/entity_sensor_mib.py
  class EntitySensorMib (line 64) | class EntitySensorMib(mibretriever.MibRetriever):
    method __init__ (line 72) | def __init__(self, agent_proxy):
    method _get_sensors (line 77) | def _get_sensors(self):
    method get_all_sensors (line 92) | def get_all_sensors(self):

FILE: python/nav/mibs/esswitch_mib.py
  class ESSwitchMib (line 26) | class ESSwitchMib(mibretriever.MibRetriever):
    method get_bandwidth (line 33) | def get_bandwidth(self):
    method get_bandwidth_peak (line 38) | def get_bandwidth_peak(self):

FILE: python/nav/mibs/etherlike_mib.py
  class EtherLikeMib (line 24) | class EtherLikeMib(mibretriever.MibRetriever):
    method get_duplex (line 30) | def get_duplex(self):

FILE: python/nav/mibs/extreme_vlan_mib.py
  class ExtremeVlanMib (line 24) | class ExtremeVlanMib(mibretriever.MibRetriever):
    method get_vlan_ports (line 29) | def get_vlan_ports(self):
    method get_ifindex_vlan_map (line 41) | def get_ifindex_vlan_map(self):
  function _strip_slot_numbers_from_index (line 53) | def _strip_slot_numbers_from_index(table):
  function _convert_columns_to_portlists (line 57) | def _convert_columns_to_portlists(table):

FILE: python/nav/mibs/geist_mibv3.py
  class GeistMibV3 (line 31) | class GeistMibV3(ItWatchDogsMibV3):

FILE: python/nav/mibs/geist_mibv4.py
  class GeistMibV4 (line 36) | class GeistMibV4(ItWatchDogsMibV4):

FILE: python/nav/mibs/hp_httpmanageable_mib.py
  class HPHTTPManageableMib (line 21) | class HPHTTPManageableMib(MibRetriever):
    method get_serial_number (line 27) | def get_serial_number(self):

FILE: python/nav/mibs/hpicf_fan_mib.py
  class HpIcfFanMib (line 43) | class HpIcfFanMib(mibretriever.MibRetriever):
    method __init__ (line 48) | def __init__(self, agent_proxy):
    method _get_fan_status_table (line 54) | def _get_fan_status_table(self):
    method _translate_fan_status (line 64) | def _translate_fan_status(psu_status):
    method get_fan_status (line 73) | def get_fan_status(self, internal_id):
    method get_fans (line 86) | def get_fans(self):

FILE: python/nav/mibs/hpicf_powersupply_mib.py
  class HpIcfPowerSupplyMib (line 40) | class HpIcfPowerSupplyMib(mibretriever.MibRetriever):
    method __init__ (line 45) | def __init__(self, agent_proxy):
    method _get_psu_status_table (line 51) | def _get_psu_status_table(self):
    method _translate_psu_status (line 61) | def _translate_psu_status(psu_status):
    method get_power_supply_status (line 70) | def get_power_supply_status(self, internal_id):
    method get_power_supplies (line 83) | def get_power_supplies(self):
  function _psu_index_from_internal_id (line 107) | def _psu_index_from_internal_id(internal_id):

FILE: python/nav/mibs/ibm_pdu_mib.py
  class IbmPduMib (line 35) | class IbmPduMib(MibRetriever):
    method get_all_sensors (line 43) | def get_all_sensors(self):
    method _get_phase_sensors (line 52) | def _get_phase_sensors(self):
    method _get_outlet_sensors (line 84) | def _get_outlet_sensors(self):
    method _outlet_row_to_sensors (line 104) | def _outlet_row_to_sensors(self, index, row):

FILE: python/nav/mibs/ieee8023_lag_mib.py
  class IEEE8023LagMib (line 24) | class IEEE8023LagMib(mibretriever.MibRetriever):
    method retrieve_selected_aggregators (line 30) | def retrieve_selected_aggregators(self):
    method retrieve_attached_aggregators (line 45) | def retrieve_attached_aggregators(self):
    method retrieve_aggregations_by_operational_key (line 60) | def retrieve_aggregations_by_operational_key(self):

FILE: python/nav/mibs/if_mib.py
  class IfMib (line 25) | class IfMib(mibretriever.MibRetriever):
    method get_if_table_last_change (line 28) | def get_if_table_last_change(self):
    method get_if_table (line 33) | def get_if_table(self):
    method get_ifnames (line 41) | def get_ifnames(self):
    method get_ifaliases (line 56) | def get_ifaliases(self):
    method get_ifindexes (line 66) | def get_ifindexes(self):
    method get_admin_status (line 72) | def get_admin_status(self):
    method get_stack_status (line 87) | def get_stack_status(self):

FILE: python/nav/mibs/ip_forward_mib.py
  class IpForwardMib (line 56) | class IpForwardMib(mibretriever.MibRetriever):
    method get_routes (line 62) | def get_routes(self, protocols=None):
    method get_decoded_routes (line 86) | def get_decoded_routes(self, protocols=None):
    method get_cidr_route_column (line 120) | def get_cidr_route_column(self, column, index):
  function decode_route_entry (line 127) | def decode_route_entry(index):

FILE: python/nav/mibs/ip_mib.py
  class IpMib (line 32) | class IpMib(mibretriever.MibRetriever):
    method inetaddress_to_ip (line 38) | def inetaddress_to_ip(oid):
    method _chop_index (line 91) | def _chop_index(cls, index, entry):
    method address_index_to_ip (line 118) | def address_index_to_ip(cls, index):
    method prefix_index_to_ip (line 126) | def prefix_index_to_ip(cls, index, prefix_entry='ipAddressPrefixEntry'):
    method _get_ifindex_ip_mac_mappings (line 144) | def _get_ifindex_ip_mac_mappings(self, column='ipNetToPhysicalPhysAddr...
    method _get_ifindex_ipv4_mac_mappings (line 166) | def _get_ifindex_ipv4_mac_mappings(self, column='ipNetToMediaPhysAddre...
    method _binary_mac_to_hex (line 199) | def _binary_mac_to_hex(mac):
    method get_ifindex_ip_mac_mappings (line 204) | def get_ifindex_ip_mac_mappings(self):
    method _get_interface_ipv4_addresses (line 224) | def _get_interface_ipv4_addresses(
    method _get_interface_addresses (line 272) | def _get_interface_addresses(
    method get_interface_addresses (line 316) | def get_interface_addresses(self):
    method get_ipv6_octet_counters (line 334) | def get_ipv6_octet_counters(self):
  class MultiIpMib (line 349) | class MultiIpMib(IpMib, mibretriever.MultiMibMixIn):
    method get_ifindex_ip_mac_mappings (line 354) | def get_ifindex_ip_mac_mappings(self):
  function _set_integrator (line 359) | def _set_integrator(results):
  class IndexToIpException (line 363) | class IndexToIpException(Exception):

FILE: python/nav/mibs/ipv6_mib.py
  class Ipv6Mib (line 31) | class Ipv6Mib(mibretriever.MibRetriever):
    method ipv6address_to_ip (line 37) | def ipv6address_to_ip(oid):
    method get_ifindex_ip_mac_mappings (line 65) | def get_ifindex_ip_mac_mappings(self):
    method get_interface_addresses (line 94) | def get_interface_addresses(self):

FILE: python/nav/mibs/itw_mib.py
  class BaseITWatchDogsMib (line 330) | class BaseITWatchDogsMib(mibretriever.MibRetriever):
    method _get_oid_for_sensor (line 331) | def _get_oid_for_sensor(self, sensor_name):
    method _make_result_dict (line 343) | def _make_result_dict(
    method _handle_sensor_group (line 361) | def _handle_sensor_group(self, sensor_group, table_data):
    method get_all_sensors (line 390) | def get_all_sensors(self):
  function get_range (line 444) | def get_range(mib, node):
  function convert_units (line 456) | def convert_units(mib, node):
  class ItWatchDogsMib (line 469) | class ItWatchDogsMib(BaseITWatchDogsMib):

FILE: python/nav/mibs/itw_mibv3.py
  class ItWatchDogsMibV3 (line 390) | class ItWatchDogsMibV3(BaseITWatchDogsMib):
    method _get_power_dms_params (line 396) | def _get_power_dms_params(self, power_dms):
    method _get_io_expanders_params (line 428) | def _get_io_expanders_params(self, io_expanders):
    method get_all_sensors (line 506) | def get_all_sensors(self):

FILE: python/nav/mibs/itw_mibv4.py
  class ItWatchDogsMibV4 (line 139) | class ItWatchDogsMibV4(BaseITWatchDogsMib):

FILE: python/nav/mibs/juniper_alarm_mib.py
  class JuniperAlarmMib (line 24) | class JuniperAlarmMib(MibRetriever):
    method get_yellow_alarm_count (line 29) | def get_yellow_alarm_count(self):
    method get_red_alarm_count (line 33) | def get_red_alarm_count(self):
    method _get_alarm_count (line 38) | def _get_alarm_count(self, oid):

FILE: python/nav/mibs/juniper_dom_mib.py
  class JuniperDomMib (line 52) | class JuniperDomMib(MibRetriever):
    method get_all_sensors (line 58) | def get_all_sensors(self):
    method handle_column (line 68) | def handle_column(self, column, config):

FILE: python/nav/mibs/juniper_mib.py
  class JuniperMib (line 62) | class JuniperMib(MibRetriever):
    method get_serial_number (line 68) | def get_serial_number(self):
    method get_cpu_loadavg (line 77) | def get_cpu_loadavg(self):
    method get_cpu_utilization (line 105) | def get_cpu_utilization(self):
    method get_power_supplies (line 125) | def get_power_supplies(self):
    method get_fans (line 129) | def get_fans(self):
    method _get_fru_by_type (line 134) | def _get_fru_by_type(self, fru_type):
    method get_fru_status (line 154) | def get_fru_status(self, internal_id):
    method get_all_sensors (line 166) | def get_all_sensors(self):
    method _get_sensors (line 175) | def _get_sensors(self, config):
    method _row_to_sensor (line 195) | def _row_to_sensor(self, config, index, row):
    method _translate_fru_status_value (line 224) | def _translate_fru_status_value(oper_status):
    method get_memory_usage (line 233) | def get_memory_usage(self):
  function _fru_row_to_powersupply_or_fan (line 253) | def _fru_row_to_powersupply_or_fan(fru_row):

FILE: python/nav/mibs/lldp_mib.py
  class LLDPMib (line 31) | class LLDPMib(mibretriever.MibRetriever):
    method get_remote_last_change (line 36) | def get_remote_last_change(self):
    method get_remote_table (line 44) | def get_remote_table(self):
    method _retrieve_rem_table (line 55) | def _retrieve_rem_table(self):
    method _remote_entry_to_neighbor (line 68) | def _remote_entry_to_neighbor(row):
    method _translate_port_numbers (line 81) | def _translate_port_numbers(self, remote_table):
    method _is_remote_table_index_broken (line 148) | def _is_remote_table_index_broken(remote_table):
    method _retrieve_local_ports (line 153) | def _retrieve_local_ports(self):
    method _make_interface_lookup_dict (line 171) | def _make_interface_lookup_dict(self):
  class IdType (line 191) | class IdType(str):
    method __repr__ (line 192) | def __repr__(self):
    method isdigit (line 195) | def isdigit(self):
  class BinaryOrString (line 204) | class BinaryOrString(IdType):
    method __new__ (line 205) | def __new__(cls, *args, **_kwargs):
  class MacAddress (line 217) | class MacAddress(IdType):
    method __new__ (line 218) | def __new__(cls, *args, **_kwargs):
  class NetworkAddress (line 230) | class NetworkAddress(IdType):
    method __new__ (line 240) | def __new__(cls, *args, **_kwargs):
  class IdSubtypes (line 256) | class IdSubtypes(object):
    method get (line 258) | def get(cls, typename, value):
    class chassisComponent (line 265) | class chassisComponent(IdType):
    class interfaceAlias (line 268) | class interfaceAlias(BinaryOrString):
    class portComponent (line 271) | class portComponent(IdType):
    class macAddress (line 274) | class macAddress(MacAddress):
    class networkAddress (line 277) | class networkAddress(NetworkAddress):
    class interfaceName (line 280) | class interfaceName(BinaryOrString):
    class local (line 283) | class local(BinaryOrString):
    class agentCircuitId (line 286) | class agentCircuitId(IdType):

FILE: python/nav/mibs/mg_snmp_ups_mib.py
  class MgSnmpUpsMib (line 23) | class MgSnmpUpsMib(UpsMib):

FILE: python/nav/mibs/mibretriever.py
  class MibRetrieverError (line 55) | class MibRetrieverError(GeneralException):
  class MIBObject (line 61) | class MIBObject(object):
    method __init__ (line 80) | def __init__(self, mib, name):
    method _build_type (line 95) | def _build_type(self):
    method to_python (line 120) | def to_python(self, value):
    method __lt__ (line 132) | def __lt__(self, other):
    method __eq__ (line 139) | def __eq__(self, other):
    method __repr__ (line 146) | def __repr__(self):
  class MibTableDescriptor (line 150) | class MibTableDescriptor(object):
    method __init__ (line 153) | def __init__(self, table_object, row_object, column_objects):
    method __repr__ (line 165) | def __repr__(self):
    method build (line 174) | def build(cls, mib, table_name):
    method build_all (line 208) | def build_all(cls, mib):
  class MibTableResultRow (line 219) | class MibTableResultRow(dict):
    method __init__ (line 226) | def __init__(self, index, columns=None):
  class MibRetrieverMaker (line 240) | class MibRetrieverMaker(type):
    method __init__ (line 256) | def __init__(cls, name, bases, dct):
    method __make_scalar_getters (line 284) | def __make_scalar_getters(cls):
    method __scalar_getter (line 296) | def __scalar_getter(node_name):
    method __make_table_getters (line 322) | def __make_table_getters(cls):
    method __table_getter (line 330) | def __table_getter(node_name):
    method __make_node_objects (line 344) | def __make_node_objects(cls):
    method __prepopulate_text_columns (line 351) | def __prepopulate_text_columns(cls):
  class MibRetriever (line 365) | class MibRetriever(object, metaclass=MibRetrieverMaker):
    method __init__ (line 372) | def __init__(self, agent_proxy):
    method get_module_name (line 379) | def get_module_name(self):
    method get_next (line 384) | def get_next(self, object_name, translate_result=False):
    method retrieve_column (line 396) | def retrieve_column(self, column_name):
    method retrieve_columns (line 452) | def retrieve_columns(self, column_names) -> Awaitable:
    method retrieve_table (line 494) | def retrieve_table(self, table_name):
    method translate_result (line 551) | def translate_result(cls, result):
    method retrieve_column_by_index (line 568) | def retrieve_column_by_index(self, column, index):
  class MultiMibMixIn (line 581) | class MultiMibMixIn(MibRetriever):
    method __init__ (line 594) | def __init__(self, agent_proxy, instances: list[LogicalMibInstance]):
    method _multiquery (line 612) | def _multiquery(self, method, *args, **kwargs):
    method __timeout_handler (line 658) | def __timeout_handler(self, failure, descr):
    method _dictintegrator (line 674) | def _dictintegrator(results):
    method _make_agents (line 689) | def _make_agents(self):
    method _prune_instances (line 701) | def _prune_instances(self) -> Iterator[LogicalMibInstance]:
    method _get_alternate_agent (line 716) | def _get_alternate_agent(self, instance: LogicalMibInstance):
  function is_text_object (line 744) | def is_text_object(mib_dict, obj_name):

FILE: python/nav/mibs/netswitch_mib.py
  class NetswitchMib (line 34) | class NetswitchMib(mibretriever.MibRetriever):
    method get_memory_usage (line 38) | def get_memory_usage(self):

FILE: python/nav/mibs/old_cisco_cpu_mib.py
  class OldCiscoCpuMib (line 21) | class OldCiscoCpuMib(mibretriever.MibRetriever):
    method get_cpu_loadavg (line 25) | def get_cpu_loadavg(self):
    method get_cpu_utilization (line 32) | def get_cpu_utilization(self):

FILE: python/nav/mibs/pdu2_mib.py
  class PDU2Mib (line 63) | class PDU2Mib(MibRetriever):
    method get_all_sensors (line 69) | def get_all_sensors(self):
    method retrieve_sensor_columns (line 78) | def retrieve_sensor_columns(self, table):
    method get_sensor (line 82) | def get_sensor(self, table, index, row, name, description, internal_na...
    method get_inlet_sensors (line 110) | def get_inlet_sensors(self):
    method get_inlet_pole_sensors (line 132) | def get_inlet_pole_sensors(self, inlets):
    method get_over_current_protection_sensors (line 159) | def get_over_current_protection_sensors(self):

FILE: python/nav/mibs/power_ethernet_mib.py
  class PowerEthernetMib (line 21) | class PowerEthernetMib(mibretriever.MibRetriever):
    method get_groups_table (line 25) | def get_groups_table(self):
    method get_ports_table (line 33) | def get_ports_table(self):

FILE: python/nav/mibs/powernet_mib.py
  class PowerNetMib (line 42) | class PowerNetMib(UpsMib):
    method get_all_sensors (line 83) | def get_all_sensors(self):
    method _get_pdu_bank_load_sensors (line 91) | def _get_pdu_bank_load_sensors(self):
    method get_serial_number (line 130) | def get_serial_number(self):

FILE: python/nav/mibs/pwt_3phase_mibv1.py
  function for_table (line 40) | def for_table(table_name):
  class Pwt3PhaseV1Mib (line 54) | class Pwt3PhaseV1Mib(mibretriever.MibRetriever):
    method _get_oid_for_sensor (line 59) | def _get_oid_for_sensor(self, sensor_name):
    method _make_result_dict (line 71) | def _make_result_dict(
    method _get_internal_sensors_params (line 99) | def _get_internal_sensors_params(self, internal_sensors):
    method get_all_sensors (line 224) | def get_all_sensors(self):

FILE: python/nav/mibs/qbridge_mib.py
  class QBridgeMib (line 28) | class QBridgeMib(mibretriever.MibRetriever):
    method get_baseport_pvid_map (line 33) | def get_baseport_pvid_map(self):
    method get_vlan_current_egress_ports (line 43) | def get_vlan_current_egress_ports(self):
    method get_vlan_current_untagged_ports (line 55) | def get_vlan_current_untagged_ports(self):
    method get_vlan_static_egress_ports (line 67) | def get_vlan_static_egress_ports(self):
    method get_vlan_static_untagged_ports (line 79) | def get_vlan_static_untagged_ports(self):
    method get_forwarding_database (line 92) | def get_forwarding_database(self):
    method get_vlan_static_names (line 111) | def get_vlan_static_names(self):
  function filter_newest_current_entries (line 122) | def filter_newest_current_entries(dot1qvlancurrenttable):
  function convert_data_to_portlist (line 134) | def convert_data_to_portlist(result, juniper_hack):
  function portlist_spec (line 138) | def portlist_spec(data):
  function portlist_juniper (line 145) | def portlist_juniper(data):
  function portlist (line 162) | def portlist(data, juniper_hack=False):

FILE: python/nav/mibs/rittal_cmc_iii.py
  class RittalCMCIIIMib (line 67) | class RittalCMCIIIMib(MibRetriever):
    method get_module_name (line 72) | def get_module_name(self):
    method get_all_sensors (line 77) | def get_all_sensors(self):
    method get_devices (line 84) | def get_devices(self):
    method get_sensors (line 92) | def get_sensors(self, devices):

FILE: python/nav/mibs/snmpv2_mib.py
  class Snmpv2Mib (line 28) | class Snmpv2Mib(mibretriever.MibRetriever):
    method _get_sysvariable (line 34) | def _get_sysvariable(self, var):
    method get_sysObjectID (line 54) | def get_sysObjectID(self):
    method get_sysDescr (line 58) | def get_sysDescr(self):
    method get_sysUpTime (line 64) | def get_sysUpTime(self):
    method get_timestamp_and_uptime (line 69) | def get_timestamp_and_uptime(self):
    method get_uptime_deviation (line 81) | def get_uptime_deviation(first_uptime, second_uptime):

FILE: python/nav/mibs/spagent_mib.py
  class SPAgentMib (line 99) | class SPAgentMib(MibRetriever):
    method get_all_sensors (line 105) | def get_all_sensors(self):
    method _get_sensors (line 118) | def _get_sensors(self, config):
    method _row_to_sensor (line 141) | def _row_to_sensor(self, config, index, row):

FILE: python/nav/mibs/statistics_mib.py
  class StatisticsMib (line 29) | class StatisticsMib(mibretriever.MibRetriever):
    method get_cpu_utilization (line 35) | def get_cpu_utilization(self):
    method get_cpu_loadavg (line 41) | def get_cpu_loadavg(self):
    method get_ipv4_multicast_groups_per_port (line 45) | def get_ipv4_multicast_groups_per_port(self):

FILE: python/nav/mibs/types.py
  class LogicalMibInstance (line 23) | class LogicalMibInstance:

FILE: python/nav/mibs/ups_mib.py
  class UpsMib (line 27) | class UpsMib(mibretriever.MibRetriever):
    method _get_named_column (line 104) | def _get_named_column(self, column):
    method get_all_sensors (line 111) | def get_all_sensors(self):
    method _get_sensors (line 121) | def _get_sensors(self, object_name, sensor_params):

FILE: python/nav/mibs/vrrp_mib.py
  class VRRPMib (line 24) | class VRRPMib(mibretriever.MibRetriever):
    method get_virtual_addresses (line 30) | def get_virtual_addresses(self):

FILE: python/nav/mibs/wlsx_systemext_mib.py
  class WLSXSystemextMib (line 21) | class WLSXSystemextMib(MibRetriever):
    method get_serial_number (line 27) | def get_serial_number(self):

FILE: python/nav/mibs/xups_mib.py
  class XupsMib (line 23) | class XupsMib(UpsMib):

FILE: python/nav/models/api.py
  class APIToken (line 30) | class APIToken(models.Model):
    method __str__ (line 62) | def __str__(self):
    method is_expired (line 66) | def is_expired(self):
    method get_absolute_url (line 70) | def get_absolute_url(self):
    class Meta (line 74) | class Meta(object):
  class JWTRefreshToken (line 78) | class JWTRefreshToken(models.Model):
    method __str__ (line 105) | def __str__(self):
    method is_active (line 108) | def is_active(self) -> bool:
    method get_absolute_url (line 115) | def get_absolute_url(self):
    class Meta (line 119) | class Meta(object):

FILE: python/nav/models/apps.py
  class NavModelsConfig (line 4) | class NavModelsConfig(AppConfig):

FILE: python/nav/models/arnold.py
  class Identity (line 36) | class Identity(models.Model):
    method __str__ (line 93) | def __str__(self):
    class Meta (line 100) | class Meta(object):
  class Event (line 108) | class Event(models.Model):
    method __str__ (line 130) | def __str__(self):
    class Meta (line 133) | class Meta(object):
  class Justification (line 138) | class Justification(models.Model):
    method __str__ (line 145) | def __str__(self):
    class Meta (line 148) | class Meta(object):
  class QuarantineVlan (line 153) | class QuarantineVlan(models.Model):
    method __str__ (line 160) | def __str__(self):
    class Meta (line 163) | class Meta(object):
  class DetentionProfile (line 168) | class DetentionProfile(models.Model):
    method __str__ (line 202) | def __str__(self):
    class Meta (line 205) | class Meta(object):

FILE: python/nav/models/cabling.py
  class Cabling (line 26) | class Cabling(models.Model):
    class Meta (line 43) | class Meta(object):
    method __str__ (line 47) | def __str__(self):
    method verbose (line 50) | def verbose(self):
  class Patch (line 68) | class Patch(models.Model):
    class Meta (line 87) | class Meta(object):
    method __str__ (line 91) | def __str__(self):

FILE: python/nav/models/event.py
  class Subsystem (line 43) | class Subsystem(models.Model):
    class Meta (line 49) | class Meta(object):
    method __str__ (line 52) | def __str__(self):
  class VariableMapBase (line 60) | class VariableMapBase(object):
    method __init__ (line 69) | def __init__(self):
    method __get__ (line 72) | def __get__(self, obj, obj_type=None):
    method __set__ (line 85) | def __set__(self, obj, vardict):
    method _as_dict (line 101) | def _as_dict(self, obj):
    method _delete_missing_variables (line 104) | def _delete_missing_variables(self, vardict, variables):
    method _update_variables (line 107) | def _update_variables(self, obj, vardict):
  class VariableMap (line 111) | class VariableMap(VariableMapBase):
    method _as_dict (line 112) | def _as_dict(self, obj):
    method _delete_missing_variables (line 116) | def _delete_missing_variables(self, vardict, variables):
    method _update_variables (line 120) | def _update_variables(self, obj, vardict):
  class StateVariableMap (line 135) | class StateVariableMap(VariableMapBase):
    method _as_dict (line 144) | def _as_dict(self, obj):
    method _delete_missing_variables (line 151) | def _delete_missing_variables(self, vardict, variables):
    method _update_variables (line 158) | def _update_variables(self, obj, vardict):
  class UnknownEventSubject (line 175) | class UnknownEventSubject(object):
    method __init__ (line 178) | def __init__(self, alert):
    method get_absolute_url (line 183) | def get_absolute_url(self):
    method __str__ (line 188) | def __str__(self):
    method _get_description_from_message (line 196) | def _get_description_from_message(self):
  class EventMixIn (line 205) | class EventMixIn(object):
    method get_key (line 208) | def get_key(self):
    method get_subject (line 233) | def get_subject(self):
    method _fetch_subject (line 251) | def _fetch_subject(self):
  class ThresholdEvent (line 289) | class ThresholdEvent(object):
    method __init__ (line 295) | def __init__(self, event):
    method __str__ (line 318) | def __str__(self):
    method get_absolute_url (line 330) | def get_absolute_url(self):
  class EventQueue (line 341) | class EventQueue(models.Model, EventMixIn):
    class Meta (line 398) | class Meta(object):
    method __repr__ (line 401) | def __repr__(self):
    method __str__ (line 416) | def __str__(self):
    method save (line 425) | def save(self, *args, **kwargs):
  class EventType (line 433) | class EventType(models.Model):
    class Meta (line 447) | class Meta(object):
    method __str__ (line 450) | def __str__(self):
  class EventQueueVar (line 454) | class EventQueueVar(models.Model):
    class Meta (line 467) | class Meta(object):
    method __str__ (line 471) | def __str__(self):
  class AlertQueue (line 479) | class AlertQueue(models.Model, EventMixIn):
    class Meta (line 548) | class Meta(object):
    method __str__ (line 551) | def __str__(self):
    method save (line 559) | def save(self, *args, **kwargs):
  class AlertType (line 567) | class AlertType(models.Model):
    class Meta (line 581) | class Meta(object):
    method __str__ (line 585) | def __str__(self):
  class AlertQueueMessage (line 589) | class AlertQueueMessage(models.Model):
    class Meta (line 606) | class Meta(object):
    method __st
Copy disabled (too large) Download .json
Condensed preview — 2578 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (39,288K chars).
[
  {
    "path": ".codecov.yml",
    "chars": 194,
    "preview": "coverage:\n  range: 57..100\n  round: down\n  precision: 2\n  status:\n    project:\n      default:\n        target: auto\n     "
  },
  {
    "path": ".dockerignore",
    "chars": 374,
    "preview": "# We actually need very little context to build a development image which\n# mounts the source code as a volume, so we ig"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 940,
    "preview": "# Initiate black usage and reformat codebase @lunkwill42 19/03/2021\ne6634e512c8ecf283c85a701366620e724806ab7\n# Re-ran bl"
  },
  {
    "path": ".npmrc",
    "chars": 22,
    "preview": "legacy-peer-deps=true\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 489,
    "preview": "exclude: smidumps/\nrepos:\n-   repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n    -   id"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 242,
    "preview": "version: 2\n\nsphinx:\n    configuration: doc/conf.py\n    builder: html\n\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3."
  },
  {
    "path": ".sonarcloud.properties",
    "chars": 579,
    "preview": "sonar.projectKey=Uninett_nav\nsonar.organization=uninett-1\n\n# This is the name and version displayed in the SonarCloud UI"
  },
  {
    "path": "AUTHORS.rst",
    "chars": 9024,
    "preview": "Network Administration Visualized list of authors\n=================================================\n\nThis file tries to "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 73361,
    "preview": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changel"
  },
  {
    "path": "COPYING",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "Dockerfile",
    "chars": 6117,
    "preview": "# NAV development container. This is NOT SUITABLE for production use of NAV.\n# For more production-oriented containeriza"
  },
  {
    "path": "HACKING",
    "chars": 59,
    "preview": "This document is now maintained as doc/hacking/hacking.rst\n"
  },
  {
    "path": "HISTORY",
    "chars": 200194,
    "preview": "This file is the changelog archive in the old NAV format for versions prior to\nNAV 5.4.0.\n\nVersion 5.3.0\n(released 22 Fe"
  },
  {
    "path": "INSTALL",
    "chars": 76,
    "preview": "For detailed instructions on how to install NAV, see doc/intro/install.rst.\n"
  },
  {
    "path": "Makefile",
    "chars": 1379,
    "preview": ".PHONY: dummy clean distclean testclean docclean doc cssclean sassbuild sasswatch setup-playwright .FORCE\n\ndummy:\n\t@echo"
  },
  {
    "path": "NOTES.rst",
    "chars": 127562,
    "preview": "=================================================\n Network Administration Visualized release notes\n====================="
  },
  {
    "path": "README.rst",
    "chars": 2541,
    "preview": "===================================\n Network Administration Visualized\n===================================\n\n.. image:: h"
  },
  {
    "path": "changelog.d/+replace-use-l10n.changed.md",
    "chars": 143,
    "preview": "Replace deprecated `USE_L10N = False` setting with a custom `FORMAT_MODULE_PATH` to preserve ISO date formatting for Dja"
  },
  {
    "path": "changelog.d/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "changelog.d/2927.added.md",
    "chars": 66,
    "preview": "Add endpoint for getting, creating and deleting maintenance tasks\n"
  },
  {
    "path": "changelog.d/3881.added.md",
    "chars": 47,
    "preview": "Show room aliases in tooltip in IP device info\n"
  },
  {
    "path": "changelog.d/3916.changed.md",
    "chars": 54,
    "preview": "Exclude JavaScript test files from installed package.\n"
  },
  {
    "path": "changelog.d/3954.fixed.md",
    "chars": 84,
    "preview": "Fixed post-login redirect not returning users to the page they originally requested\n"
  },
  {
    "path": "changelog.d/3959.fixed.md",
    "chars": 61,
    "preview": "Fix crash on `/messages/create/` when used with Django 5.0+.\n"
  },
  {
    "path": "changelog.d/3961.changed.md",
    "chars": 191,
    "preview": "Improved the usability of the two-factor authentication pages with status indicators, clearer warnings, guided setup ste"
  },
  {
    "path": "changelog.d/3980.fixed.md",
    "chars": 64,
    "preview": "Fix unclickable edit button for widget titles on the dashboard.\n"
  },
  {
    "path": "checks/check_test_names.py",
    "chars": 6373,
    "preview": "#!/usr/bin/env python3\n\"\"\"Check that new test method names follow the given/when/then/it_should convention.\n\nScans git d"
  },
  {
    "path": "constraints.txt",
    "chars": 57,
    "preview": "snowballstemmer<3.0.0  # incompatible with Sphinx 7.4.7?\n"
  },
  {
    "path": "contrib/patches/cricket-win32-null-bug.patch",
    "chars": 1248,
    "preview": "diff -ur cricket-1.0.3/lib/Common/Map.pm cricket-1.0.3-local/lib/Common/Map.pm\n--- cricket-1.0.3/lib/Common/Map.pm\tThu O"
  },
  {
    "path": "contrib/patches/cricket_zoom_1.5.patch",
    "chars": 3556,
    "preview": "--- grapher.bak\t2007-10-10 13:38:20.000000000 +0200\n+++ grapher.cgi\t2007-10-10 13:46:26.000000000 +0200\n@@ -551,6 +551,1"
  },
  {
    "path": "contrib/patches/nav_cricket-1.0.3_v0.2.ALFA.patch",
    "chars": 7484,
    "preview": "Index: compile\n===================================================================\n--- compile\t(.../vendor/cricket/1.0.3"
  },
  {
    "path": "contrib/patches/net-snmp-memory.patch",
    "chars": 670,
    "preview": "diff -u -r net-snmp-5.0.1/agent/mibgroup/ucd-snmp/memory.c net-snmp-5.0.1-local/agent/mibgroup/ucd-snmp/memory.c\n--- net"
  },
  {
    "path": "contrib/scripts/isc_dhpcd_graphite/README.rst",
    "chars": 1126,
    "preview": "======================================\nUsage and notes for isc_dhcpd_graphite\n======================================\n\nTh"
  },
  {
    "path": "contrib/scripts/isc_dhpcd_graphite/isc_dhpcd_graphite.py",
    "chars": 5866,
    "preview": "#!/usr/bin/env python3\n\"\"\"Send dhcpd statistics generated by dhcpd-pools to graphite\n\nDoes not attempt to reconnect if t"
  },
  {
    "path": "dist.sh",
    "chars": 1162,
    "preview": "#!/bin/sh -e\n\nshow_help() {\n    cat <<EOF\n$0 [-r revision]\n\nSimple shell script to create and sign tarball source distri"
  },
  {
    "path": "doc/_static/custom.css",
    "chars": 1822,
    "preview": "/* Custom css for the Sphinx theme in NAV */\n\na,\na:hover,\na:focus,\na:visited,\n.alert a,\n.alert .alert-link {\n    color: "
  },
  {
    "path": "doc/api/mibretriever.rst",
    "chars": 104,
    "preview": "MIB retrievers\n--------------\n\n.. automodule:: nav.mibs.mibretriever\n   :members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/api/searchproviders.rst",
    "chars": 3111,
    "preview": "-----------------------\nNAVbar search providers\n-----------------------\n\nNAV's search bar (the one seen at the top of ev"
  },
  {
    "path": "doc/api/sensor.rst",
    "chars": 250,
    "preview": "Sensor database model\n---------------------\n.. autoclass:: nav.models.manage.Sensor\n   :members:\n   :show-inheritance:\n\n"
  },
  {
    "path": "doc/conf.py",
    "chars": 8048,
    "preview": "# -*- coding: utf-8 -*-\n#\n# NAV documentation build configuration file, created by\n# sphinx-quickstart on Tue Feb  8 10:"
  },
  {
    "path": "doc/contents.rst",
    "chars": 527,
    "preview": ".. _contents:\n\n==========================\nNAV documentation contents\n==========================\n\n.. toctree::\n    :hidde"
  },
  {
    "path": "doc/exts/alerttypes.py",
    "chars": 1551,
    "preview": "#!/usr/bin/env python3\n#\n# Copyright (C) 2021 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV"
  },
  {
    "path": "doc/exts/alerttypes.rst.j2",
    "chars": 1533,
    "preview": "Event- and alert type hierarchy\n===============================\n\nNAV events and alerts are organized into a type hierarc"
  },
  {
    "path": "doc/exts/xref.py",
    "chars": 1047,
    "preview": "# -*- coding: utf-8 -*-\n\nfrom docutils import nodes\n\nfrom sphinx.util import caption_ref_re\n\n\ndef xref(typ, rawtext, tex"
  },
  {
    "path": "doc/faq/faq.rst",
    "chars": 6733,
    "preview": "===\nFAQ\n===\n\nFrequently Asked Questions for NAV\n\nIs vendor X / device Y supported?\n---------------------------------\n\nNA"
  },
  {
    "path": "doc/faq/graph_gaps.rst",
    "chars": 10427,
    "preview": "===================================\nDebugging \"gaps in graphs\" syndrome\n===================================\n\nThis docume"
  },
  {
    "path": "doc/glossary.rst",
    "chars": 813,
    "preview": ".. _glossary:\n\n========\nGlossary\n========\n\n.. glossary::\n\n    device\n        A physical entity, which in most cases can "
  },
  {
    "path": "doc/hacking/adding-environment-probe-support.rst",
    "chars": 16499,
    "preview": "========================================================\nAdding support for a new environment probe device to NAV\n======"
  },
  {
    "path": "doc/hacking/extending-nav-locally.rst",
    "chars": 1994,
    "preview": "=======================\n Extending NAV locally\n=======================\n\nNAV provides some simple ways to hook into its b"
  },
  {
    "path": "doc/hacking/hacking-with-pycharm.rst",
    "chars": 3243,
    "preview": "====================\nHacking with PyCharm\n====================\n\n`JetBrains PyCharm <http://www.jetbrains.com/pycharm/>`_"
  },
  {
    "path": "doc/hacking/hacking.rst",
    "chars": 24378,
    "preview": "=====================\nHacker's guide to NAV\n=====================\n\nIf you are contributing code to Network Administratio"
  },
  {
    "path": "doc/hacking/index.rst",
    "chars": 368,
    "preview": "=============\n Hacking NAV\n=============\n\n.. toctree::\n   :maxdepth: 1\n\n   hacking\n   hacking-with-pycharm\n   using-devc"
  },
  {
    "path": "doc/hacking/javascript.rst",
    "chars": 9595,
    "preview": "==================\nJavascript hacking\n==================\n\nWhen writing JavaScript code, try to focus on modules, not pag"
  },
  {
    "path": "doc/hacking/release-procedure.rst",
    "chars": 4213,
    "preview": "=========================================\nChecklist for releasing a new NAV version\n===================================="
  },
  {
    "path": "doc/hacking/snmp-tunnels.rst",
    "chars": 5063,
    "preview": "=========================================\nEstablishing SNMP tunnels using socat/SSH\n===================================="
  },
  {
    "path": "doc/hacking/using-devcontainers.rst",
    "chars": 11562,
    "preview": "=======================================\nUsing devcontainers for NAV development\n=======================================\n"
  },
  {
    "path": "doc/hacking/using-docker.rst",
    "chars": 11783,
    "preview": "=====================================\nUsing NAV with Docker for development\n=====================================\n\n.. hi"
  },
  {
    "path": "doc/hacking/web-interface-customization.rst",
    "chars": 6083,
    "preview": "===============================================\n How to customize parts of NAV's web interface\n========================="
  },
  {
    "path": "doc/hacking/writing-a-servicemon-plugin.rst",
    "chars": 10937,
    "preview": "===============================\nWriting a new servicemon plugin\n===============================\n\nThis guide will documen"
  },
  {
    "path": "doc/hg2git/README.rst",
    "chars": 309,
    "preview": "NAV migration from Mercurial to Git\n===================================\n\nNAV migrated from Mercurial to Git as its VCS s"
  },
  {
    "path": "doc/hg2git/hg2gitmapping.txt",
    "chars": 1442249,
    "preview": "# map of Mercurial revision numbers to Git revision numbers\n# format:\n# <hg revision number> <git revision number>\ne3ae4"
  },
  {
    "path": "doc/howto/allauth-and-oidc.rst",
    "chars": 9320,
    "preview": "==============================================================\nAuthenticating with OIDC/OAuth2 by using a local settings"
  },
  {
    "path": "doc/howto/api_parameters.rst",
    "chars": 5503,
    "preview": "==================\nNAV API Parameters\n==================\n\nHere you will find documentation about each endpoint in NAVs A"
  },
  {
    "path": "doc/howto/commandline-utilities.rst",
    "chars": 7921,
    "preview": "======================================\nCommand line utilities provided in NAV\n======================================\n\n.."
  },
  {
    "path": "doc/howto/debugging-topology.rst",
    "chars": 6164,
    "preview": "##########################################\n Troubleshooting topology problems in NAV\n###################################"
  },
  {
    "path": "doc/howto/email.rst",
    "chars": 1657,
    "preview": "-------------------\nRobustifying e-mail\n-------------------\n\nMost e-mail sent is spam, and making sure e-mail reaches it"
  },
  {
    "path": "doc/howto/generic-install-from-source.rst",
    "chars": 8307,
    "preview": "=================================\n Installing NAV from source code\n=================================\n\nThis is a generic "
  },
  {
    "path": "doc/howto/index.rst",
    "chars": 455,
    "preview": "======\nHowtos\n======\n\n.. toctree::\n   :maxdepth: 1\n\n   commandline-utilities\n   generic-install-from-source\n   manual-in"
  },
  {
    "path": "doc/howto/installing-graphite-on-debian.rst",
    "chars": 10570,
    "preview": "==============================================\nInstalling Graphite for use with NAV on Debian\n=========================="
  },
  {
    "path": "doc/howto/integrating-graphite-with-nav.rst",
    "chars": 3658,
    "preview": ".. _integrating-graphite-with-nav:\n\nIntegrating Graphite with NAV\n-----------------------------\n\n.. highlight:: ini\n\nNAV"
  },
  {
    "path": "doc/howto/manual-install-on-debian.rst",
    "chars": 6362,
    "preview": "===============================\n Install from source on Debian\n===============================\n\n.. highlight:: sh\n\nThis "
  },
  {
    "path": "doc/howto/migrate-data.rst",
    "chars": 9301,
    "preview": "#####################################################\n Migrating data from one NAV installation to another\n#############"
  },
  {
    "path": "doc/howto/migrate-dhcpstats.rst",
    "chars": 3334,
    "preview": "=================================================================\nMigrating DHCP stats collected with NAV 5.14.x through"
  },
  {
    "path": "doc/howto/migrate-rrd-to-graphite.rst",
    "chars": 9852,
    "preview": "######################################################\n Migrating RRD data to Graphite (from NAV 3 to NAV 4)\n###########"
  },
  {
    "path": "doc/howto/mod_auth_mellon_feide.rst",
    "chars": 6602,
    "preview": "================================================================================================================\nAuthent"
  },
  {
    "path": "doc/howto/mod_auth_openidc_feide.rst",
    "chars": 5523,
    "preview": "===================================================================================================================\nAuth"
  },
  {
    "path": "doc/howto/securing-nav-in-production.rst",
    "chars": 942,
    "preview": "==========================\nSecuring NAV in production\n==========================\n\nOverview\n========\n\nThe default configu"
  },
  {
    "path": "doc/howto/setting-up-logging.rst",
    "chars": 10357,
    "preview": "===============================\nControlling log output from NAV\n===============================\n\nOverview\n========\n\nAll "
  },
  {
    "path": "doc/howto/using_the_api.rst",
    "chars": 9263,
    "preview": "===========\nThe NAV API\n===========\n\nAbout\n=====\n\nThe NAV API gives access to NAV's data without needing to connect to t"
  },
  {
    "path": "doc/index.rst",
    "chars": 2005,
    "preview": ".. NAV documentation master file, created by\n   sphinx-quickstart on Tue Feb  8 10:54:59 2011.\n   You can adapt this fil"
  },
  {
    "path": "doc/intro/getting-organized.rst",
    "chars": 5190,
    "preview": "===================\n Getting organized\n===================\n\nNAV offers several ways to organize your seed data and colle"
  },
  {
    "path": "doc/intro/getting-started.rst",
    "chars": 11554,
    "preview": "==========================\n Getting started with NAV\n==========================\n\nThis tutorial will show you how to star"
  },
  {
    "path": "doc/intro/install.rst",
    "chars": 4018,
    "preview": "================\n Installing NAV\n================\n\n.. highlight:: sh\n\nThere are two main options for installing NAV: Eit"
  },
  {
    "path": "doc/msg_and_maint_db.dia",
    "chars": 44519,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dia:diagram xmlns:dia=\"http://www.lysator.liu.se/~alla/dia/\">\n  <dia:diagramdata"
  },
  {
    "path": "doc/overview.rst",
    "chars": 2296,
    "preview": "==========\n Overview\n==========\n\nWhat it is\n==========\n\nNetwork Administration Visualized is an advanced software suite "
  },
  {
    "path": "doc/reference/alerttypes.rst",
    "chars": 13260,
    "preview": "Event- and alert type hierarchy\n===============================\n\nNAV events and alerts are organized into a type hierarc"
  },
  {
    "path": "doc/reference/arnold.rst",
    "chars": 7959,
    "preview": "======\nArnold\n======\n\nIntroduction\n============\n\nArnold is a port-blocker and vlan changer, and was originally made to b"
  },
  {
    "path": "doc/reference/authentication.rst",
    "chars": 478,
    "preview": "Authentication\n==============\n\nBy default, users and passwords are created and stored locally on the NAV\ninstance. It is"
  },
  {
    "path": "doc/reference/backend-processes.rst",
    "chars": 13495,
    "preview": "==========================\n Backend processes in NAV\n==========================\n\nNAV has a number of back-end processes."
  },
  {
    "path": "doc/reference/cabling_and_patch.rst",
    "chars": 1853,
    "preview": "=================\nCabling and Patch\n=================\n\nThe cabling and patch registry in NAV enables you to document you"
  },
  {
    "path": "doc/reference/dhcpstats.rst",
    "chars": 20401,
    "preview": "==========\nDHCP Stats\n==========\n\n\nIntroduction\n============\n\n\nWhat DHCP servers are supported?\n------------------------"
  },
  {
    "path": "doc/reference/event-templates.rst",
    "chars": 2364,
    "preview": "===============\nEvent Templates\n===============\n\nEvent Templates are introduced to be able to display more detailed info"
  },
  {
    "path": "doc/reference/eventengine.rst",
    "chars": 13606,
    "preview": "============\nEvent Engine\n============\n\nIntroduction\n============\n\nThe :program:`Event Engine` is the backend process us"
  },
  {
    "path": "doc/reference/geomap.rst",
    "chars": 18817,
    "preview": "========\n Geomap\n========\n\nThe Geomap tool is a web app that renders your network topology on a\ngeographical map, provid"
  },
  {
    "path": "doc/reference/index.rst",
    "chars": 579,
    "preview": "====================\n Reference material\n====================\n\nThis section contains reference material for end-users.\n\n"
  },
  {
    "path": "doc/reference/ipam.rst",
    "chars": 2954,
    "preview": "============================\nIPAM - IP Address Management\n============================\n\nIntroduction\n============\n\nIPAM "
  },
  {
    "path": "doc/reference/ipdevpoll.rst",
    "chars": 5787,
    "preview": "=========\nipdevpoll\n=========\n\nipdevpoll is the main SNMP collection engine of NAV. Its work is divided into\njobs, which"
  },
  {
    "path": "doc/reference/jwt.rst",
    "chars": 3263,
    "preview": ".. _jwt-configuration:\n\nConfiguring JWT authentication\n-----------------------------\n\nThe NAV API supports authenticatio"
  },
  {
    "path": "doc/reference/ldap.rst",
    "chars": 8357,
    "preview": "=======================================\nConfiguring NAV for LDAP authentication\n=======================================\n"
  },
  {
    "path": "doc/reference/mailin.rst",
    "chars": 2945,
    "preview": "========\n MailIn\n========\n\nMailIn provides a simple engine for transforming e-mail alerts from 3rd party\nsoftware into N"
  },
  {
    "path": "doc/reference/management-profiles.rst",
    "chars": 6437,
    "preview": "===================\nManagement profiles\n===================\n\nIntroduction\n============\n\nManagement profiles are how to c"
  },
  {
    "path": "doc/reference/mfa.rst",
    "chars": 1083,
    "preview": "===========================\nMulti-factor authentication\n===========================\n\nMulti-factor authentication (aka. 2"
  },
  {
    "path": "doc/reference/models-event.rst",
    "chars": 1176,
    "preview": "Central data models of NAV's event/alert subsystems\n===================================================\n\nEventQueue\n----"
  },
  {
    "path": "doc/reference/models-manage.rst",
    "chars": 756,
    "preview": "Central data models of NAV's management subsystems\n==================================================\n\nNetbox\n------\n.. "
  },
  {
    "path": "doc/reference/navstats.rst",
    "chars": 3712,
    "preview": "========\nnavstats\n========\n\n*navstats* makes it possible to retrieve any data from the database and send it\nto Graphite "
  },
  {
    "path": "doc/reference/portadmin.rst",
    "chars": 9325,
    "preview": "=========\nPortAdmin\n=========\n\n\nIntroduction\n============\n\nPortAdmin is a tool for simple switch port configuration via "
  },
  {
    "path": "doc/reference/radius-install.rst",
    "chars": 12403,
    "preview": "===================================\nSetting up FreeRADIUS to log to NAV\n===================================\n\nThe module "
  },
  {
    "path": "doc/reference/radius.rst",
    "chars": 8133,
    "preview": "========\n Radius\n========\n\n:Authors: Roger Kristiansen <roger.kristiansen@gmail.com>,\n          Kai Bjørnenak <kai.bjorn"
  },
  {
    "path": "doc/reference/remote_user.rst",
    "chars": 3282,
    "preview": "=========================================\nExternal web authentication (REMOTE_USER)\n===================================="
  },
  {
    "path": "doc/reference/smsd.rst",
    "chars": 4089,
    "preview": "======\n smsd\n======\n\nThe SMS daemon takes care of sending alerts queued for SMS dispatch.\n\nThe daemon will regularly che"
  },
  {
    "path": "doc/reference/snmptrapd.rst",
    "chars": 3816,
    "preview": "===========\n snmptrapd\n===========\n\nWhat is the SNMP trap daemon?\n=============================\n\n:program:`snmptrapd` (a"
  },
  {
    "path": "doc/reference/social-account.rst",
    "chars": 6900,
    "preview": "==========================================\nExternal web authentication (OAuth2, OIDC)\n=================================="
  },
  {
    "path": "doc/release-notes.rst",
    "chars": 26,
    "preview": ".. include:: ../NOTES.rst\n"
  },
  {
    "path": "doc/requirements.txt",
    "chars": 106,
    "preview": "-r ../requirements/django42.txt\n-r ../requirements/base.txt\n-c ../constraints.txt\nsphinx_rtd_theme>=2.0.0\n"
  },
  {
    "path": "doc/svn2hg/README",
    "chars": 1200,
    "preview": "NAV migrated from Subversion to Mercurial as its SCM system on 1 April\n2008.  \n\nThis directory contains the file localta"
  },
  {
    "path": "doc/svn2hg/localtags",
    "chars": 200955,
    "preview": "627a3b890d1b076d1c480c3b0a574c37b1445956 svn.1243\ne3ae479f288005c80b337fffabdc8b82919e3785 svn.1\n08c95fbfb7ff79a31adc793"
  },
  {
    "path": "doc/templates/layout.html",
    "chars": 481,
    "preview": "{% extends \"!layout.html\" %}\n{% block mobile_nav %}\n  {%- set _logo_url = logo_url|default(pathto('_static/' + (logo or "
  },
  {
    "path": "docker-compose.snmp.yml",
    "chars": 1995,
    "preview": "# This compose file shows an example of how you can add SNMP proxying\n# or test services to the Docker Compose developme"
  },
  {
    "path": "docker-compose.yml",
    "chars": 3099,
    "preview": "# This sets up a live NAV development environment in Docker containers.  This\n# is NOT SUITABLE for production use of NA"
  },
  {
    "path": "package.json",
    "chars": 1009,
    "preview": "{\n  \"name\": \"NAV frontend\",\n  \"description\": \"Network Administration Visualized frontend\",\n  \"version\": \"5\",\n  \"private\""
  },
  {
    "path": "pyproject.toml",
    "chars": 5766,
    "preview": "[build-system]\nrequires = [\"setuptools>=80.3.1\", \"wheel\", \"setuptools_scm[toml]>=8.3.1\"]\nbuild-backend = \"setuptools.bui"
  },
  {
    "path": "python/nav/Snmp/__init__.py",
    "chars": 2542,
    "preview": "#\n# Copyright (C) 2010, 2013 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visual"
  },
  {
    "path": "python/nav/Snmp/defines.py",
    "chars": 1246,
    "preview": "#\n# Copyright (C) 2023 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/Snmp/errors.py",
    "chars": 754,
    "preview": "from nav.errors import GeneralException\n\n\nclass SnmpError(GeneralException):\n    \"\"\"SNMP Error\"\"\"\n\n\nclass TimeOutExcepti"
  },
  {
    "path": "python/nav/Snmp/profile.py",
    "chars": 2104,
    "preview": "#\n# Copyright (C) 2023 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/Snmp/pynetsnmp.py",
    "chars": 17361,
    "preview": "#\n# Copyright (C) 2013 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visualized ("
  },
  {
    "path": "python/nav/__init__.py",
    "chars": 4408,
    "preview": "#\n# Copyright (C) 2018 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free soft"
  },
  {
    "path": "python/nav/activeipcollector/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "python/nav/activeipcollector/collector.py",
    "chars": 2786,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2012 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV)"
  },
  {
    "path": "python/nav/activeipcollector/manager.py",
    "chars": 2519,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2012 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Admin"
  },
  {
    "path": "python/nav/alertengine/__init__.py",
    "chars": 76,
    "preview": "\"\"\"alertengine\n\nThe alert profile parser and alert dispatching daemon.\n\n\"\"\"\n"
  },
  {
    "path": "python/nav/alertengine/base.py",
    "chars": 21402,
    "preview": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright (C) 2008-2011 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This"
  },
  {
    "path": "python/nav/alertengine/dispatchers/__init__.py",
    "chars": 3995,
    "preview": "#\n# Copyright (C) 2008, 2011 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is fre"
  },
  {
    "path": "python/nav/alertengine/dispatchers/email_dispatcher.py",
    "chars": 2800,
    "preview": "#! /usr/bin/env python\n#\n# Copyright (C) 2008, 2011 Uninett AS\n#\n# This file is part of Network Administration Visualize"
  },
  {
    "path": "python/nav/alertengine/dispatchers/slack_dispatcher.py",
    "chars": 3309,
    "preview": "#\n# Copyright (C) 2015-2020 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visuali"
  },
  {
    "path": "python/nav/alertengine/dispatchers/sms_dispatcher.py",
    "chars": 2799,
    "preview": "#! /usr/bin/env python\n#\n# Copyright (C) 2008, 2011 Uninett AS\n#\n# This file is part of Network Administration Visualize"
  },
  {
    "path": "python/nav/arnold.py",
    "chars": 18680,
    "preview": "#\n# Copyright (C) 2018 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visualized ("
  },
  {
    "path": "python/nav/asyncdns.py",
    "chars": 6528,
    "preview": "#\n# Copyright (C) 2008-2011 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visuali"
  },
  {
    "path": "python/nav/auditlog/__init__.py",
    "chars": 748,
    "preview": "# coding: utf-8\n#\n# Copyright (C) 2017 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administrat"
  },
  {
    "path": "python/nav/auditlog/api.py",
    "chars": 9635,
    "preview": "# Copyright (C) 2017 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visualized (NA"
  },
  {
    "path": "python/nav/auditlog/apps.py",
    "chars": 777,
    "preview": "# Copyright (C) 2017 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free softwa"
  },
  {
    "path": "python/nav/auditlog/models.py",
    "chars": 6581,
    "preview": "# coding: utf-8\n\n# Copyright (C) 2017 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administrati"
  },
  {
    "path": "python/nav/auditlog/urls.py",
    "chars": 976,
    "preview": "# Copyright (C) 2017 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visualized (NA"
  },
  {
    "path": "python/nav/auditlog/utils.py",
    "chars": 2199,
    "preview": "#\n# Copyright (C) 2017 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visualized ("
  },
  {
    "path": "python/nav/auditlog/views.py",
    "chars": 2205,
    "preview": "# coding: utf-8\n\n# Copyright (C) 2017 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# N"
  },
  {
    "path": "python/nav/bin/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "python/nav/bin/alertengine.py",
    "chars": 7956,
    "preview": "#!/usr/bin/env python\n# -*- testargs: --test -*-\n#\n# Copyright (C) 2007, 2008, 2011, 2013, 2017 Uninett AS\n#\n# This file"
  },
  {
    "path": "python/nav/bin/autoenable.py",
    "chars": 2421,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2018 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV)"
  },
  {
    "path": "python/nav/bin/cisco_auth_sessions.py",
    "chars": 9787,
    "preview": "#!/usr/bin/env python\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2025 Sikt\n#\n# This file is part of Network Administration"
  },
  {
    "path": "python/nav/bin/collect_active_ip.py",
    "chars": 2090,
    "preview": "#!/usr/bin/env python\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2012 Uninett AS\n#\n# This file is part of Network Administ"
  },
  {
    "path": "python/nav/bin/dhcpstats.py",
    "chars": 5737,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2025 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# "
  },
  {
    "path": "python/nav/bin/emailreports.py",
    "chars": 1595,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: month -*-\n# Copyright (C) 2016 Uninett AS\n#\n# This file is"
  },
  {
    "path": "python/nav/bin/eventengine.py",
    "chars": 386,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n# -*- testargs: -h -*-\n\"\"\"\nThe NAV eventengine deamon\n\"\"\"\n\n# Assuming a producti"
  },
  {
    "path": "python/nav/bin/ipdevpolld.py",
    "chars": 558,
    "preview": "#!/usr/bin/env python\n# -*- testargs: --list-plugins -*-\n\"\"\"\nThe ipdevpoll deamon\nStart the ipdevpoll daemon\n\"\"\"\n\n# Assu"
  },
  {
    "path": "python/nav/bin/logengine.py",
    "chars": 140,
    "preview": "#!/usr/bin/env python\nimport logging\n\nlogging.raiseExceptions = False\nfrom nav.logengine import main\n\nif __name__ == '__"
  },
  {
    "path": "python/nav/bin/macwatch.py",
    "chars": 7615,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# Copyright (C) 2011, 2018 Uninett AS\n#\n# This file is part of Network Adm"
  },
  {
    "path": "python/nav/bin/mailin.py",
    "chars": 5542,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright (C) 2018 Uninett AS\n#\n# This file is part of Network Adminis"
  },
  {
    "path": "python/nav/bin/maintengine.py",
    "chars": 1706,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2006, 2008, 2011 Uninett AS\n#\n# This file is part of Network Administration Visu"
  },
  {
    "path": "python/nav/bin/navcheckservice.py",
    "chars": 3530,
    "preview": "#!/usr/bin/env python\n# -*- testargs: 127.0.0.1 localhost dummy -*-\n#\n# Copyright (C) 2015 Uninett AS\n#\n# This file is p"
  },
  {
    "path": "python/nav/bin/navclean.py",
    "chars": 8941,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: --arp -*-\n# -*- testargs: --close-arp -*-\n#\n# Copyright (C"
  },
  {
    "path": "python/nav/bin/navdf.py",
    "chars": 1731,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2014, 2016 Uninett AS\n#\n# This file is part of Network Administration Visualized"
  },
  {
    "path": "python/nav/bin/navdump.py",
    "chars": 9505,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2010-2011, 2013-2015, 2017 Uninet"
  },
  {
    "path": "python/nav/bin/naventity.py",
    "chars": 6532,
    "preview": "#!/usr/bin/env python\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2014, 2019 Uninett AS\n#\n# This file is part of Network Ad"
  },
  {
    "path": "python/nav/bin/navmain.py",
    "chars": 9743,
    "preview": "#!/usr/bin/env python\n# -*- testargs: list -*-\n#\n# Copyright (C) 2006, 2011, 2016, 2017 Uninett AS\n#\n# This file is part"
  },
  {
    "path": "python/nav/bin/navoidverify.py",
    "chars": 3945,
    "preview": "#!/usr/bin/env python\n# -*- testargs: .1.3.6.1.2.1.1.2 -*-\n#\n# Copyright (C) 2014 Uninett AS\n# Copyright (C) 2023 Sikt\n#"
  },
  {
    "path": "python/nav/bin/navrefresh.py",
    "chars": 2786,
    "preview": "#!/usr/bin/env python3\n# -*- testargs: -h -*-\n#\n# Copyright 2025 Sikt\n#\n# This file is part of Network Administration Vi"
  },
  {
    "path": "python/nav/bin/navsnmp.py",
    "chars": 3333,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2016 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV)"
  },
  {
    "path": "python/nav/bin/navstats.py",
    "chars": 3395,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2016 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV)"
  },
  {
    "path": "python/nav/bin/navsynctypes.py",
    "chars": 3507,
    "preview": "#!/usr/bin/env python3\n#\n# Copyright (C) 2006, 2010, 2020 Uninett AS\n#\n# This file is part of Network Administration Vis"
  },
  {
    "path": "python/nav/bin/navtopology.py",
    "chars": 172,
    "preview": "#!/usr/bin/env python\nfrom nav.bootstrap import bootstrap_django\n\nbootstrap_django(__file__)\n\nfrom nav.topology.detector"
  },
  {
    "path": "python/nav/bin/navuser.py",
    "chars": 8360,
    "preview": "#!/usr/bin/env python\n# -*- testargs: list -*-\n#\n# Copyright (C) 2016 Uninett AS\n#\n# This file is part of Network Admini"
  },
  {
    "path": "python/nav/bin/netbiostracker.py",
    "chars": 1752,
    "preview": "#!/usr/bin/env python\n#\n# Copyright (C) 2012 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV)"
  },
  {
    "path": "python/nav/bin/pping.py",
    "chars": 9061,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2018 Uninett AS\n# Copyright (C) 2"
  },
  {
    "path": "python/nav/bin/radiusparser.py",
    "chars": 15440,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- notest -*-\n#\n# Copyright (C) 2018 Uninett AS\n#\n# This file is part o"
  },
  {
    "path": "python/nav/bin/servicemon.py",
    "chars": 5872,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2018 Uninett AS\n#\n# This file is "
  },
  {
    "path": "python/nav/bin/smsd.py",
    "chars": 15960,
    "preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# -*- testargs: -c -*-\n#\n# Copyright (C) 2006-2008, 2017 Uninett AS\n#\n# Th"
  },
  {
    "path": "python/nav/bin/snmptrapd.py",
    "chars": 9192,
    "preview": "#!/usr/bin/env python\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2010, 2013, 2017, 2018 Uninett AS\n#\n# This file is part o"
  },
  {
    "path": "python/nav/bin/sortedstats_cacher.py",
    "chars": 1728,
    "preview": "#!/usr/bin/env python3\n# -*- testargs: hour -*-\n\nimport argparse\nimport logging\n\nfrom nav.bootstrap import bootstrap_dja"
  },
  {
    "path": "python/nav/bin/start_arnold.py",
    "chars": 9410,
    "preview": "#!/usr/bin/env python\n# -*- testargs: --list -*-\n#\n# Copyright 2017 (C) Uninett AS\n#\n# This file is part of Network Admi"
  },
  {
    "path": "python/nav/bin/t1000.py",
    "chars": 6163,
    "preview": "#!/usr/bin/env python\n#\n# Copyright 2018 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n"
  },
  {
    "path": "python/nav/bin/thresholdmon.py",
    "chars": 357,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\nThe NAV treshold monitor.\n\"\"\"\n\n# Assuming a production environment, we don'"
  },
  {
    "path": "python/nav/bin/update_ouis.py",
    "chars": 3879,
    "preview": "#!/usr/bin/env python\n# -*- testargs: -h -*-\n#\n# Copyright (C) 2024 Sikt\n#\n# This file is part of Network Administration"
  },
  {
    "path": "python/nav/bitvector.py",
    "chars": 3963,
    "preview": "#\n# Copyright (C) 2007, 2009 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visual"
  },
  {
    "path": "python/nav/bootstrap.py",
    "chars": 1511,
    "preview": "# Copyright (C) 2018 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free softwa"
  },
  {
    "path": "python/nav/buildconf.py",
    "chars": 577,
    "preview": "\"\"\"NAV build configuration variables.\"\"\"\n\nfrom importlib import metadata\nimport os\nimport sysconfig\n\n\ndatadir = os.path."
  },
  {
    "path": "python/nav/bulkimport.py",
    "chars": 15125,
    "preview": "#\n# Copyright (C) 2010, 2011, 2013-2015 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administra"
  },
  {
    "path": "python/nav/bulkparse.py",
    "chars": 11801,
    "preview": "#\n# Copyright (C) 2010-2015 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visuali"
  },
  {
    "path": "python/nav/colors.py",
    "chars": 3054,
    "preview": "#\n# Copyright (C) 2013, 2019 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visual"
  },
  {
    "path": "python/nav/config/__init__.py",
    "chars": 12480,
    "preview": "#\n# Copyright (C) 2008, 2009, 2013, 2017, 2018 Uninett AS\n# Copyright (C) 2022, 2026 Sikt\n#\n# This file is part of Netwo"
  },
  {
    "path": "python/nav/config/toml.py",
    "chars": 3561,
    "preview": "#\n# Copyright (C) 2026 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/daemon.py",
    "chars": 13126,
    "preview": "# Copyright (C) 2006-2008, 2011 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is "
  },
  {
    "path": "python/nav/db/__init__.py",
    "chars": 10552,
    "preview": "#\n# Copyright (C) 2006-2009 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Network Administration Visuali"
  },
  {
    "path": "python/nav/debug.py",
    "chars": 3384,
    "preview": "#\n# Copyright (C) 2011 Uninett AS\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free soft"
  },
  {
    "path": "python/nav/dhcpstats/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "python/nav/dhcpstats/common.py",
    "chars": 15234,
    "preview": "#\n# Copyright (C) 2026 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/dhcpstats/errors.py",
    "chars": 1334,
    "preview": "#\n# Copyright (C) 2025 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/dhcpstats/kea_dhcp.py",
    "chars": 24068,
    "preview": "#\n# Copyright (C) 2025 Sikt\n#\n# This file is part of Network Administration Visualized (NAV).\n#\n# NAV is free software: "
  },
  {
    "path": "python/nav/django/__init__.py",
    "chars": 36,
    "preview": "\"\"\"Django customization for NAV.\"\"\"\n"
  },
  {
    "path": "python/nav/django/apps.py",
    "chars": 126,
    "preview": "from django.apps import AppConfig\n\n\nclass NavDjangoConfig(AppConfig):\n    name = 'nav.django'\n    verbose_name = 'NAV Dj"
  },
  {
    "path": "python/nav/django/context_processors.py",
    "chars": 4527,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Copyright (C) 2007-2009 Uninett AS\n# Copyright (C) 2022 Sikt\n#\n# This file is part of Networ"
  }
]

// ... and 2378 more files (download for full content)

About this extraction

This page contains the full source code of the Uninett/nav GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2578 files (34.9 MB), approximately 9.3M tokens, and a symbol index with 10418 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!