Przeglądaj źródła

added feature to ping websites, fix cpu util on linux, updated packages

Veloe 1 rok temu
rodzic
commit
6272a7cbdc

+ 58 - 67
VeloeMonitorDataCollector/DataCollector.cs

@@ -9,6 +9,8 @@ using VeloeMonitorDataCollector.DatabaseConnectors;
 using VeloeMonitorDataCollector.Models;
 using Serilog;
 using VeloeMonitorDataCollector.Dependencies;
+using System.Globalization;
+using System.Net;
 
 namespace VeloeMonitorDataCollector
 {
@@ -248,10 +250,10 @@ namespace VeloeMonitorDataCollector
                     interval = 1;
                 }
 
-                    BuildUpdater(section.Path,
-                    section["Ip"],
-                    Int32.Parse(section["Port"]), 
-                    section["Type"], interval);
+                BuildUpdater(section.Path,
+                section["Ip"],
+                Int32.Parse(section["Port"]), 
+                section["Type"], interval);
             }
         }
 
@@ -312,27 +314,6 @@ namespace VeloeMonitorDataCollector
 
             StreamWriter sw = File.AppendText("sysinfo.txt");
 
-            if (OperatingSystem.IsLinux())
-            {
-                var cpuLine = File
-                    .ReadAllLines("/proc/stat")
-                    .First()
-                    .Split(' ', StringSplitOptions.RemoveEmptyEntries)
-                    .Skip(1)
-                    .Select(float.Parse)
-                    .ToArray();
-
-                var idle = cpuLine[3];
-                var total = cpuLine.Sum();
-
-                var percent = 100 * (1.0f - (idle - prevIdle) / (total - prevTotal));
-                sw.WriteLine("CPU Load: {0}", percent);
-
-                prevIdle = idle;
-                prevTotal = total;
-
-            }
-
             foreach (var hardware in _computerHardware.Hardware)
             {
                 hardware.Update();
@@ -381,36 +362,13 @@ namespace VeloeMonitorDataCollector
             if (_computerHardware is null)
                 return output;
 
-            if (OperatingSystem.IsLinux())
-            {
-                var cpuLine = File
-                    .ReadAllLines("/proc/stat")
-                    .First()
-                    .Split(' ', StringSplitOptions.RemoveEmptyEntries)
-                    .Skip(1)
-                    .Select(float.Parse)
-                    .ToArray();
-
-                var idle = cpuLine[3];
-                var total = cpuLine.Sum();
-
-                var percent = 100 * (1.0f - (idle - prevIdle) / (total - prevTotal));
-                //for the first calc number can be inf or nan
-                if (float.IsFinite(percent))
-                    output.Add("cpuload", percent);
-
-                prevIdle = idle;
-                prevTotal = total;
-
-            }
-
             foreach (var hardware in _computerHardware.Hardware)
             {
                 hardware.Update();
                 //foreach (var sensor in hardware.Sensors)
                 //    _logger.Warning("{0}: {1}", sensor.Name, sensor.Value);
    
-                if (hardware.HardwareType is HardwareType.Cpu && OperatingSystem.IsWindows())
+                if (hardware.HardwareType is HardwareType.Cpu)
                     if (_deviceLoadSensorIndex["cpuload"] is not -1)
                         output.Add("cpuload", hardware.Sensors[_deviceLoadSensorIndex["cpuload"]].Value.GetValueOrDefault());
                     else
@@ -541,25 +499,7 @@ namespace VeloeMonitorDataCollector
                         try
                         {
                             Gs3Status server = new Gs3Status(ip, port);
-                            /*
-                            bool dataIsNull = true;
-
-                            while (dataIsNull && !_token.IsCancellationRequested)
-                            {
-                                var data = server.GetStatus();
-
-                                if (data is null)
-                                    continue;
 
-                                if (_sendToDb is null)
-                                    dataIsNull = false;
-
-                                foreach(var dbController in _sendToDb)
-                                {
-                                    dbController.CheckGamespy3(data, name);
-                                }
-                            }
-                            */
                             while (!_token.IsCancellationRequested)
                             {
                                 try
@@ -629,6 +569,57 @@ namespace VeloeMonitorDataCollector
                         }
                     }, _token));
 
+                    break;
+                case "Url":
+                    _updaterTasks.Add(name, new Task(async () => {
+                        try
+                        {
+                            while (!_token.IsCancellationRequested)
+                            {
+                                try
+                                {
+                                    await Task.Delay(TimeSpan.FromSeconds(interval));
+
+                                    _logger.Debug("Try to get http response");
+                                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ip);
+                                    request.Headers.Add("Accept-Encoding", "gzip, deflate");
+                                    request.Headers.Add("Accept-Language", "en-US,en;q=0.5");
+                                    request.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+                                    request.AllowAutoRedirect = true; // find out if this site is up and don't follow a redirector
+                                    request.Method = "HEAD";
+                                    try
+                                    {
+                                        using HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+
+                                        if (response is null)
+                                            continue;
+
+                                        if (response.StatusCode != HttpStatusCode.OK)
+                                            continue;
+
+                                        if (_sendToDb is null)
+                                            continue;
+
+                                        foreach (var dbController in _sendToDb)
+                                        {
+                                            dbController.SendUrl(response, name);
+                                        }
+                                    }
+                                    catch (Exception ex) {
+                                        _logger.Warning("{0} {1}", ip, ex.Message);
+                                    }
+                                }
+                                catch (WebException ex)
+                                {
+                                    _logger.Debug("{0} {1}", ip, ex.Message);
+                                }
+                            }
+                        }
+                        catch (System.Net.Sockets.SocketException ex)
+                        {
+                            _logger.Debug("{0} {1}", ip, ex.Message);
+                        }
+                    }, _token));
                     break;
             }
         }

