Browse Source

Further Improvements to Rpc Connections

Frank van den Bos 2 years ago
parent
commit
ce246063d3

+ 1 - 1
prs.desktop/App.xaml.cs

@@ -276,7 +276,7 @@ namespace PRSDesktop
                 else
                 else
                 {
                 {
                     Profile = keys.First();
                     Profile = keys.First();
-                    DatabaseSettings = allsettings.Values.First();
+                    DatabaseSettings = allsettings[Profile];
                 }
                 }
             }
             }
             StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
             StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);

+ 5 - 3
prs.desktop/MainWindow.xaml.cs

@@ -154,7 +154,8 @@ namespace PRSDesktop
             HotKeyManager.RegisterHotKey(Key.F6, ShowRecordingNotes);
             HotKeyManager.RegisterHotKey(Key.F6, ShowRecordingNotes);
             HotKeyManager.RegisterHotKey(Key.F4, ToggleRecordingAudio);
             HotKeyManager.RegisterHotKey(Key.F4, ToggleRecordingAudio);
 
 
-            DatabaseType = App.DatabaseSettings.DatabaseType;
+            var settings = App.DatabaseSettings;
+            DatabaseType = settings.DatabaseType;
             switch (DatabaseType)
             switch (DatabaseType)
             {
             {
                 case DatabaseType.Standalone:
                 case DatabaseType.Standalone:
@@ -165,9 +166,9 @@ namespace PRSDesktop
                 
                 
                 case DatabaseType.Networked:
                 case DatabaseType.Networked:
                     
                     
-                    var url = App.DatabaseSettings.URLs.FirstOrDefault() ?? "localhost:8000";
-                    _transport = new RpcClientSocketTransport(url);
+                    _transport = new RpcClientSocketTransport(App.DatabaseSettings.URLs);
                     _transport.OnClose += TransportConnectionLost;
                     _transport.OnClose += TransportConnectionLost;
+                    _transport.Connect();
                     ClientFactory.SetClientType(typeof(RpcClient<>), Platform.Wpf, CoreUtils.GetVersion(), _transport );
                     ClientFactory.SetClientType(typeof(RpcClient<>), Platform.Wpf, CoreUtils.GetVersion(), _transport );
                     
                     
                     //var url = RestClient<User>.Ping(App.DatabaseSettings.URLs, out DatabaseInfo info);
                     //var url = RestClient<User>.Ping(App.DatabaseSettings.URLs, out DatabaseInfo info);
@@ -179,6 +180,7 @@ namespace PRSDesktop
                     var pipename = DatabaseServerProperties.GetPipeName(App.DatabaseSettings.LocalServerName);
                     var pipename = DatabaseServerProperties.GetPipeName(App.DatabaseSettings.LocalServerName);
                     _transport = new RpcClientPipeTransport(pipename);
                     _transport = new RpcClientPipeTransport(pipename);
                     _transport.OnClose += TransportConnectionLost;
                     _transport.OnClose += TransportConnectionLost;
+                    _transport.Connect();
                     ClientFactory.SetClientType(typeof(RpcClient<>), Platform.Wpf, CoreUtils.GetVersion(),
                     ClientFactory.SetClientType(typeof(RpcClient<>), Platform.Wpf, CoreUtils.GetVersion(),
                         _transport );
                         _transport );
                      // ClientFactory.SetClientType(typeof(IPCClient<>), Platform.Wpf, CoreUtils.GetVersion(), 
                      // ClientFactory.SetClientType(typeof(IPCClient<>), Platform.Wpf, CoreUtils.GetVersion(), 

+ 0 - 1
prs.desktop/Panels/Notifications/NotificationsDock.xaml.cs

@@ -14,7 +14,6 @@ using InABox.WPF;
 using Image = System.Windows.Controls.Image;
 using Image = System.Windows.Controls.Image;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using InABox.Core.Notifications;
 
 
 namespace PRSDesktop
 namespace PRSDesktop
 {
 {

+ 33 - 28
prs.desktop/Utils/SelectDatabase.xaml.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Drawing;
 using System.Drawing;
 using System.IO;
 using System.IO;
 using System.Linq;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Controls;
@@ -27,6 +28,8 @@ namespace PRSDesktop
     /// </summary>
     /// </summary>
     public partial class SelectDatabase : ThemableWindow
     public partial class SelectDatabase : ThemableWindow
     {
     {
+
+        private CancellationTokenSource cancel = new CancellationTokenSource();
         
         
         public SelectDatabase(Dictionary<string, DatabaseSettings> databases)
         public SelectDatabase(Dictionary<string, DatabaseSettings> databases)
         {
         {
@@ -106,7 +109,7 @@ namespace PRSDesktop
                         HorizontalContentAlignment = HorizontalAlignment.Center,
                         HorizontalContentAlignment = HorizontalAlignment.Center,
                         VerticalContentAlignment = VerticalAlignment.Center,
                         VerticalContentAlignment = VerticalAlignment.Center,
                         Width = 150,
                         Width = 150,
-                        Height = 40
+                        Height = 35
                     };
                     };
                     label.SetValue(DockPanel.DockProperty, Dock.Bottom);
                     label.SetValue(DockPanel.DockProperty, Dock.Bottom);
                     panel.Children.Add(label);
                     panel.Children.Add(label);
@@ -129,23 +132,23 @@ namespace PRSDesktop
                     button.SetValue(Grid.RowProperty, row);
                     button.SetValue(Grid.RowProperty, row);
                     Grid.Children.Add(button);
                     Grid.Children.Add(button);
 
 
-                    Task.Run(() =>
-                    {
-                        DatabaseInfo? info = new DatabaseInfo(db.ColorScheme, db.Logo, CoreUtils.GetVersion(), true);
-                        
-                        if (db.DatabaseType == DatabaseType.Local)
-                            info = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(db.LocalServerName)).Info();
-                        else if (db.DatabaseType == DatabaseType.Networked)
+                    Task.Run(
+                        () =>
                         {
                         {
-                            List<Task<DatabaseInfo?>> infos = new List<Task<DatabaseInfo?>>();
-                            foreach (var url in db.URLs)
-                                infos.Add(Task.Run<DatabaseInfo?>(() => new RpcClientSocketTransport(url).Info()));
-                            var index = Task.WaitAny(infos.ToArray<Task>());
-                            info = infos[index].Result;
+                            while (!cancel.IsCancellationRequested)
+                            {
+                                DatabaseInfo? info = new DatabaseInfo(db.ColorScheme, db.Logo, CoreUtils.GetVersion(), true);
+
+                                if (db.DatabaseType == DatabaseType.Local)
+                                    info = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(db.LocalServerName)).Info();
+                                else if (db.DatabaseType == DatabaseType.Networked)
+                                    info = new RpcClientSocketTransport(db.URLs).Info();
+
+                                UpdateInfo(key, db, info, border, image, dbver);
+                                Task.Delay(1000).Wait();
+                            }
                         }
                         }
-
-                        UpdateInfo(key, db, info, border, image, dbver);
-                    });
+                        ,cancel.Token);
 
 
                     i++;
                     i++;
                 }
                 }
@@ -162,12 +165,22 @@ namespace PRSDesktop
 
 
         private void UpdateInfo(String key, DatabaseSettings db, DatabaseInfo? info, Border border, Image image, Label version)
         private void UpdateInfo(String key, DatabaseSettings db, DatabaseInfo? info, Border border, Image image, Label version)
         {
         {
-            if (info == null)
-                return;
+
             
             
             Dispatcher.Invoke(() =>
             Dispatcher.Invoke(() =>
             {
             {
-                if(info?.ColorScheme is not null)
+                if (info == null)
+                {
+                    border.BorderBrush = new SolidColorBrush(Colors.Red);
+                    border.Background = db.DatabaseType == DatabaseType.Standalone
+                        ? new SolidColorBrush(Colors.WhiteSmoke)
+                        : new SolidColorBrush(Colors.White);
+                    image.Source = null;
+                    version.Content = "";
+                    return;
+                }
+
+                if (info?.ColorScheme is not null)
                 {
                 {
                     try
                     try
                     {
                     {
@@ -218,18 +231,10 @@ namespace PRSDesktop
 
 
         private void Button_Click(object sender, RoutedEventArgs e)
         private void Button_Click(object sender, RoutedEventArgs e)
         {
         {
+            cancel.Cancel();
             Database = (sender as Button).Tag as string;
             Database = (sender as Button).Tag as string;
             DialogResult = true;
             DialogResult = true;
         }
         }
 
 
-        //private void OK_Click(object sender, RoutedEventArgs e)
-        //{
-        //    DialogResult = true;
-        //}
-
-        //private void Cancel_Click(object sender, RoutedEventArgs e)
-        //{
-        //    DialogResult = false;
-        //}
     }
     }
 }
 }

+ 1 - 1
prs.desktop/prsdesktop.iss

@@ -5,7 +5,7 @@
 #pragma verboselevel 9
 #pragma verboselevel 9
 
 
 #define MyAppName "PRS Desktop"
 #define MyAppName "PRS Desktop"
-#define MyAppVersion "7.15c"
+#define MyAppVersion "8.03"
 #define MyAppPublisher "PRS Digital"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSDesktop.exe"
 #define MyAppExeName "PRSDesktop.exe"

BIN
prs.server/._hollow.ico


+ 88 - 134
prs.server/Forms/ServerGrid.cs

@@ -48,6 +48,8 @@ namespace PRSServer
 
 
         private Button _statusButton;
         private Button _statusButton;
 
 
+        private CancellationTokenSource cancel = new CancellationTokenSource();
+
         public ServerGrid()
         public ServerGrid()
         {
         {
             Options.AddRange(DynamicGridOption.AddRows, DynamicGridOption.EditRows, DynamicGridOption.DeleteRows, DynamicGridOption.ShowHelp);
             Options.AddRange(DynamicGridOption.AddRows, DynamicGridOption.EditRows, DynamicGridOption.DeleteRows, DynamicGridOption.ShowHelp);
@@ -85,7 +87,7 @@ namespace PRSServer
             else
             else
             {
             {
                 var key = row.Get<Server, string>(x => x.Key);
                 var key = row.Get<Server, string>(x => x.Key);
-                if(SecureConnections.TryGetValue(key, out var secure))
+                if(_secureConnections.TryGetValue(key, out var secure))
                 {
                 {
                     return secure
                     return secure
                         ? secureImage
                         ? secureImage
@@ -107,7 +109,7 @@ namespace PRSServer
             else
             else
             {
             {
                 var key = row.Get<Server, string>(x => x.Key);
                 var key = row.Get<Server, string>(x => x.Key);
-                if (SecureConnections.TryGetValue(key, out var secure))
+                if (_secureConnections.TryGetValue(key, out var secure))
                 {
                 {
                     return secure
                     return secure
                         ? column.TextToolTip("Secure (HTTPS) Connection")
                         ? column.TextToolTip("Secure (HTTPS) Connection")
@@ -281,8 +283,10 @@ namespace PRSServer
             );
             );
         }
         }
 
 
-        private Dictionary<string, bool> SecureConnections { get; set; } = new Dictionary<string, bool>();
-        private HashSet<string> LoadingInfos = new HashSet<string>();
+        private Dictionary<String, ServiceControllerStatus> _serviceStatuses = new Dictionary<string, ServiceControllerStatus>();
+        private Dictionary<string, bool> _secureConnections { get; set; } = new Dictionary<string, bool>();
+        private Dictionary<String,RpcClientPipeTransport> _pipemonitors = new Dictionary<string, RpcClientPipeTransport>();
+        private Dictionary<String,HttpClient> _webmonitors = new Dictionary<string, HttpClient>();
 
 
         protected override void Reload(Filters<Server> criteria, Columns<Server> columns, ref SortOrder<Server>? sort,
         protected override void Reload(Filters<Server> criteria, Columns<Server> columns, ref SortOrder<Server>? sort,
             Action<CoreTable?, Exception?> action)
             Action<CoreTable?, Exception?> action)
@@ -312,153 +316,102 @@ namespace PRSServer
                 table.LoadRow(row, server);
                 table.LoadRow(row, server);
                 table.Rows.Add(row);
                 table.Rows.Add(row);
             }
             }
+            
+            action(table, null);
 
 
-            if (table.Rows.Any(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Certificate))
-            {
-
-                foreach (var row in table.Rows.Where(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Web))
+            _monitor ??= Task.Run(
+                () =>
                 {
                 {
-                    var key = row.Get<Server, string>(x => x.Key);
-                    var props = row.ToObject<Server>().Properties as WebServerProperties;
-                    if (props != null)
+                    while (!cancel.Token.IsCancellationRequested)
                     {
                     {
-
-                        Task.Run(() =>
+                        bool testcertificates = false;
+                        var certrow = table.Rows.FirstOrDefault(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Certificate);
+                        if (certrow != null)
                         {
                         {
-                            bool IsHTTPs = false;
-                            var client = new HttpClient { BaseAddress = new Uri($"https://127.0.0.1:{props.ListenPort}") };
-                            try
-                            {
-                                client.GetAsync("/").Wait();
-                                SecureConnections[key] = true;
-                            }
-                            catch (Exception e)
-                            {
-                                System.Console.WriteLine(e);
-                                throw;
-                            }
-                            //     try
-                            //     {
-                            //         client.GetAsync("operations").Wait();
-                            //         URL = $"https://{url}";
-                            //         isHTTPS = true;
-                            //     }
-                            //     catch (Exception)
-                            //     {
-                            //         URL = $"http://{url}";
-                            //         isHTTPS = false;
-                            //     }
-                            // }
-                            // return URL;
-                        });
-
-                }
-
-                }
-                
-                foreach (var row in table.Rows.Where(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Database))
-                {
-                    var key = row.Get<Server, string>(x => x.Key);
+                            var key = certrow.Get<Server, string>(x => x.Key);
+                            var certservice = GetService(key);
+                            certservice.Refresh();
+                            if (certservice.Status == ServiceControllerStatus.Running)
+                                testcertificates = true;
+                        }
 
 
-                    var service = GetService(key);
-                    if (service is not null && service.Status == ServiceControllerStatus.Running)
-                    {
-                        if (!LoadingInfos.Contains(key))
+                        foreach (var row in table.Rows)
                         {
                         {
-                            LoadingInfos.Add(key);
-                            Task.Run(() =>
+                            bool bRefresh = false;
+                            var key = row.Get<Server, string>(x => x.Key);
+                            
+                            var service = GetService(key);
+                            _serviceStatuses.TryGetValue(key, out var oldstatus);
+                            service.Refresh();
+                            _serviceStatuses[key] = service.Status;
+                            if (_serviceStatuses[key] != oldstatus)
+                                bRefresh = true;
+
+                            if (testcertificates && (_serviceStatuses[key] == ServiceControllerStatus.Running))
                             {
                             {
-                                while (true)
+                                var type = row.Get<Server, ServerType>(x => x.Type);
+                                if (type == ServerType.Database)
+                                {
+                                    _secureConnections.TryGetValue(key, out bool oldsecure);
+                                    if (!_pipemonitors.TryGetValue(key, out RpcClientPipeTransport client))
+                                    {
+                                        client = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(key));
+                                        client.Connect();
+                                        _pipemonitors[key] = client;
+                                    }
+                                    
+                                    var info = client.IsConnected()
+                                        ? client.Send<RpcInfoCommand, RpcInfoParameters, RpcInfoResult>(new RpcInfoParameters()).Info
+                                        : null;
+                                    _secureConnections[key] = info?.IsHTTPS ?? false;
+                                    
+                                    bRefresh = bRefresh || (_secureConnections[key] != oldsecure);
+                                }
+                                else if (type == ServerType.Web)
                                 {
                                 {
-                                    var client = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(key));
-                                    //var client = IPCClientFactory.GetClient(DatabaseServerProperties.GetPipeName(key));
-                                    var response = client.Info();
-                                    //var response = client.Send(IPCMessage.Info(new InfoRequest()), 10_000).GetResponse<InfoResponse>();
-                                    if (response != null)
+                                    var props = row.ToObject<Server>().Properties as WebServerProperties;
+                                    _secureConnections.TryGetValue(key, out bool oldsecure);
+                                    if (!_webmonitors.TryGetValue(key, out HttpClient client))
                                     {
                                     {
-                                        SecureConnections[key] = response.IsHTTPS;
-                                        break;
+                                        client = new HttpClient { BaseAddress = new Uri($"https://127.0.0.1:{props.ListenPort}") };
+                                        _webmonitors[key] = client;
                                     }
                                     }
-                                    else
+                                    try
                                     {
                                     {
-                                        SecureConnections.Remove(key);
-                                        var service = GetService(key);
-                                        if (service is null || service.Status != ServiceControllerStatus.Running)
-                                            break;
+                                        client.GetAsync("/").Wait();
+                                        _secureConnections[key] = true;
                                     }
                                     }
+                                    catch (Exception e)
+                                    {
+                                        _secureConnections[key] = false;
+                                    }         
+                                    bRefresh = bRefresh || (_secureConnections[key] != oldsecure);
                                 }
                                 }
-                                Dispatcher.Invoke(() =>
-                                {
-                                    InvalidateRow(row);
-                                });
-                                LoadingInfos.Remove(key);
-                            });
-                        }
-                    }
-                    else
-                    {
-                        if(SecureConnections.TryGetValue(key, out var info))
-                        {
-                            SecureConnections.Remove(key);
-                        }
-                    }
-                }
-            }
-
-            action(table, null);
-
-            _monitor ??= Task.Run(() =>
-                {
-                    while (true)
-                    {
-                        try
-                        {
-                            var bRefresh = false;
-                            foreach (var service in _services)
+                            }
+                            else
                             {
                             {
-                                var oldstatus = service.Status;
-                                service.Refresh();
-                                bRefresh = bRefresh || service.Status != oldstatus;
-                                /*if ((oldstatus != ServiceControllerStatus.Stopped) && (service.Status == ServiceControllerStatus.Stopped))
-                                    Dispatcher.Invoke(() => StopConsole(service.ServiceName));*/
+                                bRefresh = bRefresh || _secureConnections.ContainsKey(key);
+                                _secureConnections.Remove(key);
                             }
                             }
-
                             if (bRefresh)
                             if (bRefresh)
-                                Dispatcher.Invoke(() => { Refresh(false, true); });
-                        }
-                        catch (Exception e)
-                        {
+                                Dispatcher.Invoke(() =>
+                                {                                    
+                                    if (testcertificates && (ActionColumns[1].Position != DynamicActionColumnPosition.Start))
+                                        ActionColumns[1].Position = DynamicActionColumnPosition.Start;
+                                    else if (!testcertificates && (ActionColumns[1].Position != DynamicActionColumnPosition.Hidden))
+                                        ActionColumns[1].Position = DynamicActionColumnPosition.Hidden;
+                                    Refresh(true, false);
+                                    InvalidateRow(row);
+                                });
                         }
                         }
-
-                        Task.Delay(500).Wait();
+                        
+                        Task.Delay(TimeSpan.FromSeconds(1)).Wait();
                     }
                     }
-                });
+                },
+                cancel.Token
+            );
         }
         }
-
-        // protected override void SelectItems(CoreRow[] rows)
-        // {
-        //     base.SelectItems(rows);
-        //     if (rows != null && rows.Length == 1)
-        //     {
-        //         var type = rows.First().Get<Server, ServerType>(x => x.Type);
-        //         DatabaseLicense.Visibility = Equals(type, ServerType.Database) ? Visibility.Visible : Visibility.Collapsed;
-        //         DatabaseCustomFields.Visibility = Equals(type, ServerType.Database) ? Visibility.Visible : Visibility.Collapsed;
-        //         DatabaseScripts.Visibility = Equals(type, ServerType.Database) ? Visibility.Visible : Visibility.Collapsed;
-        //
-        //         EditWebSettings.Visibility = Equals(type, ServerType.Web) ? Visibility.Visible : Visibility.Collapsed;
-        //
-        //         ScheduledScripts.Visibility = type == ServerType.Schedule ? Visibility.Visible : Visibility.Collapsed;
-        //     }
-        //     else
-        //     {
-        //         EditWebSettings.Visibility = Visibility.Collapsed;
-        //         DatabaseLicense.Visibility = Visibility.Collapsed;
-        //         DatabaseCustomFields.Visibility = Visibility.Collapsed;
-        //         DatabaseScripts.Visibility = Visibility.Collapsed;
-        //         ScheduledScripts.Visibility = Visibility.Collapsed;
-        //     }
-        // }
-
+        
         protected override Server LoadItem(CoreRow row)
         protected override Server LoadItem(CoreRow row)
         {
         {
             var key = row.Get<Server, string>(x => x.Key);
             var key = row.Get<Server, string>(x => x.Key);
@@ -766,8 +719,9 @@ namespace PRSServer
         {
         {
             if (arg == null)
             if (arg == null)
                 return Properties.Resources.tick.AsBitmapImage();
                 return Properties.Resources.tick.AsBitmapImage();
-            var service = GetService(arg.Get<Server, string>(c => c.Key));
-            var state = service != null ? (int)service.Status : 0;
+            var key = arg.Get<Server, string>(c => c.Key);
+            var service = GetService(key);
+            int state = service != null ? (int)service.Status : 0; 
             return _stateimages[state];
             return _stateimages[state];
         }
         }
 
 

+ 1 - 1
prs.server/PRSServer.iss

@@ -5,7 +5,7 @@
 #pragma verboselevel 9
 #pragma verboselevel 9
 
 
 #define MyAppName "PRS Server"
 #define MyAppName "PRS Server"
-#define MyAppVersion "7.15c"
+#define MyAppVersion "8.03"
 #define MyAppPublisher "PRS Digital"
 #define MyAppPublisher "PRS Digital"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppURL "https://www.prs-software.com.au"
 #define MyAppExeName "PRSServer.exe"
 #define MyAppExeName "PRSServer.exe"