2019-07-10 18:29:01 +02:00
/ *
* BSD 3 - Clause License
*
* Copyright ( c ) 2019 , NTT Ltd .
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* Redistributions of source code must retain the above copyright notice , this
* list of conditions and the following disclaimer .
*
* Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
*
* Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
2019-06-30 13:31:05 +02:00
import Monitor from "./monitor" ;
export default class MonitorVisibility extends Monitor {
2019-07-06 22:40:39 +02:00
constructor ( name , channel , params , env ) {
super ( name , channel , params , env ) ;
2019-10-05 16:32:37 +02:00
this . thresholdMinPeers = ( params && params . thresholdMinPeers != null ) ? params . thresholdMinPeers : 10 ;
if ( params . threshold ) {
this . logger . log ( {
level : 'error' ,
message : "The parameter threshold has been replaced by thresholdMinPeers and it will be soon deprecated."
} ) ;
this . thresholdMinPeers = params . threshold ;
}
2019-07-10 18:06:30 +02:00
this . updateMonitoredPrefixes ( ) ;
2019-06-30 13:31:05 +02:00
} ;
updateMonitoredPrefixes = ( ) => {
2019-07-10 18:06:30 +02:00
this . monitored = this . input . getMonitoredPrefixes ( ) ;
this . monitoredSimpleArray = this . monitored . map ( item => item . prefix ) ;
2019-06-30 13:31:05 +02:00
} ;
filter = ( message ) => {
2019-07-10 18:06:30 +02:00
// Based on exact match only
return message . type === 'withdrawal'
&& this . monitoredSimpleArray . includes ( message . prefix ) ;
2019-06-30 13:31:05 +02:00
} ;
squashAlerts = ( alerts ) => {
2019-07-06 22:40:39 +02:00
const peers = [ ... new Set ( alerts . map ( alert => alert . matchedMessage . peer ) ) ] . length ;
2019-07-09 02:46:08 +02:00
2019-10-05 16:32:37 +02:00
if ( peers >= this . thresholdMinPeers ) {
2019-07-09 02:46:08 +02:00
return ( peers === 1 ) ?
2019-07-09 04:29:36 +02:00
` The prefix ${ alerts [ 0 ] . matchedMessage . prefix } ( ${ alerts [ 0 ] . matchedRule . description } ) it's no longer visible (withdrawn) from the peer ${ alerts [ 0 ] . matchedMessage . peer } . ` :
` The prefix ${ alerts [ 0 ] . matchedMessage . prefix } ( ${ alerts [ 0 ] . matchedRule . description } ) has been withdrawn. It is no longer visible from ${ peers } peers. ` ;
2019-07-09 02:46:08 +02:00
} else {
return false ;
}
2019-06-30 13:31:05 +02:00
} ;
2019-07-06 22:40:39 +02:00
monitor = ( message ) =>
new Promise ( ( resolve , reject ) => {
const messagePrefix = message . prefix ;
2019-09-26 02:13:43 +02:00
const matchedRule = this . getMoreSpecificMatch ( messagePrefix ) ;
2019-07-06 22:40:39 +02:00
2019-08-18 23:19:33 +02:00
if ( matchedRule && matchedRule . prefix === messagePrefix ) {
2019-07-06 22:40:39 +02:00
2019-08-18 23:19:33 +02:00
let key = matchedRule . prefix ;
2019-07-09 02:46:08 +02:00
this . publishAlert ( key ,
2019-08-18 23:19:33 +02:00
` The prefix ${ matchedRule . prefix } has been withdrawn. ` ,
2019-08-30 12:58:29 +02:00
matchedRule . asn . getId ( ) ,
2019-08-18 23:19:33 +02:00
matchedRule ,
2019-07-06 22:40:39 +02:00
message ,
{ } ) ;
}
resolve ( true ) ;
2019-06-30 13:31:05 +02:00
} ) ;
}