| 38 | Closed = 2 |
| 39 | |
| 40 | class InternalServer(object): |
| 41 | |
| 42 | def __init__(self, shelffile=None, user_manager=None, session_cls=None): |
| 43 | self.logger = logging.getLogger(__name__) |
| 44 | |
| 45 | self.server_callback_dispatcher = CallbackDispatcher() |
| 46 | |
| 47 | self.endpoints = [] |
| 48 | self._channel_id_counter = 5 |
| 49 | self.disabled_clock = False # for debugging we may want to disable clock that writes too much in log |
| 50 | self._local_discovery_service = None # lazy-loading |
| 51 | |
| 52 | self.aspace = AddressSpace() |
| 53 | self.attribute_service = AttributeService(self.aspace) |
| 54 | self.view_service = ViewService(self.aspace) |
| 55 | self.method_service = MethodService(self.aspace) |
| 56 | self.node_mgt_service = NodeManagementService(self.aspace) |
| 57 | |
| 58 | self.load_standard_address_space(shelffile) |
| 59 | |
| 60 | self.loop = None |
| 61 | self.asyncio_transports = [] |
| 62 | self.subscription_service = SubscriptionService(self.aspace) |
| 63 | |
| 64 | self.history_manager = HistoryManager(self) |
| 65 | self.user_manager = user_manager |
| 66 | |
| 67 | # create a session to use on server side |
| 68 | self.session_cls = session_cls or InternalSession |
| 69 | self.isession = self.session_cls(self, self.aspace, \ |
| 70 | self.subscription_service, "Internal", user=UserManager.User.Admin) |
| 71 | |
| 72 | self.server_status_node = Node(self.isession, ua.NodeId(ua.ObjectIds.Server_ServerStatus)) |
| 73 | self.current_time_node = Node(self.isession, ua.NodeId(ua.ObjectIds.Server_ServerStatus_CurrentTime)) |
| 74 | self._address_space_fixes() |
| 75 | self.setup_nodes() |
| 76 | |
| 77 | @property |
| 78 | def thread_loop(self): |
| 79 | if self.loop is None: |
| 80 | raise Exception("InternalServer stopped: async threadloop is not running.") |
| 81 | return self.loop |
| 82 | |
| 83 | @property |
| 84 | def local_discovery_service(self): |
| 85 | if self._local_discovery_service is None: |
| 86 | self._local_discovery_service = LocalDiscoveryService(parent = self) |
| 87 | for edp in self.endpoints: |
| 88 | srvDesc = LocalDiscoveryService.ServerDescription(edp.Server) |
| 89 | self._local_discovery_service.add_server_description(srvDesc) |
| 90 | return self._local_discovery_service |
| 91 | |
| 92 | def setup_nodes(self): |
| 93 | """ |
| 94 | Set up some nodes as defined by spec |
| 95 | """ |
| 96 | uries = ["http://opcfoundation.org/UA/"] |
| 97 | ns_node = Node(self.isession, ua.NodeId(ua.ObjectIds.Server_NamespaceArray)) |
no outgoing calls