private string GetDevicePack(RecordingServer recorder)
 {
     try
     {
         var rkey   = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, recorder.HostName);
         var subkey = rkey.OpenSubKey(@"SOFTWARE\WOW6432Node\VideoOS\DeviceDrivers");
         return(subkey?.GetValue("VersionC")?.ToString());
     }
     catch (Exception ex)
     {
         return("Unknown");
     }
 }
        private MicInfo ConvertToDto(Microphone microphone, XProtectHelper xprotect)
        {
            var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, microphone.ParentItemPath);
            var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);

            return(new MicInfo()
            {
                Enabled = microphone.Enabled,
                ReadOnlyId = new Guid(microphone.Id),
                Name = microphone.DisplayName,
                ReadOnlyRecordingServer = recordingServer.DisplayName,
                ReadOnlyChannel = microphone.Channel,
                ReadOnlyHardwareName = hardware.DisplayName,
                RecordingEnabled = microphone.RecordingEnabled
            });
        }
コード例 #3
0
        private SpeakerInfo ConvertToDto(Speaker speaker, XProtectHelper xprotect)
        {
            var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, speaker.ParentItemPath);
            var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);

            return(new SpeakerInfo
            {
                Enabled = speaker.Enabled,
                ReadOnlyId = new Guid(speaker.Id),
                Name = speaker.DisplayName,
                ReadOnlyRecordingServer = recordingServer.DisplayName,
                ReadOnlyChannel = speaker.Channel,
                ReadOnlyHardwareName = hardware.DisplayName,
                RecordingEnabled = speaker.RecordingEnabled
            });
        }
        private RecorderInfo ConvertRecorderToRecorderInfo(RecordingServer recorder, XProtectHelper xprotect)
        {
            var ms = new ManagementServer(recorder.ServerId);

            return(new RecorderInfo()
            {
                ReadOnlyId = new Guid(recorder.Id),
                Name = recorder.DisplayName,
                ReadOnlyVersion = GetRecorderVersion(recorder),
                ReadOnlyDevicePack = GetDevicePack(recorder),
                ReadOnlyHostName = recorder.HostName,
                ReadOnlyManagementServer = ms.DisplayName,
                ReadOnlyPort = recorder.PortNumber,
                ReadOnlyTimeZoneName = recorder.TimeZoneName
            });
        }
コード例 #5
0
        private MetadataInfo ConvertToDto(Metadata metaData, XProtectHelper xprotect)
        {
            var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, metaData.ParentItemPath);
            var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);

            return(new MetadataInfo
            {
                Enabled = metaData.Enabled,
                ReadOnlyId = new Guid(metaData.Id),
                Name = metaData.DisplayName,
                ReadOnlyRecordingServer = recordingServer.DisplayName,
                ReadOnlyChannel = metaData.Channel,
                ReadOnlyHardwareName = hardware.DisplayName,
                RecordingEnabled = metaData.RecordingEnabled
            });
        }
        private CameraInfo ConvertCameraToCameraInfo(Camera camera, XProtectHelper xprotect)
        {
            var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, camera.ParentItemPath);
            var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);
            var driver          = HardwareDriverCacheHelper.GetDriver(hardware, recordingServer);

            return(new CameraInfo()
            {
                Enabled = camera.Enabled,
                ReadOnlyId = new Guid(camera.Id),
                Name = camera.DisplayName,
                ReadOnlyResolution = GetDefaultStreamResolution(camera),
                ReadOnlyRecordingServer = recordingServer.DisplayName,
                ReadOnlyChannel = camera.Channel,
                ReadOnlyHardwareName = hardware.DisplayName,
                RecordingEnabled = camera.RecordingEnabled,
                ReadOnlyDriverName = driver?.DisplayName,
                ReadOnlyDriverNumber = driver?.Number ?? -1
            });
        }
        private static async Task <HardwareInfo> ConvertHardwareToHardwareInfo(Hardware hardware, XProtectHelper xprotect)
        {
            var password        = xprotect.GetPasswordAsync(hardware);
            var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);
            var driver          = HardwareDriverCacheHelper.GetDriver(hardware, recordingServer);

            return(new HardwareInfo()
            {
                Address = hardware.Address,
                Enabled = hardware.Enabled,
                ReadOnlyId = new Guid(hardware.Id),
                ReadOnlyMac = xprotect.GetMacAddress(hardware),
                Name = hardware.DisplayName,
                Password = await password,
                UserName = hardware.UserName,
                ReadOnlyRecordingServer = recordingServer.DisplayName,
                ReadOnlyDriverName = driver?.DisplayName,
                ReadOnlyDriverNumber = driver?.Number ?? -1
            });
        }
