Browse Source

PRS SERVER - added RPC listener in addition to Rest/IPC listeners

Nick-PRSDigital@bitbucket.org 2 years ago
parent
commit
69634eb265

+ 57 - 33
prs.server/Engines/Database/DatabaseEngine.cs

@@ -12,6 +12,7 @@ using InABox.Core;
 using InABox.Database;
 using InABox.Database.SQLite;
 using InABox.IPC;
+using InABox.Rpc;
 using InABox.Server;
 using InABox.Wpf.Reports;
 using PRS.Shared;
@@ -26,9 +27,9 @@ namespace PRSServer
         private string PipeName;
         private IPCServer? PipeServer;
 
-        //private IRPCServer? _pipeserver;
-        //private IRPCServer? _socketserver;
-        
+        //private IRpcServer? _pipeserver;
+        private IRpcServer? _socketserver;
+
         public override void Configure(Server server)
         {
             base.Configure(server);
@@ -45,7 +46,7 @@ namespace PRSServer
             {
                 if (RestListener.Certificate != null)
                     result.Add(new PortStatus(Properties.Port, PortType.Database, PortState.Secure));
-                else 
+                else
                     result.Add(new PortStatus(Properties.Port, PortType.Database, PortState.Available));
             }
             if (Properties.WebSocketPort != 0)
@@ -55,12 +56,12 @@ namespace PRSServer
 
         private void ConfigureSMSProviders()
         {
-            if(Properties.SMSProviderProperties == null) return;
-            if(Properties.SMSProviderProperties.Count == 0)
+            if (Properties.SMSProviderProperties == null) return;
+            if (Properties.SMSProviderProperties.Count == 0)
             {
                 Logger.Send(LogType.Information, "", "No SMS Providers to initialise");
             }
-            foreach(var (type, properties) in Properties.SMSProviderProperties)
+            foreach (var (type, properties) in Properties.SMSProviderProperties)
             {
                 var provider = SMSProviderProperties.ToProperties(type, properties);
                 switch (provider)
@@ -132,9 +133,9 @@ namespace PRSServer
                 )).Rows.Select(x => x.ToObject<Notification>());
         }
 
-        private void ConfigureNotifier()
+        private void ConfigurePusher()
         {
-            Notify.AddPollHandler(PollNotifications);
+            PushManager.AddPollHandler(PollNotifications);
         }
 
         public override void Run()
@@ -201,39 +202,59 @@ namespace PRSServer
             CredentialsCache.LoadSessionCache();
             CredentialsCache.SetSessionExpiryTime(TimeSpan.FromMinutes(Properties.SessionExpiryTime));
 
-            Logger.Send(LogType.Information, "", string.Format("Starting Rest Listener: Port={0}", Properties.Port));
-            if (Properties.WebSocketPort != 0)
-            {
-                // Put a log saying to start the web socket listener.
-                Logger.Send(LogType.Information, "", string.Format("Starting Web Socket Listener: Port={0}", Properties.WebSocketPort));
-            }
-            // This should be out of the if-statement, since the listener needs to be initialised, even if the web socket port is 0.
-            RestListener.Init(Properties.WebSocketPort);
+            // if (Properties.WebSocketPort != 0)
+            // {
+            //     // Put a log saying to start the web socket listener.
+            //     Logger.Send(LogType.Information, "", string.Format("Starting Web Socket Listener: Port={0}", Properties.WebSocketPort));
+            // }
+            // // This should be out of the if-statement, since the listener needs to be initialised, even if the web socket port is 0.
+
+            Logger.Send(LogType.Information, "", string.Format("Starting Rest Listener: Port={0}", 0));
 
+            RestListener.Init(0); //this used to be Properties.WebSocketPort, however we are temporarily using this port to configure the RPCSocket connection
             InitialisePort();
             RestListener.Start();
