|
|
|
@ -107,6 +107,21 @@ Matrix.getColumnHeaders = function() {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
var toBroaderHostname = function(hostname) {
|
|
|
|
|
var pos = hostname.indexOf('.');
|
|
|
|
|
if ( pos === -1 ) {
|
|
|
|
|
if ( hostname === '*' ) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
return '*';
|
|
|
|
|
}
|
|
|
|
|
return hostname.slice(pos + 1);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Matrix.toBroaderHostname = toBroaderHostname;
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
Matrix.prototype.reset = function() {
|
|
|
|
|
this.switchedOn = {};
|
|
|
|
|
this.rules = {};
|
|
|
|
@ -115,25 +130,48 @@ Matrix.prototype.reset = function() {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// Copy another matrix to self
|
|
|
|
|
// Copy another matrix to self. Do this incrementally to minimize impact on
|
|
|
|
|
// a live matrix.
|
|
|
|
|
|
|
|
|
|
Matrix.prototype.assign = function(other) {
|
|
|
|
|
this.reset();
|
|
|
|
|
var k;
|
|
|
|
|
// Remove rules not in other
|
|
|
|
|
for ( k in this.rules ) {
|
|
|
|
|
if ( this.rules.hasOwnProperty(k) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( other.rules.hasOwnProperty(k) === false ) {
|
|
|
|
|
delete this.rules[k];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Remove switches not in other
|
|
|
|
|
for ( k in this.switchedOn ) {
|
|
|
|
|
if ( this.switchedOn.hasOwnProperty(k) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( other.switchedOn.hasOwnProperty(k) === false ) {
|
|
|
|
|
delete this.switchedOn[k];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Add/change rules in other
|
|
|
|
|
for ( k in other.rules ) {
|
|
|
|
|
if ( other.rules.hasOwnProperty(k) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
this.rules[k] = other.rules[k];
|
|
|
|
|
}
|
|
|
|
|
// Add/change switches in other
|
|
|
|
|
for ( k in other.switchedOn ) {
|
|
|
|
|
if ( other.switchedOn.hasOwnProperty(k) === false ) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
this.switchedOn[k] = other.switchedOn[k];
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// https://www.youtube.com/watch?v=e9RS4biqyAc
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
// If value is undefined, the switch is removed
|
|
|
|
@ -251,16 +289,10 @@ Matrix.prototype.evaluateCellZ = function(srcHostname, desHostname, type) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// TODO: external rules? (for presets)
|
|
|
|
|
pos = s.indexOf('.');
|
|
|
|
|
if ( pos !== -1 ) {
|
|
|
|
|
s = s.slice(pos + 1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( s !== '*' ) {
|
|
|
|
|
s = '*';
|
|
|
|
|
continue;
|
|
|
|
|
s = toBroaderHostname(s);
|
|
|
|
|
if ( s === '' ) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// Preset blacklisted hostnames are blacklisted in global scope
|
|
|
|
|
if ( type === '*' && µm.ubiquitousBlacklist.test(desHostname) ) {
|
|
|
|
@ -345,16 +377,10 @@ Matrix.prototype.extractZRules = function(srcHostname, desHostname, out) {
|
|
|
|
|
if ( bitmap !== undefined ) {
|
|
|
|
|
out[rule] = bitmap;
|
|
|
|
|
}
|
|
|
|
|
pos = s.indexOf('.');
|
|
|
|
|
if ( pos !== -1 ) {
|
|
|
|
|
s = s.slice(pos + 1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( s !== '*' ) {
|
|
|
|
|
s = '*';
|
|
|
|
|
continue;
|
|
|
|
|
s = toBroaderHostname(s);
|
|
|
|
|
if ( s === '' ) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -394,16 +420,10 @@ Matrix.prototype.evaluateSwitchZ = function(srcHostname) {
|
|
|
|
|
if ( b !== undefined ) {
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
pos = s.indexOf('.');
|
|
|
|
|
if ( pos !== -1 ) {
|
|
|
|
|
s = s.slice(pos + 1);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ( s !== '*' ) {
|
|
|
|
|
s = '*';
|
|
|
|
|
continue;
|
|
|
|
|
s = toBroaderHostname(s);
|
|
|
|
|
if ( s === '' ) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
@ -462,7 +482,8 @@ Matrix.prototype.toString = function() {
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
Matrix.prototype.fromString = function(text) {
|
|
|
|
|
Matrix.prototype.fromString = function(text, append) {
|
|
|
|
|
var matrix = append ? this : new Matrix();
|
|
|
|
|
var textEnd = text.length;
|
|
|
|
|
var lineBeg = 0, lineEnd;
|
|
|
|
|
var line, pos;
|
|
|
|
@ -534,7 +555,7 @@ Matrix.prototype.fromString = function(text) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.setSwitch(srcHostname, nameToSwitchMap[fieldVal]);
|
|
|
|
|
matrix.setSwitch(srcHostname, nameToSwitchMap[fieldVal]);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -588,7 +609,11 @@ Matrix.prototype.fromString = function(text) {
|
|
|
|
|
state = 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.setCell(srcHostname, desHostname, type, state);
|
|
|
|
|
matrix.setCell(srcHostname, desHostname, type, state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( !append ) {
|
|
|
|
|
this.assign(matrix);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -644,15 +669,10 @@ Matrix.prototype.diff = function(other, srcHostname, desHostnames) {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( srcHostname === '*' ) {
|
|
|
|
|
srcHostname = toBroaderHostname(srcHostname);
|
|
|
|
|
if ( srcHostname === '' ) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
pos = srcHostname.indexOf('.');
|
|
|
|
|
if ( pos !== -1 ) {
|
|
|
|
|
srcHostname = srcHostname.slice(pos + 1);
|
|
|
|
|
} else {
|
|
|
|
|
srcHostname = '*';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|