Asynchronous MultiThreaded SSH engine for Web (Net Core 6, Linux) - Part 3,4 (CryptoAPI/CryptoService and Database Access).
Protect password in DB and config, Task.Run for Async DB access, Expand POCO classes, Service lifetime list, Linq and Iterator/Yield functions.
3. CryptoAPI/CryptoService.
Based on function EncryptString/DecryptStrin from page Linux shell parser (Renci.SshNet.SshClient, MySqlConnector.NET, RSA encription, Console password, XDocument/XPath, Tuple, Regex, Buffer.BlockCopy, Stream, Base64String, UTF8.GetBytes, ToString("X2")) and on function AES_ENCRYPT and AES_DECRYPT described on this page Working with MySQL Blob. I have created controller AES for using this API by frontend (one of the number of other controllers for my project frontend):
This so basic code:
1: Imports System.IO
2: Imports System.Text
3: Imports BackendAPI.Helper
4: Imports BackendAPI.Model
5: Imports BackendAPI.Services
6: Imports Microsoft.AspNetCore.Http
7: Imports Microsoft.AspNetCore.Mvc
8: Imports Microsoft.EntityFrameworkCore
9: Imports Newtonsoft.Json.Linq
10:
11: Namespace WebApi.Controllers
12:
13: <ApiController>
14: <Route("[controller]/[action]")>
15: Public Class AesController
16: Inherits ControllerBase
17:
18: Private ReadOnly Aes As AesCryptor
19: Private ReadOnly _DB As ApplicationDbContext
20: Private ReadOnly _UserService As IUserService
21: Private ReadOnly _httpContextAccessor As IHttpContextAccessor
22:
23: Public Sub New(ByVal UserService As IUserService, Cryptor As IAesCryptor, DbContext As ApplicationDbContext, httpContextAccessor As IHttpContextAccessor)
24: Aes = Cryptor
25: _DB = DbContext
26: _UserService = UserService
27: _httpContextAccessor = httpContextAccessor
28: End Sub
29:
30: <HttpGet>
31: Public Function NetCrypt(Text As String, KeyString As String) As String
32: 'encrypted/decrypted password and key can less than 15 chars
33: Return Aes.EncryptString(Text, KeyString)
34: End Function
35:
36: <HttpGet>
37: Public Function NetDeCrypt(CipherText As String, KeyString As String) As String
38: 'encrypted/decrypted password and key can less than 15 chars
39: Return Aes.DecryptString(CipherText, KeyString)
40: End Function
41:
42: 'Authorize because vulnerable to SQL injection
43: <Jwt.Authorize>
44: <HttpGet>
45: Public Function SqlCrypt(Text As String, KeyString As String) As JsonResult
46: Dim CurUsers = _UserService.GetCurrentUser(_httpContextAccessor.HttpContext.Request.Headers("JwtUserName")(0))
47: If CurUsers.IsAdmin Then
48: Dim Buf1 As Byte() = New Byte() {}
49: ReDim Buf1(100)
50: _DB.RawSqlQuery(Of Byte())($"select aes_encrypt('{Text}','{KeyString}') as aes_encrypt", Function(X)
51: CType(X("aes_encrypt"), Byte()).CopyTo(Buf1, 0)
52: ReDim Preserve Buf1(CType(X("aes_encrypt"), Byte()).Length - 1)
53: Return Nothing
54: End Function)
55: Dim Sb1 As New StringBuilder
56: For Each One As Byte In Buf1.ToArray
57: Sb1.Append(One.ToString("X2"))
58: Next
59: Dim Ret1 As New With {.ToBase64String = Convert.ToBase64String(Buf1), .Hex = Sb1.ToString, .Utf8String = UTF8Encoding.UTF8.GetString(Buf1)}
60: Return New JsonResult(Ret1)
61: Else
62: Return New JsonResult(Unauthorized())
63: End If
64:
65: End Function
66:
67: <Jwt.Authorize>
68: <HttpGet>
69: Public Function SqlDeCrypt(HexCipherText As String, KeyString As String) As JsonResult
70: Dim CurUsers = _UserService.GetCurrentUser(_httpContextAccessor.HttpContext.Request.Headers("JwtUserName")(0))
71: If CurUsers.IsAdmin Then
72: Dim Buf1 As Byte() = New Byte() {}
73: ReDim Buf1(100)
74: _DB.RawSqlQuery(Of Byte())($"select aes_decrypt(X'{HexCipherText}','{KeyString}') as aes_decrypt", Function(X)
75: CType(X("aes_decrypt"), Byte()).CopyTo(Buf1, 0)
76: ReDim Preserve Buf1(CType(X("aes_decrypt"), Byte()).Length - 1)
77: Return Nothing
78: End Function)
79: Dim Sb1 As New StringBuilder
80: For Each One As Byte In Buf1.ToArray
81: Sb1.Append(One.ToString("X2"))
82: Next
83: Dim Ret1 As New With {.ToBase64String = Convert.ToBase64String(Buf1), .Hex = Sb1.ToString, .Utf8String = UTF8Encoding.UTF8.GetString(Buf1)}
84: Return New JsonResult(Ret1)
85: Else
86: Return New JsonResult(Unauthorized())
87: End If
88: End Function
89:
90: <Jwt.Authorize>
91: <HttpGet>
92: Public Function UpdateDecryptedPass(Type As PassType, OldPass As String, NewPass As String) As ActionResult
93: Dim CurUsers = _UserService.GetCurrentUser(_httpContextAccessor.HttpContext.Request.Headers("JwtUserName")(0))
94: If CurUsers.IsAdmin Then
95: Dim Ret1 = UpdDecryptedPass(_DB, Type, OldPass, NewPass)
96: If Ret1.Item2 Is Nothing Then
97: Return Ok(NewPass)
98: Else
99: Return StatusCode(StatusCodes.Status500InternalServerError, Ret1.Item2)
100: End If
101: Else
102: Return New JsonResult(Unauthorized())
103: End If
104: End Function
105:
106: <Jwt.Authorize>
107: <HttpPost>
108: Public Function CheckDecryptPass(AllDecryptPass As DecryptPass) As IActionResult
109: Dim CurUsers = _UserService.GetCurrentUser(_httpContextAccessor.HttpContext.Request.Headers("JwtUserName")(0))
110: If CurUsers.IsAdmin Then
111: Dim ServerDecryptPass = ChkDecryptedPass(_DB, AllDecryptPass, PassType.ServerDecryptPass)
112: Dim VmConnectionDecryptPass = ChkDecryptedPass(_DB, AllDecryptPass, PassType.VmConnectionDecryptPass)
113: Dim DockerHubVmDecryptPass = ChkDecryptedPass(_DB, AllDecryptPass, PassType.DockerHubVmDecryptPass)
114: Dim DockerRegistryVmDecryptPass = ChkDecryptedPass(_DB, AllDecryptPass, PassType.DockerRegistryVmDecryptPass)
115: Return Ok(New With {
116: .ServerDecryptPass = ServerDecryptPass,
117: .VmConnectionDecryptPass = VmConnectionDecryptPass,
118: .DockerHubVmDecryptPass = DockerHubVmDecryptPass,
119: .DockerRegistryVmDecryptPass = DockerRegistryVmDecryptPass
120: })
121: Else
122: Return New JsonResult(Unauthorized())
123: End If
124: End Function
125:
126: <HttpGet>
127: Public Function GetRandomPassword(Len As Integer) As IActionResult
128: Return New JsonResult(CreateRandomPassword(Len, FromChagCode:=&H21, ToCharCode:=&H7E))
129: End Function
130:
131: <HttpGet>
132: Public Function GetRandomName(Len As Integer) As IActionResult
133: Return New JsonResult(CreateRandomPassword(Len, FromChagCode:=&H61, ToCharCode:=&H7A))
134: End Function
135:
136: Public Shared Function UpdDecryptedPass(_DB As ApplicationDbContext, Type As PassType, OldPass As String, NewPass As String) As Tuple(Of Integer, Exception)
137: Dim Res1 As Integer
138: _DB.Database.OpenConnection
139: Dim CMD1 = _DB.Database.GetDbConnection().CreateCommand()
140: Try
141: Select Case Type
142: Case PassType.ServerDecryptPass
143: CMD1.CommandText = $"Update `cryptochestmax`.`KvmHost` set `Password`= IF( OCTET_LENGTH(AES_DECRYPT(`Password`,'{OldPass}')) is null, `Password`, AES_ENCRYPT(AES_DECRYPT(`Password`,'{OldPass}'),'{NewPass}'));"
144: Case PassType.VmConnectionDecryptPass
145: CMD1.CommandText = $"Update `cryptochestmax`.`VM` set `AdminPassword`= IF( OCTET_LENGTH(AES_DECRYPT(`AdminPassword`,'{OldPass}')) is null, `AdminPassword`, AES_ENCRYPT(AES_DECRYPT(`AdminPassword`,'{OldPass}'),'{NewPass}'));"
146: Case PassType.DockerHubVmDecryptPass
147: CMD1.CommandText = $"Update `cryptochestmax`.`DockerHubVm` set `Pass`= IF( OCTET_LENGTH(AES_DECRYPT(`Pass`,'{OldPass}')) is null, `Pass`, AES_ENCRYPT(AES_DECRYPT(`Pass`,'{OldPass}'),'{NewPass}'));"
148: Case PassType.DockerRegistryVmDecryptPass
149: CMD1.CommandText = $"Update `cryptochestmax`.`DockerRegistryVm` set `Pass`= IF( OCTET_LENGTH(AES_DECRYPT(`Pass`,'{OldPass}')) is null, `Pass`, AES_ENCRYPT(AES_DECRYPT(`Pass`,'{OldPass}'),'{NewPass}'));"
150: Case PassType.UserDecryptPass
151: CMD1.CommandText = $"Update `cryptochestmax`.`User` set `Password`= IF( OCTET_LENGTH(AES_DECRYPT(`Password`,'{OldPass}')) is null, `Password`, AES_ENCRYPT(AES_DECRYPT(`Password`,'{OldPass}'),'{NewPass}'));"
152: End Select
153: Res1 = CMD1.ExecuteNonQuery
154: Return New Tuple(Of Integer, Exception)(Res1, Nothing)
155: Catch ex As Exception
156: Debug.WriteLine(CMD1.CommandText & vbCrLf & ex.Message)
157: Return New Tuple(Of Integer, Exception)(Nothing, ex)
158: End Try
159: End Function
160:
161: Public Shared Function ChkDecryptedPass(_DB As ApplicationDbContext, AllDecryptPass As DecryptPass, Type As PassType) As Tuple(Of List(Of Nullable(Of Integer)), Exception)
162: Dim Res1 As New List(Of Nullable(Of Integer))
163: _DB.Database.OpenConnection
164: Dim CMD1 = _DB.Database.GetDbConnection().CreateCommand()
165: Try
166: Select Case Type
167: Case PassType.ServerDecryptPass
168: CMD1.CommandText = $"Select OCTET_LENGTH(AES_DECRYPT(`Password`,'{AllDecryptPass.ServerDecryptPass}')) as ServerDecryptPass from `cryptochestmax`.`KvmHost`;"
169: Case PassType.VmConnectionDecryptPass
170: CMD1.CommandText = $"Select OCTET_LENGTH(AES_DECRYPT(`AdminPassword`,'{AllDecryptPass.VmConnectionDecryptPass}')) as VmConnectionDecryptPass from `cryptochestmax`.`VM`;"
171: Case PassType.DockerHubVmDecryptPass
172: CMD1.CommandText = $"Select OCTET_LENGTH(AES_DECRYPT(`Pass`,'{AllDecryptPass.DockerHubVmDecryptPass}')) as DockerHubVmDecryptPass from `cryptochestmax`.`DockerHubVm`;"
173: Case PassType.DockerRegistryVmDecryptPass
174: CMD1.CommandText = $"Select OCTET_LENGTH(AES_DECRYPT(`Pass`,'{AllDecryptPass.DockerRegistryVmDecryptPass}')) as DockerRegistryVmDecryptPass from `cryptochestmax`.`DockerRegistryVm`;"
175: End Select
176: Dim RDR1 = CMD1.ExecuteReader
177: While RDR1.Read
178: Select Case Type
179: Case PassType.ServerDecryptPass
180: Res1.Add(RDR1.CheckDBNull(Of Integer)(RDR1("ServerDecryptPass")))
181: Case PassType.VmConnectionDecryptPass
182: Res1.Add(RDR1.CheckDBNull(Of Integer)(RDR1("VmConnectionDecryptPass")))
183: Case PassType.DockerHubVmDecryptPass
184: Res1.Add(RDR1.CheckDBNull(Of Integer)(RDR1("DockerHubVmDecryptPass")))
185: Case PassType.DockerRegistryVmDecryptPass
186: Res1.Add(RDR1.CheckDBNull(Of Integer)(RDR1("DockerRegistryVmDecryptPass")))
187: End Select
188: End While
189: RDR1.Close()
190: Return New Tuple(Of List(Of Nullable(Of Integer)), Exception)(Res1, Nothing)
191: Catch ex As Exception
192: Debug.WriteLine(CMD1.CommandText & vbCrLf & ex.Message)
193: Return New Tuple(Of List(Of Nullable(Of Integer)), Exception)(Nothing, ex)
194: End Try
195: End Function
196:
197:
198:
199:
200: #Region "Random"
201: Public Shared Function CreateRandomPassword(Len As Integer, Optional FromChagCode As UInt32 = &H21, Optional ToCharCode As UInt32 = &H7E, Optional ExcludeChars As String = "<>'""") As String
202: Dim Ret1 As New System.Text.StringBuilder
203: While Ret1.Length < Len
204: Dim RandomNum As Integer = FromChagCode + GetRandomInteger(ToCharCode - FromChagCode)
205: Dim OneChar As Char = ChrW(RandomNum)
206: If Not ExcludeChars.Contains(OneChar) Then
207: Ret1.Append(OneChar)
208: End If
209: End While
210: Return Ret1.ToString
211: End Function
212:
213: Public Shared Function GetRandomInteger(MaxValue As Integer) As Integer
214: Dim byte_count As Byte() = New Byte(3) {}
215: Dim random_number As New System.Security.Cryptography.RNGCryptoServiceProvider()
216: random_number.GetBytes(byte_count)
217: Return (Math.Abs(BitConverter.ToInt32(byte_count, 0)) / Int32.MaxValue) * MaxValue
218: End Function
219: #End Region
220:
221: End Class
222:
223: End Namespace
As you can see this API can be used to protect 5 PassType of password in database, therefore database NEVER store password in clear view, this is protection from rogue intrusion for run-time environment.
And also I have injected CryptoService, I used it for protection password for database in the same way.
And than I add the same class as service (line 57).
By the way, look to line 67-70, in this line I show this list with all services loaded in DI with lifetime.
1. Scoped : BackendAPI.Services.IUserService 2. Scoped : Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider 3. Scoped : Microsoft.AspNetCore.Authentication.IAuthenticationService 4. Scoped : Microsoft.AspNetCore.Http.IMiddlewareFactory 5. Scoped : Microsoft.AspNetCore.SignalR.IHubActivator`1[THub] 6. Scoped : Microsoft.Extensions.Options.IOptionsSnapshot`1[TOptions] 7. Singleton : BackendAPI.Services.IAesCryptor 8. Singleton : BackendAPI.Services.INotificationCacheService 9. Singleton : Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider 10. Singleton : Microsoft.AspNetCore.Authentication.IClaimsTransformation 11. Singleton : Microsoft.AspNetCore.Authorization.Policy.AuthorizationPolicyMarkerService 12. Singleton : Microsoft.AspNetCore.Connections.IConnectionListenerFactory 13. Singleton : Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory 14. Singleton : Microsoft.AspNetCore.Hosting.IApplicationLifetime 15. Singleton : Microsoft.AspNetCore.Hosting.IHostingEnvironment 16. Singleton : Microsoft.AspNetCore.Hosting.IStartupFilter 17. Singleton : Microsoft.AspNetCore.Hosting.IStartupFilter 18. Singleton : Microsoft.AspNetCore.Hosting.IStartupFilter 19. Singleton : Microsoft.AspNetCore.Hosting.IWebHostEnvironment 20. Singleton : Microsoft.AspNetCore.Hosting.Server.IServer 21. Singleton : Microsoft.AspNetCore.Http.Connections.Internal.HttpConnectionDispatcher 22. Singleton : Microsoft.AspNetCore.Http.Connections.Internal.HttpConnectionManager 23. Singleton : Microsoft.AspNetCore.Http.IHttpContextAccessor 24. Singleton : Microsoft.AspNetCore.Http.IHttpContextFactory 25. Singleton : Microsoft.AspNetCore.Mvc.ActionConstraints.ActionConstraintCache 26. Singleton : Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionGroupCollectionProvider 27. Singleton : Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModelFactory 28. Singleton : Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager 29. Singleton : Microsoft.AspNetCore.Mvc.Controllers.IControllerActivatorProvider 30. Singleton : Microsoft.AspNetCore.Mvc.Controllers.IControllerFactory 31. Singleton : Microsoft.AspNetCore.Mvc.Controllers.IControllerFactoryProvider 32. Singleton : Microsoft.AspNetCore.Mvc.DataAnnotations.IValidationAttributeAdapterProvider 33. Singleton : Microsoft.AspNetCore.Mvc.Filters.IFilterProvider 34. Singleton : Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilder 35. Singleton : Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterConfigurationProvider 36. Singleton : Microsoft.AspNetCore.Mvc.Formatters.FormatFilter 37. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionEndpointDataSourceFactory 38. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerCache 39. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionDescriptorChangeProvider 40. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionDescriptorCollectionProvider 41. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionInvokerFactory 42. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.ContentResult] 43. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.FileContentResult] 44. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.FileStreamResult] 45. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.JsonResult] 46. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.LocalRedirectResult] 47. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.ObjectResult] 48. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.PhysicalFileResult] 49. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.RedirectResult] 50. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.RedirectToActionResult] 51. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.RedirectToPageResult] 52. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.RedirectToRouteResult] 53. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultExecutor`1[Microsoft.AspNetCore.Mvc.VirtualFileResult] 54. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper 55. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IActionSelector 56. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IClientErrorFactory 57. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IHttpRequestStreamReaderFactory 58. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory 59. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.ITypeActivatorCache 60. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.OrderedEndpointsSequenceProviderCache 61. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.OutputFormatterSelector 62. Singleton : Microsoft.AspNetCore.Mvc.Infrastructure.ProblemDetailsFactory 63. Singleton : Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderFactory 64. Singleton : Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider 65. Singleton : Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder 66. Singleton : Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ClientValidatorCache 67. Singleton : Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IObjectModelValidator 68. Singleton : Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory 69. Singleton : Microsoft.AspNetCore.Mvc.Routing.ControllerActionEndpointDataSourceIdProvider 70. Singleton : Microsoft.AspNetCore.Mvc.Routing.DynamicControllerEndpointSelectorCache 71. Singleton : Microsoft.AspNetCore.Mvc.Routing.IRequestDelegateFactory 72. Singleton : Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory 73. Singleton : Microsoft.AspNetCore.Mvc.Routing.MvcRouteHandler 74. Singleton : Microsoft.AspNetCore.Routing.EndpointDataSource 75. Singleton : Microsoft.AspNetCore.Routing.IEndpointAddressScheme`1[Microsoft.AspNetCore.Routing.RouteValuesAddress] 76. Singleton : Microsoft.AspNetCore.Routing.IEndpointAddressScheme`1[System.String] 77. Singleton : Microsoft.AspNetCore.Routing.Internal.DfaGraphWriter 78. Singleton : Microsoft.AspNetCore.Routing.LinkGenerator 79. Singleton : Microsoft.AspNetCore.Routing.LinkParser 80. Singleton : Microsoft.AspNetCore.Routing.MatcherPolicy 81. Singleton : Microsoft.AspNetCore.Routing.MatcherPolicy 82. Singleton : Microsoft.AspNetCore.Routing.MatcherPolicy 83. Singleton : Microsoft.AspNetCore.Routing.MatcherPolicy 84. Singleton : Microsoft.AspNetCore.Routing.MatcherPolicy 85. Singleton : Microsoft.AspNetCore.Routing.Matching.EndpointMetadataComparer 86. Singleton : Microsoft.AspNetCore.Routing.Matching.EndpointSelector 87. Singleton : Microsoft.AspNetCore.Routing.Matching.MatcherFactory 88. Singleton : Microsoft.AspNetCore.Routing.ParameterPolicyFactory 89. Singleton : Microsoft.AspNetCore.Routing.Patterns.RoutePatternTransformer 90. Singleton : Microsoft.AspNetCore.Routing.RoutingMarkerService 91. Singleton : Microsoft.AspNetCore.Routing.Template.TemplateBinderFactory 92. Singleton : Microsoft.AspNetCore.SignalR.HubConnectionHandler`1[THub] 93. Singleton : Microsoft.AspNetCore.SignalR.HubLifetimeManager`1[THub] 94. Singleton : Microsoft.AspNetCore.SignalR.IHubContext`1[THub] 95. Singleton : Microsoft.AspNetCore.SignalR.IHubContext`2[THub,T] 96. Singleton : Microsoft.AspNetCore.SignalR.IHubProtocolResolver 97. Singleton : Microsoft.AspNetCore.SignalR.Internal.HubDispatcher`1[THub] 98. Singleton : Microsoft.AspNetCore.SignalR.Internal.SignalRCoreMarkerService 99. Singleton : Microsoft.AspNetCore.SignalR.IUserIdProvider 100. Singleton : Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol 101. Singleton : Microsoft.Extensions.ApiDescriptions.IDocumentProvider 102. Singleton : Microsoft.Extensions.Configuration.IConfiguration 103. Singleton : Microsoft.Extensions.DependencyInjection.MvcMarkerService 104. Singleton : Microsoft.Extensions.DependencyInjection.SignalRMarkerService 105. Singleton : Microsoft.Extensions.Hosting.HostBuilderContext 106. Singleton : Microsoft.Extensions.Hosting.IApplicationLifetime 107. Singleton : Microsoft.Extensions.Hosting.IHost 108. Singleton : Microsoft.Extensions.Hosting.IHostApplicationLifetime 109. Singleton : Microsoft.Extensions.Hosting.IHostEnvironment 110. Singleton : Microsoft.Extensions.Hosting.IHostingEnvironment 111. Singleton : Microsoft.Extensions.Hosting.IHostLifetime 112. Singleton : Microsoft.Extensions.Logging.Configuration.ILoggerProviderConfiguration`1[T] 113. Singleton : Microsoft.Extensions.Logging.Configuration.ILoggerProviderConfigurationFactory 114. Singleton : Microsoft.Extensions.Logging.Configuration.LoggingConfiguration 115. Singleton : Microsoft.Extensions.Logging.Configuration.LoggingConfiguration 116. Singleton : Microsoft.Extensions.Logging.Console.ConsoleFormatter 117. Singleton : Microsoft.Extensions.Logging.Console.ConsoleFormatter 118. Singleton : Microsoft.Extensions.Logging.Console.ConsoleFormatter 119. Singleton : Microsoft.Extensions.Logging.EventSource.LoggingEventSource 120. Singleton : Microsoft.Extensions.Logging.ILogger`1[TCategoryName] 121. Singleton : Microsoft.Extensions.Logging.ILoggerFactory 122. Singleton : Microsoft.Extensions.Logging.ILoggerProvider 123. Singleton : Microsoft.Extensions.Logging.ILoggerProvider 124. Singleton : Microsoft.Extensions.Logging.ILoggerProvider 125. Singleton : Microsoft.Extensions.Logging.ILoggerProvider 126. Singleton : Microsoft.Extensions.ObjectPool.ObjectPool`1[Microsoft.AspNetCore.Routing.UriBuildingContext] 127. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[BackendAPI.Jwt.JwtSettings] 128. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Builder.WebSocketOptions] 129. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Hosting.GenericWebHostServiceOptions] 130. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Http.Connections.ConnectionOptions] 131. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 132. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 133. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 134. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions] 135. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.SignalR.HubOptions] 136. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.SignalR.HubOptions`1[BackendAPI.Notification.NotificationHub]] 137. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.SignalR.HubOptions`1[BackendAPI.Notification.NotificationHub]] 138. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions] 139. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Hosting.HostOptions] 140. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.Console.ConsoleFormatterOptions] 141. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions] 142. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.Console.JsonConsoleFormatterOptions] 143. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.Console.SimpleConsoleFormatterOptions] 144. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFactoryOptions] 145. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 146. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 147. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 148. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 149. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 150. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 151. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 152. Singleton : Microsoft.Extensions.Options.IConfigureOptions`1[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions] 153. Singleton : Microsoft.Extensions.Options.IOptions`1[TOptions] 154. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[BackendAPI.Jwt.JwtSettings] 155. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.AspNetCore.HostFiltering.HostFilteringOptions] 156. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.Console.ConsoleFormatterOptions] 157. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions] 158. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.Console.JsonConsoleFormatterOptions] 159. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.Console.SimpleConsoleFormatterOptions] 160. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 161. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 162. Singleton : Microsoft.Extensions.Options.IOptionsChangeTokenSource`1[Microsoft.Extensions.Logging.LoggerFilterOptions] 163. Singleton : Microsoft.Extensions.Options.IOptionsMonitor`1[TOptions] 164. Singleton : Microsoft.Extensions.Options.IOptionsMonitorCache`1[TOptions] 165. Singleton : Microsoft.Extensions.Options.IPostConfigureOptions`1[Microsoft.AspNetCore.HostFiltering.HostFilteringOptions] 166. Singleton : System.Buffers.ArrayPool`1[System.Byte] 167. Singleton : System.Buffers.ArrayPool`1[System.Char] 168. Singleton : System.Diagnostics.ActivitySource 169. Singleton : System.Diagnostics.DiagnosticListener 170. Singleton : System.Diagnostics.DiagnosticSource 171. Singleton : System.Diagnostics.DistributedContextPropagator 172. Transient : BackendAPI.Model.ApplicationDbContext 173. Transient : BackendAPI.WebApi.Controllers.AesController 174. Transient : BackendAPI.WebApi.Controllers.ContainerController 175. Transient : BackendAPI.WebApi.Controllers.DatacenterController 176. Transient : BackendAPI.WebApi.Controllers.DbMasternodeController 177. Transient : BackendAPI.WebApi.Controllers.DockerController 178. Transient : BackendAPI.WebApi.Controllers.KvmDeployVmController 179. Transient : BackendAPI.WebApi.Controllers.KvmDiskOperation 180. Transient : BackendAPI.WebApi.Controllers.KvmInfoController 181. Transient : BackendAPI.WebApi.Controllers.KvmOperationController 182. Transient : BackendAPI.WebApi.Controllers.KvmVmController 183. Transient : BackendAPI.WebApi.Controllers.NotificationController 184. Transient : BackendAPI.WebApi.Controllers.RegistryController 185. Transient : BackendAPI.WebApi.Controllers.UsersController 186. Transient : BackendAPI.WebApi.Controllers.VmImageController 187. Transient : BackendAPI.WebApi.Controllers.VmMasternodeController 188. Transient : BackendAPI.WebApi.Controllers.VmOperationController 189. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator 190. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationHandler 191. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory 192. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider 193. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationMiddlewareResultHandler 194. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider 195. Transient : Microsoft.AspNetCore.Authorization.IAuthorizationService 196. Transient : Microsoft.AspNetCore.Authorization.Policy.IPolicyEvaluator 197. Transient : Microsoft.AspNetCore.Cors.Infrastructure.ICorsPolicyProvider 198. Transient : Microsoft.AspNetCore.Cors.Infrastructure.ICorsService 199. Transient : Microsoft.AspNetCore.Hosting.IStartupFilter 200. Transient : Microsoft.AspNetCore.Hosting.IStartupFilter 201. Transient : Microsoft.AspNetCore.Mvc.Abstractions.IActionDescriptorProvider 202. Transient : Microsoft.AspNetCore.Mvc.Abstractions.IActionInvokerProvider 203. Transient : Microsoft.AspNetCore.Mvc.ActionConstraints.IActionConstraintProvider 204. Transient : Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProvider 205. Transient : Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelProvider 206. Transient : Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelProvider 207. Transient : Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelProvider 208. Transient : Microsoft.AspNetCore.Mvc.ApplicationModels.IApplicationModelProvider 209. Transient : Microsoft.AspNetCore.Mvc.Controllers.IControllerActivator 210. Transient : Microsoft.AspNetCore.Mvc.Controllers.IControllerPropertyActivator 211. Transient : Microsoft.AspNetCore.Mvc.Cors.CorsAuthorizationFilter 212. Transient : Microsoft.AspNetCore.Mvc.Filters.DisableRequestSizeLimitFilter 213. Transient : Microsoft.AspNetCore.Mvc.Filters.RequestFormLimitsFilter 214. Transient : Microsoft.AspNetCore.Mvc.Filters.RequestSizeLimitFilter 215. Transient : Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ICompositeMetadataDetailsProvider 216. Transient : Microsoft.AspNetCore.Mvc.Routing.MvcAttributeRouteHandler 217. Transient : Microsoft.AspNetCore.Routing.IInlineConstraintResolver 218. Transient : Microsoft.AspNetCore.Routing.Matching.DataSourceDependentMatcher+Lifetime 219. Transient : Microsoft.AspNetCore.Routing.Matching.DfaMatcherBuilder 220. Transient : Microsoft.AspNetCore.Routing.Tree.TreeRouteBuilder 221. Transient : Microsoft.EntityFrameworkCore.DbContextOptions 222. Transient : Microsoft.EntityFrameworkCore.DbContextOptions`1[BackendAPI.Model.ApplicationDbContext] 223. Transient : Microsoft.Extensions.ObjectPool.ObjectPoolProvider 224. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Builder.ForwardedHeadersOptions] 225. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.ApiBehaviorOptions] 226. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 227. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 228. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Routing.RouteHandlerOptions] 229. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Routing.RouteOptions] 230. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Routing.RouteOptions] 231. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions] 232. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Swashbuckle.AspNetCore.SwaggerGen.SchemaGeneratorOptions] 233. Transient : Microsoft.Extensions.Options.IConfigureOptions`1[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions] 234. Transient : Microsoft.Extensions.Options.IOptionsFactory`1[TOptions] 235. Transient : Microsoft.Extensions.Options.IPostConfigureOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions] 236. Transient : Swashbuckle.AspNetCore.Swagger.ISwaggerProvider 237. Transient : Swashbuckle.AspNetCore.SwaggerGen.ISchemaGenerator 238. Transient : Swashbuckle.AspNetCore.SwaggerGen.ISerializerDataContractResolver 239. Transient : Swashbuckle.AspNetCore.SwaggerGen.SchemaGeneratorOptions 240. Transient : Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions
4. Database Access.
On current project I use a couple of data access methods. Firstly, I have configured EF environment and appDbContext.
But I don't define DbSet, because EF is extremely stupid framework, I simple reserve using EF opportunity to future. Instead EF I use a number of functions, based on raw SQL command CheckDBNull, RawSqlQuery, ExecRDR, RawSqlQueryAsync, ExecNonQueryAsync (with transaction)- amazing extension for working with data.
I use this functions in two ways - inside POCO classes and sometimes define memory buffer (POCO classes) dynamically. And sometimes directly expand POCO class with dataAcess functions.
Also I always use LINQ and Iterator/Yield functions. This is typical my code fragment of this project.
1: Namespace Kvm
2: Public Class KvmReport
3: Public Property KvmHostList As List(Of KvmHostReport)
4: Public Sub New()
5: KvmHostList = New List(Of KvmHostReport)
6: End Sub
7: Public Sub GetFullReport(KvmData As KvmDb)
8: Dim AdmKvmReport = Me
9: For I As Integer = 0 To KvmData.AdmKvmHostList.Count - 1
10: AdmKvmReport.KvmHostList.Add(New KvmHostReport With {
11: .i = KvmData.AdmKvmHostList(I).i,
12: .Access = New List(Of KvmHostAccessReport),
13: .Storage = New List(Of KvmStorageReport),
14: .Network = New List(Of KvmNetworkReport),
15: .VirtualStorage = New List(Of KvmPoolReport),
16: .VM = New List(Of VmReport),
17: .OsVersion = KvmData.AdmKvmHostList(I).OsVersion,
18: .ServerName = KvmData.AdmKvmHostList(I).ServerName,
19: .KvmVersion = KvmData.AdmKvmHostList(I).KvmVersion,
20: .UserName = KvmData.AdmKvmHostList(I).UserName,
21: .Password = KvmData.AdmKvmHostList(I).Password,
22: .CpuModel = KvmData.AdmKvmHostList(I).CpuModel,
23: .CpuCount = KvmData.AdmKvmHostList(I).CpuCount,
24: .CpuSocket = KvmData.AdmKvmHostList(I).CpuSocket,
25: .CorePerSocket = KvmData.AdmKvmHostList(I).CorePerSocket,
26: .ThreadPerSocket = KvmData.AdmKvmHostList(I).ThreadPerSocket,
27: .NumaCell = KvmData.AdmKvmHostList(I).NumaCell,
28: .MemorySize = KvmData.AdmKvmHostList(I).MemorySize,
29: .MainServerIP = KvmData.AdmKvmHostList(I).MainServerIP,
30: .MonthPrice = KvmData.AdmKvmHostList(I).MonthPrice,
31: .Location = KvmData.AdmKvmHostList(I).Location,
32: .Comment = KvmData.AdmKvmHostList(I).Comment,
33: .LastUpdate = KvmData.AdmKvmHostList(I).LastUpdate
34: })
35: 'Access node
36: AccessReport(KvmData).ToList.ForEach(Sub(X) AdmKvmReport.KvmHostList(I).Access.Add(X))
37: 'Pool node
38: PoolReport(KvmData).ToList.ForEach(Sub(X) AdmKvmReport.KvmHostList(I).VirtualStorage.Add(X))
39: 'Storage node
40: StorageReport(KvmData).ToList.ForEach(Sub(X) AdmKvmReport.KvmHostList(I).Storage.Add(X))
41: 'Network node
42: NetworkReport(KvmData).ToList.ForEach(Sub(X) AdmKvmReport.KvmHostList(I).Network.Add(X))
43: 'VM node
44: VmReport(KvmData).ToList.ForEach(Sub(X) AdmKvmReport.KvmHostList(I).VM.Add(X))
45: Next
46: End Sub
47:
48: Public Shared Iterator Function AccessReport(KvmData As KvmDb) As IEnumerable(Of KvmHostAccessReport)
49: For j As Integer = 0 To KvmData.AdmKvmHostAccessList.Count - 1
50: Dim KvmHostAccessReport1 = New KvmHostAccessReport With {
51: .User = New List(Of String),
52: .i = KvmData.AdmKvmHostAccessList(j).i,
53: .toKvmHost = KvmData.AdmKvmHostAccessList(j).toKvmHost,
54: .toUser = KvmData.AdmKvmHostAccessList(j).toUser,
55: .FromIp = KvmData.AdmKvmHostAccessList(j).FromIp,
56: .Comment = KvmData.AdmKvmHostAccessList(j).Comment,
57: .LastUpdate = KvmData.AdmKvmHostAccessList(j).LastUpdate
58: }
59: KvmHostAccessReport1.User = New List(Of String)
60: KvmData.AdmUserList.Where(Function(X) X.i = KvmData.AdmKvmHostAccessList(j).toUser).ToList.ForEach(Sub(Y) KvmHostAccessReport1.User.Add(Y.Name))
61: Yield KvmHostAccessReport1
62: Next
63: End Function
64: Public Shared Iterator Function PoolReport(KvmData As KvmDb) As IEnumerable(Of KvmPoolReport)
65: For j As Integer = 0 To KvmData.AdmKvmPoolList.Count - 1
66: Dim KvmPoolReport1 = New KvmPoolReport With {
67: .Volume = New List(Of AdmKvmVolume),
68: .Extent = New List(Of AdmKvmPoolExtent),
69: .i = KvmData.AdmKvmPoolList(j).i,
70: .toStorageDevice = KvmData.AdmKvmPoolList(j).toStorageDevice,
71: .Type = KvmData.AdmKvmPoolList(j).Type,
72: .Name = KvmData.AdmKvmPoolList(j).Name,
73: .State = KvmData.AdmKvmPoolList(j).State,
74: .Autostart = KvmData.AdmKvmPoolList(j).Autostart,
75: .UUID = KvmData.AdmKvmPoolList(j).UUID,
76: .Format = KvmData.AdmKvmPoolList(j).Format,
77: .Path = KvmData.AdmKvmPoolList(j).Path,
78: .Capacity = KvmData.AdmKvmPoolList(j).Capacity,
79: .Allocation = KvmData.AdmKvmPoolList(j).Allocation,
80: .Available = KvmData.AdmKvmPoolList(j).Available,
81: .Comment = KvmData.AdmKvmPoolList(j).Comment,
82: .LastUpdate = KvmData.AdmKvmPoolList(j).LastUpdate
83: }
84: Dim CurVulume = KvmData.AdmKvmVolumeList.Where(Function(X) X.toKvmPool = KvmPoolReport1.i).ToList
85: CurVulume.ForEach(Sub(X) KvmPoolReport1.Volume.Add(X))
86: Dim CurExtent = KvmData.AdmKvmPoolExtentList.Where(Function(X) X.toKvmPool = KvmPoolReport1.i).ToList
87: CurExtent.ForEach(Sub(X) KvmPoolReport1.Extent.Add(X))
88: Yield KvmPoolReport1
89: Next
90: End Function
91: Public Shared Iterator Function StorageReport(KvmData As KvmDb) As IEnumerable(Of KvmStorageReport)
92: For j As Integer = 0 To KvmData.AdmKvmStorageDeviceList.Count - 1
93: Dim KvmStorageReport1 = New KvmStorageReport With {
94: .i = KvmData.AdmKvmStorageDeviceList(j).i,
95: .LvmStorage = New List(Of KvmLVMReport),
96: .PartitionStorage = New List(Of KvmDevicePartitionReport),
97: .ToKvmHost = KvmData.AdmKvmStorageDeviceList(j).ToKvmHost,
98: .Name = KvmData.AdmKvmStorageDeviceList(j).Name,
99: .DiskType = KvmData.AdmKvmStorageDeviceList(j).DiskType,
100: .DiskId = KvmData.AdmKvmStorageDeviceList(j).DiskId,
101: .Model = KvmData.AdmKvmStorageDeviceList(j).Model,
102: .Capacity = KvmData.AdmKvmStorageDeviceList(j).Capacity,
103: .SectorSize = KvmData.AdmKvmStorageDeviceList(j).SectorSize,
104: .Bytes = KvmData.AdmKvmStorageDeviceList(j).Bytes,
105: .Sectors = KvmData.AdmKvmStorageDeviceList(j).Sectors,
106: .Comment = KvmData.AdmKvmStorageDeviceList(j).Comment,
107: .LastUpdate = KvmData.AdmKvmStorageDeviceList(j).LastUpdate
108: }
109: KvmData.AdmKvmLVMList.Where(Function(Y) Y.ToKvmStorage = KvmStorageReport1.i).ToList.
110: ForEach(Sub(X) KvmStorageReport1.LvmStorage.Add(
111: New KvmLVMReport With {
112: .LvmMember = New List(Of AdmKvmLVMmember),
113: .i = X.i,
114: .ToKvmStorage = X.ToKvmStorage,
115: .PartName = X.PartName,
116: .LvmName = X.LvmName,
117: .Fmt = X.Fmt,
118: .Size = X.Size,
119: .Free = X.Free,
120: .Comment = X.Comment,
121: .LastUpdate = X.LastUpdate
122: }))
123: Dim LvmPresent = KvmStorageReport1.LvmStorage.Where(Function(X) X IsNot Nothing).Select(Function(Y) New With {Y.LvmMember, Y.i}).ToList
124: For Each OneLvm In LvmPresent
125: For Each OneLvmMember In KvmData.AdmKvmLVMmemberList
126: If OneLvm.i = OneLvmMember.toKvmLVM Then
127: OneLvm.LvmMember.Add(New AdmKvmLVMmember With {
128: .i = OneLvmMember.i,
129: .toKvmLVM = OneLvmMember.toKvmLVM,
130: .DeviceName = OneLvmMember.DeviceName,
131: .UUID = OneLvmMember.UUID,
132: .Type = OneLvmMember.Type,
133: .BlockSize = OneLvmMember.BlockSize,
134: .Comment = OneLvmMember.Comment,
135: .LastUpdate = OneLvmMember.LastUpdate
136: })
137: End If
138: Next
139: Next
140: Dim Partitions = KvmData.AdmKvmDevicePartitionList.Where(Function(Y) Y.ToKvmStorageDevice IsNot Nothing)
141: Partitions.Where(Function(Y) Y.ToKvmStorageDevice = KvmStorageReport1.i).ToList.
142: ForEach(Sub(X) KvmStorageReport1.PartitionStorage.Add(New KvmDevicePartitionReport With {
143: .i = X.i,
144: .ToKvmStorageDevice = X.ToKvmStorageDevice,
145: .ToKvmLvmDevice = X.ToKvmLvmDevice,
146: .Name = X.Name,
147: .Type = X.Type,
148: .UUID = X.UUID,
149: .PartUUID = X.PartUUID,
150: .PtType = X.PtType,
151: .PartLabel = X.PartLabel,
152: .BlockSize = X.BlockSize,
153: .Size = X.Size,
154: .Start = X.Start,
155: .[End] = X.[End],
156: .Sectors = X.Sectors,
157: .Comment = X.Comment,
158: .LastUpdate = X.LastUpdate
159: }))
160: Yield KvmStorageReport1
161: Next
162: End Function
163: Public Shared Iterator Function NetworkReport(KvmData As KvmDb) As IEnumerable(Of KvmNetworkReport)
164: For j As Integer = 0 To KvmData.AdmKvmBridgeList.Count - 1
165: Dim KvmNetworkReport1 = New KvmNetworkReport With {
166: .NetworkInterface = New List(Of AdmKvmNetworkInterface),
167: .Bridge = New KvmBridgeReport,
168: .i = KvmData.AdmKvmBridgeList(j).i,
169: .toKvmNetwork = KvmData.AdmKvmBridgeList(j).toKvmNetwork,
170: .toKvmVlanSwitch = KvmData.AdmKvmBridgeList(j).toKvmVlanSwitch,
171: .Name = KvmData.AdmKvmBridgeList(j).Name,
172: .Id = KvmData.AdmKvmBridgeList(j).Id,
173: .STP = KvmData.AdmKvmBridgeList(j).STP,
174: .Ip = KvmData.AdmKvmBridgeList(j).Ip,
175: .Comment = KvmData.AdmKvmBridgeList(j).Comment,
176: .LastUpdate = KvmData.AdmKvmBridgeList(j).LastUpdate
177: }
178: KvmData.AdmKvmNetworkInterfaceList.Where(Function(X) X.toKvmHost = KvmNetworkReport1.i).ToList.
179: ForEach(Sub(X) KvmNetworkReport1.NetworkInterface.Add(New AdmKvmNetworkInterface With {
180: .i = X.i,
181: .toKvmHost = X.toKvmHost,
182: .Name = X.Name,
183: .Ip = X.Ip,
184: .Gateway = X.Gateway,
185: .Netmask = X.Netmask,
186: .Broadcast = X.Broadcast,
187: .Mac = X.Mac,
188: .Comment = X.Comment,
189: .LastUpdate = X.LastUpdate
190: }))
191: If KvmNetworkReport1.toKvmVlanSwitch IsNot Nothing Then
192: For k As Integer = 0 To KvmData.AdmKvmBridgeList.Count - 1
193: If KvmData.AdmKvmBridgeList(k).toKvmVlanSwitch IsNot Nothing Then
194: KvmNetworkReport1.Bridge = New KvmBridgeReport With {
195: .Bridge = KvmData.AdmKvmBridgeList.Where(Function(X) X.toKvmVlanSwitch IsNot Nothing).Where(Function(X) X.toKvmVlanSwitch = KvmNetworkReport1.toKvmVlanSwitch).FirstOrDefault,
196: .VlanSwitch = New List(Of AdmKvmVlanSwitch),
197: .Port = New List(Of KvmBridgePortReport)}
198: KvmData.AdmKvmBridgePortList.Where(Function(X) KvmNetworkReport1.Bridge.Bridge IsNot Nothing).Where(Function(X) X.toKvmBridge = KvmNetworkReport1.Bridge.Bridge.i).ToList.ForEach(Sub(X) KvmNetworkReport1.Bridge.Port.Add(New KvmBridgePortReport With {
199: .IP = KvmData.AdmVmIpList.Where(Function(Z) Z.toKvmBridgePort = X.i).Select(Function(Z) Z.Ip).ToList,
200: .i = X.i,
201: .toKvmBridge = X.toKvmBridge,
202: .BridgePort = X.BridgePort,
203: .Name = X.Name,
204: .BridgePortMac = X.BridgePortMac,
205: .Comment = X.Comment,
206: .LastUpdate = X.LastUpdate
207: }))
208: KvmNetworkReport1.Bridge.VlanSwitch = KvmData.AdmKvmVlanList.Where(Function(X) X.i = KvmNetworkReport1.Bridge.Bridge.toKvmVlanSwitch).ToList
209: End If
210: Next
211: End If
212: Yield KvmNetworkReport1
213: Next
214: End Function
215: Public Shared Iterator Function VmReport(KvmData As KvmDb) As IEnumerable(Of VmReport)
216: For j As Integer = 0 To KvmData.AdmVMList.Count - 1
217: Dim VmReport1 As New VmReport With {
218: .VmNetworkName = New List(Of AdmBridge),
219: .Ip = New List(Of String),
220: .StorageDeviceName = New List(Of AdmVmStorage),
221: .i = KvmData.AdmVMList(j).i,
222: .toKvmHost = KvmData.AdmVMList(j).toKvmHost,
223: .toUser = KvmData.AdmVMList(j).toUser,
224: .UUID = KvmData.AdmVMList(j).UUID,
225: .Id = KvmData.AdmVMList(j).Id,
226: .Name = KvmData.AdmVMList(j).Name,
227: .OsVersion = KvmData.AdmVMList(j).OsVersion,
228: .State = KvmData.AdmVMList(j).State,
229: .CpuSet = KvmData.AdmVMList(j).CpuSet,
230: .Vcpu = KvmData.AdmVMList(j).Vcpu,
231: .Memory = KvmData.AdmVMList(j).Memory,
232: .SpicePort = KvmData.AdmVMList(j).SpicePort,
233: .MacAdr = KvmData.AdmVMList(j).MacAdr,
234: .AdminLogin = KvmData.AdmVMList(j).AdminLogin,
235: .AdminPassword = KvmData.AdmVMList(j).AdminPassword,
236: .Comment = KvmData.AdmVMList(j).Comment,
237: .LastUpdate = KvmData.AdmVMList(j).LastUpdate
238: }
239: VmReport1.UserName = KvmData.AdmUserList.Where(Function(X) X.i = VmReport1.toUser).FirstOrDefault.Name
240: VmReport1.VmNetworkName = KvmData.AdmVmIpList.Where(Function(X) X.toVm = VmReport1.i).Select(Function(Z) New AdmBridge With {.BridgePort = Z.KvmBridgePort_BridgePort, .NetworkName = Z.KvmBridgePort_Name, .BridgeName = Z.Bridge_Name}).ToList
241: VmReport1.Ip = KvmData.AdmVmIpList.Where(Function(X) X.toVm = VmReport1.i).Select(Of String)(Function(X) X.Ip).ToList
242: For Each One In KvmData.AdmVmDiskList
243: If One.toVm = VmReport1.i Then
244: Dim VolumeS As List(Of AdmKvmVolume) = KvmData.AdmKvmVolumeList.Where(Function(X) X.i = One.toKvmVolume).ToList
245: For Each OneVol In VolumeS
246: VmReport1.StorageDeviceName.Add(New AdmVmStorage With {.Device = OneVol.Name, .Capacity = OneVol.Capacity})
247: Next
248: End If
249: Next
250: Yield VmReport1
251: Next
252: End Function
253: End Class
254: End Namespace
This way allow me to using each component of project in many places of project, for example.
- Asynchronous MultiThreaded SSH engine for Web (Net Core 6, Linux) - Part 5,6 (Crypt/Encrypt JWT Auth header, Middleware, User scoped service, custom AU attribute, custom HttpClient and Typed SignalRHub with saving ConnectionID to Singleton service).
- Multithreading learning conspectus 2.
|