-            // _socketserver = new RPCServer<RPCServerSocketTransport>(() => new RPCServerSocketTransport(Properties.Port));
-            // _socketserver.OnLog += (type, userid, message) => Logger.Send(type, userid, $"[S] {message}");
-            // _socketserver.Start();
-            Logger.Send(LogType.Information, "", string.Format("Rest Server Started listening on port {0}", Properties.Port));
-            
+
+            Logger.Send(LogType.Information, "", string.Format("Rest Listener Started: Port={0}", 0));
+
+            //TODO remove this (only being used for temporary site app to connect to)
+            if (Properties.WebSocketPort == 0)
+                Properties.WebSocketPort = 8050;
+
+            if (Properties.WebSocketPort != 0)
+            {
+                Logger.Send(LogType.Information, "", string.Format("Starting Socket Listener from Properties.WebSocketPort: Port={0}", Properties.WebSocketPort));
+                var sockettransport = new RpcServerSocketTransport(Properties.WebSocketPort, CertificateFileName());
+                _socketserver = new RpcServer<RpcServerSocketTransport>(sockettransport);
+                _socketserver.OnLog += (type, userid, message, parameters) => Logger.Send(type, userid, $"[S] {message}", parameters);
+                _socketserver.Start();
+                PushManager.AddPusher(sockettransport);
+                Logger.Send(LogType.Information, "", string.Format("Socket Listener Started from Properties.WebSocketPort: Port={0}", Properties.WebSocketPort));
+            }     
 
             Logger.Send(LogType.Information, "", $"Starting Pipe Listener with pipe name {PipeName}");
-            // _pipeserver = new RPCServer<RPCServerPipeTransport>(() => new RPCServerPipeTransport(PipeName));
-            // _pipeserver.OnLog += (type, userid, message) => Logger.Send(type, userid, $"[P] {message}");
-            // _pipeserver.Start();
+
             PipeServer = new IPCServer(PipeName);
             PipeServer.Start();
 
             Logger.Send(LogType.Information, "", "Pipe Listener started");
 
-            ConfigureNotifier();
+            //var pipetransport = new RpcServerPipeTransport(PipeName);
+            //_pipeserver = new RpcServer<RpcServerPipeTransport>(pipetransport);
+            //_pipeserver.OnLog += (type, userid, message, parameters) => Logger.Send(type, userid, $"[P] {message}", parameters);
+            //_pipeserver.Start();
+            //PushManager.AddPusher(pipetransport);
+
+
+
+            ConfigurePusher();
+
         }
 
         #region Certificate Management
 
-        private string CertificateFileName() => 
-            !string.IsNullOrWhiteSpace(Properties.CertificateFile) 
+        private string CertificateFileName() =>
+            !string.IsNullOrWhiteSpace(Properties.CertificateFile)
             ? Properties.CertificateFile
             : CertificateEngine.CertificateFile;
 
