updates to python based logging to use module named loggers, updated logging config file to align with these changes

This commit is contained in:
Blake Harnden 2021-04-21 21:09:35 -07:00
parent 55d5bb3859
commit 69652ac577
63 changed files with 717 additions and 606 deletions

View file

@ -94,6 +94,8 @@ from core.api.grpc.wlan_pb2 import (
)
from core.emulator.data import IpPrefixes
logger = logging.getLogger(__name__)
class InterfaceHelper:
"""
@ -147,9 +149,9 @@ def stream_listener(stream: Any, handler: Callable[[core_pb2.Event], None]) -> N
handler(event)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.CANCELLED:
logging.debug("stream closed")
logger.debug("stream closed")
else:
logging.exception("stream error")
logger.exception("stream error")
def start_streamer(stream: Any, handler: Callable[[core_pb2.Event], None]) -> None:

View file

@ -70,6 +70,8 @@ from core.api.grpc.wrappers import Hook
from core.emulator.data import IpPrefixes
from core.errors import CoreError
logger = logging.getLogger(__name__)
class MoveNodesStreamer:
def __init__(self, session_id: int = None, source: str = None) -> None:
@ -184,9 +186,9 @@ def throughput_listener(
handler(event)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.CANCELLED:
logging.debug("throughput stream closed")
logger.debug("throughput stream closed")
else:
logging.exception("throughput stream error")
logger.exception("throughput stream error")
def cpu_listener(
@ -205,9 +207,9 @@ def cpu_listener(
handler(event)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.CANCELLED:
logging.debug("cpu stream closed")
logger.debug("cpu stream closed")
else:
logging.exception("cpu stream error")
logger.exception("cpu stream error")
def event_listener(stream: Any, handler: Callable[[wrappers.Event], None]) -> None:
@ -224,9 +226,9 @@ def event_listener(stream: Any, handler: Callable[[wrappers.Event], None]) -> No
handler(event)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.CANCELLED:
logging.debug("session stream closed")
logger.debug("session stream closed")
else:
logging.exception("session stream error")
logger.exception("session stream error")
class CoreGrpcClient:

View file

@ -14,6 +14,8 @@ from core.emulator.data import (
)
from core.emulator.session import Session
logger = logging.getLogger(__name__)
def handle_node_event(node_data: NodeData) -> core_pb2.Event:
"""
@ -199,7 +201,7 @@ class EventStreamer:
elif isinstance(data, FileData):
event = handle_file_event(data)
else:
logging.error("unknown event: %s", data)
logger.error("unknown event: %s", data)
except Empty:
pass
if event:

View file

