Skip to content

Commit

Permalink
Merge pull request #407 from coreemu/develop
Browse files Browse the repository at this point in the history
Merge 6.2.0
  • Loading branch information
bharnden authored Mar 16, 2020
2 parents b6aef6d + 102fa41 commit 3be162b
Show file tree
Hide file tree
Showing 49 changed files with 1,936 additions and 1,599 deletions.
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.

# this defines the CORE version number, must be static for AC_INIT
AC_INIT(core, 6.1.0)
AC_INIT(core, 6.2.0)

# autoconf and automake initialization
AC_CONFIG_SRCDIR([netns/version.h.in])
Expand Down
593 changes: 315 additions & 278 deletions daemon/Pipfile.lock

Large diffs are not rendered by default.

26 changes: 23 additions & 3 deletions daemon/core/api/grpc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
SetNodeConfigServiceResponse,
)
from core.api.grpc.core_pb2 import (
ExecuteScriptRequest,
ExecuteScriptResponse,
GetEmaneEventChannelRequest,
GetEmaneEventChannelResponse,
)
Expand Down Expand Up @@ -146,8 +148,9 @@ def start_streamer(stream: Any, handler: Callable[[core_pb2.Event], None]) -> No
:param handler: function that handles an event
:return: nothing
"""
thread = threading.Thread(target=stream_listener, args=(stream, handler))
thread.daemon = True
thread = threading.Thread(
target=stream_listener, args=(stream, handler), daemon=True
)
thread.start()


Expand Down Expand Up @@ -259,6 +262,16 @@ def get_sessions(self) -> core_pb2.GetSessionsResponse:
"""
return self.stub.GetSessions(core_pb2.GetSessionsRequest())

def check_session(self, session_id: int) -> core_pb2.CheckSessionResponse:
"""
Check if a session exists.
:param session_id: id of session to check for
:return: response with result if session was found
"""
request = core_pb2.CheckSessionRequest(session_id=session_id)
return self.stub.CheckSession(request)

