public CertificateCheckTask(CertificateValidityCheck certificateCheck, TimeSpan interval, CertificateCheckReporter reporter, HttpClientWrapper httpClientWrapper, ILogger diagnosticLog)
 {
     if (certificateCheck == null)
     {
         throw new ArgumentNullException(nameof(certificateCheck));
     }
     if (reporter == null)
     {
         throw new ArgumentNullException(nameof(reporter));
     }
     _httpClientWrapper    = httpClientWrapper;
     _certificateCheckTask =
         Task.Run(() => Run(certificateCheck, interval, reporter, _httpClientWrapper, diagnosticLog, _cancel.Token), _cancel.Token);
 }
示例#2
0
        public void Start(TextWriter inputWriter)
        {
            _httpClientWrapper = new HttpClientWrapper();
            var reporter   = new CertificateCheckReporter(inputWriter);
            var targetUrls = TargetUrl.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var targetUrl in targetUrls)
            {
                var healthCheck = new CertificateValidityCheck(
                    App.Title,
                    targetUrl,
                    ValidityDays);

                _certificateCheckTasks.Add(new CertificateCheckTask(
                                               healthCheck,
                                               TimeSpan.FromSeconds(IntervalSeconds),
                                               reporter,
                                               _httpClientWrapper,
                                               Log));
            }
        }
示例#3
0
        public async Task <CertificateCheckResult> CheckNow(HttpClientWrapper httpClientWrapper, CancellationToken cancel, ILogger diagnosticLog)
        {
            string   outcome;
            var      utcTimestamp = DateTime.UtcNow;
            DateTime?expiresAtUtc = null;

            try
            {
                expiresAtUtc = await httpClientWrapper.CheckEndpoint(new Uri(_targetUrl), cancel).ConfigureAwait(false);

                bool valid = expiresAtUtc.HasValue && expiresAtUtc.Value > DateTime.UtcNow.AddDays(_validityDays);
                outcome = valid ? OutcomeSucceeded : OutcomeFailed;
            }
            catch (Exception exception)
            {
                diagnosticLog.Error(exception, "Something went wrong while checking certificate");
                outcome = OutcomeFailed;
            }

            var level = outcome == OutcomeFailed ? "Error" :
                        null;

            return(new CertificateCheckResult(utcTimestamp, _title, _targetUrl, outcome, level, expiresAtUtc));
        }
        private static async Task Run(CertificateValidityCheck certificateCheck, TimeSpan interval, CertificateCheckReporter reporter, HttpClientWrapper httpClientWrapper, ILogger diagnosticLog, CancellationToken cancel)
        {
            try
            {
                while (!cancel.IsCancellationRequested)
                {
                    var sw     = Stopwatch.StartNew();
                    var result = await certificateCheck.CheckNow(httpClientWrapper, cancel, diagnosticLog).ConfigureAwait(false);

                    reporter.Report(result);
                    sw.Stop();
                    var total = sw.Elapsed.TotalMilliseconds;

                    if (total < interval.TotalMilliseconds)
                    {
                        var delay = (int)(interval.TotalMilliseconds - total);
                        await Task.Delay(delay, cancel).ConfigureAwait(false);
                    }
                }
            }
            catch (OperationCanceledException)
            {
                // Unloading
            }
            catch (Exception ex)
            {
                diagnosticLog.Fatal(ex, "The health check task threw an unhandled exception");
            }
        }