Exemple #1
0
            public async Task <MonitorDto> Handle(Command request, CancellationToken cancellationToken)
            {
                var certificate = _certificateParser.GetCertificate(request.DomainName, request.Port);

                var user = await _context.Users
                           .SingleOrDefaultAsync(x => x.UserName.Equals(_userAccessor.GetCurrentUsername()));

                var monitor = new Monitor
                {
                    User               = user,
                    DisplayName        = request.DisplayName,
                    DomainName         = request.DomainName,
                    Port               = request.Port,
                    CreationDate       = DateTime.Now,
                    Certificate        = certificate,
                    AutoRenewalEnabled = false,
                    LastCheckDate      = DateTime.Now
                };

                _context.Monitors.Add(monitor);

                var success = await _context.SaveChangesAsync() > 0;

                if (success)
                {
                    return(_mapper.Map <Monitor, MonitorDto>(monitor));
                }
                throw new RestException(HttpStatusCode.InternalServerError, ErrorType.SavingChangesError);
            }
        public async Task Check(Guid monitorId)
        {
            try
            {
                var monitor = await _context.Monitors.Include(m => m.Certificate)
                              .FirstOrDefaultAsync(m => m.Id == monitorId);

                if (monitor == null)
                {
                    return; // Probably, the monitor had been deleted before we started its check
                }
                var user = await _context.Users.FindAsync(monitor.UserId);

                monitor.LastCheckDate = DateTime.Now;

                var certificate = _certificateParser.GetCertificate(monitor.DomainName, monitor.Port);

                if (!certificate.SerialNumber.Equals(monitor.Certificate.SerialNumber))
                {
                    monitor.Certificate = certificate;

                    _logger.LogInformation($"Sending unexpected certificate change email for {monitor.Id}");
                    if (user.NotifyAboutCertificateChange)
                    {
                        _emailSender.Send(user.NotificationsEmail, "Unexpected certificate change",
                                          BodyBuilder.BuildEmailBody(EmailType.CertificateChanged, monitor, user));
                    }
                }

                if (Math.Abs((DateTime.Now - certificate.ValidTo).TotalDays) <= user.ExpiryNotificationThresholdDays)
                {
                    if (!user.NotifyAboutExpiryIfRenewalConfigured && monitor.RenewalScript != null)
                    {
                        return;
                    }

                    _logger.LogInformation($"Sending certificate expiry email for {monitor.Id}");
                    _emailSender.Send(user.NotificationsEmail, "Certificate expiry",
                                      BodyBuilder.BuildEmailBody(EmailType.CertificateIsAboutToExpire, monitor, user));
                }

                if (monitor.RenewalScript != null && !monitor.IsInRenewalQueue &&
                    Math.Abs((DateTime.Now - certificate.ValidTo).TotalDays) <= user.RenewalThresholdDays
                    )
                {
                    monitor.IsInRenewalQueue = true;
                    var monitorRenewer = new MonitorRenewer(_context, _jobClient, this, _monitorRenewerLogger);
                    monitorRenewer.EnqueueRenewal(monitor);
                }

                var success = await _context.SaveChangesAsync() > 0;

                if (!success)
                {
                    throw new Exception("Error saving changes");
                }
            }
            catch (Exception e)
            {
                _logger.LogError("Error checking a monitor.\n" + e.Message);
            }
        }