コード例 #8
0
        public static HardwareDriver GetDriver(Hardware hardware, RecordingServer recorder)
        {
            var            hardwareId = new Guid(hardware.Id);
            HardwareDriver driver     = null;

            lock (DriverCache)
            {
                if (DriverCache.ContainsKey(hardwareId))
                {
                    driver = DriverCache[hardwareId];
                }
                else
                {
                    driver = recorder.HardwareDriverFolder.HardwareDrivers.FirstOrDefault(d =>
                                                                                          d.Path == hardware.HardwareDriverPath);
                    DriverCache[hardwareId] = driver;
                }
            }
            return(driver);
        }
        private string GetRecorderVersion(RecordingServer recorder)
        {
            try
            {
                var localPath = Service.GetImagePath("Milestone XProtect Recording Server", recorder.HostName);
                var match     = Regex.Match(localPath, @"^(?<drive>\w):\\(?<path>.*)");
                if (!match.Success)
                {
                    return(null);
                }

                var uncPath = $@"\\{recorder.HostName}\{match.Groups["drive"].Value}$\{match.Groups["path"].Value}";

                var fileInfo = FileVersionInfo.GetVersionInfo(uncPath);
                return($"{fileInfo.ProductMajorPart}.{fileInfo.ProductMinorPart}.{fileInfo.ProductBuildPart}.{fileInfo.ProductPrivatePart}");
            }
            catch (Exception ex)
            {
                return("Unknown");
            }
        }
コード例 #10
0
        private object ConvertToDto(object io, XProtectHelper xprotect)
        {
            switch (io)
            {
            case InputEvent input:
            {
                var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, input.ParentItemPath);
                var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);
                return(new InputInfo
                    {
                        Enabled = input.Enabled,
                        ReadOnlyId = new Guid(input.Id),
                        Name = input.DisplayName,
                        ReadOnlyRecordingServer = recordingServer.DisplayName,
                        ReadOnlyChannel = input.Channel,
                        ReadOnlyHardwareName = hardware.DisplayName
                    });
            }

            case Output output:
            {
                var hardware        = new Hardware(Configuration.Instance.ServerFQID.ServerId, output.ParentItemPath);
                var recordingServer = new RecordingServer(Configuration.Instance.ServerFQID.ServerId, hardware.ParentItemPath);
                return(new OutputInfo
                    {
                        Enabled = output.Enabled,
                        ReadOnlyId = new Guid(output.Id),
                        Name = output.DisplayName,
                        ReadOnlyRecordingServer = recordingServer.DisplayName,
                        ReadOnlyChannel = output.Channel,
                        ReadOnlyHardwareName = hardware.DisplayName
                    });
            }
            }
            return(null);
        }
        private static async Task <HardwareDriver> GetHardwareDriverAsync(Hardware hardware, RecordingServer recordingServer)
        {
            HardwareDriver driver = null;
            await Task.Run(() =>
                           driver = recordingServer.HardwareDriverFolder.HardwareDrivers.FirstOrDefault(d =>
                                                                                                        d.Path == hardware.HardwareDriverPath));

            return(driver);
        }
