@ -168,7 +168,14 @@ class Monitor extends BeanModel { 
			
		
	
		
			
				
					                    let  certInfoStartTime  =  dayjs ( ) . valueOf ( ) ;  
			
		
	
		
			
				
					                    if  ( this . getUrl ( ) ? . protocol  ===  "https:" )  {  
			
		
	
		
			
				
					                        try  {  
			
		
	
		
			
				
					                            tlsInfo  =  await  this . updateTlsInfo ( checkCertificate ( res ) ) ;  
			
		
	
		
			
				
					                            let  tlsInfoObject  =  checkCertificate ( res ) ;  
			
		
	
		
			
				
					                            tlsInfo  =  await  this . updateTlsInfo ( tlsInfoObject ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                            if  ( ! this . getIgnoreTls ( ) )  {  
			
		
	
		
			
				
					                                debug ( "call sendCertNotification" ) ;  
			
		
	
		
			
				
					                                await  this . sendCertNotification ( tlsInfoObject ) ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                        }  catch  ( e )  {  
			
		
	
		
			
				
					                            if  ( e . message  !==  "No TLS certificate in response" )  {  
			
		
	
		
			
				
					                                console . error ( e . message ) ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -595,9 +602,7 @@ class Monitor extends BeanModel { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    static  async  sendNotification ( isFirstBeat ,  monitor ,  bean )  {  
			
		
	
		
			
				
					        if  ( ! isFirstBeat  ||  bean . status  ===  DOWN )  {  
			
		
	
		
			
				
					            let  notificationList  =  await  R . getAll ( "SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id " ,  [  
			
		
	
		
			
				
					                monitor . id ,  
			
		
	
		
			
				
					            ] ) ;  
			
		
	
		
			
				
					            const  notificationList  =  await  Monitor . getNotificationList ( monitor ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            let  text ;  
			
		
	
		
			
				
					            if  ( bean . status  ===  UP )  {  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -619,6 +624,70 @@ class Monitor extends BeanModel { 
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    static  async  getNotificationList ( monitor )  {  
			
		
	
		
			
				
					        let  notificationList  =  await  R . getAll ( "SELECT notification.* FROM notification, monitor_notification WHERE monitor_id = ? AND monitor_notification.notification_id = notification.id " ,  [  
			
		
	
		
			
				
					            monitor . id ,  
			
		
	
		
			
				
					        ] ) ;  
			
		
	
		
			
				
					        return  notificationList ;  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    async  sendCertNotification ( tlsInfoObject )  {  
			
		
	
		
			
				
					        if  ( tlsInfoObject  &&  tlsInfoObject . certInfo  &&  tlsInfoObject . certInfo . daysRemaining )  {  
			
		
	
		
			
				
					            const  notificationList  =  await  Monitor . getNotificationList ( this ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            debug ( "call sendCertNotificationByTargetDays" ) ;  
			
		
	
		
			
				
					            await  this . sendCertNotificationByTargetDays ( tlsInfoObject . certInfo . daysRemaining ,  21 ,  notificationList ) ;  
			
		
	
		
			
				
					            await  this . sendCertNotificationByTargetDays ( tlsInfoObject . certInfo . daysRemaining ,  14 ,  notificationList ) ;  
			
		
	
		
			
				
					            await  this . sendCertNotificationByTargetDays ( tlsInfoObject . certInfo . daysRemaining ,  7 ,  notificationList ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    async  sendCertNotificationByTargetDays ( daysRemaining ,  targetDays ,  notificationList )  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( daysRemaining  >  targetDays )  {  
			
		
	
		
			
				
					            debug ( ` No need to send cert notification.  ${ daysRemaining }  >  ${ targetDays } ` ) ;  
			
		
	
		
			
				
					            return ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( notificationList . length  >  0 )  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            let  row  =  await  R . getRow ( "SELECT * FROM notification_sent_history WHERE type = ? AND monitor_id = ? AND days = ?" ,  [  
			
		
	
		
			
				
					                "certificate" ,  
			
		
	
		
			
				
					                this . id ,  
			
		
	
		
			
				
					                targetDays ,  
			
		
	
		
			
				
					            ] ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            // Sent already, no need to send again
  
			
		
	
		
			
				
					            if  ( row )  {  
			
		
	
		
			
				
					                debug ( "Sent already, no need to send again" ) ;  
			
		
	
		
			
				
					                return ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            let  sent  =  false ;  
			
		
	
		
			
				
					            debug ( "Send certificate notification" ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            for  ( let  notification  of  notificationList )  {  
			
		
	
		
			
				
					                try  {  
			
		
	
		
			
				
					                    debug ( "Sending to "  +  notification . name ) ;  
			
		
	
		
			
				
					                    await  Notification . send ( JSON . parse ( notification . config ) ,  ` The certificate of  ${ this . url }  will be expired in  ${ daysRemaining }  days ` ) ;  
			
		
	
		
			
				
					                    sent  =  true ;  
			
		
	
		
			
				
					                }  catch  ( e )  {  
			
		
	
		
			
				
					                    console . error ( "Cannot send cert notification to "  +  notification . name ) ;  
			
		
	
		
			
				
					                    console . error ( e ) ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( sent )  {  
			
		
	
		
			
				
					                await  R . exec ( "INSERT INTO notification_sent_history (type, monitor_id, days) VALUES(?, ?, ?)" ,  [  
			
		
	
		
			
				
					                    "certificate" ,  
			
		
	
		
			
				
					                    this . id ,  
			
		
	
		
			
				
					                    targetDays ,  
			
		
	
		
			
				
					                ] ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  else  {  
			
		
	
		
			
				
					            debug ( "No notification, no need to send cert notification" ) ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					module . exports  =  Monitor ;