/// <summary> /// Runs the agent /// </summary> public void Run() { try { // Check we have an address to connect to. if (string.IsNullOrEmpty(ApplicationSettings.Default.XmrNetworkAddress)) { throw new Exception("Empty XMR Network Address"); } // Get the Private Key AsymmetricCipherKeyPair rsaKey = _hardwareKey.getXmrKey(); // Connect to XMR using (SubscriberSocket socket = new SubscriberSocket()) { // Bind socket.Connect(ApplicationSettings.Default.XmrNetworkAddress); socket.Subscribe("H"); socket.Subscribe(_hardwareKey.Channel); // Notify _clientInfoForm.XmrSubscriberStatus = "Connected to " + ApplicationSettings.Default.XmrNetworkAddress; while (!_forceStop) { lock (_locker) { try { NetMQMessage message = socket.ReceiveMultipartMessage(); // Update status string statusMessage = "Connected (" + ApplicationSettings.Default.XmrNetworkAddress + "), last activity: " + DateTime.Now.ToString(); // Write this out to a log _clientInfoForm.XmrSubscriberStatus = statusMessage; Trace.WriteLine(new LogMessage("XmrSubscriber - Run", statusMessage), LogType.Audit.ToString()); // Deal with heart beat if (message[0].ConvertToString() == "H") { LastHeartBeat = DateTime.Now; continue; } // Decrypt the message string opened = OpenSslInterop.decrypt(message[2].ConvertToString(), message[1].ConvertToString(), rsaKey.Private); // Decode into a JSON string PlayerAction action = JsonConvert.DeserializeObject <PlayerAction>(opened); // Make sure the TTL hasn't expired if (DateTime.Now > action.createdDt.AddSeconds(action.ttl)) { Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Expired Message: " + action.action), LogType.Info.ToString()); continue; } // Decide what to do with the message, probably raise events according to the type of message we have switch (action.action) { case "commandAction": // Create a schedule command out of the message Dictionary <string, string> obj = JsonConvert.DeserializeObject <Dictionary <string, string> >(opened); ScheduleCommand command = new ScheduleCommand(); string code; obj.TryGetValue("commandCode", out code); command.Code = code; new Thread(new ThreadStart(command.Run)).Start(); break; case "collectNow": case RevertToSchedulePlayerAction.Name: if (OnAction != null) { OnAction(action); } break; case LayoutChangePlayerAction.Name: LayoutChangePlayerAction changeLayout = JsonConvert.DeserializeObject <LayoutChangePlayerAction>(opened); if (OnAction != null) { OnAction(changeLayout); } break; case OverlayLayoutPlayerAction.Name: OverlayLayoutPlayerAction overlayLayout = JsonConvert.DeserializeObject <OverlayLayoutPlayerAction>(opened); if (OnAction != null) { OnAction(overlayLayout); } break; case "screenShot": ScreenShot.TakeAndSend(); _clientInfoForm.notifyStatusToXmds(); break; default: Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Unknown Message: " + action.action), LogType.Info.ToString()); break; } } catch (Exception ex) { // Log this message, but dont abort the thread Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Exception in Run: " + ex.Message), LogType.Error.ToString()); _clientInfoForm.XmrSubscriberStatus = "Error. " + ex.Message; } } } } // Update status _clientInfoForm.XmrSubscriberStatus = "Not Running, last activity: " + LastHeartBeat.ToString(); Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Subscriber Stopped"), LogType.Info.ToString()); } catch (Exception e) { Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Unable to Subscribe to XMR: " + e.Message), LogType.Info.ToString()); _clientInfoForm.XmrSubscriberStatus = e.Message; } }
/// <summary> /// Runs the agent /// </summary> public void Run() { Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Thread Started"), LogType.Info.ToString()); while (!_forceStop) { lock (_locker) { try { // If we are restarting, reset _manualReset.Reset(); // Check we have an address to connect to. if (string.IsNullOrEmpty(ApplicationSettings.Default.XmrNetworkAddress)) { throw new Exception("Empty XMR Network Address"); } // Cache the address for this socket (the setting may change outside). _address = ApplicationSettings.Default.XmrNetworkAddress; // Get the Private Key AsymmetricCipherKeyPair rsaKey = _hardwareKey.getXmrKey(); // Connect to XMR try { // Create a Poller _poller = new NetMQPoller(); // Create a Socket using (SubscriberSocket socket = new SubscriberSocket()) { // Options socket.Options.ReconnectInterval = TimeSpan.FromSeconds(5); socket.Options.Linger = TimeSpan.FromSeconds(0); // Bind socket.Connect(ApplicationSettings.Default.XmrNetworkAddress); socket.Subscribe("H"); socket.Subscribe(_hardwareKey.Channel); // Add Socket to Poller _poller.Add(socket); // Bind to the receive ready event socket.ReceiveReady += _socket_ReceiveReady; // Notify _clientInfoForm.XmrSubscriberStatus = "Connected to " + ApplicationSettings.Default.XmrNetworkAddress + ". Waiting for messages."; // Sit and wait, processing messages, indefinitely or until we are interrupted. _poller.Run(); } } finally { _poller.Dispose(); } Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Socket Disconnected, waiting to reconnect."), LogType.Info.ToString()); } catch (TerminatingException terminatingEx) { Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "NetMQ terminating: " + terminatingEx.Message), LogType.Audit.ToString()); } catch (Exception e) { Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Unable to Subscribe: " + e.Message), LogType.Info.ToString()); _clientInfoForm.XmrSubscriberStatus = e.Message; } // Update status _clientInfoForm.XmrSubscriberStatus = "Disconnected, waiting to reconnect, last activity: " + LastHeartBeat.ToString(); // Sleep for 60 seconds. _manualReset.WaitOne(60 * 1000); } } Trace.WriteLine(new LogMessage("XmrSubscriber - Run", "Subscriber Stopped"), LogType.Info.ToString()); }