annet 3.11.0__tar.gz → 3.12.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of annet might be problematic. Click here for more details.
- {annet-3.11.0/annet.egg-info → annet-3.12.1}/PKG-INFO +1 -1
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/adapter.py +1 -1
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/query.py +16 -13
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/storage_base.py +2 -1
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/storage_opts.py +9 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v37/storage.py +3 -2
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v41/storage.py +3 -2
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v42/storage.py +3 -2
- {annet-3.11.0 → annet-3.12.1}/annet/api/__init__.py +10 -1
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/huawei.rul +2 -0
- {annet-3.11.0 → annet-3.12.1/annet.egg-info}/PKG-INFO +1 -1
- {annet-3.11.0 → annet-3.12.1}/AUTHORS +0 -0
- {annet-3.11.0 → annet-3.12.1}/LICENSE +0 -0
- {annet-3.11.0 → annet-3.12.1}/MANIFEST.in +0 -0
- {annet-3.11.0 → annet-3.12.1}/README.md +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/fetchers/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/fetchers/stub/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/fetchers/stub/fetcher.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/file/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/file/provider.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/client.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/manufacturer.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/common/status_client.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/provider.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v24/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v24/models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v24/storage.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v37/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v37/models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v41/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v41/models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v42/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/adapters/netbox/v42/models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annet.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/command.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/diff.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/errors.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/filter_acl.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/jsontools.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/lib.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/db.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/devdb/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/views/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/views/dump.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/netdev/views/hardware.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/output.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/patching.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/acl.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/deploying.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/ordering.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/platform.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rbparser/syntax.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rulebook/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/rulebook/common.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/annlib/types.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/argparse.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/bgp_models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/cli.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/cli_args.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/configs/context.yml +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/configs/logging.yaml +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/connectors.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/deploy.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/deploy_ui.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/diff.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/filtering.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/gen.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/base.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/common/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/common/initial.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/entire.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/exceptions.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/jsonfragment.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/partial.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/perf.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/ref.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/generators/result.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/hardware.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/implicit.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/lib.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/basemodel.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/device_models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/executor.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/match_args.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/models_converter.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/peer_models.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/port_processor.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/mesh/registry.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/output.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/parallel.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/patching.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/reference.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/action.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/condition.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/match_builder.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/policy.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/result.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/routemap.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl/statement_builder.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/aspath.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/community.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/cumulus_frr.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/entities.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/execute.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/policy.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/prefix_lists.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rpl_generators/rd.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/arista/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/arista/aaa.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/arista/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/aruba/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/aruba/ap_env.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/aruba/misc.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/b4com/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/b4com/file.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/b4com/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/cisco/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/cisco/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/cisco/misc.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/cisco/vlandb.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/common.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/deploying.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/generic/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/generic/misc.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/aaa.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/bgp.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/misc.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/huawei/vlandb.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/juniper/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/juniper/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/nexus/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/nexus/iface.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/patching.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/routeros/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/routeros/file.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/arista.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/arista.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/arista.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/aruba.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/aruba.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/aruba.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/b4com.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/b4com.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/b4com.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/cisco.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/cisco.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/cisco.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/huawei.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/huawei.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/iosxr.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/iosxr.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/iosxr.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/juniper.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/juniper.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/nexus.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/nexus.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/nexus.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/nokia.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/optixtrans.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/optixtrans.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/optixtrans.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/pc.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/pc.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/pc.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/ribbon.deploy +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/ribbon.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/routeros.order +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/rulebook/texts/routeros.rul +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/storage.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/text_term_format.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/tracing.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/types.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/base.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/arista.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/aruba.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/b4com.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/cisco.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/h3c.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/huawei.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/iosxr.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/juniper.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/nexus.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/nokia.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/optixtrans.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/pc.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/ribbon.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/library/routeros.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/registry.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet/vendors/tabparser.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet.egg-info/SOURCES.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet.egg-info/dependency_links.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet.egg-info/entry_points.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet.egg-info/requires.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet.egg-info/top_level.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/example/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/example/hostname.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/example/lldp.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/mesh_example/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/mesh_example/bgp.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/mesh_example/mesh_logic.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/rpl_example/__init__.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/rpl_example/generator.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/rpl_example/items.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/rpl_example/mesh.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/annet_generators/rpl_example/route_policy.py +0 -0
- {annet-3.11.0 → annet-3.12.1}/requirements.txt +0 -0
- {annet-3.11.0 → annet-3.12.1}/setup.cfg +0 -0
- {annet-3.11.0 → annet-3.12.1}/setup.py +0 -0
|
@@ -37,19 +37,7 @@ class NetboxQuery(Query):
|
|
|
37
37
|
return self.query
|
|
38
38
|
|
|
39
39
|
def parse_query(self) -> Filter:
|
|
40
|
-
query_groups =
|
|
41
|
-
for q in self.globs:
|
|
42
|
-
if FIELD_VALUE_SEPARATOR in q:
|
|
43
|
-
glob_type, param = q.split(FIELD_VALUE_SEPARATOR, 2)
|
|
44
|
-
if glob_type not in ALLOWED_GLOB_GROUPS:
|
|
45
|
-
raise Exception(f"unknown query type: '{glob_type}'")
|
|
46
|
-
if not param:
|
|
47
|
-
raise Exception(f"empty param for '{glob_type}'")
|
|
48
|
-
query_groups[glob_type].append(param)
|
|
49
|
-
else:
|
|
50
|
-
query_groups["name"].append(q)
|
|
51
|
-
|
|
52
|
-
query_groups.default_factory = None
|
|
40
|
+
query_groups = parse_query(self.globs)
|
|
53
41
|
return cast(Filter, query_groups)
|
|
54
42
|
|
|
55
43
|
def is_empty(self) -> bool:
|
|
@@ -62,3 +50,18 @@ class NetboxQuery(Query):
|
|
|
62
50
|
if FIELD_VALUE_SEPARATOR in q:
|
|
63
51
|
return False
|
|
64
52
|
return True
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def parse_query(query: list[str]) -> dict[str, list[str]]:
|
|
56
|
+
query_groups = defaultdict(list)
|
|
57
|
+
for q in query:
|
|
58
|
+
if FIELD_VALUE_SEPARATOR in q:
|
|
59
|
+
glob_type, param = q.split(FIELD_VALUE_SEPARATOR, 2)
|
|
60
|
+
if glob_type not in ALLOWED_GLOB_GROUPS:
|
|
61
|
+
raise Exception(f"unknown query type: '{glob_type}'")
|
|
62
|
+
if not param:
|
|
63
|
+
raise Exception(f"empty param for '{glob_type}'")
|
|
64
|
+
query_groups[glob_type].append(param)
|
|
65
|
+
else:
|
|
66
|
+
query_groups["name"].append(q)
|
|
67
|
+
return dict(query_groups)
|
|
@@ -54,6 +54,7 @@ class BaseNetboxStorage(
|
|
|
54
54
|
token = opts.token
|
|
55
55
|
threads = opts.threads
|
|
56
56
|
self.exact_host_filter = opts.exact_host_filter
|
|
57
|
+
self.all_hosts_filter = opts.all_hosts_filter
|
|
57
58
|
self.netbox = self._init_adapter(url=url, token=token, ssl_context=ctx, threads=threads)
|
|
58
59
|
self._all_fqdns: Optional[list[str]] = None
|
|
59
60
|
self._id_devices: dict[int, NetboxDeviceT] = {}
|
|
@@ -87,7 +88,7 @@ class BaseNetboxStorage(
|
|
|
87
88
|
|
|
88
89
|
def resolve_all_fdnds(self) -> list[str]:
|
|
89
90
|
if self._all_fqdns is None:
|
|
90
|
-
self._all_fqdns = self.netbox.
|
|
91
|
+
self._all_fqdns = self.netbox.list_fqdns(self.all_hosts_filter)
|
|
91
92
|
return self._all_fqdns
|
|
92
93
|
|
|
93
94
|
def make_devices(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Any, Optional
|
|
3
|
+
from .query import parse_query
|
|
3
4
|
|
|
4
5
|
DEFAULT_URL = "http://localhost"
|
|
5
6
|
|
|
@@ -12,17 +13,24 @@ class NetboxStorageOpts:
|
|
|
12
13
|
insecure: bool = False,
|
|
13
14
|
exact_host_filter: bool = False,
|
|
14
15
|
threads: int = 1,
|
|
16
|
+
all_hosts_filter: dict[str, list[str]] | None = None,
|
|
15
17
|
):
|
|
16
18
|
self.url = url
|
|
17
19
|
self.token = token
|
|
18
20
|
self.insecure = insecure
|
|
19
21
|
self.exact_host_filter = exact_host_filter
|
|
20
22
|
self.threads = threads
|
|
23
|
+
self.all_hosts_filter: dict[str, list[str]] = all_hosts_filter or {}
|
|
21
24
|
|
|
22
25
|
@classmethod
|
|
23
26
|
def parse_params(cls, conf_params: Optional[dict[str, str]], cli_opts: Any):
|
|
24
27
|
url = os.getenv("NETBOX_URL") or conf_params.get("url") or DEFAULT_URL
|
|
25
28
|
token = os.getenv("NETBOX_TOKEN", "").strip() or conf_params.get("token") or ""
|
|
29
|
+
all_hosts_filter = None
|
|
30
|
+
if all_hosts_filter_env := os.getenv("NETBOX_ALL_HOSTS_FILTER", "").strip():
|
|
31
|
+
all_hosts_filter = parse_query(all_hosts_filter_env.split(","))
|
|
32
|
+
elif all_hosts_filter_params := conf_params.get("all_hosts_filter"):
|
|
33
|
+
all_hosts_filter = all_hosts_filter_params
|
|
26
34
|
threads = os.getenv("NETBOX_CLIENT_THREADS", "").strip() or conf_params.get("threads") or "1"
|
|
27
35
|
insecure = False
|
|
28
36
|
if insecure_env := os.getenv("NETBOX_INSECURE", "").lower():
|
|
@@ -39,4 +47,5 @@ class NetboxStorageOpts:
|
|
|
39
47
|
insecure=insecure,
|
|
40
48
|
exact_host_filter=exact_host_filter,
|
|
41
49
|
threads=int(threads),
|
|
50
|
+
all_hosts_filter=all_hosts_filter,
|
|
42
51
|
)
|
|
@@ -70,10 +70,11 @@ class NetboxV37Adapter(NetboxAdapter[
|
|
|
70
70
|
list[FHRPGroupV37],
|
|
71
71
|
)
|
|
72
72
|
|
|
73
|
-
def
|
|
73
|
+
def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
|
|
74
|
+
query = query or {}
|
|
74
75
|
return [
|
|
75
76
|
d.name
|
|
76
|
-
for d in self.netbox.dcim_all_devices_brief().results
|
|
77
|
+
for d in self.netbox.dcim_all_devices_brief(**query).results
|
|
77
78
|
]
|
|
78
79
|
|
|
79
80
|
def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV37]:
|
|
@@ -71,10 +71,11 @@ class NetboxV41Adapter(NetboxAdapter[
|
|
|
71
71
|
list[FHRPGroupV41],
|
|
72
72
|
)
|
|
73
73
|
|
|
74
|
-
def
|
|
74
|
+
def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
|
|
75
|
+
query = query or {}
|
|
75
76
|
return [
|
|
76
77
|
d.name
|
|
77
|
-
for d in self.netbox.dcim_all_devices_brief().results
|
|
78
|
+
for d in self.netbox.dcim_all_devices_brief(**query).results
|
|
78
79
|
]
|
|
79
80
|
|
|
80
81
|
def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV41]:
|
|
@@ -72,10 +72,11 @@ class NetboxV42Adapter(NetboxAdapter[
|
|
|
72
72
|
list[FHRPGroupV41],
|
|
73
73
|
)
|
|
74
74
|
|
|
75
|
-
def
|
|
75
|
+
def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
|
|
76
|
+
query = query or {}
|
|
76
77
|
return [
|
|
77
78
|
d.name
|
|
78
|
-
for d in self.netbox.dcim_all_devices_brief().results
|
|
79
|
+
for d in self.netbox.dcim_all_devices_brief(**query).results
|
|
79
80
|
]
|
|
80
81
|
|
|
81
82
|
def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV42]:
|
|
@@ -331,7 +331,16 @@ def diff(
|
|
|
331
331
|
loader: ann_gen.Loader,
|
|
332
332
|
device_ids: List[Any]
|
|
333
333
|
) -> tuple[Mapping[Device, Union[Diff, PCDiff]], Mapping[Device, Exception]]:
|
|
334
|
-
""" Сгенерировать
|
|
334
|
+
""" Сгенерировать дифф для устройств """
|
|
335
|
+
if args.config == "running":
|
|
336
|
+
fetcher = annet.deploy.get_fetcher()
|
|
337
|
+
ann_gen.live_configs = annet.lib.do_async(
|
|
338
|
+
fetcher.fetch(
|
|
339
|
+
[device for device in loader.devices if device.id in device_ids],
|
|
340
|
+
processes=args.parallel
|
|
341
|
+
),
|
|
342
|
+
new_thread=True
|
|
343
|
+
)
|
|
335
344
|
stdin = args.stdin(filter_acl=args.filter_acl, config=None)
|
|
336
345
|
|
|
337
346
|
filterer = filtering.filterer_connector.get()
|
|
@@ -200,9 +200,11 @@ aaa
|
|
|
200
200
|
|
|
201
201
|
hwtacacs-server template *
|
|
202
202
|
hwtacacs-server shared-key
|
|
203
|
+
hwtacacs-server source-ip
|
|
203
204
|
|
|
204
205
|
hwtacacs server template *
|
|
205
206
|
hwtacacs server shared-key
|
|
207
|
+
hwtacacs server source-ip
|
|
206
208
|
|
|
207
209
|
!radius-server template default
|
|
208
210
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|