@@ -271,7 +292,7 @@ namespace PRSServer
             else
             {
                 // Once every day, check certificate expiry
-                if(CertificateRefreshTimer == null)
+                if (CertificateRefreshTimer == null)
                 {
                     CertificateRefreshTimer = new Timer(1000 * 60 * 60 * 24);
                     CertificateRefreshTimer.Elapsed += CertificateTimer_Elapsed;
@@ -298,7 +319,7 @@ namespace PRSServer
                 var employee = DbFactory.Provider.Query(
                     new Filter<Employee>(x => x.UserLink.UserID).IsEqualTo(Properties.CertificateExpirationSubscriber),
                     new Columns<Employee>(x => x.ID, x => x.UserLink.ID, x => x.UserLink.UserID)).Rows.FirstOrDefault()?.ToObject<Employee>();
-                if(employee != null)
+                if (employee != null)
                 {
                     var notification = new Notification();
                     notification.Employee.ID = employee.ID;
@@ -323,7 +344,7 @@ namespace PRSServer
                     cert = new X509Certificate2(CertificateFileName());
                 }
 
-                if(cert != null && cert.NotAfter > RestListener.Certificate.NotAfter && cert.NotAfter > DateTime.Now)
+                if (cert != null && cert.NotAfter > RestListener.Certificate.NotAfter && cert.NotAfter > DateTime.Now)
                 {
                     Logger.Send(LogType.Information, "DATABASE", "HTTPS Certificate with greater expiry date found; restarting HTTPS listener...");
                     RestartListener();
@@ -331,7 +352,7 @@ namespace PRSServer
 
                 var expiry = RestListener.Certificate.NotAfter;
                 var untilExpiry = expiry - DateTime.Now;
-                if(untilExpiry.TotalDays <= 7)
+                if (untilExpiry.TotalDays <= 7)
                 {
                     SendCertificateExpiryNotification(expiry);
                     if (untilExpiry.TotalDays <= 1)
@@ -416,13 +437,16 @@ namespace PRSServer
         {
             Logger.Send(LogType.Information, "", "Stopping..");
 
+            _socketserver?.Stop();
+            _socketserver = null;
+
             //_pipeserver?.Stop();
             //_pipeserver = null;
             PipeServer?.Dispose();
 
             RestListener.Stop();
             CredentialsCache.SaveSessionCache();
-            
+
             CertificateRefreshTimer?.Stop();
             CertificateHaltTimer?.Stop();
         }

+ 12 - 0
prs.server/Engines/GPS/GPSEngine.cs

@@ -14,6 +14,13 @@ using System.Net;
 using System.Net.Sockets;
 using System.Text;
 using System.Threading.Tasks;
+using Comal.Classes;
+using InABox.Clients;
+using InABox.Core;
+using InABox.DigitalMatter;
+using InABox.IPC;
+using InABox.Rpc;
+using PRSServer.Engines;
 using System.Timers;
 
 namespace PRSServer
@@ -200,6 +207,11 @@ namespace PRSServer
 
             sigfoxListener.Start();
 
+            //var transport = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(Properties.Server));
+            //ClientFactory.SetClientType(typeof(RpcClient<>), Platform.GPSEngine, Version, transport);
+
+            //CheckConnection();
+
             Logger.Send(LogType.Information, "", "Sigfox Listener started on port " + Properties.SigfoxListenPort);
         }
         

+ 5 - 0
prs.server/Engines/Scheduler/ScheduleEngine.cs

@@ -4,6 +4,7 @@ using Comal.TaskScheduler.Shared;
 using InABox.IPC;
 using InABox.Clients;
 using InABox.Core;
+using InABox.Rpc;
 
 namespace PRSServer
 {
@@ -34,6 +35,10 @@ namespace PRSServer
                     return;
                 }
                 ClientFactory.SetClientType(typeof(IPCClient<>), Platform.SchedulerEngine, Version, DatabaseServerProperties.GetPipeName(Properties.Server));
+
+                //var transport = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(Properties.Server));
+                //ClientFactory.SetClientType(typeof(RpcClient<>), Platform.SchedulerEngine, Version, transport);
+
                 CheckConnection();
 
                 Logger.Send(LogType.Information, "", "Starting Scheduler: ");

+ 4 - 0
prs.server/Engines/WebEngine/WebEngine.cs

@@ -7,6 +7,7 @@ using InABox.Clients;
 using InABox.Configuration;
 using InABox.Core;
 using InABox.Wpf.Reports;
+using InABox.Rpc;
 
 namespace PRSServer
 {
@@ -31,6 +32,9 @@ namespace PRSServer
             }
             ClientFactory.SetClientType(typeof(IPCClient<>), Platform.WebEngine, Version, DatabaseServerProperties.GetPipeName(Properties.Server));
 
+            //var transport = new RpcClientPipeTransport(DatabaseServerProperties.GetPipeName(Properties.Server));
+            //ClientFactory.SetClientType(typeof(RpcClient<>), Platform.WebEngine, Version, transport);
+
             Logger.Send(LogType.Information, "", "Registering Classes");
 
             StoreUtils.RegisterClasses();

+ 3 - 3
prs.server/Engines/WebEngine/WebListener.cs

@@ -358,15 +358,15 @@ namespace PRSServer
             var validation = Client.Validate(username, password);
             switch (validation.Status)
             {
-                case ValidationResult.INVALID:
+                case ValidationStatus.INVALID:
                     Logger.Send(LogType.Information, "", "User name or password is incorrect");
                     return request.Respond().Status(ResponseStatus.Unauthorized);
-                case ValidationResult.PASSWORD_EXPIRED:
+                case ValidationStatus.PASSWORD_EXPIRED:
                     Logger.Send(LogType.Information, "", "Password has expired");
                     return request.Respond().Status(ResponseStatus.Unauthorized);
             }
 
-            var require2FA = validation.Status == ValidationResult.REQUIRE_2FA;
+            var require2FA = validation.Status == ValidationStatus.REQUIRE_2FA;
 
             var newSessionID = Guid.NewGuid();
             var user = new User

+ 1 - 1
prs.server/Engines/WebEngine/WebUtils.cs

@@ -2062,7 +2062,7 @@ for(let addTaskField of addTaskFields){
         /// <param name="id">An optional HTML id to add to root &lt;div&gt; of the generated item.</param>
         /// <param name="classList">An optional list of HTML classes to add to root &lt;div&gt; of the generated item.</param>
         /// <returns>A string containing raw HTML markup</returns>
-        public static string BuildDigitalFormViewer(IBaseDigitalFormInstance form, Entity entity, bool readOnly, string? id = null,
+        public static string BuildDigitalFormViewer(ICoreDigitalFormInstance form, Entity entity, bool readOnly, string? id = null,
             string[]? classList = null)
         {
             var formLayoutTable = new Client<DigitalFormLayout>().Query(