From 716a1d9e1db6701c0b310dd7e10dc4a10656da0f Mon Sep 17 00:00:00 2001 From: Chris PeBenito Date: Tue, 14 Dec 2021 14:24:20 -0500 Subject: [PATCH] Make NetworkX optional. Content-type: text/plain The CLI tools get installed to most distros, but sedta and seinfoflow are not typically used or separated into a different package. This will allow seinfo, sesearch, and sediff to function if NetworkX is missing, since they don't require it. Signed-off-by: Chris PeBenito --- setools/dta.py | 18 ++++++++++++++---- setools/infoflow.py | 17 +++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/setools/dta.py b/setools/dta.py index ce5a36463684..ded88ff4f615 100644 --- a/setools/dta.py +++ b/setools/dta.py @@ -10,8 +10,11 @@ from collections import defaultdict from contextlib import suppress from typing import DefaultDict, Iterable, List, NamedTuple, Optional, Union -import networkx as nx -from networkx.exception import NetworkXError, NetworkXNoPath, NodeNotFound +try: + import networkx as nx + from networkx.exception import NetworkXError, NetworkXNoPath, NodeNotFound +except ImportError: + logging.getLogger(__name__).debug("NetworkX failed to import.") from .descriptors import EdgeAttrDict, EdgeAttrList from .policyrep import AnyTERule, SELinuxPolicy, TERuletype, Type @@ -73,8 +76,15 @@ class DomainTransitionAnalysis: self.reverse = reverse self.rebuildgraph = True self.rebuildsubgraph = True - self.G = nx.DiGraph() - self.subG = self.G.copy() + + try: + self.G = nx.DiGraph() + self.subG = self.G.copy() + except NameError: + self.log.critical("NetworkX is not available. This is " + "requried for Domain Transition Analysis.") + self.log.critical("This is typically in the python3-networkx package.") + raise @property def reverse(self) -> bool: diff --git a/setools/infoflow.py b/setools/infoflow.py index 0ef240a9993f..4b94a0c2d6dd 100644 --- a/setools/infoflow.py +++ b/setools/infoflow.py @@ -7,8 +7,11 @@ import logging from contextlib import suppress from typing import cast, Iterable, List, Mapping, Optional, Union -import networkx as nx -from networkx.exception import NetworkXError, NetworkXNoPath, NodeNotFound +try: + import networkx as nx + from networkx.exception import NetworkXError, NetworkXNoPath, NodeNotFound +except ImportError: + logging.getLogger(__name__).debug("NetworkX failed to import.") from .descriptors import EdgeAttrIntMax, EdgeAttrList from .permmap import PermissionMap @@ -54,8 +57,14 @@ class InfoFlowAnalysis: self.rebuildgraph = True self.rebuildsubgraph = True - self.G = nx.DiGraph() - self.subG = self.G.copy() + try: + self.G = nx.DiGraph() + self.subG = self.G.copy() + except NameError: + self.log.critical("NetworkX is not available. This is " + "requried for Information Flow Analysis.") + self.log.critical("This is typically in the python3-networkx package.") + raise @property def min_weight(self) -> int: -- 2.39.1