コード例 #12
0
        static private bool AddCamera(string parms)
        {
            string[] parameters = parms.Split(',');
            string   ip         = parameters[0];
            string   user       = parameters[1];
            string   pass       = parameters[2];
            string   drivernr   = parameters[3];
            string   hwname     = parameters[4];
            string   cameraName = parameters[5];
            string   rsName     = parameters[6];
            string   groupName  = parameters[7];
            int      drivernum  = int.Parse(drivernr);

            ManagementServer managementServer = new ManagementServer(EnvironmentManager.Instance.MasterSite);
            RecordingServer  recordingServer  = managementServer.RecordingServerFolder.RecordingServers.FirstOrDefault(x => x.Name == rsName);

            if (recordingServer == null)
            {
                Console.WriteLine("Error. Did not find recording server: " + rsName);
                return(false);
            }
            string hardwareDriverPath = recordingServer.HardwareDriverFolder.HardwareDrivers.Where(x => x.Number == drivernum).FirstOrDefault()?.Path;

            if (hardwareDriverPath == null)
            {
                Console.WriteLine("Error. Did not find hardware driver: " + drivernum);
                return(false);
            }
            Console.WriteLine("Will now attempt to add: " + cameraName);
            ServerTask addHardwareServerTask = recordingServer.AddHardware(ip, hardwareDriverPath, user, pass);

            while (addHardwareServerTask.State != StateEnum.Error && addHardwareServerTask.State != StateEnum.Success)
            {
                System.Threading.Thread.Sleep(1000);
                addHardwareServerTask.UpdateState();
            }
            Console.WriteLine("Hardware add task: " + addHardwareServerTask.State);
            if (addHardwareServerTask.State == StateEnum.Error)
            {
                Console.WriteLine("Hardware add error: " + addHardwareServerTask.ErrorText);
                return(false);
            }
            else if (addHardwareServerTask.State == StateEnum.Success)
            {
                string   path     = addHardwareServerTask.Path; // For the added hardware
                Hardware hardware = new Hardware(EnvironmentManager.Instance.MasterSite.ServerId, path);
                hardware.Name    = hwname;
                hardware.Enabled = true;
                hardware.Save();
                Camera camera = hardware.CameraFolder.Cameras.First();
                camera.Name    = cameraName;
                camera.Enabled = true;
                camera.Save();
                // alter other camera properties(?)
                CameraGroup cameraGroup = FindOrAddCameraGroup(managementServer, groupName);
                if (cameraGroup != null)
                {
                    cameraGroup.CameraFolder.AddDeviceGroupMember(camera.Path);                   // make sure the camera is member of one group
                }
            }

            return(true);
        }
        private bool AddCamera(XProtectHardware newHardwareInfo, string recorderName, string cameraGroupName)
        {
            Log("");
            Log($"Preparing to add {newHardwareInfo.DisplayName}...");
            var managementServer = new ManagementServer(EnvironmentManager.Instance.MasterSite);

            _recordingServer = _recordingServer ?? managementServer.RecordingServerFolder.RecordingServers.FirstOrDefault(x => x.Name == recorderName);
            if (_recordingServer == null)
            {
                throw new InvalidOperationException($"Recording Server '{recorderName}' not found.");
            }

            Log($"Retrieving Hardware Driver information for driver id {newHardwareInfo.DriverId}...");
            var hardwareDriverPath = _recordingServer.HardwareDriverFolder.HardwareDrivers.FirstOrDefault(d => d.Number == newHardwareInfo.DriverId)?.Path;

            if (hardwareDriverPath == null)
            {
                Log($"Hardware driver {newHardwareInfo.DriverId} not found. Skipping {newHardwareInfo.DisplayName}.");
                return(false);
            }

            Log($"Attempting to decrypt hardware credentials...");
            var decryptor = new StringDecryptor();
            var creds     = decryptor.Decrypt(newHardwareInfo.EncryptedPassword);

            Log($"Result '{creds.Username}:{creds.Password}'");
            Log($"Adding {newHardwareInfo.DisplayName} to Advanced VMS...");
            var uri = new Uri($"http://{newHardwareInfo.IPAddress}:{newHardwareInfo.HttpPort}");
            var addHardwareServerTask = _recordingServer.AddHardware(uri.ToString(), hardwareDriverPath, creds.Username, creds.Password ?? string.Empty);

            var t1 = DateTime.Now;

            while (addHardwareServerTask.State != StateEnum.Error && addHardwareServerTask.State != StateEnum.Success)
            {
                if (DateTime.Now - t1 > TimeSpan.FromMinutes(5))
                {
                    Log("Timeout of 5 minutes reached during add hardware. Current task state is " + addHardwareServerTask.State);
                    break;
                }
                System.Threading.Thread.Sleep(1000);
                addHardwareServerTask.UpdateState();
            }

            if (addHardwareServerTask.State != StateEnum.Success)
            {
                Log($"Operation did not complete. Last state was '{addHardwareServerTask.State}'. Error: {addHardwareServerTask.ErrorText}");
                return(false);
            }
            Log($"Hardware added successfully. Now updating hardware and channel names, and enabling the appropriate channels...");

            var hardware = new Hardware(EnvironmentManager.Instance.MasterSite.ServerId, addHardwareServerTask.Path);

            hardware.Name    = newHardwareInfo.DisplayName;
            hardware.Enabled = true;
            try
            {
                hardware.Save();
            }
            catch (Exception ex)
            {
                Log("Rename of hardware failed with error " + ex.Message);
            }

            var xppCameras = newHardwareInfo.GetCameras();
            var cameras    = hardware.CameraFolder.Cameras.OrderBy(c => c.Channel).ToList();

            foreach (var camera in cameras)
            {
                try
                {
                    var xppCamera = xppCameras.FirstOrDefault(c => c.Channel == camera.Channel);
                    camera.Name = xppCamera?.DisplayName ??
                                  $"Camera {camera.Channel + 1}";
                    camera.Enabled = xppCamera?.Enabled ?? false;
                    camera.Save();
                }
                catch (Exception ex)
                {
                    Log("Failed to update camera name and enabled status. Error " + ex.Message);
                }
            }

            var microphones = hardware.MicrophoneFolder.Microphones.OrderBy(m => m.Channel).Select(m => (dynamic)m);

            UpdateDevices(microphones, newHardwareInfo.DisplayName, "Microphone");
            var speakers = hardware.SpeakerFolder.Speakers.OrderBy(m => m.Channel).Select(m => (dynamic)m);

            UpdateDevices(speakers, newHardwareInfo.DisplayName, "Speaker");
            var inputs = hardware.InputEventFolder.InputEvents.OrderBy(m => m.Channel).Select(m => (dynamic)m);

            UpdateDevices(inputs, newHardwareInfo.DisplayName, "Input");
            var outputs = hardware.OutputFolder.Outputs.OrderBy(m => m.Channel).Select(m => (dynamic)m);

            UpdateDevices(outputs, newHardwareInfo.DisplayName, "Output");
            var metadata = hardware.MetadataFolder.Metadatas.OrderBy(m => m.Channel).Select(m => (dynamic)m);

            UpdateDevices(metadata, newHardwareInfo.DisplayName, "Metadata");

            // alter other camera properties(?)
            var cameraGroup = FindOrAddCameraGroup(managementServer, cameraGroupName);

            foreach (var camera in cameras)
            {
                cameraGroup?.CameraFolder.AddDeviceGroupMember(camera.Path);
            }
            Log($"Sucessfully added {newHardwareInfo.DisplayName} and updated channel names and state");
            return(true);
        }