示例#1
0
        // Helper Methods
        private List <Interface> GetDeviceInterfaces(FarmForgeDataContext context, AskToRegisterDevice message)
        {
            var client  = new RestClient(new Uri($"http://{message.IpAddress}"));
            var request = new RestRequest($"{message.InterfaceEndpoint}", Method.GET);
            // TODO: Add security
            // request.AddHeader("Authorization", message.SecurityToken);

            // TODO: Make the conversion more resilient
            IRestResponse response = client.Execute(request);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                return(JsonConvert.DeserializeObject <List <Interface> >(response.Content));
            }
            else
            {
                var logMessage = $"Error getting Interfaces from {message.DeviceName}:{message.IpAddress}";
                var logData    = new
                {
                    Response = response.StatusCode.ToString(),
                    response?.Content,
                    response?.ErrorMessage
                };
                var logDataString = JsonConvert.SerializeObject(logData);

                context.Logs.Add(new Log
                {
                    Message = logMessage,
                    Data    = logDataString
                });

                context.SaveChanges();

                return(new List <Interface>());
            }
        }
示例#2
0
        // Message Methods
        public void RegisterDevice(AskToRegisterDevice message)
        {
            // TODO: Return information instead of true / false
            // Make sure we have everything needed
            if (
                message.DeviceName == null ||
                message.IpAddress == null ||
                message.SerialNumber == null ||
                message.SecurityToken == null
                )
            {
                Sender.Tell(false);
                return;
            }


            Using <FarmForgeDataContext>((context) =>
            {
                // See if the device has been registered before
                var registeredDevice = context.Devices
                                       .Where(d =>
                                              d.Name == message.DeviceName &&
                                              d.SerialNumber == message.SerialNumber &&
                                              d.IsDeleted == false
                                              )
                                       .FirstOrDefault();

                var connectedStatus = context.Statuses
                                      .Where(s =>
                                             s.EntityType == "Device.Status" &&
                                             s.Name == "connected" &&
                                             s.IsDeleted == false
                                             )
                                      .Select(s => s.StatusId)
                                      .FirstOrDefault();

                // If it has, update the token, ip, and status
                if (registeredDevice != null)
                {
                    // TODO: Hash the security token?
                    // var hashedToken = SecurityUtility.GenerateSecurityTokenHash(message.SecurityToken);

                    registeredDevice.IpAddress     = message.IpAddress;
                    registeredDevice.SecurityToken = message.SecurityToken;
                    registeredDevice.StatusId      = connectedStatus;

                    context.SaveChanges();
                }
                // Otherwise, request the device information and create a new device
                else
                {
                    try
                    {
                        // TODO: Wrap in a transaction
                        var interfaces = GetDeviceInterfaces(context, message);
                        var newDevice  = context.Devices.Add(new Device
                        {
                            Name          = message.DeviceName,
                            IpAddress     = message.IpAddress,
                            SerialNumber  = message.SerialNumber,
                            SecurityToken = message.SecurityToken,
                            StatusId      = connectedStatus
                        }).Entity;

                        // Save to generate an ID for newDevice
                        context.SaveChanges();

                        foreach (var deviceInterface in interfaces)
                        {
                            // TODO: implement interface types
                            context.Interfaces.Add(new Interface
                            {
                                DeviceId     = newDevice.DeviceId,
                                Name         = deviceInterface.Name,
                                SerialNumber = deviceInterface.SerialNumber
                            });
                        }

                        context.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        var logMessage = "Error Registering Device";
                        var logData    = new
                        {
                            ex.Message,
                            InnerException = ex.InnerException?.ToString(),
                            ex.StackTrace
                        };
                        var logDataString = JsonConvert.SerializeObject(logData);

                        context.Logs.Add(new Log
                        {
                            Message = logMessage,
                            Data    = logDataString
                        });

                        context.SaveChanges();
                    }
                }

                Sender.Tell(true);
            });
        }