+ 14 - 1
VeloeMonitorDataCollector/DatabaseConnectors/MySqlConnector.cs

@@ -1,4 +1,5 @@
 using System.Globalization;
+using System.Net;
 using System.Text;
 using System.Text.Json;
 using Microsoft.Extensions.Configuration;
@@ -170,6 +171,10 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
                     _logger.Warning("Table {0} can't be checked before game server quering service init because server uses {1} protocol. Table will be checked after first success connection to the server.", name, "Gamespy2");
                     return true;
 
+                case "Url":
+                    _logger.Warning("No support provided for {0}",name);
+                    return true;
+
                 default:
                     throw new ArgumentException(type);
             }
@@ -327,7 +332,6 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
                     query.Append(",PRIMARY KEY (date))");
                     command = new MySqlCommand(query.ToString(), _connection);
 
-                    
                     break;
 
                 case "Gamespy3":
@@ -338,6 +342,10 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
                     throw new NotImplementedException("Gamespy3");
                     return;
 
+                case "Url":
+                    throw new NotImplementedException("Url");
+                    return;
+
                 default:    
                     throw new ArgumentException(type);
             }
@@ -726,5 +734,10 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
             MySqlCommand command = new MySqlCommand($"CREATE DATABASE {name}", _connection);
             command.ExecuteNonQuery();
         }
+
+        public void SendUrl(HttpWebResponse data, string name)
+        {
+            //ignore
+        }
     }
 }

+ 13 - 0
VeloeMonitorDataCollector/DatabaseConnectors/SignalRConnector.cs

@@ -8,6 +8,9 @@ using Microsoft.Extensions.DependencyInjection;
 using Microsoft.AspNetCore.SignalR;
 using System.Text.Json;
 using Serilog;
+using System.Net;
+using static System.Runtime.InteropServices.JavaScript.JSType;
+using System;
 
 namespace VeloeMonitorDataCollector.DatabaseConnectors
 {
@@ -76,6 +79,11 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
         {
             app.Services.GetService<DataSender>().SendSteam(data, name);
         }
+
+        public void SendUrl(HttpWebResponse data, string name)
+        {
+            app.Services.GetService<DataSender>().SendUrl(data, name);
+        }
     }
 
     public class DataSender
@@ -112,6 +120,11 @@ namespace VeloeMonitorDataCollector.DatabaseConnectors
         {
             _hubContext.Clients.Groups(name).SendAsync($"Update{name}", JsonSerializer.Serialize(data));
         }
+
+        internal void SendUrl(HttpWebResponse data, string name)
+        {
+            _hubContext.Clients.Groups(name).SendAsync($"Update{name}", JsonSerializer.Serialize(data));
+        }
     }
 
     public class DataHub : Hub

+ 3 - 1
VeloeMonitorDataCollector/Interfaces/IDataSendable.cs

@@ -1,4 +1,5 @@
 using MinecraftStatus;
+using System.Net;
 using VeloeMonitorDataCollector.Dependencies;
 using VeloeMonitorDataCollector.Models;
 
@@ -21,5 +22,6 @@ public interface IDataSendable
     public bool CheckHardware(in Dictionary<string,float> input);
 
     public bool CheckGameServer(in string name,in string type);
-    
+
+    void SendUrl(HttpWebResponse data, string name);
 }

+ 10 - 8
VeloeMonitorDataCollector/VeloeMonitorDataCollector.csproj

@@ -2,11 +2,13 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>net7.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <PlatformTarget>x64</PlatformTarget>
     <DebugType>embedded</DebugType>
+    <AssemblyVersion>1.0.0.15</AssemblyVersion>
+    <FileVersion>1.0.0.15</FileVersion>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -23,14 +25,14 @@
 
   <ItemGroup>
     <PackageReference Include="ClrHeapAllocationAnalyzer" Version="3.0.0" />
-    <PackageReference Include="LibreHardwareMonitorLib" Version="0.9.1" />
-    <PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="6.0.0" />
-    <PackageReference Include="MySqlConnector" Version="2.2.0" />
-    <PackageReference Include="Serilog.AspNetCore" Version="6.0.1" />
-    <PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
+    <PackageReference Include="LibreHardwareMonitorLib" Version="0.9.2" />
+    <PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="7.0.0" />
+    <PackageReference Include="MySqlConnector" Version="2.2.7" />
+    <PackageReference Include="Serilog.AspNetCore" Version="7.0.0" />
+    <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
     <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
-    <PackageReference Include="SonarAnalyzer.CSharp" Version="8.44.0.52574">
+    <PackageReference Include="SonarAnalyzer.CSharp" Version="9.12.0.78982">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>