@ -31,6 +31,7 @@ from core.nodes.lxd import LxcNode
from core.nodes.network import WlanNode
from core.services.coreservices import CoreService
logger = logging.getLogger(__name__)
WORKERS = 10
@ -156,7 +157,7 @@ def create_nodes(
start = time.monotonic()
results, exceptions = utils.threadpool(funcs)
total = time.monotonic() - start
logging.debug("grpc created nodes time: %s", total)
logger.debug("grpc created nodes time: %s", total)
return results, exceptions
@ -180,7 +181,7 @@ def create_links(
start = time.monotonic()
results, exceptions = utils.threadpool(funcs)
total = time.monotonic() - start
logging.debug("grpc created links time: %s", total)
logger.debug("grpc created links time: %s", total)
return results, exceptions
@ -204,7 +205,7 @@ def edit_links(
start = time.monotonic()
results, exceptions = utils.threadpool(funcs)
total = time.monotonic() - start
logging.debug("grpc edit links time: %s", total)
logger.debug("grpc edit links time: %s", total)
return results, exceptions

View file

@ -116,6 +116,7 @@ from core.nodes.base import CoreNode, NodeBase
from core.nodes.network import CtrlNet, PtpNet, WlanNode
from core.services.coreservices import ServiceManager
logger = logging.getLogger(__name__)
_ONE_DAY_IN_SECONDS: int = 60 * 60 * 24
_INTERFACE_REGEX: Pattern = re.compile(r"veth(?P<node>[0-9a-fA-F]+)")
_MAX_WORKERS = 1000
@ -136,7 +137,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
atexit.register(self._exit_handler)
def _exit_handler(self) -> None:
logging.debug("catching exit, stop running")
logger.debug("catching exit, stop running")
self.running = False
def _is_running(self, context) -> bool:
@ -146,7 +147,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
context.abort(grpc.StatusCode.CANCELLED, "server stopping")
def listen(self, address: str) -> None:
logging.info("CORE gRPC API listening on: %s", address)
logger.info("CORE gRPC API listening on: %s", address)
self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=_MAX_WORKERS))
core_pb2_grpc.add_CoreApiServicer_to_server(self, self.server)
self.server.add_insecure_port(address)
@ -217,7 +218,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: grpc context
:return: start session response
"""
logging.debug("start session: %s", request)
logger.debug("start session: %s", request)
session = self.get_session(request.session_id, context)
# clear previous state and setup for creation
@ -313,7 +314,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: grpc context
:return: stop session response
"""
logging.debug("stop session: %s", request)
logger.debug("stop session: %s", request)
session = self.get_session(request.session_id, context)
session.data_collect()
session.shutdown()
@ -329,7 +330,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context:
:return: a create-session response
"""
logging.debug("create session: %s", request)
logger.debug("create session: %s", request)
session = self.coreemu.create_session(request.session_id)
session.set_state(EventTypes.DEFINITION_STATE)
session.location.setrefgeo(47.57917, -122.13232, 2.0)
@ -348,7 +349,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: a delete-session response
"""
logging.debug("delete session: %s", request)
logger.debug("delete session: %s", request)
result = self.coreemu.delete_session(request.session_id)
return core_pb2.DeleteSessionResponse(result=result)
@ -362,7 +363,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: a delete-session response
"""
logging.debug("get sessions: %s", request)
logger.debug("get sessions: %s", request)
sessions = []
for session_id in self.coreemu.sessions:
session = self.coreemu.sessions[session_id]
@ -387,7 +388,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: a get-session-location response
"""
logging.debug("get session location: %s", request)
logger.debug("get session location: %s", request)
session = self.get_session(request.session_id, context)
x, y, z = session.location.refxyz
lat, lon, alt = session.location.refgeo
@ -407,7 +408,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: a set-session-location-response
"""
logging.debug("set session location: %s", request)
logger.debug("set session location: %s", request)
session = self.get_session(request.session_id, context)
grpcutils.session_location(session, request.location)
return core_pb2.SetSessionLocationResponse(result=True)
@ -422,7 +423,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context:context object
:return: set-session-state response
"""
logging.debug("set session state: %s", request)
logger.debug("set session state: %s", request)
session = self.get_session(request.session_id, context)
try:
state = EventTypes(request.state)
@ -451,7 +452,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set session user response
"""
logging.debug("set session user: %s", request)
logger.debug("set session user: %s", request)
session = self.get_session(request.session_id, context)
session.user = request.user
return core_pb2.SetSessionUserResponse(result=True)
@ -467,7 +468,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-session-options response about all session's options
"""
logging.debug("get session options: %s", request)
logger.debug("get session options: %s", request)
session = self.get_session(request.session_id, context)
current_config = session.options.get_configs()
default_config = session.options.default_values()
@ -485,7 +486,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-session-options response
"""
logging.debug("set session options: %s", request)
logger.debug("set session options: %s", request)
session = self.get_session(request.session_id, context)
config = session.options.get_configs()
config.update(request.config)
@ -502,7 +503,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get session metadata response
"""
logging.debug("get session metadata: %s", request)
logger.debug("get session metadata: %s", request)
session = self.get_session(request.session_id, context)
return core_pb2.GetSessionMetadataResponse(config=session.metadata)
@ -516,7 +517,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set metadata response
"""
logging.debug("set session metadata: %s", request)
logger.debug("set session metadata: %s", request)
session = self.get_session(request.session_id, context)
session.metadata = dict(request.config)
return core_pb2.SetSessionMetadataResponse(result=True)
@ -544,7 +545,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-session response
"""
logging.debug("get session: %s", request)
logger.debug("get session: %s", request)
session = self.get_session(request.session_id, context)
links = []
nodes = []
@ -718,7 +719,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: add-node response
"""
logging.debug("add node: %s", request)
logger.debug("add node: %s", request)
session = self.get_session(request.session_id, context)
_type, _id, options = grpcutils.add_node_data(request.node)
_class = session.get_node_class(_type)
@ -737,7 +738,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-node response
"""
logging.debug("get node: %s", request)
logger.debug("get node: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, NodeBase)
ifaces = []
@ -768,7 +769,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
options = NodeOptions()
has_geo = request.HasField("geo")
if has_geo:
logging.info("has geo")
logger.info("has geo")
lat = request.geo.lat
lon = request.geo.lon
alt = request.geo.alt
@ -776,7 +777,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
else:
x = request.position.x
y = request.position.y
logging.info("has pos: %s,%s", x, y)
logger.info("has pos: %s,%s", x, y)
options.set_position(x, y)
session.edit_node(node.id, options)
source = request.source if request.source else None
@ -794,7 +795,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: edit-node response
"""
logging.debug("edit node: %s", request)
logger.debug("edit node: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, NodeBase)
options = NodeOptions(icon=request.icon)
@ -830,7 +831,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: core.api.grpc.core_pb2.DeleteNodeResponse
"""
logging.debug("delete node: %s", request)
logger.debug("delete node: %s", request)
session = self.get_session(request.session_id, context)
result = False
if request.node_id in session.nodes:
@ -850,7 +851,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: core.api.grpc.core_pb2.NodeCommandResponse
"""
logging.debug("sending node command: %s", request)
logger.debug("sending node command: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, CoreNode)
try:
@ -871,7 +872,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-node-terminal response
"""
logging.debug("getting node terminal: %s", request)
logger.debug("getting node terminal: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, CoreNode)
terminal = node.termcmdstring("/bin/bash")
@ -887,7 +888,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-node-links response
"""
logging.debug("get node links: %s", request)
logger.debug("get node links: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, NodeBase)
links = get_links(node)
@ -903,7 +904,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: add-link response
"""
logging.debug("add link: %s", request)
logger.debug("add link: %s", request)
session = self.get_session(request.session_id, context)
node1_id = request.link.node1_id
node2_id = request.link.node2_id
@ -952,7 +953,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: edit-link response
"""
logging.debug("edit link: %s", request)
logger.debug("edit link: %s", request)
session = self.get_session(request.session_id, context)
node1_id = request.node1_id
node2_id = request.node2_id
@ -998,7 +999,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: delete-link response
"""
logging.debug("delete link: %s", request)
logger.debug("delete link: %s", request)
session = self.get_session(request.session_id, context)
node1_id = request.node1_id
node2_id = request.node2_id
@ -1029,7 +1030,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-hooks response about all the hooks in all session states
"""
logging.debug("get hooks: %s", request)
logger.debug("get hooks: %s", request)
session = self.get_session(request.session_id, context)
hooks = grpcutils.get_hooks(session)
return core_pb2.GetHooksResponse(hooks=hooks)
@ -1044,7 +1045,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: add-hook response
"""
logging.debug("add hook: %s", request)
logger.debug("add hook: %s", request)
session = self.get_session(request.session_id, context)
hook = request.hook
state = EventTypes(hook.state)
@ -1062,7 +1063,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-mobility-configurations response that has a list of configurations
"""
logging.debug("get mobility configs: %s", request)
logger.debug("get mobility configs: %s", request)
session = self.get_session(request.session_id, context)
configs = grpcutils.get_mobility_configs(session)
return GetMobilityConfigsResponse(configs=configs)
@ -1078,7 +1079,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-mobility-configuration response
"""
logging.debug("get mobility config: %s", request)
logger.debug("get mobility config: %s", request)
session = self.get_session(request.session_id, context)
current_config = session.mobility.get_model_config(
request.node_id, Ns2ScriptedMobility.name
@ -1097,7 +1098,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-mobility-configuration response
"""
logging.debug("set mobility config: %s", request)
logger.debug("set mobility config: %s", request)
session = self.get_session(request.session_id, context)
mobility_config = request.mobility_config
session.mobility.set_model_config(
@ -1116,7 +1117,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: mobility-action response
"""
logging.debug("mobility action: %s", request)
logger.debug("mobility action: %s", request)
session = self.get_session(request.session_id, context)
node = grpcutils.get_mobility_node(session, request.node_id, context)
if not node.mobility:
@ -1144,7 +1145,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-services response
"""
logging.debug("get services: %s", request)
logger.debug("get services: %s", request)
services = []
for name in ServiceManager.services:
service = ServiceManager.services[name]
@ -1162,7 +1163,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-service-defaults response about all the available default services
"""
logging.debug("get service defaults: %s", request)
logger.debug("get service defaults: %s", request)
session = self.get_session(request.session_id, context)
defaults = grpcutils.get_default_services(session)
return GetServiceDefaultsResponse(defaults=defaults)
@ -1177,7 +1178,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-service-defaults response
"""
logging.debug("set service defaults: %s", request)
logger.debug("set service defaults: %s", request)
session = self.get_session(request.session_id, context)
session.services.default_services.clear()
for service_defaults in request.defaults:
@ -1197,7 +1198,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: all node service configs response
"""
logging.debug("get node service configs: %s", request)
logger.debug("get node service configs: %s", request)
session = self.get_session(request.session_id, context)
configs = grpcutils.get_node_service_configs(session)
return GetNodeServiceConfigsResponse(configs=configs)
@ -1213,7 +1214,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-node-service response about the requested service
"""
logging.debug("get node service: %s", request)
logger.debug("get node service: %s", request)
session = self.get_session(request.session_id, context)
service = session.services.get_service(
request.node_id, request.service, default_service=True
@ -1232,7 +1233,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-node-service response about the requested service
"""
logging.debug("get node service file: %s", request)
logger.debug("get node service file: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, CoreNode)
file_data = session.services.get_service_file(
@ -1251,7 +1252,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-node-service response
"""
logging.debug("set node service: %s", request)
logger.debug("set node service: %s", request)
session = self.get_session(request.session_id, context)
config = request.config
grpcutils.service_configuration(session, config)
@ -1268,7 +1269,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-node-service-file response
"""
logging.debug("set node service file: %s", request)
logger.debug("set node service file: %s", request)
session = self.get_session(request.session_id, context)
config = request.config
session.services.set_service_file(
@ -1287,7 +1288,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: service-action response about status of action
"""
logging.debug("service action: %s", request)
logger.debug("service action: %s", request)
session = self.get_session(request.session_id, context)
node = self.get_node(session, request.node_id, context, CoreNode)
service = None
@ -1327,7 +1328,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: core.api.grpc.core_pb2.GetWlanConfigResponse
:return: all wlan configurations
"""
logging.debug("get wlan configs: %s", request)
logger.debug("get wlan configs: %s", request)
session = self.get_session(request.session_id, context)
configs = grpcutils.get_wlan_configs(session)
return GetWlanConfigsResponse(configs=configs)
@ -1342,7 +1343,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: core.api.grpc.core_pb2.GetWlanConfigResponse
:return: get-wlan-configuration response about the wlan configuration of a node
"""
logging.debug("get wlan config: %s", request)
logger.debug("get wlan config: %s", request)
session = self.get_session(request.session_id, context)
current_config = session.mobility.get_model_config(
request.node_id, BasicRangeModel.name
@ -1360,7 +1361,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-wlan-configuration response
"""
logging.debug("set wlan config: %s", request)
logger.debug("set wlan config: %s", request)
session = self.get_session(request.session_id, context)
node_id = request.wlan_config.node_id
config = request.wlan_config.config
@ -1380,7 +1381,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-EMANE-configuration response
"""
logging.debug("get emane config: %s", request)
logger.debug("get emane config: %s", request)
session = self.get_session(request.session_id, context)
config = grpcutils.get_emane_config(session)
return GetEmaneConfigResponse(config=config)
@ -1395,7 +1396,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-EMANE-configuration response
"""
logging.debug("set emane config: %s", request)
logger.debug("set emane config: %s", request)
session = self.get_session(request.session_id, context)
config = session.emane.get_configs()
config.update(request.config)
@ -1411,7 +1412,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-EMANE-models response that has all the models
"""
logging.debug("get emane models: %s", request)
logger.debug("get emane models: %s", request)
session = self.get_session(request.session_id, context)
models = grpcutils.get_emane_models(session)
return GetEmaneModelsResponse(models=models)
@ -1427,7 +1428,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: get-EMANE-model-configuration response
"""
logging.debug("get emane model config: %s", request)
logger.debug("get emane model config: %s", request)
session = self.get_session(request.session_id, context)
model = session.emane.models.get(request.model)
if not model:
@ -1448,7 +1449,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: set-EMANE-model-configuration response
"""
logging.debug("set emane model config: %s", request)
logger.debug("set emane model config: %s", request)
session = self.get_session(request.session_id, context)
model_config = request.emane_model_config
_id = utils.iface_config_id(model_config.node_id, model_config.iface_id)
@ -1467,7 +1468,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:return: get-EMANE-model-configurations response that has all the EMANE
configurations
"""
logging.debug("get emane model configs: %s", request)
logger.debug("get emane model configs: %s", request)
session = self.get_session(request.session_id, context)
configs = grpcutils.get_emane_model_configs(session)
return GetEmaneModelConfigsResponse(configs=configs)
@ -1482,7 +1483,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: save-xml response
"""
logging.debug("save xml: %s", request)
logger.debug("save xml: %s", request)
session = self.get_session(request.session_id, context)
_, temp_path = tempfile.mkstemp()
@ -1503,7 +1504,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: Open-XML response or raise an exception if invalid XML file
"""
logging.debug("open xml: %s", request)
logger.debug("open xml: %s", request)
session = self.coreemu.create_session()
temp = tempfile.NamedTemporaryFile(delete=False)
temp.write(request.data.encode("utf-8"))
@ -1516,7 +1517,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
session.file_path = file_path
return core_pb2.OpenXmlResponse(session_id=session.id, result=True)
except IOError:
logging.exception("error opening session file")
logger.exception("error opening session file")
self.coreemu.delete_session(session.id)
context.abort(grpc.StatusCode.INVALID_ARGUMENT, "invalid xml file")
finally:
@ -1549,7 +1550,7 @@ class CoreGrpcServer(core_pb2_grpc.CoreApiServicer):
:param context: context object
:return: emane link response with success status
"""
logging.debug("emane link: %s", request)
logger.debug("emane link: %s", request)
session = self.get_session(request.session_id, context)
nem1 = request.nem1
iface1 = session.emane.get_iface(nem1)

View file

@ -55,6 +55,8 @@ from core.nodes.network import WlanNode
from core.nodes.physical import Rj45Node
from core.services.coreservices import ServiceManager, ServiceShim
logger = logging.getLogger(__name__)
class CoreHandler(socketserver.BaseRequestHandler):
"""
@ -104,7 +106,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:return: nothing
"""
logging.debug("new TCP connection: %s", self.client_address)
logger.debug("new TCP connection: %s", self.client_address)
def finish(self):
"""
@ -113,40 +115,40 @@ class CoreHandler(socketserver.BaseRequestHandler):
:return: nothing
"""
logging.debug("finishing request handler")
logging.debug("remaining message queue size: %s", self.message_queue.qsize())
logger.debug("finishing request handler")
logger.debug("remaining message queue size: %s", self.message_queue.qsize())
# give some time for message queue to deplete
timeout = 10
wait = 0
while not self.message_queue.empty():
logging.debug("waiting for message queue to empty: %s seconds", wait)
logger.debug("waiting for message queue to empty: %s seconds", wait)
time.sleep(1)
wait += 1
if wait == timeout:
logging.warning("queue failed to be empty, finishing request handler")
logger.warning("queue failed to be empty, finishing request handler")
break
logging.info("client disconnected: notifying threads")
logger.info("client disconnected: notifying threads")
self.done = True
for thread in self.handler_threads:
logging.info("waiting for thread: %s", thread.getName())
logger.info("waiting for thread: %s", thread.getName())
thread.join(timeout)
if thread.is_alive():
logging.warning(
logger.warning(
"joining %s failed: still alive after %s sec",
thread.getName(),
timeout,
)
logging.info("connection closed: %s", self.client_address)
logger.info("connection closed: %s", self.client_address)
if self.session:
# remove client from session broker and shutdown if there are no clients
self.remove_session_handlers()
clients = self.session_clients[self.session.id]
clients.remove(self)
if not clients and not self.session.is_active():
logging.info(
logger.info(
"no session clients left and not active, initiating shutdown"
)
self.coreemu.delete_session(self.session.id)
@ -218,7 +220,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.EventData event_data: event data to handle
:return: nothing
"""
logging.debug("handling broadcast event: %s", event_data)
logger.debug("handling broadcast event: %s", event_data)
tlv_data = structutils.pack_values(
coreapi.CoreEventTlv,
@ -236,7 +238,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
self.sendall(message)
except IOError:
logging.exception("error sending event message")
logger.exception("error sending event message")
def handle_broadcast_file(self, file_data):
"""
@ -245,7 +247,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.FileData file_data: file data to handle
:return: nothing
"""
logging.debug("handling broadcast file: %s", file_data)
logger.debug("handling broadcast file: %s", file_data)
tlv_data = structutils.pack_values(
coreapi.CoreFileTlv,
@ -266,7 +268,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
self.sendall(message)
except IOError:
logging.exception("error sending file message")
logger.exception("error sending file message")
def handle_broadcast_config(self, config_data):
"""
@ -275,12 +277,12 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.ConfigData config_data: config data to handle
:return: nothing
"""
logging.debug("handling broadcast config: %s", config_data)
logger.debug("handling broadcast config: %s", config_data)
message = dataconversion.convert_config(config_data)
try:
self.sendall(message)
except IOError:
logging.exception("error sending config message")
logger.exception("error sending config message")
def handle_broadcast_exception(self, exception_data):
"""
@ -289,7 +291,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.ExceptionData exception_data: exception data to handle
:return: nothing
"""
logging.debug("handling broadcast exception: %s", exception_data)
logger.debug("handling broadcast exception: %s", exception_data)
tlv_data = structutils.pack_values(
coreapi.CoreExceptionTlv,
[
@ -306,7 +308,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
self.sendall(message)
except IOError:
logging.exception("error sending exception message")
logger.exception("error sending exception message")
def handle_broadcast_node(self, node_data):
"""
@ -315,12 +317,12 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.NodeData node_data: node data to handle
:return: nothing
"""
logging.debug("handling broadcast node: %s", node_data)
logger.debug("handling broadcast node: %s", node_data)
message = dataconversion.convert_node(node_data)
try:
self.sendall(message)
except IOError:
logging.exception("error sending node message")
logger.exception("error sending node message")
def handle_broadcast_link(self, link_data):
"""
@ -329,7 +331,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param core.emulator.data.LinkData link_data: link data to handle
:return: nothing
"""
logging.debug("handling broadcast link: %s", link_data)
logger.debug("handling broadcast link: %s", link_data)
options_data = link_data.options
loss = ""
if options_data.loss is not None:
@ -381,7 +383,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
self.sendall(message)
except IOError:
logging.exception("error sending Event Message")
logger.exception("error sending Event Message")
def register(self):
"""
@ -389,7 +391,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:return: register message data
"""
logging.info(
logger.info(
"GUI has connected to session %d at %s", self.session.id, time.ctime()
)
tlv_data = b""
@ -461,14 +463,14 @@ class CoreHandler(socketserver.BaseRequestHandler):
header
)
if message_len == 0:
logging.warning("received message with no data")
logger.warning("received message with no data")
data = b""
while len(data) < message_len:
data += self.request.recv(message_len - len(data))
if len(data) > message_len:
error_message = f"received message length does not match received data ({len(data)} != {message_len})"
logging.error(error_message)
logger.error(error_message)
raise IOError(error_message)
try:
@ -477,7 +479,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
except KeyError:
message = coreapi.CoreMessage(message_flags, header, data)
message.message_type = message_type
logging.exception("unimplemented core message type: %s", message.type_str())
logger.exception("unimplemented core message type: %s", message.type_str())
return message
@ -488,7 +490,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param message: message to queue
:return: nothing
"""
logging.debug(
logger.debug(
"queueing msg (queuedtimes = %s): type %s",
message.queuedtimes,
MessageTypes(message.message_type),
@ -518,11 +520,11 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param message: message to handle
:return: nothing
"""
logging.debug(
logger.debug(
"%s handling message:\n%s", threading.currentThread().getName(), message
)
if message.message_type not in self.message_handlers:
logging.error("no handler for message type: %s", message.type_str())
logger.error("no handler for message type: %s", message.type_str())
return
message_handler = self.message_handlers[message.message_type]
@ -532,7 +534,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.dispatch_replies(replies, message)
except Exception as e:
self.send_exception(ExceptionLevels.ERROR, "corehandler", str(e))
logging.exception(
logger.exception(
"%s: exception while handling message: %s",
threading.currentThread().getName(),
message,
@ -560,12 +562,12 @@ class CoreHandler(socketserver.BaseRequestHandler):
# multiple TLVs of same type cause KeyError exception
reply_message = f"CoreMessage (type {message_type} flags {message_flags} length {message_length})"
logging.debug("sending reply:\n%s", reply_message)
logger.debug("sending reply:\n%s", reply_message)
try:
self.sendall(reply)
except IOError:
logging.exception("error dispatching reply")
logger.exception("error dispatching reply")
def handle(self):
"""
@ -580,7 +582,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
# TODO: add shutdown handler for session
self.session = self.coreemu.create_session(port)
logging.debug("created new session for client: %s", self.session.id)
logger.debug("created new session for client: %s", self.session.id)
clients = self.session_clients.setdefault(self.session.id, [])
clients.append(self)
@ -594,10 +596,10 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
message = self.receive_message()
except EOFError:
logging.info("client disconnected")
logger.info("client disconnected")
break
except IOError:
logging.exception("error receiving message")
logger.exception("error receiving message")
break
message.queuedtimes = 0
@ -619,7 +621,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
if client == self:
continue
logging.debug("BROADCAST TO OTHER CLIENT: %s", client)
logger.debug("BROADCAST TO OTHER CLIENT: %s", client)
client.sendall(message.raw_message)
def send_exception(self, level, source, text, node=None):
@ -643,7 +645,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.handle_broadcast_exception(exception_data)
def add_session_handlers(self):
logging.debug("adding session broadcast handlers")
logger.debug("adding session broadcast handlers")
self.session.event_handlers.append(self.handle_broadcast_event)
self.session.exception_handlers.append(self.handle_broadcast_exception)
self.session.node_handlers.append(self.handle_broadcast_node)
@ -652,7 +654,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.session.config_handlers.append(self.handle_broadcast_config)
def remove_session_handlers(self):
logging.debug("removing session broadcast handlers")
logger.debug("removing session broadcast handlers")
self.session.event_handlers.remove(self.handle_broadcast_event)
self.session.exception_handlers.remove(self.handle_broadcast_exception)
self.session.node_handlers.remove(self.handle_broadcast_node)
@ -672,7 +674,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
message.flags & MessageFlags.ADD.value
and message.flags & MessageFlags.DELETE.value
):
logging.warning("ignoring invalid message: add and delete flag both set")
logger.warning("ignoring invalid message: add and delete flag both set")
return ()
_class = CoreNode
@ -898,7 +900,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
else:
node.cmd(command, wait=False)
except CoreError:
logging.exception("error getting object: %s", node_id)
logger.exception("error getting object: %s", node_id)
# XXX wait and queue this message to try again later
# XXX maybe this should be done differently
if not message.flags & MessageFlags.LOCAL.value:
@ -920,7 +922,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
execute_server = message.get_tlv(RegisterTlvs.EXECUTE_SERVER.value)
if execute_server:
try:
logging.info("executing: %s", execute_server)
logger.info("executing: %s", execute_server)
if message.flags & MessageFlags.STRING.value:
old_session_ids = set(self.coreemu.sessions.keys())
sys.argv = shlex.split(execute_server)
@ -946,26 +948,26 @@ class CoreHandler(socketserver.BaseRequestHandler):
new_sid = new_session_ids.difference(old_session_ids)
try:
sid = new_sid.pop()
logging.info("executed: %s as session %d", execute_server, sid)
logger.info("executed: %s as session %d", execute_server, sid)
except KeyError:
logging.info(
logger.info(
"executed %s with unknown session ID", execute_server
)
return replies
logging.debug("checking session %d for RUNTIME state", sid)
logger.debug("checking session %d for RUNTIME state", sid)
session = self.coreemu.sessions.get(sid)
retries = 10
# wait for session to enter RUNTIME state, to prevent GUI from
# connecting while nodes are still being instantiated
while session.state != EventTypes.RUNTIME_STATE:
logging.debug(
logger.debug(
"waiting for session %d to enter RUNTIME state", sid
)
time.sleep(1)
retries -= 1
if retries <= 0:
logging.debug("session %d did not enter RUNTIME state", sid)
logger.debug("session %d did not enter RUNTIME state", sid)
return replies
tlv_data = coreapi.CoreRegisterTlv.pack(
@ -977,7 +979,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
message = coreapi.CoreRegMessage.pack(0, tlv_data)
replies.append(message)
except Exception as e:
logging.exception("error executing: %s", execute_server)
logger.exception("error executing: %s", execute_server)
tlv_data = coreapi.CoreExceptionTlv.pack(ExceptionTlvs.LEVEL.value, 2)
tlv_data += coreapi.CoreExceptionTlv.pack(
ExceptionTlvs.TEXT.value, str(e)
@ -989,7 +991,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
gui = message.get_tlv(RegisterTlvs.GUI.value)
if gui is None:
logging.debug("ignoring Register message")
logger.debug("ignoring Register message")
else:
# register capabilities with the GUI
replies.append(self.register())
@ -1020,7 +1022,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
network_id=message.get_tlv(ConfigTlvs.NETWORK_ID.value),
opaque=message.get_tlv(ConfigTlvs.OPAQUE.value),
)
logging.debug(
logger.debug(
"configuration message for %s node %s", config_data.object, config_data.node
)
message_type = ConfigFlags(config_data.type)
@ -1095,7 +1097,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.session.location.reset()
else:
if not config_data.data_values:
logging.warning("location data missing")
logger.warning("location data missing")
else:
values = [float(x) for x in config_data.data_values.split("|")]
@ -1108,7 +1110,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
# geographic reference point
self.session.location.setrefgeo(lat, lon, alt)
self.session.location.refscale = values[5]
logging.info(
logger.info(
"location configured: %s = %s scale=%s",
self.session.location.refxyz,
self.session.location.refgeo,
@ -1145,7 +1147,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
def handle_config_broker(self, message_type, config_data):
if message_type not in [ConfigFlags.REQUEST, ConfigFlags.RESET]:
if not config_data.data_values:
logging.info("emulation server data missing")
logger.info("emulation server data missing")
else:
values = config_data.data_values.split("|")
@ -1169,7 +1171,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
session_id = config_data.session
opaque = config_data.opaque
logging.debug(
logger.debug(
"configuration request: node(%s) session(%s) opaque(%s)",
node_id,
session_id,
@ -1199,10 +1201,10 @@ class CoreHandler(socketserver.BaseRequestHandler):
values = []
group_strings = []
start_index = 1
logging.debug("sorted groups: %s", groups)
logger.debug("sorted groups: %s", groups)
for group in groups:
services = sorted(group_map[group], key=lambda x: x.name.lower())
logging.debug("sorted services for group(%s): %s", group, services)
logger.debug("sorted services for group(%s): %s", group, services)
end_index = start_index + len(services) - 1
group_strings.append(f"{group}:{start_index}-{end_index}")
start_index += len(services)
@ -1226,7 +1228,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
node = self.session.get_node(node_id, CoreNodeBase)
if node is None:
logging.warning(
logger.warning(
"request to configure service for unknown node %s", node_id
)
return replies
@ -1285,7 +1287,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
error_message = "services config message that I don't know how to handle"
if values is None:
logging.error(error_message)
logger.error(error_message)
else:
if opaque is None:
values = values.split("|")
@ -1294,11 +1296,11 @@ class CoreHandler(socketserver.BaseRequestHandler):
data_types is None
or data_types[0] != ConfigDataTypes.STRING.value
):
logging.info(error_message)
logger.info(error_message)
return None
key = values.pop(0)
self.session.services.default_services[key] = values
logging.debug("default services for type %s set to %s", key, values)
logger.debug("default services for type %s set to %s", key, values)
elif node_id:
services = ServiceShim.servicesfromopaque(opaque)
if services:
@ -1337,16 +1339,16 @@ class CoreHandler(socketserver.BaseRequestHandler):
values_str = config_data.data_values
node_id = utils.iface_config_id(node_id, iface_id)
logging.debug(
logger.debug(
"received configure message for %s nodenum: %s", object_name, node_id
)
if message_type == ConfigFlags.REQUEST:
logging.info("replying to configure request for model: %s", object_name)
logger.info("replying to configure request for model: %s", object_name)
typeflags = ConfigFlags.NONE.value
model_class = self.session.mobility.models.get(object_name)
if not model_class:
logging.warning("model class does not exist: %s", object_name)
logger.warning("model class does not exist: %s", object_name)
return []
config = self.session.mobility.get_model_config(node_id, object_name)
@ -1357,7 +1359,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
elif message_type != ConfigFlags.RESET:
# store the configuration values for later use, when the node
if not object_name:
logging.warning("no configuration object for node: %s", node_id)
logger.warning("no configuration object for node: %s", node_id)
return []
parsed_config = {}
@ -1371,7 +1373,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
if object_name == BasicRangeModel.name:
node.updatemodel(parsed_config)
except CoreError:
logging.error(
logger.error(
"skipping mobility configuration for unknown node: %s", node_id
)
@ -1385,11 +1387,11 @@ class CoreHandler(socketserver.BaseRequestHandler):
values_str = config_data.data_values
node_id = utils.iface_config_id(node_id, iface_id)
logging.debug(
logger.debug(
"received configure message for %s nodenum: %s", object_name, node_id
)
if message_type == ConfigFlags.REQUEST:
logging.info("replying to configure request for %s model", object_name)
logger.info("replying to configure request for %s model", object_name)
typeflags = ConfigFlags.NONE.value
config = self.session.emane.get_configs()
config_response = ConfigShim.config_data(
@ -1398,7 +1400,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
replies.append(config_response)
elif message_type != ConfigFlags.RESET:
if not object_name:
logging.info("no configuration object for node %s", node_id)
logger.info("no configuration object for node %s", node_id)
return []
if values_str:
@ -1415,16 +1417,16 @@ class CoreHandler(socketserver.BaseRequestHandler):
values_str = config_data.data_values
node_id = utils.iface_config_id(node_id, iface_id)
logging.debug(
logger.debug(
"received configure message for %s nodenum: %s", object_name, node_id
)
if message_type == ConfigFlags.REQUEST:
logging.info("replying to configure request for model: %s", object_name)
logger.info("replying to configure request for model: %s", object_name)
typeflags = ConfigFlags.NONE.value
model_class = self.session.emane.models.get(object_name)
if not model_class:
logging.warning("model class does not exist: %s", object_name)
logger.warning("model class does not exist: %s", object_name)
return []
config = self.session.emane.get_model_config(node_id, object_name)
@ -1435,7 +1437,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
elif message_type != ConfigFlags.RESET:
# store the configuration values for later use, when the node
if not object_name:
logging.warning("no configuration object for node: %s", node_id)
logger.warning("no configuration object for node: %s", node_id)
return []
parsed_config = {}
@ -1464,13 +1466,11 @@ class CoreHandler(socketserver.BaseRequestHandler):
compressed_data = message.get_tlv(FileTlvs.COMPRESSED_DATA.value)
if compressed_data:
logging.warning(
"Compressed file data not implemented for File message."
)
logger.warning("Compressed file data not implemented for File message.")
return ()
if src_path and data:
logging.warning(
logger.warning(
"ignoring invalid File message: source and data TLVs are both present"
)
return ()
@ -1487,7 +1487,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
elif file_type.startswith("hook:"):
_, state = file_type.split(":")[:2]
if not state.isdigit():
logging.error("error setting hook having state '%s'", state)
logger.error("error setting hook having state '%s'", state)
return ()
state = int(state)
state = EventTypes(state)
@ -1517,7 +1517,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
:param message: interface message to handle
:return: reply messages
"""
logging.info("ignoring Interface message")
logger.info("ignoring Interface message")
return ()
def handle_event_message(self, message):
@ -1543,7 +1543,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
raise NotImplementedError("Event message missing event type")
node_id = event_data.node
logging.debug("handling event %s at %s", event_type.name, time.ctime())
logger.debug("handling event %s at %s", event_type.name, time.ctime())
if event_type.value <= EventTypes.SHUTDOWN_STATE.value:
if node_id is not None:
node = self.session.get_node(node_id, NodeBase)
@ -1555,7 +1555,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.session.start_mobility(node_ids=[node.id])
return ()
logging.warning(
logger.warning(
"dropping unhandled event message for node: %s", node.name
)
return ()
@ -1580,12 +1580,12 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.send_node_emulation_id(_id)
elif event_type == EventTypes.RUNTIME_STATE:
self.session.set_state(event_type)
logging.warning("Unexpected event message: RUNTIME state received")
logger.warning("Unexpected event message: RUNTIME state received")
elif event_type == EventTypes.DATACOLLECT_STATE:
self.session.data_collect()
elif event_type == EventTypes.SHUTDOWN_STATE:
self.session.set_state(event_type)
logging.warning("Unexpected event message: SHUTDOWN state received")
logger.warning("Unexpected event message: SHUTDOWN state received")
elif event_type in {
EventTypes.START,
EventTypes.STOP,
@ -1605,7 +1605,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.session.mobility_event(event_data)
handled = True
if not handled:
logging.warning(
logger.warning(
"unhandled event message: event type %s, name %s ",
event_type.name,
name,
@ -1624,7 +1624,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
name = event_data.name
data = event_data.data
if etime is None:
logging.warning("Event message scheduled event missing start time")
logger.warning("Event message scheduled event missing start time")
return ()
if message.flags & MessageFlags.ADD.value:
self.session.add_event(
@ -1650,7 +1650,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
node = self.session.get_node(node_id, CoreNodeBase)
except CoreError:
logging.warning(
logger.warning(
"ignoring event for service '%s', unknown node '%s'", name, node_id
)
return
@ -1692,7 +1692,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
if num > 1:
unknown_data += ", "
num -= 1
logging.warning("Event requested for unknown service(s): %s", unknown_data)
logger.warning("Event requested for unknown service(s): %s", unknown_data)
unknown_data = f"Unknown:{unknown_data}"
event_data = EventData(
@ -1720,7 +1720,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
files = coreapi.str_to_list(file_str)
thumb = message.get_tlv(SessionTlvs.THUMB.value)
user = message.get_tlv(SessionTlvs.USER.value)
logging.debug(
logger.debug(
"SESSION message flags=0x%x sessions=%s", message.flags, session_id_str
)
@ -1732,7 +1732,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
else:
session = self.coreemu.sessions.get(session_id)
if session is None:
logging.warning("session %s not found", session_id)
logger.warning("session %s not found", session_id)
continue
if names is not None:
session.name = names[index]
@ -1756,14 +1756,14 @@ class CoreHandler(socketserver.BaseRequestHandler):
session = self.coreemu.sessions.get(session_id)
if session is None:
logging.info(
logger.info(
"session %s not found (flags=0x%x)", session_id, message.flags
)
continue
if message.flags & MessageFlags.ADD.value:
# connect to the first session that exists
logging.info("request to connect to session %s", session_id)
logger.info("request to connect to session %s", session_id)
# remove client from session broker and shutdown if needed
self.remove_session_handlers()
@ -1780,7 +1780,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
clients.append(self)
# add broadcast handlers
logging.info("adding session broadcast handlers")
logger.info("adding session broadcast handlers")
self.add_session_handlers()
if user:
@ -1790,12 +1790,10 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.send_objects()
elif message.flags & MessageFlags.DELETE.value:
# shut down the specified session(s)
logging.info("request to terminate session %s", session_id)
logger.info("request to terminate session %s", session_id)
self.coreemu.delete_session(session_id)
else:
logging.warning(
"unhandled session flags for session %s", session_id
)
logger.warning("unhandled session flags for session %s", session_id)
return ()
@ -1817,9 +1815,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
try:
self.sendall(reply)
except IOError:
logging.exception(
"error sending node emulation id message: %s", node_id
)
logger.exception("error sending node emulation id message: %s", node_id)
del self.node_status_request[node_id]
@ -1845,7 +1841,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
for model_name in mobility_configs:
config = mobility_configs[model_name]
model_class = self.session.mobility.models[model_name]
logging.debug(
logger.debug(
"mobility config: node(%s) class(%s) values(%s)",
node_id,
model_class,
@ -1858,7 +1854,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
# send global emane config
config = self.session.emane.get_configs()
logging.debug("global emane config: values(%s)", config)
logger.debug("global emane config: values(%s)", config)
config_data = ConfigShim.config_data(
0, None, ConfigFlags.UPDATE.value, self.session.emane.emane_config, config
)
@ -1870,7 +1866,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
for model_name in emane_configs:
config = emane_configs[model_name]
model_class = self.session.emane.models[model_name]
logging.debug(
logger.debug(
"emane config: node(%s) class(%s) values(%s)",
node_id,
model_class,
@ -1951,7 +1947,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
self.session.broadcast_config(config_data)
node_count = self.session.get_node_count()
logging.info(
logger.info(
"informed GUI about %d nodes and %d links", node_count, len(all_links)
)
@ -1991,11 +1987,11 @@ class CoreUdpHandler(CoreHandler):
header
)
if message_len == 0:
logging.warning("received message with no data")
logger.warning("received message with no data")
return
if len(data) != coreapi.CoreMessage.header_len + message_len:
logging.error(
logger.error(
"received message length does not match received data (%s != %s)",
len(data),
coreapi.CoreMessage.header_len + message_len,
@ -2013,7 +2009,7 @@ class CoreUdpHandler(CoreHandler):
message_flags, header, data[coreapi.CoreMessage.header_len :]
)
message.msgtype = message_type
logging.exception("unimplemented core message type: %s", message.type_str())
logger.exception("unimplemented core message type: %s", message.type_str())
def handle(self):
message = self.receive_message()
@ -2023,12 +2019,12 @@ class CoreUdpHandler(CoreHandler):
for session_id in sessions:
session = self.server.mainserver.coreemu.sessions.get(session_id)
if session:
logging.debug("session handling message: %s", session.id)
logger.debug("session handling message: %s", session.id)
self.session = session
self.handle_message(message)
self.broadcast(message)
else:
logging.error(
logger.error(
"session %d in %s message not found.",
session_id,
message.type_str(),
@ -2052,7 +2048,7 @@ class CoreUdpHandler(CoreHandler):
self.handle_message(message)
self.broadcast(message)
else:
logging.error(
logger.error(
"no active session, dropping %s message.", message.type_str()
)
@ -2065,7 +2061,7 @@ class CoreUdpHandler(CoreHandler):
try:
client.sendall(message.raw_message)
except IOError:
logging.error("error broadcasting")
logger.error("error broadcasting")
def finish(self):
return socketserver.BaseRequestHandler.finish(self)

View file

@ -10,6 +10,8 @@ from core.api.tlv.enumerations import ConfigTlvs, NodeTlvs
from core.config import ConfigGroup, ConfigurableOptions
from core.emulator.data import ConfigData, NodeData
logger = logging.getLogger(__name__)
def convert_node(node_data: NodeData):
"""
@ -139,9 +141,9 @@ class ConfigShim:
captions = None
data_types = []
possible_values = []
logging.debug("configurable: %s", configurable_options)
logging.debug("configuration options: %s", configurable_options.configurations)
logging.debug("configuration data: %s", config)
logger.debug("configurable: %s", configurable_options)
logger.debug("configuration options: %s", configurable_options.configurations)
logger.debug("configuration data: %s", config)
for configuration in configurable_options.configurations():
if not captions:
captions = configuration.label

View file

@ -4,6 +4,8 @@ Utilities for working with python struct data.
import logging
logger = logging.getLogger(__name__)
def pack_values(clazz, packers):
"""
@ -15,7 +17,7 @@ def pack_values(clazz, packers):
"""
# iterate through tuples of values to pack
logging.debug("packing: %s", packers)
logger.debug("packing: %s", packers)
data = b""
for packer in packers:
# check if a transformer was provided for valid values
@ -37,7 +39,7 @@ def pack_values(clazz, packers):
value = transformer(value)
# pack and add to existing data
logging.debug("packing: %s - %s type(%s)", tlv_type, value, type(value))
logger.debug("packing: %s - %s type(%s)", tlv_type, value, type(value))
data += clazz.pack(tlv_type.value, value)
return data

View file

@ -12,6 +12,8 @@ from core.emulator.enumerations import ConfigDataTypes
from core.errors import CoreConfigError
from core.nodes.network import WlanNode
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.location.mobility import WirelessModel
@ -178,7 +180,7 @@ class ConfigurableManager:
:param config_type: configuration type to store configuration for
:return: nothing
"""
logging.debug(
logger.debug(
"setting config for node(%s) type(%s): %s", node_id, config_type, config
)
node_configs = self.node_configurations.setdefault(node_id, OrderedDict())
@ -310,7 +312,7 @@ class ModelManager(ConfigurableManager):
:param config: model configuration, None for default configuration
:return: nothing
"""
logging.debug(
logger.debug(
"setting model(%s) for node(%s): %s", model_class.name, node.id, config
)
self.set_model_config(node.id, model_class.name, config)
@ -339,5 +341,5 @@ class ModelManager(ConfigurableManager):
model_class = self.models[model_name]
models.append((model_class, config))
logging.debug("models for node(%s): %s", node.id, models)
logger.debug("models for node(%s): %s", node.id, models)
return models

View file

@ -14,6 +14,7 @@ from core.config import Configuration
from core.errors import CoreCommandError, CoreError
from core.nodes.base import CoreNode
logger = logging.getLogger(__name__)
TEMPLATES_DIR: str = "templates"
@ -133,7 +134,7 @@ class ConfigService(abc.ABC):
:return: nothing
:raises ConfigServiceBootError: when there is an error starting service
"""
logging.info("node(%s) service(%s) starting...", self.node.name, self.name)
logger.info("node(%s) service(%s) starting...", self.node.name, self.name)
self.create_dirs()
self.create_files()
wait = self.validation_mode == ConfigServiceMode.BLOCKING
@ -154,7 +155,7 @@ class ConfigService(abc.ABC):
try:
self.node.cmd(cmd)
except CoreCommandError:
logging.exception(
logger.exception(
f"node({self.node.name}) service({self.name}) "
f"failed shutdown: {cmd}"
)
@ -250,7 +251,7 @@ class ConfigService(abc.ABC):
else:
text = self.get_text_template(name)
rendered = self.render_text(text, data)
logging.debug(
logger.debug(
"node(%s) service(%s) template(%s): \n%s",
self.node.name,
self.name,
@ -301,7 +302,7 @@ class ConfigService(abc.ABC):
del cmds[index]
index += 1
except CoreCommandError:
logging.debug(
logger.debug(
f"node({self.node.name}) service({self.name}) "
f"validate command failed: {cmd}"
)

View file

@ -1,6 +1,8 @@
import logging
from typing import TYPE_CHECKING, Dict, List, Set
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.configservice.base import ConfigService
@ -41,7 +43,7 @@ class ConfigServiceDependencies:
for name in self.node_services:
service = self.node_services[name]
if service.name in self.started:
logging.debug(
logger.debug(
"skipping service that will already be started: %s", service.name
)
continue
@ -75,7 +77,7 @@ class ConfigServiceDependencies:
:param service: service to check dependencies for
:return: list of config services to start in order
"""
logging.debug("starting service dependency check: %s", service.name)
logger.debug("starting service dependency check: %s", service.name)
self._reset()
return self._visit(service)
@ -86,7 +88,7 @@ class ConfigServiceDependencies:
:param current_service: service being visited
:return: list of dependent services for a visited service
"""
logging.debug("visiting service(%s): %s", current_service.name, self.path)
logger.debug("visiting service(%s): %s", current_service.name, self.path)
self.visited.add(current_service.name)
self.visiting.add(current_service.name)
@ -109,7 +111,7 @@ class ConfigServiceDependencies:
self._visit(service)
# add service when bottom is found
logging.debug("adding service to startup path: %s", current_service.name)
logger.debug("adding service to startup path: %s", current_service.name)
self.started.add(current_service.name)
self.path.append(current_service)
self.visiting.remove(current_service.name)

View file

@ -7,6 +7,8 @@ from core import utils
from core.configservice.base import ConfigService
from core.errors import CoreError
logger = logging.getLogger(__name__)
class ConfigServiceManager:
"""
@ -41,7 +43,7 @@ class ConfigServiceManager:
:raises CoreError: when service is a duplicate or has unmet executables
"""
name = service.name
logging.debug(
logger.debug(
"loading service: class(%s) name(%s)", service.__class__.__name__, name
)
@ -71,12 +73,12 @@ class ConfigServiceManager:
subdirs.append(path)
service_errors = []
for subdir in subdirs:
logging.debug("loading config services from: %s", subdir)
logger.debug("loading config services from: %s", subdir)
services = utils.load_classes(subdir, ConfigService)
for service in services:
try:
self.add(service)
except CoreError as e:
service_errors.append(service.name)
logging.debug("not loading service(%s): %s", service.name, e)
logger.debug("not loading service(%s): %s", service.name, e)
return service_errors

View file

@ -9,6 +9,7 @@ from core.nodes.base import CoreNodeBase
from core.nodes.interface import DEFAULT_MTU, CoreInterface
from core.nodes.network import WlanNode
logger = logging.getLogger(__name__)
GROUP: str = "Quagga"
QUAGGA_STATE_DIR: str = "/var/run/quagga"
@ -229,7 +230,7 @@ class Ospfv3mdr(Ospfv3):
def data(self) -> Dict[str, Any]:
for iface in self.node.get_ifaces():
is_wireless = isinstance(iface.net, (WlanNode, EmaneNet))
logging.info("MDR wireless: %s", is_wireless)
logger.info("MDR wireless: %s", is_wireless)
return dict()
def quagga_iface_config(self, iface: CoreInterface) -> str:

View file

@ -14,6 +14,8 @@ from core.emulator.data import LinkOptions
from core.nodes.interface import CoreInterface
from core.xml import emanexml
logger = logging.getLogger(__name__)
try:
from emane.events.commeffectevent import CommEffectEvent
except ImportError:
@ -21,7 +23,7 @@ except ImportError:
from emanesh.events.commeffectevent import CommEffectEvent
except ImportError:
CommEffectEvent = None
logging.debug("compatible emane python bindings not installed")
logger.debug("compatible emane python bindings not installed")
def convert_none(x: float) -> int:
@ -113,11 +115,11 @@ class EmaneCommEffectModel(emanemodel.EmaneModel):
"""
service = self.session.emane.service
if service is None:
logging.warning("%s: EMANE event service unavailable", self.name)
logger.warning("%s: EMANE event service unavailable", self.name)
return
if iface is None or iface2 is None:
logging.warning("%s: missing NEM information", self.name)
logger.warning("%s: missing NEM information", self.name)
return
# TODO: batch these into multiple events per transmission
@ -125,7 +127,7 @@ class EmaneCommEffectModel(emanemodel.EmaneModel):
event = CommEffectEvent()
nem1 = self.session.emane.get_nem_id(iface)
nem2 = self.session.emane.get_nem_id(iface2)
logging.info("sending comm effect event")
logger.info("sending comm effect event")
event.append(
nem1,
latency=convert_none(options.delay),

View file

@ -34,6 +34,8 @@ from core.nodes.base import CoreNetworkBase, CoreNode, CoreNodeBase, NodeBase
from core.nodes.interface import CoreInterface, TunTap
from core.xml import emanexml
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -51,7 +53,7 @@ except ImportError:
LocationEvent = None
PathlossEvent = None
EventServiceException = None
logging.debug("compatible emane python bindings not installed")
logger.debug("compatible emane python bindings not installed")
EMANE_MODELS = [
EmaneRfPipeModel,
@ -174,11 +176,11 @@ class EmaneManager(ModelManager):
# check for emane
path = utils.which("emane", required=False)
if not path:
logging.info("emane is not installed")
logger.info("emane is not installed")
return
# get version
emane_version = utils.cmd("emane --version")
logging.info("using emane: %s", emane_version)
logger.info("using emane: %s", emane_version)
# load default emane models
self.load_models(EMANE_MODELS)
# load custom models
@ -214,7 +216,7 @@ class EmaneManager(ModelManager):
self.event_device = self.get_config("eventservicedevice")
eventnetidx = self.session.get_control_net_index(self.event_device)
if eventnetidx < 0:
logging.error(
logger.error(
"invalid emane event service device provided: %s", self.event_device
)
return
@ -230,18 +232,18 @@ class EmaneManager(ModelManager):
# disabled otachannel for event service
# only needed for e.g. antennaprofile events xmit by models
logging.info("using %s for event service traffic", self.event_device)
logger.info("using %s for event service traffic", self.event_device)
try:
self.service = EventService(eventchannel=self.eventchannel, otachannel=None)
except EventServiceException:
logging.exception("error instantiating emane EventService")
logger.exception("error instantiating emane EventService")
def load_models(self, emane_models: List[Type[EmaneModel]]) -> None:
"""
Load EMANE models and make them available.
"""
for emane_model in emane_models:
logging.debug("loading emane model: %s", emane_model.__name__)
logger.debug("loading emane model: %s", emane_model.__name__)
emane_prefix = self.session.options.get_config(
"emane_prefix", default=DEFAULT_EMANE_PREFIX
)
@ -281,17 +283,17 @@ class EmaneManager(ModelManager):
:return: SUCCESS, NOT_NEEDED, NOT_READY in order to delay session
instantiation
"""
logging.debug("emane setup")
logger.debug("emane setup")
with self.session.nodes_lock:
for node_id in self.session.nodes:
node = self.session.nodes[node_id]
if isinstance(node, EmaneNet):
logging.debug(
logger.debug(
"adding emane node: id(%s) name(%s)", node.id, node.name
)
self.add_node(node)
if not self._emane_nets:
logging.debug("no emane nodes in session")
logger.debug("no emane nodes in session")
return EmaneState.NOT_NEEDED
# check if bindings were installed
@ -302,9 +304,9 @@ class EmaneManager(ModelManager):
# - needs to exist when eventservice binds to it (initeventservice)
otadev = self.get_config("otamanagerdevice")
netidx = self.session.get_control_net_index(otadev)
logging.debug("emane ota manager device: index(%s) otadev(%s)", netidx, otadev)
logger.debug("emane ota manager device: index(%s) otadev(%s)", netidx, otadev)
if netidx < 0:
logging.error(
logger.error(
"EMANE cannot start, check core config. invalid OTA device provided: %s",
otadev,
)
@ -314,12 +316,12 @@ class EmaneManager(ModelManager):
net_index=netidx, remove=False, conf_required=False
)
eventdev = self.get_config("eventservicedevice")
logging.debug("emane event service device: eventdev(%s)", eventdev)
logger.debug("emane event service device: eventdev(%s)", eventdev)
if eventdev != otadev:
netidx = self.session.get_control_net_index(eventdev)
logging.debug("emane event service device index: %s", netidx)
logger.debug("emane event service device index: %s", netidx)
if netidx < 0:
logging.error(
logger.error(
"emane cannot start due to invalid event service device: %s",
eventdev,
)
@ -346,7 +348,7 @@ class EmaneManager(ModelManager):
self.starteventmonitor()
self.buildeventservicexml()
with self._emane_node_lock:
logging.info("emane building xmls...")
logger.info("emane building xmls...")
start_data = self.get_start_data()
for data in start_data:
self.start_node(data)
@ -359,11 +361,11 @@ class EmaneManager(ModelManager):
for node_id in sorted(self._emane_nets):
emane_net = self._emane_nets[node_id]
if not emane_net.model:
logging.error("emane net(%s) has no model", emane_net.name)
logger.error("emane net(%s) has no model", emane_net.name)
continue
for iface in emane_net.get_ifaces():
if not iface.node:
logging.error(
logger.error(
"emane net(%s) connected interface(%s) missing node",
emane_net.name,
iface.name,
@ -403,7 +405,7 @@ class EmaneManager(ModelManager):
with path.open("a") as f:
f.write(f"{iface.node.name} {iface.name} {nem_id}\n")
except IOError:
logging.exception("error writing to emane nem file")
logger.exception("error writing to emane nem file")
def links_enabled(self) -> bool:
return self.get_config("link_enabled") == "1"
@ -417,7 +419,7 @@ class EmaneManager(ModelManager):
with self._emane_node_lock:
for node_id in sorted(self._emane_nets):
emane_net = self._emane_nets[node_id]
logging.debug(
logger.debug(
"post startup for emane node: %s - %s", emane_net.id, emane_net.name
)
emane_net.model.post_startup()
@ -441,7 +443,7 @@ class EmaneManager(ModelManager):
with self._emane_node_lock:
if not self._emane_nets:
return
logging.info("stopping EMANE daemons")
logger.info("stopping EMANE daemons")
if self.links_enabled():
self.link_monitor.stop()
# shutdown interfaces and stop daemons
@ -467,11 +469,11 @@ class EmaneManager(ModelManager):
"""
for node_id in self._emane_nets:
emane_net = self._emane_nets[node_id]
logging.debug("checking emane model for node: %s", node_id)
logger.debug("checking emane model for node: %s", node_id)
# skip nodes that already have a model set
if emane_net.model:
logging.debug(
logger.debug(
"node(%s) already has model(%s)", emane_net.id, emane_net.model.name
)
continue
@ -480,11 +482,11 @@ class EmaneManager(ModelManager):
# before nodes exist
model_name = self.node_models.get(node_id)
if not model_name:
logging.error("emane node(%s) has no node model", node_id)
logger.error("emane node(%s) has no node model", node_id)
raise ValueError("emane node has no model set")
config = self.get_model_config(node_id=node_id, model_name=model_name)
logging.debug("setting emane model(%s) config(%s)", model_name, config)
logger.debug("setting emane model(%s) config(%s)", model_name, config)
model_class = self.models[model_name]
emane_net.setmodel(model_class, config)
@ -493,12 +495,12 @@ class EmaneManager(ModelManager):
) -> Optional[LinkData]:
iface1 = self.get_iface(nem1)
if not iface1:
logging.error("invalid nem: %s", nem1)
logger.error("invalid nem: %s", nem1)
return None
node1 = iface1.node
iface2 = self.get_iface(nem2)
if not iface2:
logging.error("invalid nem: %s", nem2)
logger.error("invalid nem: %s", nem2)
return None
node2 = iface2.node
if iface1.net != iface2.net:
@ -535,7 +537,7 @@ class EmaneManager(ModelManager):
try:
group, port = self.get_config("eventservicegroup").split(":")
except ValueError:
logging.exception("invalid eventservicegroup in EMANE config")
logger.exception("invalid eventservicegroup in EMANE config")
return
dev = self.get_config("eventservicedevice")
@ -551,12 +553,12 @@ class EmaneManager(ModelManager):
Start one EMANE daemon per node having a radio.
Add a control network even if the user has not configured one.
"""
logging.info("starting emane daemons...")
logger.info("starting emane daemons...")
loglevel = str(EmaneManager.DEFAULT_LOG_LEVEL)
cfgloglevel = self.session.options.get_config_int("emane_log_level")
realtime = self.session.options.get_config_bool("emane_realtime", default=True)
if cfgloglevel:
logging.info("setting user-defined emane log level: %d", cfgloglevel)
logger.info("setting user-defined emane log level: %d", cfgloglevel)
loglevel = str(cfgloglevel)
emanecmd = f"emane -d -l {loglevel}"
if realtime:
@ -574,17 +576,17 @@ class EmaneManager(ModelManager):
node, 0, remove=False, conf_required=False
)
if otanetidx > 0:
logging.info("adding ota device ctrl%d", otanetidx)
logger.info("adding ota device ctrl%d", otanetidx)
self.session.add_remove_control_iface(
node, otanetidx, remove=False, conf_required=False
)
if eventservicenetidx >= 0:
logging.info("adding event service device ctrl%d", eventservicenetidx)
logger.info("adding event service device ctrl%d", eventservicenetidx)
self.session.add_remove_control_iface(
node, eventservicenetidx, remove=False, conf_required=False
)
# multicast route is needed for OTA data
logging.info("OTA GROUP(%s) OTA DEV(%s)", otagroup, otadev)
logger.info("OTA GROUP(%s) OTA DEV(%s)", otagroup, otadev)
node.node_net_client.create_route(otagroup, otadev)
# multicast route is also needed for event data if on control network
if eventservicenetidx >= 0 and eventgroup != otagroup:
@ -594,13 +596,13 @@ class EmaneManager(ModelManager):
platform_xml = node.directory / f"{node.name}-platform.xml"
args = f"{emanecmd} -f {log_file} {platform_xml}"
node.cmd(args)
logging.info("node(%s) emane daemon running: %s", node.name, args)
logger.info("node(%s) emane daemon running: %s", node.name, args)
else:
log_file = self.session.directory / f"{node.name}-emane.log"
platform_xml = self.session.directory / f"{node.name}-platform.xml"
args = f"{emanecmd} -f {log_file} {platform_xml}"
node.host_cmd(args, cwd=self.session.directory)
logging.info("node(%s) host emane daemon running: %s", node.name, args)
logger.info("node(%s) host emane daemon running: %s", node.name, args)
def install_iface(self, iface: CoreInterface) -> None:
emane_net = iface.net
@ -641,11 +643,11 @@ class EmaneManager(ModelManager):
"""
Start monitoring EMANE location events if configured to do so.
"""
logging.info("emane start event monitor")
logger.info("emane start event monitor")
if not self.doeventmonitor():
return
if self.service is None:
logging.error(
logger.error(
"Warning: EMANE events will not be generated "
"because the emaneeventservice\n binding was "
"unable to load "
@ -678,7 +680,7 @@ class EmaneManager(ModelManager):
"""
if self.service is None:
return
logging.info(
logger.info(
"subscribing to EMANE location events. (%s)",
threading.currentThread().getName(),
)
@ -694,7 +696,7 @@ class EmaneManager(ModelManager):
if eid == LocationEvent.IDENTIFIER:
self.handlelocationevent(nem, eid, data)
logging.info(
logger.info(
"unsubscribing from EMANE location events. (%s)",
threading.currentThread().getName(),
)
@ -712,14 +714,14 @@ class EmaneManager(ModelManager):
or "longitude" not in attrs
or "altitude" not in attrs
):
logging.warning("dropped invalid location event")
logger.warning("dropped invalid location event")
continue
# yaw,pitch,roll,azimuth,elevation,velocity are unhandled
lat = attrs["latitude"]
lon = attrs["longitude"]
alt = attrs["altitude"]
logging.debug("emane location event: %s,%s,%s", lat, lon, alt)
logger.debug("emane location event: %s,%s,%s", lat, lon, alt)
self.handlelocationeventtoxyz(txnemid, lat, lon, alt)
def handlelocationeventtoxyz(
@ -733,7 +735,7 @@ class EmaneManager(ModelManager):
# convert nemid to node number
iface = self.get_iface(nemid)
if iface is None:
logging.info("location event for unknown NEM %s", nemid)
logger.info("location event for unknown NEM %s", nemid)
return False
n = iface.node.id
@ -742,7 +744,7 @@ class EmaneManager(ModelManager):
x = int(x)
y = int(y)
z = int(z)
logging.debug(
logger.debug(
"location event NEM %s (%s, %s, %s) -> (%s, %s, %s)",
nemid,
lat,
@ -756,7 +758,7 @@ class EmaneManager(ModelManager):
ybit_check = y.bit_length() > 16 or y < 0
zbit_check = z.bit_length() > 16 or z < 0
if any([xbit_check, ybit_check, zbit_check]):
logging.error(
logger.error(
"Unable to build node location message, received lat/long/alt "
"exceeds coordinate space: NEM %s (%d, %d, %d)",
nemid,
@ -770,7 +772,7 @@ class EmaneManager(ModelManager):
try:
node = self.session.get_node(n, NodeBase)
except CoreError:
logging.exception(
logger.exception(
"location event NEM %s has no corresponding node %s", nemid, n
)
return False

View file

@ -5,6 +5,8 @@ from typing import Dict, List
from core.config import Configuration
from core.emulator.enumerations import ConfigDataTypes
logger = logging.getLogger(__name__)
manifest = None
try:
from emane.shell import manifest
@ -13,7 +15,7 @@ except ImportError:
from emanesh import manifest
except ImportError:
manifest = None
logging.debug("compatible emane python bindings not installed")
logger.debug("compatible emane python bindings not installed")
def _type_value(config_type: str) -> ConfigDataTypes:

View file

@ -15,6 +15,8 @@ from core.location.mobility import WirelessModel
from core.nodes.interface import CoreInterface
from core.xml import emanexml
logger = logging.getLogger(__name__)
class EmaneModel(WirelessModel):
"""
@ -115,7 +117,7 @@ class EmaneModel(WirelessModel):
:return: nothing
"""
logging.debug("emane model(%s) has no post setup tasks", self.name)
logger.debug("emane model(%s) has no post setup tasks", self.name)
def update(self, moved_ifaces: List[CoreInterface]) -> None:
"""
@ -130,7 +132,7 @@ class EmaneModel(WirelessModel):
emane_net = self.session.get_node(self.id, EmaneNet)
emane_net.setnempositions(moved_ifaces)
except CoreError:
logging.exception("error during update")
logger.exception("error during update")
def linkconfig(
self, iface: CoreInterface, options: LinkOptions, iface2: CoreInterface = None
@ -143,4 +145,4 @@ class EmaneModel(WirelessModel):
:param iface2: interface two
:return: nothing
"""
logging.warning("emane model(%s) does not support link config", self.name)
logger.warning("emane model(%s) does not support link config", self.name)

View file

@ -10,6 +10,8 @@ from core.emulator.data import LinkData
from core.emulator.enumerations import LinkTypes, MessageFlags
from core.nodes.network import CtrlNet
logger = logging.getLogger(__name__)
try:
from emane import shell
except ImportError:
@ -17,7 +19,7 @@ except ImportError:
from emanesh import shell
except ImportError:
shell = None
logging.debug("compatible emane python bindings not installed")
logger.debug("compatible emane python bindings not installed")
if TYPE_CHECKING:
from core.emane.emanemanager import EmaneManager
@ -91,7 +93,7 @@ class EmaneClient:
# get mac config
mac_id, _, emane_model = components[MAC_COMPONENT_INDEX]
mac_config = self.client.getConfiguration(mac_id)
logging.debug(
logger.debug(
"address(%s) nem(%s) emane(%s)", self.address, nem_id, emane_model
)
@ -101,9 +103,9 @@ class EmaneClient:
elif emane_model == EMANE_RFPIPE:
loss_table = self.handle_rfpipe(mac_config)
else:
logging.warning("unknown emane link model: %s", emane_model)
logger.warning("unknown emane link model: %s", emane_model)
continue
logging.info("monitoring links nem(%s) model(%s)", nem_id, emane_model)
logger.info("monitoring links nem(%s) model(%s)", nem_id, emane_model)
loss_table.mac_id = mac_id
self.nems[nem_id] = loss_table
@ -138,12 +140,12 @@ class EmaneClient:
def handle_tdma(self, config: Dict[str, Tuple]):
pcr = config["pcrcurveuri"][0][0]
logging.debug("tdma pcr: %s", pcr)
logger.debug("tdma pcr: %s", pcr)
def handle_80211(self, config: Dict[str, Tuple]) -> LossTable:
unicastrate = config["unicastrate"][0][0]
pcr = config["pcrcurveuri"][0][0]
logging.debug("80211 pcr: %s", pcr)
logger.debug("80211 pcr: %s", pcr)
tree = etree.parse(pcr)
root = tree.getroot()
table = root.find("table")
@ -159,7 +161,7 @@ class EmaneClient:
def handle_rfpipe(self, config: Dict[str, Tuple]) -> LossTable:
pcr = config["pcrcurveuri"][0][0]
logging.debug("rfpipe pcr: %s", pcr)
logger.debug("rfpipe pcr: %s", pcr)
tree = etree.parse(pcr)
root = tree.getroot()
table = root.find("table")
@ -192,7 +194,7 @@ class EmaneLinkMonitor:
self.link_timeout = int(self.emane_manager.get_config("link_timeout"))
self.initialize()
if not self.clients:
logging.info("no valid emane models to monitor links")
logger.info("no valid emane models to monitor links")
return
self.scheduler = sched.scheduler()
self.scheduler.enter(0, 0, self.check_links)
@ -228,7 +230,7 @@ class EmaneLinkMonitor:
client.check_links(self.links, self.loss_threshold)
except shell.ControlPortException:
if self.running:
logging.exception("link monitor error")
logger.exception("link monitor error")
# find new links
current_links = set(self.links.keys())

View file

@ -19,6 +19,8 @@ from core.errors import CoreError
from core.nodes.base import CoreNetworkBase, CoreNode
from core.nodes.interface import CoreInterface
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emane.emanemodel import EmaneModel
from core.emulator.session import Session
@ -34,7 +36,7 @@ except ImportError:
from emanesh.events import LocationEvent
except ImportError:
LocationEvent = None
logging.debug("compatible emane python bindings not installed")
logger.debug("compatible emane python bindings not installed")
class EmaneNet(CoreNetworkBase):
@ -92,9 +94,7 @@ class EmaneNet(CoreNetworkBase):
def updatemodel(self, config: Dict[str, str]) -> None:
if not self.model:
raise CoreError(f"no model set to update for node({self.name})")
logging.info(
"node(%s) updating model(%s): %s", self.id, self.model.name, config
)
logger.info("node(%s) updating model(%s): %s", self.id, self.model.name, config)
self.model.update_config(config)
def setmodel(self, model: "WirelessModelType", config: Dict[str, str]) -> None:
@ -122,7 +122,7 @@ class EmaneNet(CoreNetworkBase):
nem_id = self.session.emane.get_nem_id(iface)
ifname = iface.localname
if nem_id is None:
logging.info("nemid for %s is unknown", ifname)
logger.info("nemid for %s is unknown", ifname)
return
node = iface.node
x, y, z = node.getposition()
@ -141,7 +141,7 @@ class EmaneNet(CoreNetworkBase):
:param iface: interface to set nem position for
"""
if self.session.emane.service is None:
logging.info("position service not available")
logger.info("position service not available")
return
position = self._nem_position(iface)
if position:
@ -160,7 +160,7 @@ class EmaneNet(CoreNetworkBase):
return
if self.session.emane.service is None:
logging.info("position service not available")
logger.info("position service not available")
return
event = LocationEvent()

View file

@ -11,6 +11,8 @@ from core.config import Configuration
from core.emane import emanemodel
from core.emulator.enumerations import ConfigDataTypes
logger = logging.getLogger(__name__)
class EmaneTdmaModel(emanemodel.EmaneModel):
# model name
@ -58,7 +60,7 @@ class EmaneTdmaModel(emanemodel.EmaneModel):
event_device = self.session.emane.event_device
# initiate tdma schedule
logging.info(
logger.info(
"setting up tdma schedule: schedule(%s) device(%s)", schedule, event_device
)
args = f"emaneevent-tdmaschedule -i {event_device} {schedule}"

View file

@ -13,6 +13,8 @@ from core.emulator.session import Session
from core.executables import get_requirements
from core.services.coreservices import ServiceManager
logger = logging.getLogger(__name__)
def signal_handler(signal_number: int, _) -> None:
"""
@ -22,7 +24,7 @@ def signal_handler(signal_number: int, _) -> None:
:param _: ignored
:return: nothing
"""
logging.info("caught signal: %s", signal_number)
logger.info("caught signal: %s", signal_number)
sys.exit(signal_number)
@ -95,7 +97,7 @@ class CoreEmu:
self.service_errors = core.services.load()
# load custom services
service_paths = self.config.get("custom_services_dir")
logging.debug("custom service paths: %s", service_paths)
logger.debug("custom service paths: %s", service_paths)
if service_paths is not None:
for service_path in service_paths.split(","):
service_path = Path(service_path.strip())
@ -108,7 +110,7 @@ class CoreEmu:
:return: nothing
"""
logging.info("shutting down all sessions")
logger.info("shutting down all sessions")
sessions = self.sessions.copy()
self.sessions.clear()
for _id in sessions:
@ -129,7 +131,7 @@ class CoreEmu:
_id += 1
session = _cls(_id, config=self.config)
session.service_manager = self.service_manager
logging.info("created session: %s", _id)
logger.info("created session: %s", _id)
self.sessions[_id] = session
return session
@ -140,14 +142,14 @@ class CoreEmu:
:param _id: session id to delete
:return: True if deleted, False otherwise
"""
logging.info("deleting session: %s", _id)
logger.info("deleting session: %s", _id)
session = self.sessions.pop(_id, None)
result = False
if session:
logging.info("shutting session down: %s", _id)
logger.info("shutting session down: %s", _id)
session.data_collect()
session.shutdown()
result = True
else:
logging.error("session to delete did not exist: %s", _id)
logger.error("session to delete did not exist: %s", _id)
return result

View file

@ -20,6 +20,8 @@ from core.executables import get_requirements
from core.nodes.interface import GreTap
from core.nodes.network import CoreNetwork, CtrlNet
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -62,7 +64,7 @@ class DistributedServer:
replace_env = env is not None
if not wait:
cmd += " &"
logging.debug(
logger.debug(
"remote cmd server(%s) cwd(%s) wait(%s): %s", self.host, cwd, wait, cmd
)
try:
@ -212,13 +214,11 @@ class DistributedController:
if tunnel is not None:
return tunnel
# local to server
logging.info(
"local tunnel node(%s) to remote(%s) key(%s)", node.name, host, key
)
logger.info("local tunnel node(%s) to remote(%s) key(%s)", node.name, host, key)
local_tap = GreTap(session=self.session, remoteip=host, key=key)
local_tap.net_client.set_iface_master(node.brname, local_tap.localname)
# server to local
logging.info(
logger.info(
"remote tunnel node(%s) to local(%s) key(%s)", node.name, self.address, key
)
remote_tap = GreTap(
@ -240,7 +240,7 @@ class DistributedController:
:param node2_id: node two id
:return: tunnel key for the node pair
"""
logging.debug("creating tunnel key for: %s, %s", node1_id, node2_id)
logger.debug("creating tunnel key for: %s, %s", node1_id, node2_id)
key = (
(self.session.id << 16)
^ utils.hashkey(node1_id)

View file

@ -62,6 +62,8 @@ from core.services.coreservices import CoreServices
from core.xml import corexml, corexmldeployment
from core.xml.corexml import CoreXmlReader, CoreXmlWriter
logger = logging.getLogger(__name__)
# maps for converting from API call node type values to classes and vice versa
NODES: Dict[NodeTypes, Type[NodeBase]] = {
NodeTypes.DEFAULT: CoreNode,
@ -197,7 +199,7 @@ class Session:
:raises core.CoreError: when objects to link is less than 2, or no common
networks are found
"""
logging.info(
logger.info(
"handling wireless linking node1(%s) node2(%s): %s",
node1.name,
node2.name,
@ -208,7 +210,7 @@ class Session:
raise CoreError("no common network found for wireless link/unlink")
for common_network, iface1, iface2 in common_networks:
if not isinstance(common_network, (WlanNode, EmaneNet)):
logging.info(
logger.info(
"skipping common network that is not wireless/emane: %s",
common_network,
)
@ -263,7 +265,7 @@ class Session:
else:
# peer to peer link
if isinstance(node1, CoreNodeBase) and isinstance(node2, CoreNodeBase):
logging.info("linking ptp: %s - %s", node1.name, node2.name)
logger.info("linking ptp: %s - %s", node1.name, node2.name)
start = self.state.should_start()
ptp = self.create_node(PtpNet, start)
iface1 = node1.new_iface(ptp, iface1_data)
@ -286,7 +288,7 @@ class Session:
elif isinstance(node1, CoreNetworkBase) and isinstance(
node2, CoreNetworkBase
):
logging.info(
logger.info(
"linking network to network: %s - %s", node1.name, node2.name
)
iface1 = node1.linknet(node2)
@ -303,10 +305,10 @@ class Session:
# configure tunnel nodes
key = options.key
if isinstance(node1, TunnelNode):
logging.info("setting tunnel key for: %s", node1.name)
logger.info("setting tunnel key for: %s", node1.name)
node1.setkey(key, iface1_data)
if isinstance(node2, TunnelNode):
logging.info("setting tunnel key for: %s", node2.name)
logger.info("setting tunnel key for: %s", node2.name)
node2.setkey(key, iface2_data)
self.sdt.add_link(node1_id, node2_id)
return iface1, iface2
@ -332,7 +334,7 @@ class Session:
"""
node1 = self.get_node(node1_id, NodeBase)
node2 = self.get_node(node2_id, NodeBase)
logging.info(
logger.info(
"deleting link(%s) node(%s):interface(%s) node(%s):interface(%s)",
link_type.name,
node1.name,
@ -409,7 +411,7 @@ class Session:
options = LinkOptions()
node1 = self.get_node(node1_id, NodeBase)
node2 = self.get_node(node2_id, NodeBase)
logging.info(
logger.info(
"update link(%s) node(%s):interface(%s) node(%s):interface(%s)",
link_type.name,
node1.name,
@ -525,7 +527,7 @@ class Session:
raise CoreError(f"invalid distributed server: {options.server}")
# create node
logging.info(
logger.info(
"creating node(%s) id(%s) name(%s) start(%s)",
_class.__name__,
_id,
@ -547,11 +549,11 @@ class Session:
# add services to needed nodes
if isinstance(node, (CoreNode, PhysicalNode)):
node.type = options.model
logging.debug("set node type: %s", node.type)
logger.debug("set node type: %s", node.type)
self.services.add_services(node, node.type, options.services)
# add config services
logging.info("setting node config services: %s", options.config_services)
logger.info("setting node config services: %s", options.config_services)
for name in options.config_services:
service_class = self.service_manager.get_service(name)
node.add_config_service(service_class)
@ -638,7 +640,7 @@ class Session:
:return: True if active, False otherwise
"""
result = self.state in {EventTypes.RUNTIME_STATE, EventTypes.DATACOLLECT_STATE}
logging.info("session(%s) checking if active: %s", self.id, result)
logger.info("session(%s) checking if active: %s", self.id, result)
return result
def open_xml(self, file_path: Path, start: bool = False) -> None:
@ -649,7 +651,7 @@ class Session:
:param start: instantiate session if true, false otherwise
:return: nothing
"""
logging.info("opening xml: %s", file_path)
logger.info("opening xml: %s", file_path)
# clear out existing session
self.clear()
# set state and read xml
@ -684,7 +686,7 @@ class Session:
:param src_name: source name
:return: nothing
"""
logging.info(
logger.info(
"setting state hook: %s - %s source(%s)", state, file_name, src_name
)
hook = file_name, data
@ -693,7 +695,7 @@ class Session:
# immediately run a hook if it is in the current state
if self.state == state:
logging.info("immediately running new state hook")
logger.info("immediately running new state hook")
self.run_hook(hook)
def add_node_file(
@ -766,9 +768,9 @@ class Session:
Shutdown all session nodes and remove the session directory.
"""
if self.state == EventTypes.SHUTDOWN_STATE:
logging.info("session(%s) state(%s) already shutdown", self.id, self.state)
logger.info("session(%s) state(%s) already shutdown", self.id, self.state)
else:
logging.info("session(%s) state(%s) shutting down", self.id, self.state)
logger.info("session(%s) state(%s) shutting down", self.id, self.state)
self.set_state(EventTypes.SHUTDOWN_STATE, send_event=True)
# clear out current core session
self.clear()
@ -861,7 +863,7 @@ class Session:
return
self.state = state
self.state_time = time.monotonic()
logging.info("changing session(%s) to state %s", self.id, state.name)
logger.info("changing session(%s) to state %s", self.id, state.name)
self.write_state(state)
self.run_hooks(state)
self.run_state_hooks(state)
@ -881,7 +883,7 @@ class Session:
with state_file.open("w") as f:
f.write(f"{state.value} {state.name}\n")
except IOError:
logging.exception("error writing state file: %s", state.name)
logger.exception("error writing state file: %s", state.name)
def run_hooks(self, state: EventTypes) -> None:
"""
@ -903,7 +905,7 @@ class Session:
:return: nothing
"""
file_name, data = hook
logging.info("running hook %s", file_name)
logger.info("running hook %s", file_name)
file_path = self.directory / file_name
log_path = self.directory / f"{file_name}.log"
try:
@ -920,7 +922,7 @@ class Session:
env=self.get_environment(),
)
except (IOError, subprocess.CalledProcessError):
logging.exception("error running hook: %s", file_path)
logger.exception("error running hook: %s", file_path)
def run_state_hooks(self, state: EventTypes) -> None:
"""
@ -937,7 +939,7 @@ class Session:
hook(state)
except Exception:
message = f"exception occurred when running {state.name} state hook: {hook}"
logging.exception(message)
logger.exception(message)
self.exception(ExceptionLevels.ERROR, "Session.run_state_hooks", message)
def add_state_hook(
@ -1022,7 +1024,7 @@ class Session:
try:
utils.load_config(path, env)
except IOError:
logging.exception("error reading environment file: %s", path)
logger.exception("error reading environment file: %s", path)
return env
def set_thumbnail(self, thumb_file: Path) -> None:
@ -1033,7 +1035,7 @@ class Session:
:return: nothing
"""
if not thumb_file.is_file():
logging.error("thumbnail file to set does not exist: %s", thumb_file)
logger.error("thumbnail file to set does not exist: %s", thumb_file)
self.thumbnail = None
return
dst_path = self.directory / thumb_file.name
@ -1054,7 +1056,7 @@ class Session:
gid = self.directory.stat().st_gid
os.chown(self.directory, uid, gid)
except IOError:
logging.exception("failed to set permission on %s", self.directory)
logger.exception("failed to set permission on %s", self.directory)
self.user = user
def create_node(
@ -1111,7 +1113,7 @@ class Session:
with self.nodes_lock:
if _id in self.nodes:
node = self.nodes.pop(_id)
logging.info("deleted node(%s)", node.name)
logger.info("deleted node(%s)", node.name)
if node:
node.shutdown()
self.sdt.delete_node(_id)
@ -1144,7 +1146,7 @@ class Session:
for _id, node in self.nodes.items():
f.write(f"{_id} {node.name} {node.apitype} {type(node)}\n")
except IOError:
logging.exception("error writing nodes file")
logger.exception("error writing nodes file")
def exception(
self, level: ExceptionLevels, source: str, text: str, node_id: int = None
@ -1235,13 +1237,13 @@ class Session:
"""
# this is called from instantiate() after receiving an event message
# for the instantiation state
logging.debug(
logger.debug(
"session(%s) checking if not in runtime state, current state: %s",
self.id,
self.state.name,
)
if self.state == EventTypes.RUNTIME_STATE:
logging.info("valid runtime state found, returning")
logger.info("valid runtime state found, returning")
return
# start event loop and set to runtime
self.event_loop.run()
@ -1255,11 +1257,11 @@ class Session:
:return: nothing
"""
if self.state.already_collected():
logging.info(
logger.info(
"session(%s) state(%s) already data collected", self.id, self.state
)
return
logging.info("session(%s) state(%s) data collection", self.id, self.state)
logger.info("session(%s) state(%s) data collection", self.id, self.state)
self.set_state(EventTypes.DATACOLLECT_STATE, send_event=True)
# stop event loop
@ -1302,7 +1304,7 @@ class Session:
:param node: node to boot
:return: nothing
"""
logging.info("booting node(%s): %s", node.name, [x.name for x in node.services])
logger.info("booting node(%s): %s", node.name, [x.name for x in node.services])
self.services.boot_services(node)
node.start_config_services()
@ -1323,7 +1325,7 @@ class Session:
funcs.append((self.boot_node, (node,), {}))
results, exceptions = utils.threadpool(funcs)
total = time.monotonic() - start
logging.debug("boot run time: %s", total)
logger.debug("boot run time: %s", total)
if not exceptions:
self.update_control_iface_hosts()
return exceptions
@ -1351,7 +1353,7 @@ class Session:
"""
d0 = self.options.get_config("controlnetif0")
if d0:
logging.error("controlnet0 cannot be assigned with a host interface")
logger.error("controlnet0 cannot be assigned with a host interface")
d1 = self.options.get_config("controlnetif1")
d2 = self.options.get_config("controlnetif2")
d3 = self.options.get_config("controlnetif3")
@ -1396,7 +1398,7 @@ class Session:
:param conf_required: flag to check if conf is required
:return: control net node
"""
logging.debug(
logger.debug(
"add/remove control net: index(%s) remove(%s) conf_required(%s)",
net_index,
remove,
@ -1410,7 +1412,7 @@ class Session:
return None
else:
prefix_spec = CtrlNet.DEFAULT_PREFIX_LIST[net_index]
logging.debug("prefix spec: %s", prefix_spec)
logger.debug("prefix spec: %s", prefix_spec)
server_iface = self.get_control_net_server_ifaces()[net_index]
# return any existing controlnet bridge
@ -1433,7 +1435,7 @@ class Session:
if net_index == 0:
updown_script = self.options.get_config("controlnet_updown_script")
if not updown_script:
logging.debug("controlnet updown script not configured")
logger.debug("controlnet updown script not configured")
prefixes = prefix_spec.split()
if len(prefixes) > 1:
@ -1447,7 +1449,7 @@ class Session:
else:
prefix = prefixes[0]
logging.info(
logger.info(
"controlnet(%s) prefix(%s) updown(%s) serverintf(%s)",
_id,
prefix,
@ -1510,7 +1512,7 @@ class Session:
msg = f"Control interface not added to node {node.id}. "
msg += f"Invalid control network prefix ({control_net.prefix}). "
msg += "A longer prefix length may be required for this many nodes."
logging.exception(msg)
logger.exception(msg)
def update_control_iface_hosts(
self, net_index: int = 0, remove: bool = False
@ -1528,12 +1530,12 @@ class Session:
try:
control_net = self.get_control_net(net_index)
except CoreError:
logging.exception("error retrieving control net node")
logger.exception("error retrieving control net node")
return
header = f"CORE session {self.id} host entries"
if remove:
logging.info("Removing /etc/hosts file entries.")
logger.info("Removing /etc/hosts file entries.")
utils.file_demunge("/etc/hosts", header)
return
@ -1543,7 +1545,7 @@ class Session:
for ip in iface.ips():
entries.append(f"{ip.ip} {name}")
logging.info("Adding %d /etc/hosts file entries.", len(entries))
logger.info("Adding %d /etc/hosts file entries.", len(entries))
utils.file_munge("/etc/hosts", header, "\n".join(entries) + "\n")
def runtime(self) -> float:
@ -1572,7 +1574,7 @@ class Session:
current_time = self.runtime()
if current_time > 0:
if event_time <= current_time:
logging.warning(
logger.warning(
"could not schedule past event for time %s (run time is now %s)",
event_time,
current_time,
@ -1584,7 +1586,7 @@ class Session:
)
if not name:
name = ""
logging.info(
logger.info(
"scheduled event %s at time %s data=%s",
name,
event_time + current_time,
@ -1603,12 +1605,12 @@ class Session:
:return: nothing
"""
if data is None:
logging.warning("no data for event node(%s) name(%s)", node_id, name)
logger.warning("no data for event node(%s) name(%s)", node_id, name)
return
now = self.runtime()
if not name:
name = ""
logging.info("running event %s at time %s cmd=%s", name, now, data)
logger.info("running event %s at time %s cmd=%s", name, now, data)
if not node_id:
utils.mute_detach(data)
else:

View file

@ -22,6 +22,7 @@ from core.gui.statusbar import StatusBar
from core.gui.themes import PADY
from core.gui.toolbar import Toolbar
logger = logging.getLogger(__name__)
WIDTH: int = 1000
HEIGHT: int = 800
@ -171,7 +172,7 @@ class Application(ttk.Frame):
def show_grpc_exception(
self, message: str, e: grpc.RpcError, blocking: bool = False
) -> None:
logging.exception("app grpc exception", exc_info=e)
logger.exception("app grpc exception", exc_info=e)
dialog = ErrorDialog(self, "GRPC Exception", message, e.details())
if blocking:
dialog.show()
@ -179,7 +180,7 @@ class Application(ttk.Frame):
self.after(0, lambda: dialog.show())
def show_exception(self, message: str, e: Exception) -> None:
logging.exception("app exception", exc_info=e)
logger.exception("app exception", exc_info=e)
self.after(
0, lambda: ErrorDialog(self, "App Exception", message, str(e)).show()
)

View file

@ -46,6 +46,8 @@ from core.gui.graph.shape import Shape
from core.gui.interface import InterfaceManager
from core.gui.nodeutils import NodeDraw
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -150,7 +152,7 @@ class CoreClient:
if not self.session or event.source == GUI_SOURCE:
return
if event.session_id != self.session.id:
logging.warning(
logger.warning(
"ignoring event session(%s) current(%s)",
event.session_id,
self.session.id,
@ -159,7 +161,7 @@ class CoreClient:
if event.link_event:
self.app.after(0, self.handle_link_event, event.link_event)
elif event.session_event:
logging.info("session event: %s", event)
logger.info("session event: %s", event)
session_event = event.session_event
if session_event.event <= SessionState.SHUTDOWN.value:
self.session.state = SessionState(session_event.event)
@ -174,22 +176,22 @@ class CoreClient:
else:
dialog.set_pause()
else:
logging.warning("unknown session event: %s", session_event)
logger.warning("unknown session event: %s", session_event)
elif event.node_event:
self.app.after(0, self.handle_node_event, event.node_event)
elif event.config_event:
logging.info("config event: %s", event)
logger.info("config event: %s", event)
elif event.exception_event:
self.handle_exception_event(event.exception_event)
else:
logging.info("unhandled event: %s", event)
logger.info("unhandled event: %s", event)
def handle_link_event(self, event: LinkEvent) -> None:
logging.debug("Link event: %s", event)
logger.debug("Link event: %s", event)
node1_id = event.link.node1_id
node2_id = event.link.node2_id
if node1_id == node2_id:
logging.warning("ignoring links with loops: %s", event)
logger.warning("ignoring links with loops: %s", event)
return
canvas_node1 = self.canvas_nodes[node1_id]
canvas_node2 = self.canvas_nodes[node2_id]
@ -207,7 +209,7 @@ class CoreClient:
canvas_node1, canvas_node2, event.link
)
else:
logging.warning("unknown link event: %s", event)
logger.warning("unknown link event: %s", event)
else:
if event.message_type == MessageType.ADD:
self.app.manager.add_wired_edge(canvas_node1, canvas_node2, event.link)
@ -216,10 +218,10 @@ class CoreClient:
elif event.message_type == MessageType.NONE:
self.app.manager.update_wired_edge(event.link)
else:
logging.warning("unknown link event: %s", event)
logger.warning("unknown link event: %s", event)
def handle_node_event(self, event: NodeEvent) -> None:
logging.debug("node event: %s", event)
logger.debug("node event: %s", event)
node = event.node
if event.message_type == MessageType.NONE:
canvas_node = self.canvas_nodes[node.id]
@ -235,10 +237,10 @@ class CoreClient:
canvas_node.canvas.delete_selected_objects()
elif event.message_type == MessageType.ADD:
if node.id in self.session.nodes:
logging.error("core node already exists: %s", node)
logger.error("core node already exists: %s", node)
self.app.manager.add_core_node(node)
else:
logging.warning("unknown node event: %s", event)
logger.warning("unknown node event: %s", event)
def enable_throughputs(self) -> None:
self.handling_throughputs = self.client.throughputs(
@ -272,24 +274,24 @@ class CoreClient:
def handle_throughputs(self, event: ThroughputsEvent) -> None:
if event.session_id != self.session.id:
logging.warning(
logger.warning(
"ignoring throughput event session(%s) current(%s)",
event.session_id,
self.session.id,
)
return
logging.debug("handling throughputs event: %s", event)
logger.debug("handling throughputs event: %s", event)
self.app.after(0, self.app.manager.set_throughputs, event)
def handle_cpu_event(self, event: core_pb2.CpuUsageEvent) -> None:
self.app.after(0, self.app.statusbar.set_cpu, event.usage)
def handle_exception_event(self, event: ExceptionEvent) -> None:
logging.info("exception event: %s", event)
logger.info("exception event: %s", event)
self.app.statusbar.add_alert(event)
def join_session(self, session_id: int) -> None:
logging.info("joining session(%s)", session_id)
logger.info("joining session(%s)", session_id)
self.reset()
try:
self.session = self.client.get_session(session_id)
@ -314,7 +316,7 @@ class CoreClient:
# canvas setting
config = self.session.metadata
canvas_config = config.get("canvas")
logging.debug("canvas metadata: %s", canvas_config)
logger.debug("canvas metadata: %s", canvas_config)
if canvas_config:
canvas_config = json.loads(canvas_config)
self.app.manager.parse_metadata(canvas_config)
@ -324,14 +326,14 @@ class CoreClient:
if shapes_config:
shapes_config = json.loads(shapes_config)
for shape_config in shapes_config:
logging.debug("loading shape: %s", shape_config)
logger.debug("loading shape: %s", shape_config)
Shape.from_metadata(self.app, shape_config)
# load edges config
edges_config = config.get("edges")
if edges_config:
edges_config = json.loads(edges_config)
logging.info("edges config: %s", edges_config)
logger.info("edges config: %s", edges_config)
for edge_config in edges_config:
edge = self.links[edge_config["token"]]
edge.width = edge_config["width"]
@ -347,7 +349,7 @@ class CoreClient:
if canvas_node:
canvas_node.hide()
else:
logging.warning("invalid node to hide: %s", _id)
logger.warning("invalid node to hide: %s", _id)
def create_new_session(self) -> None:
"""
@ -355,7 +357,7 @@ class CoreClient:
"""
try:
session_id = self.client.create_session()
logging.info("created session: %s", session_id)
logger.info("created session: %s", session_id)
self.join_session(session_id)
location_config = self.app.guiconfig.location
self.session.location = SessionLocation(
@ -377,7 +379,7 @@ class CoreClient:
session_id = self.session.id
try:
response = self.client.delete_session(session_id)
logging.info("deleted session(%s), Result: %s", session_id, response)
logger.info("deleted session(%s), Result: %s", session_id, response)
except grpc.RpcError as e:
self.app.show_grpc_exception("Delete Session Error", e)
@ -419,7 +421,7 @@ class CoreClient:
dialog = SessionsDialog(self.app, True)
dialog.show()
except grpc.RpcError as e:
logging.exception("core setup error")
logger.exception("core setup error")
self.app.show_grpc_exception("Setup Error", e, blocking=True)
self.app.close()
@ -456,7 +458,7 @@ class CoreClient:
result, exceptions = self.client.start_session(
self.session, asymmetric_links
)
logging.info("start session(%s), result: %s", self.session.id, result)
logger.info("start session(%s), result: %s", self.session.id, result)
if result:
self.set_metadata()
except grpc.RpcError as e:
@ -469,7 +471,7 @@ class CoreClient:
result = False
try:
result = self.client.stop_session(session_id)
logging.info("stopped session(%s), result: %s", session_id, result)
logger.info("stopped session(%s), result: %s", session_id, result)
except grpc.RpcError as e:
self.app.show_grpc_exception("Stop Session Error", e)
return result
@ -513,7 +515,7 @@ class CoreClient:
canvas=canvas_config, shapes=shapes, edges=edges_config, hidden=hidden
)
response = self.client.set_session_metadata(self.session.id, metadata)
logging.debug("set session metadata %s, result: %s", metadata, response)
logger.debug("set session metadata %s, result: %s", metadata, response)
def launch_terminal(self, node_id: int) -> None:
try:
@ -527,7 +529,7 @@ class CoreClient:
return
node_term = self.client.get_node_terminal(self.session.id, node_id)
cmd = f"{terminal} {node_term} &"
logging.info("launching terminal %s", cmd)
logger.info("launching terminal %s", cmd)
os.system(cmd)
except grpc.RpcError as e:
self.app.show_grpc_exception("Node Terminal Error", e)
@ -540,16 +542,16 @@ class CoreClient:
Save core session as to an xml file
"""
if not file_path and not self.session.file:
logging.error("trying to save xml for session with no file")
logger.error("trying to save xml for session with no file")
return
if not file_path:
file_path = str(self.session.file)
try:
if not self.is_runtime():
logging.debug("Send session data to the daemon")
logger.debug("Send session data to the daemon")
self.send_data()
self.client.save_xml(self.session.id, file_path)
logging.info("saved xml file %s", file_path)
logger.info("saved xml file %s", file_path)
except grpc.RpcError as e:
self.app.show_grpc_exception("Save XML Error", e)
@ -559,7 +561,7 @@ class CoreClient:
"""
try:
result, session_id = self._client.open_xml(file_path)
logging.info(
logger.info(
"open xml file %s, result(%s) session(%s)",
file_path,
result,
@ -573,14 +575,14 @@ class CoreClient:
node_service = self.client.get_node_service(
self.session.id, node_id, service_name
)
logging.debug(
logger.debug(
"get node(%s) service(%s): %s", node_id, service_name, node_service
)
return node_service
def set_node_service(self, node_id: int, config: ServiceConfig) -> NodeServiceData:
result = self.client.set_node_service(self.session.id, config)
logging.info("set node service result(%s): %s", result, config)
logger.info("set node service result(%s): %s", result, config)
return self.client.get_node_service(self.session.id, node_id, config.service)
def get_node_service_file(
@ -589,7 +591,7 @@ class CoreClient:
data = self.client.get_node_service_file(
self.session.id, node_id, service_name, file_name
)
logging.debug(
logger.debug(
"get service file for node(%s), service: %s, file: %s, data: %s",
node_id,
service_name,
@ -603,7 +605,7 @@ class CoreClient:
) -> None:
config = ServiceFileConfig(node_id, service_name, file_name, data)
result = self.client.set_node_service_file(self.session.id, config)
logging.info("set service file config %s: %s", config, result)
logger.info("set service file config %s: %s", config, result)
def create_nodes_and_links(self) -> None:
"""
@ -612,7 +614,7 @@ class CoreClient:
self.client.set_session_state(self.session.id, SessionState.DEFINITION)
for node in self.session.nodes.values():
node_id = self.client.add_node(self.session.id, node, source=GUI_SOURCE)
logging.debug("created node: %s", node_id)
logger.debug("created node: %s", node_id)
asymmetric_links = []
for edge in self.links.values():
self.add_link(edge.link)
@ -648,7 +650,7 @@ class CoreClient:
"""
Clean ups when done using grpc
"""
logging.debug("close grpc")
logger.debug("close grpc")
self.client.close()
def next_node_id(self) -> int:
@ -704,7 +706,7 @@ class CoreClient:
services = self.session.default_services.get(model)
if services:
node.services = services.copy()
logging.info(
logger.info(
"add node(%s) to session(%s), coordinates(%s, %s)",
node.name,
self.session.id,
@ -831,13 +833,13 @@ class CoreClient:
return config_service_protos
def run(self, node_id: int) -> str:
logging.info("running node(%s) cmd: %s", node_id, self.observer)
logger.info("running node(%s) cmd: %s", node_id, self.observer)
_, output = self.client.node_command(self.session.id, node_id, self.observer)
return output
def get_wlan_config(self, node_id: int) -> Dict[str, ConfigOption]:
config = self.client.get_wlan_config(self.session.id, node_id)
logging.debug(
logger.debug(
"get wlan configuration from node %s, result configuration: %s",
node_id,
config,
@ -846,7 +848,7 @@ class CoreClient:
def get_mobility_config(self, node_id: int) -> Dict[str, ConfigOption]:
config = self.client.get_mobility_config(self.session.id, node_id)
logging.debug(
logger.debug(
"get mobility config from node %s, result configuration: %s",
node_id,
config,
@ -861,7 +863,7 @@ class CoreClient:
config = self.client.get_emane_model_config(
self.session.id, node_id, model, iface_id
)
logging.debug(
logger.debug(
"get emane model config: node id: %s, EMANE model: %s, "
"interface: %s, config: %s",
node_id,
@ -873,17 +875,17 @@ class CoreClient:
def execute_script(self, script) -> None:
session_id = self.client.execute_script(script)
logging.info("execute python script %s", session_id)
logger.info("execute python script %s", session_id)
if session_id != -1:
self.join_session(session_id)
def add_link(self, link: Link) -> None:
result, _, _ = self.client.add_link(self.session.id, link, source=GUI_SOURCE)
logging.debug("added link: %s", result)
logger.debug("added link: %s", result)
if not result:
logging.error("error adding link: %s", link)
logger.error("error adding link: %s", link)
def edit_link(self, link: Link) -> None:
result = self.client.edit_link(self.session.id, link, source=GUI_SOURCE)
if not result:
logging.error("error editing link: %s", link)
logger.error("error editing link: %s", link)

View file

@ -13,6 +13,8 @@ from core.gui.graph.graph import CanvasGraph
from core.gui.themes import PADX, PADY
from core.gui.widgets import image_chooser
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -167,5 +169,5 @@ class CanvasWallpaperDialog(Dialog):
try:
self.canvas.set_wallpaper(filename)
except FileNotFoundError:
logging.error("invalid background: %s", filename)
logger.error("invalid background: %s", filename)
self.destroy()

View file

@ -18,6 +18,8 @@ from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CodeText, ConfigFrame, ListboxScroll
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.coreclient import CoreClient
@ -97,7 +99,7 @@ class ConfigServiceConfigDialog(Dialog):
if service_config:
for key, value in service_config.config.items():
self.config[key].value = value
logging.info("default config: %s", self.default_config)
logger.info("default config: %s", self.default_config)
for file, data in service_config.templates.items():
self.modified_files.add(file)
self.temp_service_files[file] = data
@ -181,7 +183,7 @@ class ConfigServiceConfigDialog(Dialog):
self.modes_combobox.bind("<<ComboboxSelected>>", self.handle_mode_changed)
self.modes_combobox.grid(row=0, column=1, sticky=tk.EW, pady=PADY)
logging.info("config service config: %s", self.config)
logger.info("config service config: %s", self.config)
self.config_frame = ConfigFrame(tab, self.app, self.config)
self.config_frame.draw_config()
self.config_frame.grid(sticky=tk.NSEW, pady=PADY)
@ -328,7 +330,7 @@ class ConfigServiceConfigDialog(Dialog):
def handle_mode_changed(self, event: tk.Event) -> None:
mode = self.modes_combobox.get()
config = self.mode_configs[mode]
logging.info("mode config: %s", config)
logger.info("mode config: %s", config)
self.config_frame.set_values(config)
def update_template_file_data(self, event: tk.Event) -> None:
@ -350,7 +352,7 @@ class ConfigServiceConfigDialog(Dialog):
def click_defaults(self) -> None:
self.node.config_service_configs.pop(self.service_name, None)
logging.info(
logger.info(
"cleared config service config: %s", self.node.config_service_configs
)
self.temp_service_files = dict(self.original_service_files)
@ -358,7 +360,7 @@ class ConfigServiceConfigDialog(Dialog):
self.template_text.text.delete(1.0, "end")
self.template_text.text.insert("end", self.temp_service_files[filename])
if self.config_frame:
logging.info("resetting defaults: %s", self.default_config)
logger.info("resetting defaults: %s", self.default_config)
self.config_frame.set_values(self.default_config)
def click_copy(self) -> None:

View file

@ -13,6 +13,8 @@ from core.gui.nodeutils import NodeDraw
from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CheckboxList, ListboxScroll, image_chooser
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -209,7 +211,7 @@ class CustomNodesDialog(Dialog):
name, node_draw.image_file, list(node_draw.services)
)
self.app.guiconfig.nodes.append(custom_node)
logging.info("saving custom nodes: %s", self.app.guiconfig.nodes)
logger.info("saving custom nodes: %s", self.app.guiconfig.nodes)
self.app.save_config()
self.destroy()
@ -219,7 +221,7 @@ class CustomNodesDialog(Dialog):
image_file = str(Path(self.image_file).absolute())
custom_node = CustomNode(name, image_file, list(self.services))
node_draw = NodeDraw.from_custom(custom_node)
logging.info(
logger.info(
"created new custom node (%s), image file (%s), services: (%s)",
name,
image_file,
@ -239,7 +241,7 @@ class CustomNodesDialog(Dialog):
node_draw.image_file = str(Path(self.image_file).absolute())
node_draw.image = self.image
node_draw.services = set(self.services)
logging.debug(
logger.debug(
"edit custom node (%s), image: (%s), services (%s)",
node_draw.model,
node_draw.image_file,

View file

@ -7,6 +7,8 @@ from core.gui.appconfig import SCRIPT_PATH
from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -83,6 +85,6 @@ class ExecutePythonDialog(Dialog):
def script_execute(self) -> None:
file = self.file_entry.get()
options = self.option_entry.get()
logging.info("Execute %s with options %s", file, options)
logger.info("Execute %s with options %s", file, options)
self.app.core.execute_script(file)
self.destroy()

View file

@ -6,6 +6,8 @@ from typing import TYPE_CHECKING, Optional
from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -139,8 +141,8 @@ class FindDialog(Dialog):
_x, _y, _, _ = canvas_node.canvas.bbox(canvas_node.id)
oid = canvas_node.canvas.find_withtag("rectangle")
x0, y0, x1, y1 = canvas_node.canvas.bbox(oid[0])
logging.debug("Dist to most left: %s", abs(x0 - _x))
logging.debug("White canvas width: %s", abs(x0 - x1))
logger.debug("Dist to most left: %s", abs(x0 - _x))
logger.debug("White canvas width: %s", abs(x0 - x1))
# calculate the node's location
# (as fractions of white canvas's width and height)

View file

@ -17,6 +17,8 @@ from core.gui.dialogs.emaneconfig import EmaneModelDialog
from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import ListboxScroll, image_chooser
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.graph.node import CanvasNode
@ -261,7 +263,7 @@ class NodeConfigDialog(Dialog):
if nutils.is_rj45(self.node):
ifaces = self.app.core.client.get_ifaces()
logging.debug("host machine available interfaces: %s", ifaces)
logger.debug("host machine available interfaces: %s", ifaces)
ifaces_scroll = ListboxScroll(frame)
ifaces_scroll.listbox.config(state=state)
ifaces_scroll.grid(

View file

@ -12,6 +12,8 @@ from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CheckboxList, ListboxScroll
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -131,7 +133,7 @@ class NodeConfigServiceDialog(Dialog):
def click_save(self) -> None:
self.node.config_services = self.current_services.copy()
logging.info("saved node config services: %s", self.node.config_services)
logger.info("saved node config services: %s", self.node.config_services)
self.destroy()
def click_cancel(self) -> None:

View file

@ -9,6 +9,8 @@ from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY, scale_fonts
from core.gui.validation import LARGEST_SCALE, SMALLEST_SCALE
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -102,7 +104,7 @@ class PreferencesDialog(Dialog):
def theme_change(self, event: tk.Event) -> None:
theme = self.theme.get()
logging.info("changing theme: %s", theme)
logger.info("changing theme: %s", theme)
self.app.style.theme_use(theme)
def click_save(self) -> None:

View file

@ -20,6 +20,8 @@ from core.gui.images import ImageEnum
from core.gui.themes import FRAME_PAD, PADX, PADY
from core.gui.widgets import CodeText, ListboxScroll
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.coreclient import CoreClient
@ -393,7 +395,7 @@ class ServiceConfigDialog(Dialog):
1.0, "end"
)
else:
logging.debug("file already existed")
logger.debug("file already existed")
def delete_filename(self) -> None:
cbb = self.filename_combobox
@ -601,7 +603,7 @@ class ServiceConfigDialog(Dialog):
i = dirs.index(d)
self.dir_list.listbox.delete(i)
except ValueError:
logging.debug("directory is not in the list")
logger.debug("directory is not in the list")
self.directory_entry.delete(0, "end")
def directory_select(self, event) -> None:

View file

@ -10,6 +10,8 @@ from core.gui.dialogs.dialog import Dialog
from core.gui.themes import PADX, PADY
from core.gui.widgets import ConfigFrame
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -55,7 +57,7 @@ class SessionOptionsDialog(Dialog):
try:
session_id = self.app.core.session.id
result = self.app.core.client.set_session_options(session_id, config)
logging.info("saved session config: %s", result)
logger.info("saved session config: %s", result)
except grpc.RpcError as e:
self.app.show_grpc_exception("Set Session Options Error", e)
self.destroy()

View file

@ -12,6 +12,8 @@ from core.gui.images import ImageEnum
from core.gui.task import ProgressTask
from core.gui.themes import PADX, PADY
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -31,7 +33,7 @@ class SessionsDialog(Dialog):
def get_sessions(self) -> List[SessionSummary]:
try:
sessions = self.app.core.client.get_sessions()
logging.info("sessions: %s", sessions)
logger.info("sessions: %s", sessions)
return sorted(sessions, key=lambda x: x.id)
except grpc.RpcError as e:
self.app.show_grpc_exception("Get Sessions Error", e)
@ -175,7 +177,7 @@ class SessionsDialog(Dialog):
self.selected_id = None
self.delete_button.config(state=tk.DISABLED)
self.connect_button.config(state=tk.DISABLED)
logging.debug("selected session: %s", self.selected_session)
logger.debug("selected session: %s", self.selected_session)
def click_connect(self) -> None:
if not self.selected_session:
@ -199,7 +201,7 @@ class SessionsDialog(Dialog):
def click_delete(self) -> None:
if not self.selected_session:
return
logging.info("click delete session: %s", self.selected_session)
logger.info("click delete session: %s", self.selected_session)
self.tree.delete(self.selected_id)
self.app.core.delete_session(self.selected_session)
session_id = None

View file

@ -11,6 +11,8 @@ from core.gui.frames.link import EdgeInfoFrame, WirelessEdgeInfoFrame
from core.gui.graph import tags
from core.gui.utils import bandwidth_text, delay_jitter_text
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.graph.graph import CanvasGraph
@ -393,7 +395,7 @@ class Edge:
self.dst.canvas.coords(self.dst_label2, *dst_pos)
def delete(self) -> None:
logging.debug("deleting canvas edge, id: %s", self.id)
logger.debug("deleting canvas edge, id: %s", self.id)
self.src.canvas.delete(self.id)
self.src.canvas.delete(self.src_label)
self.src.canvas.delete(self.dst_label)
@ -488,7 +490,7 @@ class CanvasWirelessEdge(Edge):
token: str,
link: Link,
) -> None:
logging.debug("drawing wireless link from node %s to node %s", src, dst)
logger.debug("drawing wireless link from node %s to node %s", src, dst)
super().__init__(app, src, dst)
self.src.wireless_edges.add(self)
self.dst.wireless_edges.add(self)
@ -622,7 +624,7 @@ class CanvasEdge(Edge):
self.draw_link_options()
def complete(self, dst: "CanvasNode", link: Link = None) -> None:
logging.debug(
logger.debug(
"completing wired link from node(%s) to node(%s)",
self.src.core_node.name,
dst.core_node.name,

View file

@ -18,6 +18,8 @@ from core.gui.graph.node import CanvasNode, ShadowNode
from core.gui.graph.shape import Shape
from core.gui.graph.shapeutils import ShapeType, is_draw_shape, is_marker
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.graph.manager import CanvasManager
@ -184,7 +186,7 @@ class CanvasGraph(tk.Canvas):
"""
Draw a node or finish drawing an edge according to the current graph mode
"""
logging.debug("click release")
logger.debug("click release")
x, y = self.canvas_xy(event)
if not self.inside_canvas(x, y):
return
@ -210,7 +212,7 @@ class CanvasGraph(tk.Canvas):
else:
self.focus_set()
self.selected = self.get_selected(event)
logging.debug(
logger.debug(
"click release selected(%s) mode(%s)", self.selected, self.manager.mode
)
if self.manager.mode == GraphMode.EDGE:
@ -228,7 +230,7 @@ class CanvasGraph(tk.Canvas):
edge = self.drawing_edge
self.drawing_edge = None
# edge dst must be a node
logging.debug("current selected: %s", self.selected)
logger.debug("current selected: %s", self.selected)
dst_node = self.nodes.get(self.selected)
if not dst_node:
edge.delete()
@ -331,8 +333,8 @@ class CanvasGraph(tk.Canvas):
self.offset[0] * factor + event.x * (1 - factor),
self.offset[1] * factor + event.y * (1 - factor),
)
logging.debug("ratio: %s", self.ratio)
logging.debug("offset: %s", self.offset)
logger.debug("ratio: %s", self.ratio)
logger.debug("offset: %s", self.offset)
self.app.statusbar.set_zoom(self.ratio)
if self.wallpaper:
self.redraw_wallpaper()
@ -347,10 +349,10 @@ class CanvasGraph(tk.Canvas):
self.cursor = x, y
selected = self.get_selected(event)
logging.debug("click press(%s): %s", self.cursor, selected)
logger.debug("click press(%s): %s", self.cursor, selected)
x_check = self.cursor[0] - self.offset[0]
y_check = self.cursor[1] - self.offset[1]
logging.debug("click press offset(%s, %s)", x_check, y_check)
logger.debug("click press offset(%s, %s)", x_check, y_check)
is_node = selected in self.nodes
if self.manager.mode == GraphMode.EDGE and is_node:
node = self.nodes[selected]
@ -387,7 +389,7 @@ class CanvasGraph(tk.Canvas):
node = self.nodes[selected]
self.select_object(node.id)
self.selected = selected
logging.debug(
logger.debug(
"selected node(%s), coords: (%s, %s)",
node.core_node.name,
node.core_node.position.x,
@ -397,7 +399,7 @@ class CanvasGraph(tk.Canvas):
shadow_node = self.shadow_nodes[selected]
self.select_object(shadow_node.id)
self.selected = selected
logging.debug(
logger.debug(
"selected shadow node(%s), coords: (%s, %s)",
shadow_node.node.core_node.name,
shadow_node.node.core_node.position.x,
@ -418,7 +420,7 @@ class CanvasGraph(tk.Canvas):
self.cursor = x, y
# handle multiple selections
logging.debug("control left click: %s", event)
logger.debug("control left click: %s", event)
selected = self.get_selected(event)
if (
selected not in self.selection
@ -489,12 +491,12 @@ class CanvasGraph(tk.Canvas):
"""
delete selected nodes and any data that relates to it
"""
logging.debug("press delete key")
logger.debug("press delete key")
if not self.app.core.is_runtime():
self.delete_selected_objects()
self.app.default_info()
else:
logging.debug("node deletion is disabled during runtime state")
logger.debug("node deletion is disabled during runtime state")
def double_click(self, event: tk.Event) -> None:
selected = self.get_selected(event)
@ -606,10 +608,10 @@ class CanvasGraph(tk.Canvas):
self.draw_wallpaper(image)
def redraw_canvas(self, dimensions: Tuple[int, int] = None) -> None:
logging.debug("redrawing canvas to dimensions: %s", dimensions)
logger.debug("redrawing canvas to dimensions: %s", dimensions)
# reset scale and move back to original position
logging.debug("resetting scaling: %s %s", self.ratio, self.offset)
logger.debug("resetting scaling: %s %s", self.ratio, self.offset)
factor = 1 / self.ratio
self.scale(tk.ALL, self.offset[0], self.offset[1], factor, factor)
self.move(tk.ALL, -self.offset[0], -self.offset[1])
@ -628,11 +630,11 @@ class CanvasGraph(tk.Canvas):
def redraw_wallpaper(self) -> None:
if self.adjust_to_dim.get():
logging.debug("drawing wallpaper to canvas dimensions")
logger.debug("drawing wallpaper to canvas dimensions")
self.resize_to_wallpaper()
else:
option = ScaleOption(self.scale_option.get())
logging.debug("drawing canvas using scaling option: %s", option)
logger.debug("drawing canvas using scaling option: %s", option)
if option == ScaleOption.UPPER_LEFT:
self.wallpaper_upper_left()
elif option == ScaleOption.CENTERED:
@ -640,7 +642,7 @@ class CanvasGraph(tk.Canvas):
elif option == ScaleOption.SCALED:
self.wallpaper_scaled()
elif option == ScaleOption.TILED:
logging.warning("tiled background not implemented yet")
logger.warning("tiled background not implemented yet")
self.organize()
def organize(self) -> None:
@ -648,7 +650,7 @@ class CanvasGraph(tk.Canvas):
self.tag_raise(tag)
def set_wallpaper(self, filename: Optional[str]) -> None:
logging.info("setting canvas(%s) background: %s", self.id, filename)
logger.info("setting canvas(%s) background: %s", self.id, filename)
if filename:
img = Image.open(filename)
self.wallpaper = img
@ -673,10 +675,10 @@ class CanvasGraph(tk.Canvas):
def copy(self) -> None:
if self.core.is_runtime():
logging.debug("copy is disabled during runtime state")
logger.debug("copy is disabled during runtime state")
return
if self.selection:
logging.debug("to copy nodes: %s", self.selection)
logger.debug("to copy nodes: %s", self.selection)
self.to_copy.clear()
for node_id in self.selection.keys():
canvas_node = self.nodes[node_id]
@ -684,7 +686,7 @@ class CanvasGraph(tk.Canvas):
def paste(self) -> None:
if self.core.is_runtime():
logging.debug("paste is disabled during runtime state")
logger.debug("paste is disabled during runtime state")
return
# maps original node canvas id to copy node canvas id
copy_map = {}
@ -825,7 +827,7 @@ class CanvasGraph(tk.Canvas):
wallpaper = Path(wallpaper)
if not wallpaper.is_file():
wallpaper = appconfig.BACKGROUNDS_PATH.joinpath(wallpaper)
logging.info("canvas(%s), wallpaper: %s", self.id, wallpaper)
logger.info("canvas(%s), wallpaper: %s", self.id, wallpaper)
if wallpaper.is_file():
self.set_wallpaper(str(wallpaper))
else:

View file

@ -19,6 +19,8 @@ from core.gui.graph.node import CanvasNode
from core.gui.graph.shapeutils import ShapeType
from core.gui.nodeutils import NodeDraw
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.coreclient import CoreClient
@ -166,7 +168,7 @@ class CanvasManager:
canvas_id = self._next_id()
self.notebook.add(tab, text=f"Canvas {canvas_id}")
unique_id = self.notebook.tabs()[-1]
logging.info("creating canvas(%s)", canvas_id)
logger.info("creating canvas(%s)", canvas_id)
self.canvas_ids[unique_id] = canvas_id
self.unique_ids[canvas_id] = unique_id
@ -213,7 +215,7 @@ class CanvasManager:
self.unique_ids.clear()
self.edges.clear()
self.wireless_edges.clear()
logging.info("cleared canvases")
logger.info("cleared canvases")
# reset settings
self.show_node_labels.set(True)
@ -289,7 +291,7 @@ class CanvasManager:
for canvas_config in config.get("canvases", []):
canvas_id = canvas_config.get("id")
if canvas_id is None:
logging.error("canvas config id not provided")
logger.error("canvas config id not provided")
continue
canvas = self.get(canvas_id)
canvas.parse_metadata(canvas_config)
@ -297,7 +299,7 @@ class CanvasManager:
def add_core_node(self, core_node: Node) -> None:
# get canvas tab for node
canvas_id = core_node.canvas if core_node.canvas > 0 else 1
logging.info("adding core node canvas(%s): %s", core_node.name, canvas_id)
logger.info("adding core node canvas(%s): %s", core_node.name, canvas_id)
canvas = self.get(canvas_id)
image = nutils.get_icon(core_node, self.app)
x = core_node.position.x
@ -354,7 +356,7 @@ class CanvasManager:
network_id = link.network_id if link.network_id else None
token = create_wireless_token(src.id, dst.id, network_id)
if token in self.wireless_edges:
logging.warning("ignoring link that already exists: %s", link)
logger.warning("ignoring link that already exists: %s", link)
return
edge = CanvasWirelessEdge(self.app, src, dst, network_id, token, link)
self.wireless_edges[token] = edge

View file

@ -24,6 +24,8 @@ from core.gui.graph.edges import CanvasEdge, CanvasWirelessEdge
from core.gui.graph.tooltip import CanvasTooltip
from core.gui.images import ImageEnum
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.graph.graph import CanvasGraph
@ -87,7 +89,7 @@ class CanvasNode:
self.canvas.tag_bind(self.id, "<Button-1>", self.show_info)
def delete(self) -> None:
logging.debug("Delete canvas node for %s", self.core_node)
logger.debug("Delete canvas node for %s", self.core_node)
self.canvas.delete(self.id)
self.canvas.delete(self.text_id)
self.delete_antennas()
@ -110,7 +112,7 @@ class CanvasNode:
"""
delete one antenna
"""
logging.debug("Delete an antenna on %s", self.core_node.name)
logger.debug("Delete an antenna on %s", self.core_node.name)
if self.antennas:
antenna_id = self.antennas.pop()
self.canvas.delete(antenna_id)
@ -120,7 +122,7 @@ class CanvasNode:
"""
delete all antennas
"""
logging.debug("Remove all antennas for %s", self.core_node.name)
logger.debug("Remove all antennas for %s", self.core_node.name)
for antenna_id in self.antennas:
self.canvas.delete(antenna_id)
self.antennas.clear()
@ -400,7 +402,7 @@ class CanvasNode:
def update_icon(self, icon_path: str) -> None:
if not Path(icon_path).exists():
logging.error(f"node icon does not exist: {icon_path}")
logger.error(f"node icon does not exist: {icon_path}")
return
self.core_node.icon = icon_path
self.image = images.from_file(icon_path, width=images.NODE_SIZE)

View file

@ -5,6 +5,8 @@ from core.gui.dialogs.shapemod import ShapeDialog
from core.gui.graph import tags
from core.gui.graph.shapeutils import ShapeType
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
from core.gui.graph.graph import CanvasGraph
@ -92,7 +94,7 @@ class Shape:
shape = Shape(app, canvas, shape_type, *coords, data=data)
canvas.shapes[shape.id] = shape
except ValueError:
logging.exception("unknown shape: %s", shape_type)
logger.exception("unknown shape: %s", shape_type)
def draw(self) -> None:
if self.created:
@ -139,7 +141,7 @@ class Shape:
state=self.app.manager.show_annotations.state(),
)
else:
logging.error("unknown shape type: %s", self.shape_type)
logger.error("unknown shape type: %s", self.shape_type)
self.created = True
def get_font(self) -> List[Union[int, str]]:
@ -192,7 +194,7 @@ class Shape:
self.canvas.move(self.text_id, x_offset, y_offset)
def delete(self) -> None:
logging.debug("Delete shape, id(%s)", self.id)
logger.debug("Delete shape, id(%s)", self.id)
self.canvas.delete(self.id)
self.canvas.delete(self.text_id)

View file

@ -9,6 +9,8 @@ from core.gui import nodeutils as nutils
from core.gui.graph.edges import CanvasEdge
from core.gui.graph.node import CanvasNode
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -196,12 +198,12 @@ class InterfaceManager:
else:
self.current_subnets = self.next_subnets()
else:
logging.info("ignoring subnet change for link between network nodes")
logger.info("ignoring subnet change for link between network nodes")
def find_subnets(
self, canvas_node: CanvasNode, visited: Set[int] = None
) -> Optional[IPNetwork]:
logging.info("finding subnet for node: %s", canvas_node.core_node.name)
logger.info("finding subnet for node: %s", canvas_node.core_node.name)
subnets = None
if not visited:
visited = set()
@ -220,7 +222,7 @@ class InterfaceManager:
else:
subnets = self.find_subnets(check_node, visited)
if subnets:
logging.info("found subnets: %s", subnets)
logger.info("found subnets: %s", subnets)
break
return subnets
@ -244,7 +246,7 @@ class InterfaceManager:
iface1=src_iface,
iface2=dst_iface,
)
logging.info("added link between %s and %s", src_node.name, dst_node.name)
logger.info("added link between %s and %s", src_node.name, dst_node.name)
return link
def create_iface(self, canvas_node: CanvasNode, wireless_link: bool) -> Interface:
@ -266,5 +268,5 @@ class InterfaceManager:
ip6=ip6,
ip6_mask=ip6_mask,
)
logging.info("create node(%s) interface(%s)", node.name, iface)
logger.info("create node(%s) interface(%s)", node.name, iface)
return iface

View file

@ -27,6 +27,8 @@ from core.gui.graph.manager import CanvasManager
from core.gui.observers import ObserversMenu
from core.gui.task import ProgressTask
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -274,10 +276,10 @@ class Menubar(tk.Menu):
def open_recent_files(self, file_path: Path) -> None:
if file_path.is_file():
logging.debug("Open recent file %s", file_path)
logger.debug("Open recent file %s", file_path)
self.open_xml_task(file_path)
else:
logging.warning("File does not exist %s", file_path)
logger.warning("File does not exist %s", file_path)
def update_recent_files(self) -> None:
self.recent_menu.delete(0, tk.END)
@ -429,23 +431,23 @@ class Menubar(tk.Menu):
canvas.show_hidden()
def click_session_options(self) -> None:
logging.debug("Click options")
logger.debug("Click options")
dialog = SessionOptionsDialog(self.app)
if not dialog.has_error:
dialog.show()
def click_sessions(self) -> None:
logging.debug("Click change sessions")
logger.debug("Click change sessions")
dialog = SessionsDialog(self.app)
dialog.show()
def click_hooks(self) -> None:
logging.debug("Click hooks")
logger.debug("Click hooks")
dialog = HooksDialog(self.app)
dialog.show()
def click_servers(self) -> None:
logging.debug("Click emulation servers")
logger.debug("Click emulation servers")
dialog = ServersDialog(self.app)
dialog.show()
@ -458,7 +460,7 @@ class Menubar(tk.Menu):
padding = (images.NODE_SIZE / 2) + 10
layout_size = padding + images.NODE_SIZE
col_count = width // layout_size
logging.info(
logger.info(
"auto grid layout: dimension(%s, %s) col(%s)", width, height, col_count
)
canvas = self.manager.current()

View file

@ -8,6 +8,8 @@ from core.gui import images
from core.gui.appconfig import CustomNode, GuiConfig
from core.gui.images import ImageEnum
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -118,11 +120,11 @@ def get_icon(node: Node, app: "Application") -> PhotoImage:
try:
image = images.from_file(node.icon, width=images.NODE_SIZE, scale=scale)
except OSError:
logging.error("invalid icon: %s", node.icon)
logger.error("invalid icon: %s", node.icon)
# custom node
elif is_custom(node):
image_file = _get_custom_file(app.guiconfig, node.model)
logging.info("custom node file: %s", image_file)
logger.info("custom node file: %s", image_file)
if image_file:
image = images.from_file(image_file, width=images.NODE_SIZE, scale=scale)
# built in node

View file

@ -4,6 +4,8 @@ import time
import tkinter as tk
from typing import TYPE_CHECKING, Any, Callable, Optional, Tuple
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -43,7 +45,7 @@ class ProgressTask:
if self.callback:
self.app.after(0, self.callback, *values)
except Exception as e:
logging.exception("progress task exception")
logger.exception("progress task exception")
self.app.show_exception("Task Error", e)
finally:
self.app.after(0, self.complete)

View file

@ -20,6 +20,8 @@ from core.gui.task import ProgressTask
from core.gui.themes import Styles
from core.gui.tooltip import Tooltip
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -338,7 +340,7 @@ class Toolbar(ttk.Frame):
type_enum: NodeTypeEnum,
image: PhotoImage,
) -> None:
logging.debug("update button(%s): %s", button, node_draw)
logger.debug("update button(%s): %s", button, node_draw)
button.configure(image=image)
button.image = image
self.app.manager.node_draw = node_draw
@ -399,7 +401,7 @@ class Toolbar(ttk.Frame):
"""
redraw buttons on the toolbar, send node and link messages to grpc server
"""
logging.info("clicked stop button")
logger.info("clicked stop button")
self.app.menubar.set_state(is_runtime=False)
self.app.core.close_mobility_players()
enable_buttons(self.runtime_frame, enabled=False)
@ -415,7 +417,7 @@ class Toolbar(ttk.Frame):
def update_annotation(
self, shape_type: ShapeType, image_enum: ImageEnum, image: PhotoImage
) -> None:
logging.debug("clicked annotation")
logger.debug("clicked annotation")
self.annotation_button.configure(image=image)
self.annotation_button.image = image
self.app.manager.annotation_type = shape_type
@ -433,7 +435,7 @@ class Toolbar(ttk.Frame):
self.marker_frame.grid()
def click_run_button(self) -> None:
logging.debug("Click on RUN button")
logger.debug("Click on RUN button")
dialog = RunToolDialog(self.app)
dialog.show()

View file

@ -10,6 +10,8 @@ from core.gui import appconfig, themes, validation
from core.gui.dialogs.dialog import Dialog
from core.gui.themes import FRAME_PAD, PADX, PADY
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.gui.app import Application
@ -161,7 +163,7 @@ class ConfigFrame(ttk.Notebook):
)
entry.grid(row=index, column=1, sticky=tk.EW)
else:
logging.error("unhandled config option type: %s", option.type)
logger.error("unhandled config option type: %s", option.type)
self.values[option.name] = value
def parse_config(self) -> Dict[str, str]:

View file

@ -10,6 +10,7 @@ from pyproj import Transformer
from core.emulator.enumerations import RegisterTlvs
logger = logging.getLogger(__name__)
SCALE_FACTOR: float = 100.0
CRS_WGS84: int = 4326
CRS_PROJ: int = 3857
@ -92,7 +93,7 @@ class GeoLocation:
:param alt: altitude value
:return: x,y,z representation of provided values
"""
logging.debug("input lon,lat,alt(%s, %s, %s)", lon, lat, alt)
logger.debug("input lon,lat,alt(%s, %s, %s)", lon, lat, alt)
px, py = self.to_pixels.transform(lon, lat)
px -= self.refproj[0]
py -= self.refproj[1]
@ -100,7 +101,7 @@ class GeoLocation:
x = self.meters2pixels(px) + self.refxyz[0]
y = -(self.meters2pixels(py) + self.refxyz[1])
z = self.meters2pixels(pz) + self.refxyz[2]
logging.debug("result x,y,z(%s, %s, %s)", x, y, z)
logger.debug("result x,y,z(%s, %s, %s)", x, y, z)
return x, y, z
def getgeo(self, x: float, y: float, z: float) -> Tuple[float, float, float]:
@ -112,7 +113,7 @@ class GeoLocation:
:param z: z value
:return: lat,lon,alt representation of provided values
"""
logging.debug("input x,y(%s, %s)", x, y)
logger.debug("input x,y(%s, %s)", x, y)
x -= self.refxyz[0]
y = -(y - self.refxyz[1])
if z is None:
@ -123,5 +124,5 @@ class GeoLocation:
py = self.refproj[1] + self.pixels2meters(y)
lon, lat = self.to_geo.transform(px, py)
alt = self.refgeo[2] + self.pixels2meters(z)
logging.debug("result lon,lat,alt(%s, %s, %s)", lon, lat, alt)
logger.debug("result lon,lat,alt(%s, %s, %s)", lon, lat, alt)
return lat, lon, alt

View file

@ -28,6 +28,8 @@ from core.nodes.base import CoreNode
from core.nodes.interface import CoreInterface
from core.nodes.network import WlanNode
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -81,7 +83,7 @@ class MobilityManager(ModelManager):
if node_ids is None:
node_ids = self.nodes()
for node_id in node_ids:
logging.debug(
logger.debug(
"node(%s) mobility startup: %s", node_id, self.get_all_configs(node_id)
)
try:
@ -95,8 +97,8 @@ class MobilityManager(ModelManager):
if node.mobility:
self.session.event_loop.add_event(0.0, node.mobility.startup)
except CoreError:
logging.exception("mobility startup error")
logging.warning(
logger.exception("mobility startup error")
logger.warning(
"skipping mobility configuration for unknown node: %s", node_id
)
@ -114,7 +116,7 @@ class MobilityManager(ModelManager):
try:
node = get_mobility_node(self.session, node_id)
except CoreError:
logging.exception(
logger.exception(
"ignoring event for model(%s), unknown node(%s)", name, node_id
)
return
@ -124,17 +126,17 @@ class MobilityManager(ModelManager):
for model in models:
cls = self.models.get(model)
if not cls:
logging.warning("ignoring event for unknown model '%s'", model)
logger.warning("ignoring event for unknown model '%s'", model)
continue
if cls.config_type in [RegisterTlvs.WIRELESS, RegisterTlvs.MOBILITY]:
model = node.mobility
else:
continue
if model is None:
logging.warning("ignoring event, %s has no model", node.name)
logger.warning("ignoring event, %s has no model", node.name)
continue
if cls.name != model.name:
logging.warning(
logger.warning(
"ignoring event for %s wrong model %s,%s",
node.name,
cls.name,
@ -410,16 +412,16 @@ class BasicRangeModel(WirelessModel):
linked = self.wlan.linked(a, b)
if d > self.range:
if linked:
logging.debug("was linked, unlinking")
logger.debug("was linked, unlinking")
self.wlan.unlink(a, b)
self.sendlinkmsg(a, b, unlink=True)
else:
if not linked:
logging.debug("was not linked, linking")
logger.debug("was not linked, linking")
self.wlan.link(a, b)
self.sendlinkmsg(a, b)
except KeyError:
logging.exception("error getting interfaces during calclink")
logger.exception("error getting interfaces during calclink")
@staticmethod
def calcdistance(
@ -449,7 +451,7 @@ class BasicRangeModel(WirelessModel):
self.range = self._get_config(self.range, config, "range")
if self.range is None:
self.range = 0
logging.debug("wlan %s set range to %s", self.wlan.name, self.range)
logger.debug("wlan %s set range to %s", self.wlan.name, self.range)
self.bw = self._get_config(self.bw, config, "bandwidth")
self.delay = self._get_config(self.delay, config, "delay")
self.loss = self._get_config(self.loss, config, "error")
@ -927,7 +929,7 @@ class Ns2ScriptedMobility(WayPointMobility):
def update_config(self, config: Dict[str, str]) -> None:
self.file = Path(config["file"])
logging.info(
logger.info(
"ns-2 scripted mobility configured for WLAN %d using file: %s",
self.id,
self.file,
@ -955,11 +957,11 @@ class Ns2ScriptedMobility(WayPointMobility):
try:
f = file_path.open("r")
except IOError:
logging.exception(
logger.exception(
"ns-2 scripted mobility failed to load file: %s", self.file
)
return
logging.info("reading ns-2 script file: %s", file_path)
logger.info("reading ns-2 script file: %s", file_path)
ln = 0
ix = iy = iz = None
inodenum = None
@ -1002,7 +1004,7 @@ class Ns2ScriptedMobility(WayPointMobility):
else:
raise ValueError
except ValueError:
logging.exception(
logger.exception(
"skipping line %d of file %s '%s'", ln, self.file, line
)
continue
@ -1052,7 +1054,7 @@ class Ns2ScriptedMobility(WayPointMobility):
raise ValueError
self.nodemap[int(parts[0])] = int(parts[1])
except ValueError:
logging.exception("ns-2 mobility node map error")
logger.exception("ns-2 mobility node map error")
def map(self, nodenum: str) -> int:
"""
@ -1074,19 +1076,19 @@ class Ns2ScriptedMobility(WayPointMobility):
:return: nothing
"""
if self.autostart == "":
logging.info("not auto-starting ns-2 script for %s", self.net.name)
logger.info("not auto-starting ns-2 script for %s", self.net.name)
return
try:
t = float(self.autostart)
except ValueError:
logging.exception(
logger.exception(
"Invalid auto-start seconds specified '%s' for %s",
self.autostart,
self.net.name,
)
return
self.movenodesinitial()
logging.info("scheduling ns-2 script for %s autostart at %s", self.net.name, t)
logger.info("scheduling ns-2 script for %s autostart at %s", self.net.name, t)
self.state = self.STATE_RUNNING
self.session.event_loop.add_event(t, self.run)
@ -1096,7 +1098,7 @@ class Ns2ScriptedMobility(WayPointMobility):
:return: nothing
"""
logging.info("starting script: %s", self.file)
logger.info("starting script: %s", self.file)
laststate = self.state
super().start()
if laststate == self.STATE_PAUSED:
@ -1117,7 +1119,7 @@ class Ns2ScriptedMobility(WayPointMobility):
:return: nothing
"""
logging.info("pausing script: %s", self.file)
logger.info("pausing script: %s", self.file)
super().pause()
self.statescript("pause")
@ -1129,7 +1131,7 @@ class Ns2ScriptedMobility(WayPointMobility):
position
:return: nothing
"""
logging.info("stopping script: %s", self.file)
logger.info("stopping script: %s", self.file)
super().stop(move_initial=move_initial)
self.statescript("stop")

View file

@ -21,6 +21,8 @@ from core.nodes.client import VnodeClient
from core.nodes.interface import CoreInterface, TunTap, Veth
from core.nodes.netclient import LinuxNetClient, get_net_client
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.distributed import DistributedServer
from core.emulator.session import Session
@ -404,7 +406,7 @@ class CoreNodeBase(NodeBase):
if iface_id not in self.ifaces:
raise CoreError(f"node({self.name}) interface({iface_id}) does not exist")
iface = self.ifaces.pop(iface_id)
logging.info("node(%s) removing interface(%s)", self.name, iface.name)
logger.info("node(%s) removing interface(%s)", self.name, iface.name)
iface.detachnet()
iface.shutdown()
@ -547,17 +549,17 @@ class CoreNode(CoreNodeBase):
output = self.host_cmd(vnoded, env=env)
self.pid = int(output)
logging.debug("node(%s) pid: %s", self.name, self.pid)
logger.debug("node(%s) pid: %s", self.name, self.pid)
# create vnode client
self.client = VnodeClient(self.name, self.ctrlchnlname)
# bring up the loopback interface
logging.debug("bringing up loopback interface")
logger.debug("bringing up loopback interface")
self.node_net_client.device_up("lo")
# set hostname for node
logging.debug("setting hostname: %s", self.name)
logger.debug("setting hostname: %s", self.name)
self.node_net_client.set_hostname(self.name)
# mark node as up
@ -588,18 +590,18 @@ class CoreNode(CoreNodeBase):
try:
self.host_cmd(f"kill -9 {self.pid}")
except CoreCommandError:
logging.exception("error killing process")
logger.exception("error killing process")
# remove node directory if present
try:
self.host_cmd(f"rm -rf {self.ctrlchnlname}")
except CoreCommandError:
logging.exception("error removing node directory")
logger.exception("error removing node directory")
# clear interface data, close client, and mark self and not up
self.ifaces.clear()
self.client.close()
self.up = False
except OSError:
logging.exception("error during shutdown")
logger.exception("error during shutdown")
finally:
self.rmnodedir()
@ -668,7 +670,7 @@ class CoreNode(CoreNodeBase):
:return: nothing
:raises CoreCommandError: when a non-zero exit status occurs
"""
logging.debug("node(%s) mounting: %s at %s", self.name, src_path, target_path)
logger.debug("node(%s) mounting: %s at %s", self.name, src_path, target_path)
self.cmd(f"mkdir -p {target_path}")
self.cmd(f"{MOUNT} -n --bind {src_path} {target_path}")
self._mounts.append((src_path, target_path))
@ -726,9 +728,9 @@ class CoreNode(CoreNodeBase):
if self.up:
flow_id = self.node_net_client.get_ifindex(veth.name)
veth.flow_id = int(flow_id)
logging.debug("interface flow index: %s - %s", veth.name, veth.flow_id)
logger.debug("interface flow index: %s - %s", veth.name, veth.flow_id)
mac = self.node_net_client.get_mac(veth.name)
logging.debug("interface mac: %s - %s", veth.name, mac)
logger.debug("interface mac: %s - %s", veth.name, mac)
veth.set_mac(mac)
try:
@ -867,7 +869,7 @@ class CoreNode(CoreNodeBase):
:return: nothing
:raises CoreCommandError: when a non-zero exit status occurs
"""
logging.info("adding file from %s to %s", src_path, file_path)
logger.info("adding file from %s to %s", src_path, file_path)
directory = file_path.parent
if self.server is None:
self.client.check_cmd(f"mkdir -p {directory}")
@ -898,7 +900,7 @@ class CoreNode(CoreNodeBase):
self.host_cmd(f"mkdir -m {0o755:o} -p {directory}")
self.server.remote_put_temp(host_path, contents)
self.host_cmd(f"chmod {mode:o} {host_path}")
logging.debug("node(%s) added file: %s; mode: 0%o", self.name, host_path, mode)
logger.debug("node(%s) added file: %s; mode: 0%o", self.name, host_path, mode)
def nodefilecopy(self, file_path: Path, src_path: Path, mode: int = None) -> None:
"""
@ -917,7 +919,7 @@ class CoreNode(CoreNodeBase):
self.server.remote_put(src_path, host_path)
if mode is not None:
self.host_cmd(f"chmod {mode:o} {host_path}")
logging.info("node(%s) copied file: %s; mode: %s", self.name, host_path, mode)
logger.info("node(%s) copied file: %s; mode: %s", self.name, host_path, mode)
class CoreNetworkBase(NodeBase):

View file

@ -11,6 +11,8 @@ from core.errors import CoreCommandError
from core.nodes.base import CoreNode
from core.nodes.netclient import LinuxNetClient, get_net_client
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -50,7 +52,7 @@ class DockerClient:
self.run(f"docker rm -f {self.name}")
def check_cmd(self, cmd: str, wait: bool = True, shell: bool = False) -> str:
logging.info("docker cmd output: %s", cmd)
logger.info("docker cmd output: %s", cmd)
return utils.cmd(f"docker exec {self.name} {cmd}", wait=wait, shell=shell)
def create_ns_cmd(self, cmd: str) -> str:
@ -60,7 +62,7 @@ class DockerClient:
args = f"docker inspect -f '{{{{.State.Pid}}}}' {self.name}"
output = self.run(args)
self.pid = output
logging.debug("node(%s) pid: %s", self.name, self.pid)
logger.debug("node(%s) pid: %s", self.name, self.pid)
return output
def copy_file(self, src_path: Path, dst_path: Path) -> str:
@ -169,7 +171,7 @@ class DockerNode(CoreNode):
:param dir_path: path to create
:return: nothing
"""
logging.debug("creating node dir: %s", dir_path)
logger.debug("creating node dir: %s", dir_path)
args = f"mkdir -p {dir_path}"
self.cmd(args)
@ -182,7 +184,7 @@ class DockerNode(CoreNode):
:return: nothing
:raises CoreCommandError: when a non-zero exit status occurs
"""
logging.debug("mounting source(%s) target(%s)", src_path, target_path)
logger.debug("mounting source(%s) target(%s)", src_path, target_path)
raise Exception("not supported")
def nodefile(self, file_path: Path, contents: str, mode: int = 0o644) -> None:
@ -194,7 +196,7 @@ class DockerNode(CoreNode):
:param mode: mode for file
:return: nothing
"""
logging.debug("nodefile filename(%s) mode(%s)", file_path, mode)
logger.debug("nodefile filename(%s) mode(%s)", file_path, mode)
temp = NamedTemporaryFile(delete=False)
temp.write(contents.encode("utf-8"))
temp.close()
@ -209,7 +211,7 @@ class DockerNode(CoreNode):
if self.server is not None:
self.host_cmd(f"rm -f {temp_path}")
temp_path.unlink()
logging.debug("node(%s) added file: %s; mode: 0%o", self.name, file_path, mode)
logger.debug("node(%s) added file: %s; mode: 0%o", self.name, file_path, mode)
def nodefilecopy(self, file_path: Path, src_path: Path, mode: int = None) -> None:
"""
@ -221,7 +223,7 @@ class DockerNode(CoreNode):
:param mode: mode to copy to
:return: nothing
"""
logging.info(
logger.info(
"node file copy file(%s) source(%s) mode(%s)", file_path, src_path, mode
)
self.cmd(f"mkdir -p {file_path.parent}")

View file

@ -15,6 +15,8 @@ from core.emulator.enumerations import TransportType
from core.errors import CoreCommandError, CoreError
from core.nodes.netclient import LinuxNetClient, get_net_client
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.distributed import DistributedServer
from core.emulator.session import Session
@ -274,7 +276,7 @@ class CoreInterface:
:return: True if parameter changed, False otherwise
"""
# treat None and 0 as unchanged values
logging.debug("setting param: %s - %s", key, value)
logger.debug("setting param: %s - %s", key, value)
if value is None or value < 0:
return False
@ -457,7 +459,7 @@ class TunTap(CoreInterface):
try:
self.node.node_net_client.device_flush(self.name)
except CoreCommandError:
logging.exception("error shutting down tunnel tap")
logger.exception("error shutting down tunnel tap")
self.up = False
@ -482,14 +484,14 @@ class TunTap(CoreInterface):
msg = f"attempt {i} failed with nonzero exit status {r}"
if i < attempts + 1:
msg += ", retrying..."
logging.info(msg)
logger.info(msg)
time.sleep(delay)
delay += delay
if delay > maxretrydelay:
delay = maxretrydelay
else:
msg += ", giving up"
logging.info(msg)
logger.info(msg)
return result
@ -500,7 +502,7 @@ class TunTap(CoreInterface):
:return: wait for device local response
"""
logging.debug("waiting for device local: %s", self.localname)
logger.debug("waiting for device local: %s", self.localname)
def localdevexists():
try:
@ -517,7 +519,7 @@ class TunTap(CoreInterface):
:return: nothing
"""
logging.debug("waiting for device node: %s", self.name)
logger.debug("waiting for device node: %s", self.name)
def nodedevexists():
try:
@ -634,5 +636,5 @@ class GreTap(CoreInterface):
self.net_client.device_down(self.localname)
self.net_client.delete_device(self.localname)
except CoreCommandError:
logging.exception("error during shutdown")
logger.exception("error during shutdown")
self.localname = None

View file

@ -12,6 +12,8 @@ from core.errors import CoreCommandError
from core.nodes.base import CoreNode
from core.nodes.interface import CoreInterface
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -145,7 +147,7 @@ class LxcNode(CoreNode):
:param dir_path: path to create
:return: nothing
"""
logging.info("creating node dir: %s", dir_path)
logger.info("creating node dir: %s", dir_path)
args = f"mkdir -p {dir_path}"
self.cmd(args)
@ -158,7 +160,7 @@ class LxcNode(CoreNode):
:return: nothing
:raises CoreCommandError: when a non-zero exit status occurs
"""
logging.debug("mounting source(%s) target(%s)", src_path, target_path)
logger.debug("mounting source(%s) target(%s)", src_path, target_path)
raise Exception("not supported")
def nodefile(self, file_path: Path, contents: str, mode: int = 0o644) -> None:
@ -170,7 +172,7 @@ class LxcNode(CoreNode):
:param mode: mode for file
:return: nothing
"""
logging.debug("nodefile filename(%s) mode(%s)", file_path, mode)
logger.debug("nodefile filename(%s) mode(%s)", file_path, mode)
temp = NamedTemporaryFile(delete=False)
temp.write(contents.encode("utf-8"))
temp.close()
@ -185,7 +187,7 @@ class LxcNode(CoreNode):
if self.server is not None:
self.host_cmd(f"rm -f {temp_path}")
temp_path.unlink()
logging.debug("node(%s) added file: %s; mode: 0%o", self.name, file_path, mode)
logger.debug("node(%s) added file: %s; mode: 0%o", self.name, file_path, mode)
def nodefilecopy(self, file_path: Path, src_path: Path, mode: int = None) -> None:
"""
@ -197,7 +199,7 @@ class LxcNode(CoreNode):
:param mode: mode to copy to
:return: nothing
"""
logging.info(
logger.info(
"node file copy file(%s) source(%s) mode(%s)", file_path, src_path, mode
)
self.cmd(f"mkdir -p {file_path.parent}")

View file

@ -26,6 +26,8 @@ from core.nodes.base import CoreNetworkBase
from core.nodes.interface import CoreInterface, GreTap, Veth
from core.nodes.netclient import get_net_client
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.distributed import DistributedServer
from core.emulator.session import Session
@ -90,7 +92,7 @@ class EbtablesQueue:
try:
del self.last_update_time[wlan]
except KeyError:
logging.exception(
logger.exception(
"error deleting last update time for wlan, ignored before: %s", wlan
)
if len(self.last_update_time) > 0:
@ -186,7 +188,7 @@ class EbtablesQueue:
try:
wlan.host_cmd(f"rm -f {self.atomic_file}")
except CoreCommandError:
logging.exception("error removing atomic file: %s", self.atomic_file)
logger.exception("error removing atomic file: %s", self.atomic_file)
def ebchange(self, wlan: "CoreNetwork") -> None:
"""
@ -309,7 +311,7 @@ class CoreNetwork(CoreNetworkBase):
:return: combined stdout and stderr
:raises CoreCommandError: when a non-zero exit status occurs
"""
logging.debug("network node(%s) cmd", self.name)
logger.debug("network node(%s) cmd", self.name)
output = utils.cmd(args, env, cwd, wait, shell)
self.session.distributed.execute(lambda x: x.remote_cmd(args, env, cwd, wait))
return output
@ -344,7 +346,7 @@ class CoreNetwork(CoreNetworkBase):
]
ebtablescmds(self.host_cmd, cmds)
except CoreCommandError:
logging.exception("error during shutdown")
logger.exception("error during shutdown")
# removes veth pairs used for bridge-to-bridge connections
for iface in self.get_ifaces():
iface.shutdown()
@ -763,7 +765,7 @@ class CtrlNet(CoreNetwork):
raise CoreError(f"old bridges exist for node: {self.id}")
super().startup()
logging.info("added control network bridge: %s %s", self.brname, self.prefix)
logger.info("added control network bridge: %s %s", self.brname, self.prefix)
if self.hostid and self.assign_address:
self.add_addresses(self.hostid)
@ -771,7 +773,7 @@ class CtrlNet(CoreNetwork):
self.add_addresses(-2)
if self.updown_script:
logging.info(
logger.info(
"interface %s updown script (%s startup) called",
self.brname,
self.updown_script,
@ -791,7 +793,7 @@ class CtrlNet(CoreNetwork):
try:
self.net_client.delete_iface(self.brname, self.serverintf)
except CoreCommandError:
logging.exception(
logger.exception(
"error deleting server interface %s from bridge %s",
self.serverintf,
self.brname,
@ -799,14 +801,14 @@ class CtrlNet(CoreNetwork):
if self.updown_script is not None:
try:
logging.info(
logger.info(
"interface %s updown script (%s shutdown) called",
self.brname,
self.updown_script,
)
self.host_cmd(f"{self.updown_script} {self.brname} shutdown")
except CoreCommandError:
logging.exception("error issuing shutdown script shutdown")
logger.exception("error issuing shutdown script shutdown")
super().shutdown()
@ -1006,7 +1008,7 @@ class WlanNode(CoreNetwork):
:param config: configuration for model being set
:return: nothing
"""
logging.debug("node(%s) setting model: %s", self.name, model.name)
logger.debug("node(%s) setting model: %s", self.name, model.name)
if model.config_type == RegisterTlvs.WIRELESS:
self.model = model(session=self.session, _id=self.id)
for iface in self.get_ifaces():
@ -1025,7 +1027,7 @@ class WlanNode(CoreNetwork):
def updatemodel(self, config: Dict[str, str]) -> None:
if not self.model:
raise CoreError(f"no model set to update for node({self.name})")
logging.debug(
logger.debug(
"node(%s) updating model(%s): %s", self.id, self.model.name, config
)
self.model.update_config(config)

View file

@ -16,6 +16,8 @@ from core.nodes.base import CoreNetworkBase, CoreNodeBase
from core.nodes.interface import DEFAULT_MTU, CoreInterface
from core.nodes.network import CoreNetwork, GreTap
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -163,7 +165,7 @@ class PhysicalNode(CoreNodeBase):
def new_iface(
self, net: CoreNetworkBase, iface_data: InterfaceData
) -> CoreInterface:
logging.info("creating interface")
logger.info("creating interface")
ips = iface_data.get_ips()
iface_id = iface_data.id
if iface_id is None:
@ -191,17 +193,17 @@ class PhysicalNode(CoreNodeBase):
self.mount(host_path, dir_path)
def mount(self, src_path: Path, target_path: Path) -> None:
logging.debug("node(%s) mounting: %s at %s", self.name, src_path, target_path)
logger.debug("node(%s) mounting: %s at %s", self.name, src_path, target_path)
self.cmd(f"mkdir -p {target_path}")
self.host_cmd(f"{MOUNT} --bind {src_path} {target_path}", cwd=self.directory)
self._mounts.append((src_path, target_path))
def umount(self, target_path: Path) -> None:
logging.info("unmounting '%s'", target_path)
logger.info("unmounting '%s'", target_path)
try:
self.host_cmd(f"{UMOUNT} -l {target_path}", cwd=self.directory)
except CoreCommandError:
logging.exception("unmounting failed for %s", target_path)
logger.exception("unmounting failed for %s", target_path)
def nodefile(self, file_path: Path, contents: str, mode: int = 0o644) -> None:
host_path = self.host_path(file_path)
@ -211,7 +213,7 @@ class PhysicalNode(CoreNodeBase):
with host_path.open("w") as f:
f.write(contents)
host_path.chmod(mode)
logging.info("created nodefile: '%s'; mode: 0%o", host_path, mode)
logger.info("created nodefile: '%s'; mode: 0%o", host_path, mode)
def cmd(self, args: str, wait: bool = True, shell: bool = False) -> str:
return self.host_cmd(args, wait=wait)
@ -415,7 +417,7 @@ class Rj45Node(CoreNodeBase):
if items[1][:4] == "fe80":
continue
self.old_addrs.append((items[1], None))
logging.info("saved rj45 state: addrs(%s) up(%s)", self.old_addrs, self.old_up)
logger.info("saved rj45 state: addrs(%s) up(%s)", self.old_addrs, self.old_up)
def restorestate(self) -> None:
"""
@ -425,7 +427,7 @@ class Rj45Node(CoreNodeBase):
:raises CoreCommandError: when there is a command exception
"""
localname = self.iface.localname
logging.info("restoring rj45 state: %s", localname)
logger.info("restoring rj45 state: %s", localname)
for addr in self.old_addrs:
self.net_client.create_address(localname, addr[0], addr[1])
if self.old_up:

View file

@ -15,6 +15,8 @@ from core.errors import CoreError
from core.nodes.base import CoreNetworkBase, NodeBase
from core.nodes.network import WlanNode
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -109,7 +111,7 @@ class Sdt:
return False
self.seturl()
logging.info("connecting to SDT at %s://%s", self.protocol, self.address)
logger.info("connecting to SDT at %s://%s", self.protocol, self.address)
if self.sock is None:
try:
if self.protocol.lower() == "udp":
@ -119,7 +121,7 @@ class Sdt:
# Default to tcp
self.sock = socket.create_connection(self.address, 5)
except IOError:
logging.exception("SDT socket connect error")
logger.exception("SDT socket connect error")
return False
if not self.initialize():
@ -157,7 +159,7 @@ class Sdt:
try:
self.sock.close()
except IOError:
logging.error("error closing socket")
logger.error("error closing socket")
finally:
self.sock = None
@ -191,11 +193,11 @@ class Sdt:
try:
cmd = f"{cmdstr}\n".encode()
logging.debug("sdt cmd: %s", cmd)
logger.debug("sdt cmd: %s", cmd)
self.sock.sendall(cmd)
return True
except IOError:
logging.exception("SDT connection error")
logger.exception("SDT connection error")
self.sock = None
self.connected = False
return False
@ -250,7 +252,7 @@ class Sdt:
:param node: node to add
:return: nothing
"""
logging.debug("sdt add node: %s - %s", node.id, node.name)
logger.debug("sdt add node: %s - %s", node.id, node.name)
if not self.connect():
return
pos = self.get_node_position(node)
@ -262,8 +264,8 @@ class Sdt:
icon = node.icon
if icon:
node_type = node.name
icon = icon.replace("$CORE_DATA_DIR", CORE_DATA_DIR)
icon = icon.replace("$CORE_CONF_DIR", CORE_CONF_DIR)
icon = icon.replace("$CORE_DATA_DIR", str(CORE_DATA_DIR))
icon = icon.replace("$CORE_CONF_DIR", str(CORE_CONF_DIR))
self.cmd(f"sprite {node_type} image {icon}")
self.cmd(
f'node {node.id} nodeLayer "{NODE_LAYER}" '
@ -280,7 +282,7 @@ class Sdt:
:param alt: node altitude
:return: nothing
"""
logging.debug("sdt update node: %s - %s", node.id, node.name)
logger.debug("sdt update node: %s - %s", node.id, node.name)
if not self.connect():
return
@ -300,7 +302,7 @@ class Sdt:
:param node_id: node id to delete
:return: nothing
"""
logging.debug("sdt delete node: %s", node_id)
logger.debug("sdt delete node: %s", node_id)
if not self.connect():
return
self.cmd(f"delete node,{node_id}")
@ -315,7 +317,7 @@ class Sdt:
if not self.connect():
return
node = node_data.node
logging.debug("sdt handle node update: %s - %s", node.id, node.name)
logger.debug("sdt handle node update: %s - %s", node.id, node.name)
if node_data.message_type == MessageFlags.DELETE:
self.cmd(f"delete node,{node.id}")
else:
@ -356,7 +358,7 @@ class Sdt:
:param label: label for link
:return: nothing
"""
logging.debug("sdt add link: %s, %s, %s", node1_id, node2_id, network_id)
logger.debug("sdt add link: %s, %s, %s", node1_id, node2_id, network_id)
if not self.connect():
return
if self.wireless_net_check(node1_id) or self.wireless_net_check(node2_id):
@ -396,7 +398,7 @@ class Sdt:
:param network_id: network link is associated with, None otherwise
:return: nothing
"""
logging.debug("sdt delete link: %s, %s, %s", node1_id, node2_id, network_id)
logger.debug("sdt delete link: %s, %s, %s", node1_id, node2_id, network_id)
if not self.connect():
return
if self.wireless_net_check(node1_id) or self.wireless_net_check(node2_id):
@ -416,7 +418,7 @@ class Sdt:
:param label: label to update
:return: nothing
"""
logging.debug("sdt edit link: %s, %s, %s", node1_id, node2_id, network_id)
logger.debug("sdt edit link: %s, %s, %s", node1_id, node2_id, network_id)
if not self.connect():
return
if self.wireless_net_check(node1_id) or self.wireless_net_check(node2_id):

View file

@ -34,6 +34,8 @@ from core.errors import (
)
from core.nodes.base import CoreNode
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
@ -161,7 +163,7 @@ class ServiceShim:
cls.setvalue(service, key, values[cls.keys.index(key)])
except IndexError:
# old config does not need to have new keys
logging.exception("error indexing into key")
logger.exception("error indexing into key")
@classmethod
def setvalue(cls, service: "CoreService", key: str, value: str) -> None:
@ -228,7 +230,7 @@ class ServiceManager:
:raises ValueError: when service cannot be loaded
"""
name = service.name
logging.debug("loading service: class(%s) name(%s)", service.__name__, name)
logger.debug("loading service: class(%s) name(%s)", service.__name__, name)
# avoid duplicate services
if name in cls.services:
@ -245,7 +247,7 @@ class ServiceManager:
try:
service.on_load()
except Exception as e:
logging.exception("error during service(%s) on load", service.name)
logger.exception("error during service(%s) on load", service.name)
raise ValueError(e)
# make service available
@ -281,7 +283,7 @@ class ServiceManager:
cls.add(service)
except (CoreError, ValueError) as e:
service_errors.append(service.name)
logging.debug("not loading service(%s): %s", service.name, e)
logger.debug("not loading service(%s): %s", service.name, e)
return service_errors
@ -329,14 +331,14 @@ class CoreServices:
:param node_type: node type to get default services for
:return: default services
"""
logging.debug("getting default services for type: %s", node_type)
logger.debug("getting default services for type: %s", node_type)
results = []
defaults = self.default_services.get(node_type, [])
for name in defaults:
logging.debug("checking for service with service manager: %s", name)
logger.debug("checking for service with service manager: %s", name)
service = ServiceManager.get(name)
if not service:
logging.warning("default service %s is unknown", name)
logger.warning("default service %s is unknown", name)
else:
results.append(service)
return results
@ -369,7 +371,7 @@ class CoreServices:
:param service_name: name of service to set
:return: nothing
"""
logging.debug("setting custom service(%s) for node: %s", service_name, node_id)
logger.debug("setting custom service(%s) for node: %s", service_name, node_id)
service = self.get_service(node_id, service_name)
if not service:
service_class = ServiceManager.get(service_name)
@ -391,15 +393,15 @@ class CoreServices:
:return: nothing
"""
if not services:
logging.info(
logger.info(
"using default services for node(%s) type(%s)", node.name, node_type
)
services = self.default_services.get(node_type, [])
logging.info("setting services for node(%s): %s", node.name, services)
logger.info("setting services for node(%s): %s", node.name, services)
for service_name in services:
service = self.get_service(node.id, service_name, default_service=True)
if not service:
logging.warning(
logger.warning(
"unknown service(%s) for node(%s)", service_name, node.name
)
continue
@ -457,7 +459,7 @@ class CoreServices:
raise CoreServiceBootError(*exceptions)
def _boot_service_path(self, node: CoreNode, boot_path: List["CoreServiceType"]):
logging.info(
logger.info(
"booting node(%s) services: %s",
node.name,
" -> ".join([x.name for x in boot_path]),
@ -467,7 +469,7 @@ class CoreServices:
try:
self.boot_service(node, service)
except Exception as e:
logging.exception("exception booting service: %s", service.name)
logger.exception("exception booting service: %s", service.name)
raise CoreServiceBootError(e)
def boot_service(self, node: CoreNode, service: "CoreServiceType") -> None:
@ -479,7 +481,7 @@ class CoreServices:
:param service: service to start
:return: nothing
"""
logging.info(
logger.info(
"starting node(%s) service(%s) validation(%s)",
node.name,
service.name,
@ -492,7 +494,7 @@ class CoreServices:
try:
node.privatedir(dir_path)
except (CoreCommandError, CoreError) as e:
logging.warning(
logger.warning(
"error mounting private dir '%s' for service '%s': %s",
directory,
service.name,
@ -563,21 +565,21 @@ class CoreServices:
:param service: service to validate
:return: service validation status
"""
logging.debug("validating node(%s) service(%s)", node.name, service.name)
logger.debug("validating node(%s) service(%s)", node.name, service.name)
cmds = service.validate
if not service.custom:
cmds = service.get_validate(node)
status = 0
for cmd in cmds:
logging.debug("validating service(%s) using: %s", service.name, cmd)
logger.debug("validating service(%s) using: %s", service.name, cmd)
try:
node.cmd(cmd)
except CoreCommandError as e:
logging.debug(
logger.debug(
"node(%s) service(%s) validate failed", node.name, service.name
)
logging.debug("cmd(%s): %s", e.cmd, e.output)
logger.debug("cmd(%s): %s", e.cmd, e.output)
status = -1
break
@ -612,7 +614,7 @@ class CoreServices:
f"error stopping service {service.name}: {e.stderr}",
node.id,
)
logging.exception("error running stop command %s", args)
logger.exception("error running stop command %s", args)
status = -1
return status
@ -680,13 +682,13 @@ class CoreServices:
# retrieve custom service
service = self.get_service(node_id, service_name)
if service is None:
logging.warning("received file name for unknown service: %s", service_name)
logger.warning("received file name for unknown service: %s", service_name)
return
# validate file being set is valid
config_files = service.configs
if file_name not in config_files:
logging.warning(
logger.warning(
"received unknown file(%s) for service(%s)", file_name, service_name
)
return
@ -714,7 +716,7 @@ class CoreServices:
try:
node.cmd(cmd, wait)
except CoreCommandError:
logging.exception("error starting command")
logger.exception("error starting command")
status = -1
return status
@ -732,7 +734,7 @@ class CoreServices:
config_files = service.get_configs(node)
for file_name in config_files:
file_path = Path(file_name)
logging.debug(
logger.debug(
"generating service config custom(%s): %s", service.custom, file_name
)
if service.custom:
@ -744,7 +746,7 @@ class CoreServices:
if self.copy_service_file(node, file_path, cfg):
continue
except IOError:
logging.exception("error copying service file: %s", file_name)
logger.exception("error copying service file: %s", file_name)
continue
else:
cfg = service.generate_config(node, file_name)

View file

@ -11,6 +11,8 @@ from core.nodes.base import CoreNode
from core.nodes.interface import CoreInterface
from core.services.coreservices import CoreService
logger = logging.getLogger(__name__)
class VPNClient(CoreService):
name: str = "VPNClient"
@ -33,7 +35,7 @@ class VPNClient(CoreService):
with open(fname, "r") as f:
cfg += f.read()
except IOError:
logging.exception(
logger.exception(
"error opening VPN client configuration template (%s)", fname
)
return cfg
@ -61,7 +63,7 @@ class VPNServer(CoreService):
with open(fname, "r") as f:
cfg += f.read()
except IOError:
logging.exception(
logger.exception(
"Error opening VPN server configuration template (%s)", fname
)
return cfg
@ -89,7 +91,7 @@ class IPsec(CoreService):
with open(fname, "r") as f:
cfg += f.read()
except IOError:
logging.exception("Error opening IPsec configuration template (%s)", fname)
logger.exception("Error opening IPsec configuration template (%s)", fname)
return cfg
@ -112,7 +114,7 @@ class Firewall(CoreService):
with open(fname, "r") as f:
cfg += f.read()
except IOError:
logging.exception(
logger.exception(
"Error opening Firewall configuration template (%s)", fname
)
return cfg

View file

@ -36,6 +36,8 @@ import netaddr
from core.errors import CoreCommandError, CoreError
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emulator.session import Session
from core.nodes.base import CoreNode
@ -204,7 +206,7 @@ def cmd(
:raises CoreCommandError: when there is a non-zero exit status or the file to
execute is not found
"""
logging.debug("command cwd(%s) wait(%s): %s", cwd, wait, args)
logger.debug("command cwd(%s) wait(%s): %s", cwd, wait, args)
if shell is False:
args = shlex.split(args)
try:
@ -221,7 +223,7 @@ def cmd(
else:
return ""
except OSError as e:
logging.error("cmd error: %s", e.strerror)
logger.error("cmd error: %s", e.strerror)
raise CoreCommandError(1, args, "", e.strerror)
@ -323,7 +325,7 @@ def load_config(file_path: Path, d: Dict[str, str]) -> None:
key, value = line.split("=", 1)
d[key] = value.strip()
except ValueError:
logging.exception("error reading file to dict: %s", file_path)
logger.exception("error reading file to dict: %s", file_path)
def load_classes(path: Path, clazz: Generic[T]) -> T:
@ -335,13 +337,13 @@ def load_classes(path: Path, clazz: Generic[T]) -> T:
:return: list of classes loaded
"""
# validate path exists
logging.debug("attempting to load modules from path: %s", path)
logger.debug("attempting to load modules from path: %s", path)
if not path.is_dir():
logging.warning("invalid custom module directory specified" ": %s", path)
logger.warning("invalid custom module directory specified" ": %s", path)
# check if path is in sys.path
parent = str(path.parent)
if parent not in sys.path:
logging.debug("adding parent path to allow imports: %s", parent)
logger.debug("adding parent path to allow imports: %s", parent)
sys.path.append(parent)
# import and add all service modules in the path
classes = []
@ -349,7 +351,7 @@ def load_classes(path: Path, clazz: Generic[T]) -> T:
if not _valid_module(p):
continue
import_statement = f"{path.name}.{p.stem}"
logging.debug("importing custom module: %s", import_statement)
logger.debug("importing custom module: %s", import_statement)
try:
module = importlib.import_module(import_statement)
members = inspect.getmembers(module, lambda x: _is_class(module, x, clazz))
@ -357,7 +359,7 @@ def load_classes(path: Path, clazz: Generic[T]) -> T:
valid_class = member[1]
classes.append(valid_class)
except Exception:
logging.exception(
logger.exception(
"unexpected error during import, skipping: %s", import_statement
)
return classes
@ -398,7 +400,7 @@ def threadpool(
result = future.result()
results.append(result)
except Exception as e:
logging.exception("thread pool exception")
logger.exception("thread pool exception")
exceptions.append(e)
return results, exceptions

View file

@ -17,6 +17,8 @@ from core.nodes.lxd import LxcNode
from core.nodes.network import CtrlNet, GreTapBridge, WlanNode
from core.services.coreservices import CoreService
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emane.emanemodel import EmaneModel
from core.emulator.session import Session
@ -384,7 +386,7 @@ class CoreXmlWriter:
node_id, iface_id = utils.parse_iface_config_id(node_id)
for model_name in all_configs:
config = all_configs[model_name]
logging.debug(
logger.debug(
"writing emane config node(%s) model(%s)", node_id, model_name
)
model = self.session.emane.models[model_name]
@ -404,7 +406,7 @@ class CoreXmlWriter:
for model_name in all_configs:
config = all_configs[model_name]
logging.debug(
logger.debug(
"writing mobility config node(%s) model(%s)", node_id, model_name
)
mobility_configuration = etree.SubElement(
@ -609,7 +611,7 @@ class CoreXmlReader:
services = []
for service in node.iterchildren():
services.append(service.get("name"))
logging.info(
logger.info(
"reading default services for nodes(%s): %s", node_type, services
)
self.session.services.default_services[node_type] = services
@ -624,7 +626,7 @@ class CoreXmlReader:
name = data.get("name")
value = data.get("value")
configs[name] = value
logging.info("reading session metadata: %s", configs)
logger.info("reading session metadata: %s", configs)
self.session.metadata = configs
def read_session_options(self) -> None:
@ -636,7 +638,7 @@ class CoreXmlReader:
name = configuration.get("name")
value = configuration.get("value")
xml_config[name] = value
logging.info("reading session options: %s", xml_config)
logger.info("reading session options: %s", xml_config)
config = self.session.options.get_configs()
config.update(xml_config)
@ -650,7 +652,7 @@ class CoreXmlReader:
state = get_int(hook, "state")
state = EventTypes(state)
data = hook.text
logging.info("reading hook: state(%s) name(%s)", state, name)
logger.info("reading hook: state(%s) name(%s)", state, name)
self.session.add_hook(state, name, data)
def read_servers(self) -> None:
@ -660,7 +662,7 @@ class CoreXmlReader:
for server in servers.iterchildren():
name = server.get("name")
address = server.get("address")
logging.info("reading server: name(%s) address(%s)", name, address)
logger.info("reading server: name(%s) address(%s)", name, address)
self.session.distributed.add_server(name, address)
def read_session_origin(self) -> None:
@ -672,19 +674,19 @@ class CoreXmlReader:
lon = get_float(session_origin, "lon")
alt = get_float(session_origin, "alt")
if all([lat, lon, alt]):
logging.info("reading session reference geo: %s, %s, %s", lat, lon, alt)
logger.info("reading session reference geo: %s, %s, %s", lat, lon, alt)
self.session.location.setrefgeo(lat, lon, alt)
scale = get_float(session_origin, "scale")
if scale:
logging.info("reading session reference scale: %s", scale)
logger.info("reading session reference scale: %s", scale)
self.session.location.refscale = scale
x = get_float(session_origin, "x")
y = get_float(session_origin, "y")
z = get_float(session_origin, "z")
if all([x, y]):
logging.info("reading session reference xyz: %s, %s, %s", x, y, z)
logger.info("reading session reference xyz: %s, %s, %s", x, y, z)
self.session.location.refxyz = (x, y, z)
def read_service_configs(self) -> None:
@ -695,7 +697,7 @@ class CoreXmlReader:
for service_configuration in service_configurations.iterchildren():
node_id = get_int(service_configuration, "node")
service_name = service_configuration.get("name")
logging.info(
logger.info(
"reading custom service(%s) for node(%s)", service_name, node_id
)
self.session.services.set_service(node_id, service_name)
@ -790,7 +792,7 @@ class CoreXmlReader:
value = config.get("value")
configs[name] = value
logging.info(
logger.info(
"reading emane configuration node(%s) model(%s)", node_id, model_name
)
node_id = utils.iface_config_id(node_id, iface_id)
@ -811,7 +813,7 @@ class CoreXmlReader:
value = config.get("value")
configs[name] = value
logging.info(
logger.info(
"reading mobility configuration node(%s) model(%s)", node_id, model_name
)
self.session.mobility.set_model_config(node_id, model_name, configs)
@ -868,7 +870,7 @@ class CoreXmlReader:
if all([lat, lon, alt]):
options.set_location(lat, lon, alt)
logging.info("reading node id(%s) model(%s) name(%s)", node_id, model, name)
logger.info("reading node id(%s) model(%s) name(%s)", node_id, model, name)
self.session.add_node(_class, node_id, options)
def read_network(self, network_element: etree.Element) -> None:
@ -896,7 +898,7 @@ class CoreXmlReader:
if all([lat, lon, alt]):
options.set_location(lat, lon, alt)
logging.info(
logger.info(
"reading node id(%s) node_type(%s) name(%s)", node_id, node_type, name
)
self.session.add_node(_class, node_id, options)
@ -926,7 +928,7 @@ class CoreXmlReader:
for template_element in templates_element.iterchildren():
name = template_element.get("name")
template = template_element.text
logging.info(
logger.info(
"loading xml template(%s): %s", type(template), template
)
service.set_template(name, template)
@ -978,12 +980,12 @@ class CoreXmlReader:
options.buffer = get_int(options_element, "buffer")
if options.unidirectional == 1 and node_set in node_sets:
logging.info("updating link node1(%s) node2(%s)", node1_id, node2_id)
logger.info("updating link node1(%s) node2(%s)", node1_id, node2_id)
self.session.update_link(
node1_id, node2_id, iface1_data.id, iface2_data.id, options
)
else:
logging.info("adding link node1(%s) node2(%s)", node1_id, node2_id)
logger.info("adding link node1(%s) node2(%s)", node1_id, node2_id)
self.session.add_link(
node1_id, node2_id, iface1_data, iface2_data, options
)

View file

@ -15,6 +15,8 @@ from core.nodes.interface import CoreInterface
from core.nodes.network import CtrlNet
from core.xml import corexml
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from core.emane.emanemanager import EmaneManager, StartData
from core.emane.emanemodel import EmaneModel
@ -47,7 +49,7 @@ def _value_to_params(value: str) -> Optional[Tuple[str]]:
return None
return values
except SyntaxError:
logging.exception("error in value string to param list")
logger.exception("error in value string to param list")
return None

View file

@ -13,8 +13,11 @@
"format": "%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s"
}
},
"root": {
"level": "INFO",
"handlers": ["console"]
}
"loggers": {
"core": {
"level": "INFO",
"handlers": ["console"],
"propagate": false
}
}
}

View file

@ -22,6 +22,8 @@ from core.api.tlv.enumerations import CORE_API_PORT
from core.constants import CORE_CONF_DIR, COREDPY_VERSION
from core.utils import close_onexec, load_logging_config
logger = logging.getLogger(__name__)
def banner():
"""
@ -29,7 +31,7 @@ def banner():
:return: nothing
"""
logging.info("CORE daemon v.%s started %s", constants.COREDPY_VERSION, time.ctime())
logger.info("CORE daemon v.%s started %s", constants.COREDPY_VERSION, time.ctime())
def start_udp(mainserver, server_address):
@ -62,7 +64,7 @@ def cored(cfg):
address = (host, port)
server = CoreServer(address, CoreHandler, cfg)
except:
logging.exception("error starting main server on: %s:%s", host, port)
logger.exception("error starting main server on: %s:%s", host, port)
sys.exit(1)
# initialize grpc api
@ -79,7 +81,7 @@ def cored(cfg):
# close handlers
close_onexec(server.fileno())
logging.info("CORE TLV API TCP/UDP listening on: %s:%s", host, port)
logger.info("CORE TLV API TCP/UDP listening on: %s:%s", host, port)
server.serve_forever()
@ -155,7 +157,7 @@ def main():
try:
cored(cfg)
except KeyboardInterrupt:
logging.info("keyboard interrupt, stopping core daemon")
logger.info("keyboard interrupt, stopping core daemon")
if __name__ == "__main__":