def get_session(self, session_id: int) -> core_pb2.GetSessionResponse:
"""
Retrieve a session.
Expand Down Expand Up @@ -472,9 +485,10 @@ def edit_node(
self,
session_id: int,
node_id: int,
position: core_pb2.Position,
position: core_pb2.Position = None,
icon: str = None,
source: str = None,
geo: core_pb2.Geo = None,
) -> core_pb2.EditNodeResponse:
"""
Edit a node, currently only changes position.
Expand All @@ -484,6 +498,7 @@ def edit_node(
:param position: position to set node to
:param icon: path to icon for gui to use for node
:param source: application source editing node
:param geo: lon,lat,alt location for node
:return: response with result of success or failure
:raises grpc.RpcError: when session or node doesn't exist
"""
Expand All @@ -493,6 +508,7 @@ def edit_node(
position=position,
icon=icon,
source=source,
geo=geo,
)
return self.stub.EditNode(request)

Expand Down Expand Up @@ -1147,6 +1163,10 @@ def get_emane_event_channel(self, session_id: int) -> GetEmaneEventChannelRespon
request = GetEmaneEventChannelRequest(session_id=session_id)
return self.stub.GetEmaneEventChannel(request)

def execute_script(self, script: str) -> ExecuteScriptResponse:
request = ExecuteScriptRequest(script=script)
return self.stub.ExecuteScript(request)

def connect(self) -> None:
"""
Open connection to server, must be closed manually.
Expand Down
8 changes: 5 additions & 3 deletions daemon/core/api/grpc/grpcutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ def add_node_data(node_proto: core_pb2.Node) -> Tuple[NodeTypes, int, NodeOption

position = node_proto.position
options.set_position(position.x, position.y)
options.set_location(position.lat, position.lon, position.alt)
if node_proto.HasField("geo"):
geo = node_proto.geo
options.set_location(geo.lat, geo.lon, geo.alt)
return _type, _id, options


Expand Down Expand Up @@ -377,9 +379,9 @@ def service_configuration(session: Session, config: core_pb2.ServiceConfig) -> N
session.services.set_service(config.node_id, config.service)
service = session.services.get_service(config.node_id, config.service)
if config.files:
service.files = tuple(config.files)
service.configs = tuple(config.files)
if config.directories:
service.directories = tuple(config.directories)
service.dirs = tuple(config.directories)
if config.startup:
service.startup = tuple(config.startup)
if config.validate:
Expand Down
58 changes: 49 additions & 9 deletions daemon/core/api/grpc/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import os
import re
import tempfile
import threading
import time
from concurrent import futures
from typing import Type

import grpc
from grpc import ServicerContext

from core import utils
from core.api.grpc import (
common_pb2,
configservices_pb2,
Expand All @@ -33,6 +35,7 @@
SetNodeConfigServiceResponse,
)
from core.api.grpc.core_pb2 import (
ExecuteScriptResponse,
GetEmaneEventChannelRequest,
GetEmaneEventChannelResponse,
)
Expand Down Expand Up @@ -450,6 +453,19 @@ def SetSessionMetadata(
session.metadata = dict(request.config)
return core_pb2.SetSessionMetadataResponse(result=True)

def CheckSession(
self, request: core_pb2.GetSessionRequest, context: ServicerContext
) -> core_pb2.CheckSessionResponse:
"""
Checks if a session exists.
:param request: check session request
:param context: context object
:return: check session response
"""
result = request.session_id in self.coreemu.sessions
return core_pb2.CheckSessionResponse(result=result)

def GetSession(
self, request: core_pb2.GetSessionRequest, context: ServicerContext
) -> core_pb2.GetSessionResponse:
Expand Down Expand Up @@ -685,21 +701,26 @@ def EditNode(
node = self.get_node(session, request.node_id, context)
options = NodeOptions()
options.icon = request.icon
x = request.position.x
y = request.position.y
options.set_position(x, y)
lat = request.position.lat
lon = request.position.lon
alt = request.position.alt
options.set_location(lat, lon, alt)
if request.HasField("position"):
x = request.position.x
y = request.position.y
options.set_position(x, y)
lat, lon, alt = None, None, None
has_geo = request.HasField("geo")
if has_geo:
lat = request.geo.lat
lon = request.geo.lon
alt = request.geo.alt
options.set_location(lat, lon, alt)
result = True
try:
session.edit_node(node.id, options)
source = None
if request.source:
source = request.source
node_data = node.data(0, source=source)
session.broadcast_node(node_data)
if not has_geo:
node_data = node.data(0, source=source)
session.broadcast_node(node_data)
except CoreError:
result = False
return core_pb2.EditNodeResponse(result=result)
Expand Down Expand Up @@ -1645,3 +1666,22 @@ def GetEmaneEventChannel(
if session.emane.eventchannel:
group, port, device = session.emane.eventchannel
return GetEmaneEventChannelResponse(group=group, port=port, device=device)

def ExecuteScript(self, request, context):
existing_sessions = set(self.coreemu.sessions.keys())
thread = threading.Thread(
target=utils.execute_file,
args=(
request.script,
{"__file__": request.script, "coreemu": self.coreemu},
),
daemon=True,
)
thread.start()
thread.join()
current_sessions = set(self.coreemu.sessions.keys())
new_sessions = list(current_sessions.difference(existing_sessions))
new_session = -1
if new_sessions:
new_session = new_sessions[0]
return ExecuteScriptResponse(session_id=new_session)
13 changes: 2 additions & 11 deletions daemon/core/api/tlv/corehandlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -526,11 +526,6 @@ def handle_message(self, message):
logging.debug(
"%s handling message:\n%s", threading.currentThread().getName(), message
)

# provide to sdt, if enabled
if self.session and self.session.sdt.is_enabled():
self.session.sdt.handle_distributed(message)

if message.message_type not in self.message_handlers:
logging.error("no handler for message type: %s", message.type_str())
return
Expand Down Expand Up @@ -949,11 +944,10 @@ def handle_register_message(self, message):
file_name,
{"__file__": file_name, "coreemu": self.coreemu},
),
daemon=True,
)
thread.daemon = True
thread.start()
# allow time for session creation
time.sleep(0.25)
thread.join()

if message.flags & MessageFlags.STRING.value:
new_session_ids = set(self.coreemu.sessions.keys())
Expand Down Expand Up @@ -1128,7 +1122,6 @@ def handle_config_location(self, message_type, config_data):
self.session.location.refgeo,
self.session.location.refscale,
)
logging.info("location configured: UTM%s", self.session.location.refutm)

def handle_config_metadata(self, message_type, config_data):
replies = []
Expand Down Expand Up @@ -2044,7 +2037,6 @@ def handle(self):
logging.debug("session handling message: %s", session.session_id)
self.session = session
self.handle_message(message)
self.session.sdt.handle_distributed(message)
self.broadcast(message)
else:
logging.error(
Expand All @@ -2069,7 +2061,6 @@ def handle(self):
if session or message.message_type == MessageTypes.REGISTER.value:
self.session = session
self.handle_message(message)
self.session.sdt.handle_distributed(message)
self.broadcast(message)
else:
logging.error(
Expand Down
6 changes: 3 additions & 3 deletions daemon/core/api/tlv/dataconversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ def convert_node(node_data):
(NodeTlvs.CANVAS, node_data.canvas),
(NodeTlvs.NETWORK_ID, node_data.network_id),
(NodeTlvs.SERVICES, node_data.services),
(NodeTlvs.LATITUDE, node_data.latitude),
(NodeTlvs.LONGITUDE, node_data.longitude),
(NodeTlvs.ALTITUDE, node_data.altitude),
(NodeTlvs.LATITUDE, str(node_data.latitude)),
(NodeTlvs.LONGITUDE, str(node_data.longitude)),
(NodeTlvs.ALTITUDE, str(node_data.altitude)),
(NodeTlvs.ICON, node_data.icon),
(NodeTlvs.OPAQUE, node_data.opaque),
],
Expand Down
10 changes: 4 additions & 6 deletions daemon/core/emane/emanemanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,6 @@ def startup(self) -> int:
nems = []
with self._emane_node_lock:
self.buildxml()
self.initeventservice()
self.starteventmonitor()

if self.numnems() > 0:
Expand Down Expand Up @@ -683,8 +682,9 @@ def starteventmonitor(self) -> None:
)
return
self.doeventloop = True
self.eventmonthread = threading.Thread(target=self.eventmonitorloop)
self.eventmonthread.daemon = True
self.eventmonthread = threading.Thread(
target=self.eventmonitorloop, daemon=True
)
self.eventmonthread.start()

def stopeventmonitor(self) -> None:
Expand All @@ -698,8 +698,6 @@ def stopeventmonitor(self) -> None:
self.initeventservice(shutdown=True)

if self.eventmonthread is not None:
# TODO: fix this
self.eventmonthread._Thread__stop()
self.eventmonthread.join()
self.eventmonthread = None

Expand Down Expand Up @@ -773,7 +771,7 @@ def handlelocationeventtoxyz(
x = int(x)
y = int(y)
z = int(z)
logging.info(
logging.debug(
"location event NEM %s (%s, %s, %s) -> (%s, %s, %s)",
nemid,
lat,
Expand Down
Loading

0 comments on commit 3be162b

Please sign in to comment.