diff --git a/explorer/public/assets/js/main.js b/explorer/public/assets/js/main.js index bde467526f..dd1b0bdef3 100644 --- a/explorer/public/assets/js/main.js +++ b/explorer/public/assets/js/main.js @@ -1,7 +1,4 @@ function websocketUrl() { - return "wss://testnet-explorer.nymtech.net"; - - if ($(location).attr("href").startsWith("http://localhost")) { return "ws://localhost:1648"; } else if ($(location).attr("href").startsWith("http://qa-explorer")) { @@ -11,6 +8,22 @@ function websocketUrl() { } } +function parseVersion(str) { + if (typeof (str) != 'string') { return false; } + + var arr = str.split('.'); + + // parse int or default to 0 + var maj = parseInt(arr[0]) || 0; + var min = parseInt(arr[1]) || 0; + var rest = parseInt(arr[2]) || 0; + return { + major: maj, + minor: min, + patch: rest + } +} + function getTopology() { console.log("Getting topology..."); var topologyUrl = "/downloads/topology.json"; @@ -41,6 +54,11 @@ function clearStatus(element) { } function setNodeStatus(dotWrapper, reportData) { + // don't do anything to pre 0.9.2 nodes which have status 'active' + if (dotWrapper.children[0].hasAttribute("active")) { + return + } + let statusIndicator = dotWrapper.children[0]; clearStatus(statusIndicator) @@ -111,9 +129,9 @@ function makeStatusDot(nodePubKey) { return dotWrapper; } -function tempDisabledStatus(nodePubKey) { - let statusText = "Temporarily disabled..." - +function outdatedStatus(nodePubKey) { + let statusText = "Out of date" + let dotWrapper = document.getElementById(`dotWrapper${nodePubKey}`); dotWrapper.classList.remove('statusDot') let statusIndicator = dotWrapper.children[0]; @@ -185,11 +203,14 @@ function createMixnodeRows(mixNodes) { if (purifiedRep.length === 0) { purifiedRep = 0 } + + let purifiedVersion = DOMPurify.sanitize(node.version) + var $tr = $('').append( $(' '), $('').html(makeStatusDot(node.identityKey)), $('').text(purifiedRep), - $('').text(DOMPurify.sanitize(node.version)), + $('').text(purifiedVersion), $('').text(DOMPurify.sanitize(node.identityKey)), $('').text(DOMPurify.sanitize(node.sphinxKey)), $('').text(DOMPurify.sanitize(node.location)), @@ -199,7 +220,13 @@ function createMixnodeRows(mixNodes) { $('').text("0") ).appendTo('#mixnodes-list'); - tempDisabledStatus(node.identityKey); + let version = parseVersion(purifiedVersion) + + if (version.major >= 1 || version.minor >= 10 || (version.minor == 9 && version.patch >= 2)) { + makeStatusDot(node.identityKey); + } else { + outdatedStatus(node.identityKey); + } }) } @@ -299,7 +326,7 @@ function updateTimeStampStorage(msg) { document.addEventListener("DOMContentLoaded", function () { // update every minute - // setInterval(updateNodesStatus, 60000); + setInterval(updateNodesStatus, 60000); getTopology(); connectWebSocket(); }); diff --git a/network-monitor/src/main.rs b/network-monitor/src/main.rs index 8c83cddd87..3e9342651b 100644 --- a/network-monitor/src/main.rs +++ b/network-monitor/src/main.rs @@ -50,6 +50,8 @@ const GATEWAY_SENDING_RATE_ARG: &str = "gateway-rate"; const DEFAULT_VALIDATOR: &str = "http://testnet-validator1.nymtech.net:8081"; const DEFAULT_GATEWAY_SENDING_RATE: usize = 500; +pub(crate) const PENALISE_OUTDATED: bool = false; + pub(crate) const TIME_CHUNK_SIZE: Duration = Duration::from_millis(50); fn parse_args<'a>() -> ArgMatches<'a> { diff --git a/network-monitor/src/notifications/test_run.rs b/network-monitor/src/notifications/test_run.rs index c6dd1c717d..207eb648ba 100644 --- a/network-monitor/src/notifications/test_run.rs +++ b/network-monitor/src/notifications/test_run.rs @@ -14,6 +14,7 @@ use crate::run_info::RunInfo; use crate::test_packet::TestPacket; +use crate::PENALISE_OUTDATED; use log::*; use std::collections::{HashMap, HashSet}; use std::mem; @@ -252,10 +253,16 @@ impl TestRun { self.test_report.print(self.print_detailed_report); } - let mut mix_status = Vec::with_capacity( - 2 * (self.test_report.malformed.len() + self.test_report.outdated.len()) - + self.expected_run_packets.len(), - ); + let mut mix_status = if PENALISE_OUTDATED { + Vec::with_capacity( + 2 * (self.test_report.malformed.len() + self.test_report.outdated.len()) + + self.expected_run_packets.len(), + ) + } else { + Vec::with_capacity( + 2 * (self.test_report.malformed.len()) + self.expected_run_packets.len(), + ) + }; // firstly we know all malformed and outdated nodes are definitely down - we haven't sent // any test packets for those @@ -263,9 +270,13 @@ impl TestRun { let mut down_status = self.down_status(malformed.clone()); mix_status.append(&mut down_status); } - for outdated in self.test_report.outdated.iter() { - let mut down_status = self.down_status(outdated.0.clone()); - mix_status.append(&mut down_status); + + // but don't inform validator about outdated nodes for now! + if PENALISE_OUTDATED { + for outdated in self.test_report.outdated.iter() { + let mut down_status = self.down_status(outdated.0.clone()); + mix_status.append(&mut down_status); + } } let mut undelivered = mem::replace(&mut self.expected_run_packets, HashSet::new()); diff --git a/network-monitor/src/packet_sender.rs b/network-monitor/src/packet_sender.rs index e533dedbd4..0f2c749287 100644 --- a/network-monitor/src/packet_sender.rs +++ b/network-monitor/src/packet_sender.rs @@ -62,6 +62,31 @@ impl PacketSender { } } + fn check_version_compatibility(&self, mix_version: &str) -> bool { + let semver_compatibility = version_checker::is_minor_version_compatible( + mix_version, + self.tested_network.system_version(), + ); + + if semver_compatibility { + // this can't fail as we know it's semver compatible + let version = version_checker::parse_version(mix_version).unwrap(); + if version.major >= 1 { + return true; + } + if version.major == 0 && version.minor >= 10 { + return true; + } + if version.minor >= 9 && version.patch >= 2 { + true + } else { + false + } + } else { + false + } + } + fn make_test_mix(&self, mix: RegisteredMix) -> TestMix { // the reason for that conversion is that I want to operate on concrete types // rather than on "String" everywhere and also this way we remove obviously wrong @@ -74,10 +99,7 @@ impl PacketSender { TestMix::MalformedMix(mix_id) } Ok(mix) => { - if version_checker::is_minor_version_compatible( - &mix.version, - self.tested_network.system_version(), - ) { + if self.check_version_compatibility(&mix.version) { let v4_test_packet = TestPacket::new(mix.identity_key, IpVersion::V4, self.nonce); let v6_test_packet =