diff --git a/python/nav/ipdevpoll/log.py b/python/nav/ipdevpoll/log.py index 8403f1f64f..91d0a76c4a 100644 --- a/python/nav/ipdevpoll/log.py +++ b/python/nav/ipdevpoll/log.py @@ -1,5 +1,6 @@ # # Copyright (C) 2008-2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -20,8 +21,6 @@ import inspect from itertools import islice -import six - class ContextFormatter(Formatter): """A log formatter that will add context data if available in the record. @@ -61,17 +60,9 @@ def _set_context(self, record): else: self._set_format(self._normal_fmt) - if six.PY3: - # Under Python >= 3 we must also set the internal style's format, since - # formatting is actually delegated to the style object - def _set_format(self, fmt): - self._fmt = fmt - self._style._fmt = fmt - - else: - - def _set_format(self, fmt): - self._fmt = fmt + def _set_format(self, fmt): + self._fmt = fmt + self._style._fmt = fmt def _strip_logger_prefix(self, record): if record.name.startswith(self.prefix): diff --git a/python/nav/ipdevpoll/neighbor.py b/python/nav/ipdevpoll/neighbor.py index cd119b86fd..8d296dd158 100644 --- a/python/nav/ipdevpoll/neighbor.py +++ b/python/nav/ipdevpoll/neighbor.py @@ -1,5 +1,6 @@ # # Copyright (C) 2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -28,7 +29,6 @@ from IPy import IP from django.db.models import Q -import six from nav.util import cachedfor, synchronized from nav.models import manage @@ -151,7 +151,7 @@ def _netbox_from_ip(self, ip): """ try: - ip = six.text_type(IP(ip)) + ip = str(IP(ip)) except ValueError: self._logger.warning( "Invalid IP (%s) in neighbor record: %r", ip, self.record diff --git a/python/nav/ipdevpoll/plugins/cdp.py b/python/nav/ipdevpoll/plugins/cdp.py index 69bd9d39a1..5093018d83 100644 --- a/python/nav/ipdevpoll/plugins/cdp.py +++ b/python/nav/ipdevpoll/plugins/cdp.py @@ -1,5 +1,6 @@ # # Copyright (C) 2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -16,7 +17,6 @@ "ipdevpoll plugin to collect CDP (Cisco Discovery Protocol) information" import string -import six from twisted.internet import defer from nav.macaddress import MacAddress @@ -173,11 +173,11 @@ def _store_unidentified(self, record): ifc = self.containers.factory(record.ifindex, shadows.Interface) ifc.ifindex = record.ifindex - key = (record.ifindex, six.text_type(record.ip), SOURCE) + key = (record.ifindex, str(record.ip), SOURCE) neighbor = self.containers.factory(key, shadows.UnrecognizedNeighbor) neighbor.netbox = self.netbox neighbor.interface = ifc - neighbor.remote_id = six.text_type(record.ip) + neighbor.remote_id = str(record.ip) neighbor.remote_name = record.deviceid neighbor.source = SOURCE diff --git a/python/nav/ipdevpoll/plugins/entity.py b/python/nav/ipdevpoll/plugins/entity.py index e3cae0cd46..e494ca1e6c 100644 --- a/python/nav/ipdevpoll/plugins/entity.py +++ b/python/nav/ipdevpoll/plugins/entity.py @@ -1,5 +1,6 @@ # # Copyright (C) 2009-2012, 2015 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -17,7 +18,6 @@ ipdevpoll plugin to collect information about physical entities, if any, within a Netbox, from the ENTITY-MIB::entPhysicalTable (RFC 4133 and RFC 6933) """ -import six from twisted.internet import defer from nav.Snmp import safestring @@ -74,7 +74,7 @@ def _fix_hierarchy(self, containers): ghosts = set() for container in containers: if container.contained_in: - parent_id = six.text_type(container.contained_in) + parent_id = str(container.contained_in) parent = by_index.get(parent_id) if parent: container.contained_in = parent diff --git a/python/nav/ipdevpoll/plugins/lldp.py b/python/nav/ipdevpoll/plugins/lldp.py index f05e0df5a0..dc71b834dc 100644 --- a/python/nav/ipdevpoll/plugins/lldp.py +++ b/python/nav/ipdevpoll/plugins/lldp.py @@ -1,5 +1,6 @@ # # Copyright (C) 2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -17,7 +18,6 @@ from pprint import pformat from django.db.models import Q -import six from twisted.internet import defer from nav.models import manage @@ -294,7 +294,7 @@ def _interfaces_from_mac(self, mac): return self._interface_query(Q(ifphysaddress=mac)) def _interfaces_from_ip(self, ip): - ip = six.text_type(ip) + ip = str(ip) assert ip if ip in self._invalid_neighbor_ips: return diff --git a/python/nav/ipdevpoll/plugins/statmulticast.py b/python/nav/ipdevpoll/plugins/statmulticast.py index a2b89bd830..75c3dd662b 100644 --- a/python/nav/ipdevpoll/plugins/statmulticast.py +++ b/python/nav/ipdevpoll/plugins/statmulticast.py @@ -1,5 +1,6 @@ # # Copyright (C) 2014 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -19,7 +20,6 @@ from collections import Counter from pprint import pformat -from six import iteritems from twisted.internet import defer from nav.ipdevpoll import Plugin @@ -70,5 +70,5 @@ def _make_metrics_from_counts(self, count_report, timestamp=None): timestamp = timestamp or time.time() return [ (metric_path_for_multicast_usage(group, self.netbox), (timestamp, count)) - for group, count in iteritems(count_report) + for group, count in count_report.items() ] diff --git a/python/nav/ipdevpoll/plugins/statports.py b/python/nav/ipdevpoll/plugins/statports.py index 2a25247253..0214ff2ab3 100644 --- a/python/nav/ipdevpoll/plugins/statports.py +++ b/python/nav/ipdevpoll/plugins/statports.py @@ -1,5 +1,6 @@ # # Copyright (C) 2013 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -17,7 +18,6 @@ import time import logging -from six import itervalues from twisted.internet import defer from nav.ipdevpoll import Plugin from nav.ipdevpoll import db @@ -111,7 +111,7 @@ def _make_metrics(self, stats, netboxes, timestamp=None): timestamp = timestamp or time.time() hc_counters = False - for row in itervalues(stats): + for row in stats.values(): hc_counters = use_hc_counters(row) or hc_counters for key in LOGGED_COUNTERS: if key not in row: diff --git a/python/nav/ipdevpoll/plugins/statsensors.py b/python/nav/ipdevpoll/plugins/statsensors.py index 6a2ef81ae2..37289be74e 100644 --- a/python/nav/ipdevpoll/plugins/statsensors.py +++ b/python/nav/ipdevpoll/plugins/statsensors.py @@ -1,5 +1,6 @@ # # Copyright (C) 2013 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -18,7 +19,6 @@ import time from twisted.internet import defer -import six from nav.Snmp import safestring from nav.ipdevpoll import Plugin @@ -79,15 +79,13 @@ def _response_to_metrics(self, result, sensors, netboxes): metrics = [] timestamp = time.time() data = ( - (sensors[oid], value) - for oid, value in six.iteritems(result) - if oid in sensors + (sensors[oid], value) for oid, value in result.items() if oid in sensors ) for sensor, value in data: # Attempt to support numbers-as-text values - if isinstance(value, six.binary_type): + if isinstance(value, bytes): value = safestring(value) - if isinstance(value, six.text_type): + if isinstance(value, str): try: value = float(value) except ValueError: diff --git a/python/nav/ipdevpoll/pool.py b/python/nav/ipdevpoll/pool.py index d9cdf43aaf..c5f459e277 100755 --- a/python/nav/ipdevpoll/pool.py +++ b/python/nav/ipdevpoll/pool.py @@ -1,5 +1,6 @@ # # Copyright (C) 2017, 2020 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -28,8 +29,6 @@ from twisted.internet.endpoints import ProcessEndpoint, StandardIOEndpoint import twisted.internet.endpoints -import six - from nav.ipdevpoll.config import ipdevpoll_conf from . import control, jobs @@ -448,7 +447,7 @@ class HackLog(object): @staticmethod def msg(data, **_kwargs): """Logs a message to STDERR""" - if six.PY3 and isinstance(data, six.binary_type): + if isinstance(data, bytes): data = data.decode("utf-8") sys.stderr.write(data) sys.stderr.flush() diff --git a/python/nav/ipdevpoll/schedule.py b/python/nav/ipdevpoll/schedule.py index aed8cd5f09..d1e8ce089d 100644 --- a/python/nav/ipdevpoll/schedule.py +++ b/python/nav/ipdevpoll/schedule.py @@ -1,5 +1,6 @@ # # Copyright (C) 2008-2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -29,8 +30,6 @@ from twisted.internet.task import LoopingCall from twisted.python.log import err -from six import iteritems - from nav import ipdevpoll from nav.ipdevpoll import db from nav.ipdevpoll.snmp import SnmpError, AgentProxy @@ -537,7 +536,7 @@ def flush(self): _logger.debug("flushing %d counters to graphite", len(self)) metrics = [] timestamp = time.time() - for counter, count in iteritems(self): + for counter, count in self.items(): metrics.append((counter, (timestamp, count))) self[counter] = 0 diff --git a/python/nav/ipdevpoll/shadows/adjacency.py b/python/nav/ipdevpoll/shadows/adjacency.py index 51a91ea750..28e02742f9 100644 --- a/python/nav/ipdevpoll/shadows/adjacency.py +++ b/python/nav/ipdevpoll/shadows/adjacency.py @@ -1,5 +1,6 @@ # # Copyright (C) 2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -42,8 +43,6 @@ interface attribute is None, and whose source attribute is a non-empty string. """ -import six - from nav.models import manage from nav.ipdevpoll.storage import Shadow, DefaultManager from nav.ipdevpoll.utils import is_invalid_database_string @@ -227,7 +226,7 @@ def prepare(self, _=None): setattr(self, attr, repr(getattr(self, attr))) elif not getattr(self, attr): setattr(self, attr, '') - elif not isinstance(getattr(self, attr), six.text_type): + elif not isinstance(getattr(self, attr), str): value = getattr(self, attr) setattr(self, attr, value.decode('utf-8')) diff --git a/python/nav/ipdevpoll/shadows/entity.py b/python/nav/ipdevpoll/shadows/entity.py index 52c69e64fd..f556d856a3 100644 --- a/python/nav/ipdevpoll/shadows/entity.py +++ b/python/nav/ipdevpoll/shadows/entity.py @@ -24,8 +24,6 @@ from networkx.algorithms.traversal.depth_first_search import dfs_tree as subtree from django.db import transaction -import six -from six import iteritems, itervalues from nav.toposort import build_graph, topological_sort @@ -215,7 +213,7 @@ def __init__(self, *args, **kwargs): def __setattr__(self, key, value): if key == 'index' and value is not None: - value = six.text_type(value) + value = str(value) if key == 'contained_in' and value == 0: value = None super(NetboxEntity, self).__setattr__(key, value) @@ -239,7 +237,7 @@ def get_chassis_entities(cls, containers): :type containers: nav.ipdevpoll.storage.ContainerRepository """ if cls in containers: - entities = itervalues(containers[cls]) + entities = containers[cls].values() return [ e for e in entities @@ -255,7 +253,7 @@ def get_root_entities(cls, containers): :type containers: nav.ipdevpoll.storage.ContainerRepository """ if cls in containers: - entities = itervalues(containers[cls]) + entities = containers[cls].values() return [ e for e in entities if e.contained_in is None or e.contained_in == -1 ] @@ -310,7 +308,7 @@ def index_by_serial(self): for ent in self.entities: if ent.device and ent.device.serial: by_serial[(ent.source, ent.device.serial)].append(ent) - by_serial = {k: v[0] for k, v in iteritems(by_serial) if len(v) == 1} + by_serial = {k: v[0] for k, v in by_serial.items() if len(v) == 1} return by_serial def index_by_name(self): @@ -322,5 +320,5 @@ def index_by_name(self): for ent in self.entities: if ent.name: by_name[(ent.source, ent.name)].append(ent) - by_name = {k: v[0] for k, v in iteritems(by_name) if len(v) == 1} + by_name = {k: v[0] for k, v in by_name.items() if len(v) == 1} return by_name diff --git a/python/nav/ipdevpoll/shadows/interface.py b/python/nav/ipdevpoll/shadows/interface.py index 075f7cfa09..a3e7235b9a 100644 --- a/python/nav/ipdevpoll/shadows/interface.py +++ b/python/nav/ipdevpoll/shadows/interface.py @@ -1,5 +1,6 @@ # # Copyright (C) 2009-2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -20,7 +21,6 @@ from django.db.models import Q from django.db import transaction -import six from nav.models import manage from nav.models.event import EventQueue as Event, EventQueueVar as EventVar @@ -403,7 +403,7 @@ def _strip_null_bytes(self, containers): """ for field in 'ifname', 'ifdescr', 'ifalias': value = getattr(self, field, None) - if isinstance(value, six.text_type) and "\x00" in value: + if isinstance(value, str) and "\x00" in value: value = value.replace("\x00", "") setattr(self, field, value) diff --git a/python/nav/ipdevpoll/snmp/pynetsnmp.py b/python/nav/ipdevpoll/snmp/pynetsnmp.py index 89186fed35..3b363d0055 100644 --- a/python/nav/ipdevpoll/snmp/pynetsnmp.py +++ b/python/nav/ipdevpoll/snmp/pynetsnmp.py @@ -1,5 +1,6 @@ # # Copyright (C) 2011,2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -20,7 +21,7 @@ import inspect import os -import six +import sys # pylint: disable=wrong-import-position # don't have NET-SNMP load and parse MIB modules, we don't use them @@ -47,10 +48,7 @@ def pynetsnmp_limits_results(): except ImportError: return False else: - if six.PY2: - args = inspect.getargspec(TableRetriever.__init__)[0] - else: - args = inspect.getfullargspec(TableRetriever.__init__)[0] + args = inspect.getfullargspec(TableRetriever.__init__)[0] return 'limit' in args @@ -62,7 +60,7 @@ class AgentProxy(common.AgentProxyMixIn, twistedsnmp.AgentProxy): def getTable(self, *args, **kwargs): if 'limit' not in kwargs: - kwargs['limit'] = six.MAXSIZE + kwargs['limit'] = sys.maxsize return super(AgentProxy, self).getTable(*args, **kwargs) def open(self): diff --git a/python/nav/ipdevpoll/storage.py b/python/nav/ipdevpoll/storage.py index b308cebb0f..b46c0dc8be 100644 --- a/python/nav/ipdevpoll/storage.py +++ b/python/nav/ipdevpoll/storage.py @@ -1,5 +1,6 @@ # # Copyright (C) 2009-2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -17,7 +18,6 @@ import django.db.models from django.db import transaction -import six from nav import toposort from nav import ipdevpoll @@ -106,8 +106,7 @@ def __repr__(self): ) -@six.add_metaclass(MetaShadow) -class Shadow(object): +class Shadow(object, metaclass=MetaShadow): """Base class to shadow Django model classes. To create a "dumb" container of values, whose attribute list will diff --git a/python/nav/ipdevpoll/utils.py b/python/nav/ipdevpoll/utils.py index 85ac43d0be..0cbcb9e9a4 100644 --- a/python/nav/ipdevpoll/utils.py +++ b/python/nav/ipdevpoll/utils.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # # Copyright (C) 2009-2012 Uninett AS +# Copyright (C) 2022 Sikt # # This file is part of Network Administration Visualized (NAV). # @@ -62,7 +63,7 @@ def binary_mac_to_hex(binary_mac): """ if binary_mac: binary_mac = binary_mac[-6:].rjust(MAX_MAC_ADDRESS_LENGTH, b'\x00') - return ":".join("%02x" % x for x in six.iterbytes(binary_mac)) + return ":".join("%02x" % x for x in binary_mac) def truncate_mac(mac): @@ -95,9 +96,7 @@ def is_invalid_database_string(string): that cannot be decoded as UTF-8, or is another type of object, it is considered invalid. """ - return (isinstance(string, six.text_type) and "\x00" in string) or is_invalid_utf8( - string - ) + return (isinstance(string, str) and "\x00" in string) or is_invalid_utf8(string) def is_invalid_utf8(string): @@ -107,7 +106,7 @@ def is_invalid_utf8(string): returned. """ - if isinstance(string, six.binary_type): + if isinstance(string, bytes): try: string.decode('utf-8') except UnicodeDecodeError: