<SupportedOSPlatform("Windows")>
Public Shared Async Function ConfigureApplicationAsync(Args As String()) As Task(Of Result)
Dim oCityCodeResult As Result(Of City)
Dim oCsrResult As Result(Of (Challenge As IChallengeContext, Order As IOrderContext, DnsText As String))
Dim oDnsRecord As (Content As String, Type As DnsRecordType, Name As String)
Dim oTlsResult As Result(Of X509Certificate2)
Dim oTcpResult As Result(Of Net.IPAddress)
Dim oDnsResult As Result
Dim oCrtResult As Result
Dim sCityCode As String
Dim lIsAdmin As Boolean
Dim oResult As Result
Dim oCity As City
With New WindowsPrincipal(WindowsIdentity.GetCurrent)
lIsAdmin = .IsInRole(WindowsBuiltInRole.Administrator)
End With
Try
If Args.Any(Function(Arg) Arg.ToLower = "install") Then
If lIsAdmin Then
oCityCodeResult = Await CityCode.RegisterAsync
If oCityCodeResult.IsSuccess Then
oTcpResult = Await Tcp.GetPrivateAddressAsync("Getting the local private IP address...")
If oTcpResult.IsSuccess Then
oCity = oCityCodeResult.Value
sCityCode = oCity.Code.ToLower
oDnsRecord.Content = oTcpResult.Value.ToString
oDnsRecord.Type = DnsRecordType.A
oDnsRecord.Name = sCityCode
oDnsResult = Await Dns.RegisterAsync(oDnsRecord, $"Registering {oCity.Name} in the public DNS...")
If oDnsResult.IsSuccess Then
oCsrResult = Await Csr.SubmitAsync(sCityCode, "Submitting a Certificate Signing Request...")
If oCsrResult.IsSuccess Then
oDnsRecord.Content = oCsrResult.Value.DnsText
oDnsRecord.Type = DnsRecordType.Txt
oDnsRecord.Name = $"_acme-challenge.{sCityCode}"
oDnsResult = Await Dns.RegisterAsync(oDnsRecord, $"Updating the DNS with the request's validation token...")
If oDnsResult.IsSuccess Then
oCsrResult = Await Csr.ValidateAsync(oCsrResult.Value.Challenge, oCsrResult.Value.Order, "Validating the request...")
If oCsrResult.IsSuccess Then
oTlsResult = Await Tls.GenerateAsync(oCsrResult.Value.Order, sCityCode, "Generating a TLS certificate...")
If oTlsResult.IsSuccess Then
oDnsResult = Await Dns.CleanupAsync(oDnsRecord, "Cleaning up the DNS after a successful validation...")
If oDnsResult.IsSuccess Then
oCrtResult = Await Crt.ImportAsync(oTlsResult.Value, "Importing the certificate locally...")
If oCrtResult.IsSuccess Then
oResult = Result.Ok
Else
oResult = Result.Fail(oCrtResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oDnsResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oTlsResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oCsrResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oDnsResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oCsrResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oDnsResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oTcpResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail(oCityCodeResult.Errors.Select(Function(Err) Err.Message))
End If
Else
oResult = Result.Fail("The service installation must be run as an administrator.")
End If
Else
oResult = Result.Ok
End If
Catch ex As Exception
oResult = Result.Fail(ex.ToString)
End Try
Return oResult
End Function