Advertisement
AtomicOs

satori_feed.js

Apr 4th, 2021
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var endpoint = "wss://open-data.api.satori.com";
  2. var appkey = "Fd1A23752B4eCbD8Ec8E131171CdD0a8"; // check weekly for new public api key
  3. var channelName = "live-cyber-attack-threat-map";
  4.  
  5. var client = new RTM(endpoint, appkey);
  6. var satoriData = [];
  7.  
  8. function showText(text) {
  9.   var view = document.getElementById("output");
  10.   var record = "<div>" + text + "</div>";
  11.   view.innerHTML = record + view.innerHTML;
  12. }
  13.  
  14. function updateTally(msg, table, dimension) {
  15.   var sumTable = document.getElementById(table);
  16.   let numRows = sumTable.rows.length;
  17.   let incremented = false;
  18.   let newDimension = "";
  19.   if (msg[dimension] === "") {
  20.     newDimension = "Unknown";
  21.   } else {
  22.     newDimension = msg[dimension];
  23.   }
  24.  
  25.   for (let i = 0; i < numRows; i++) {
  26.     let currentDimension = sumTable.rows[i].cells[0].innerHTML;
  27.     let dimensionCount = parseInt(sumTable.rows[i].cells[1].innerHTML);
  28.     if (currentDimension === newDimension) {
  29.       sumTable.rows[i].cells[1].innerHTML = (dimensionCount + 1);
  30.       incremented = true;
  31.     }
  32.   }
  33.   if (incremented === false) {
  34.     let addDimension = sumTable.insertRow(-1);
  35.     let cell1 = addDimension.insertCell(0);
  36.     let cell2 = addDimension.insertCell(1);
  37.     if (msg[dimension] === "") {
  38.       cell1.innerHTML = "Unknown";
  39.     } else {
  40.           cell1.innerHTML = msg[dimension];
  41.     }
  42.     cell2.innerHTML = 1;
  43.   }
  44. }
  45.  
  46. // https://www.w3schools.com/howto/howto_js_sort_table.asp
  47. function sortTable(tableName) {
  48.   let table, rows, switching, i, countOne, countTwo, shouldSwitch;
  49.   table = document.getElementById(tableName);
  50.   switching = true;
  51.  
  52.   while (switching) {
  53.  
  54.     switching = false;
  55.     rows = table.getElementsByTagName("TR");
  56.  
  57.     for (i = 1; i < (rows.length - 1); i++) {
  58.       shouldSwitch = false;
  59.  
  60.       countOne = rows[i].getElementsByTagName("TD")[1];
  61.       countTwo = rows[i + 1].getElementsByTagName("TD")[1];
  62.  
  63.       if (parseInt(countOne.innerHTML) < parseInt(countTwo.innerHTML)) {
  64.         shouldSwitch = true;
  65.         break;
  66.       }
  67.     }
  68.     if (shouldSwitch) {
  69.       rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
  70.       switching = true;
  71.     }
  72.   }
  73. }
  74.  
  75.  
  76. // client.on("enter-connected", function () {
  77. //   showText("Connected to Satori RTM!");
  78. // });
  79. client.on("leave-connected", function () {
  80.   showText("Disconnected from Satori RTM");
  81. });
  82. client.on("error", function (error) {
  83.   var reason;
  84.   if (error.body) {
  85.     // reason = error.body.error + " - " + error.body.reason;
  86.     showText("As of October 2017, Satori has disabled this feed.");
  87.   } else {
  88.     reason = "As of October 2017, Satori has disabled this feed.";
  89.   }
  90.   // showText("RTM client failed: " + reason);
  91.   showText("As of October 2017, Satori has disabled this feed.");
  92. });
  93.  
  94. var subscription = client.subscribe(channelName, RTM.SubscriptionMode.SIMPLE, {
  95.   filter: 'select * from `live-cyber-attack-threat-map` where country_origin="US"'
  96. });
  97.  
  98. subscription.on("enter-subscribed", function() {
  99.   showText("Subscribed to the channel: " + channelName);
  100. });
  101. subscription.on("rtm/subscribe/error", function(pdu) {
  102.   // showText("Failed to subscribe: " + pdu.body.error + " - " + pdu.body.reason);
  103.   showText("As of October 2017, Satori has disabled this feed.");
  104. });
  105. subscription.on("rtm/subscription/data", function(pdu) {
  106.   // Messages arrive in an array.
  107.   pdu.body.messages.forEach(function(msg) {
  108.     satoriData = satoriData.concat(msg);
  109.     showText("Data is received: " + JSON.stringify(msg));
  110.     updateTally(msg, 'attack-tally', 'attacker');
  111.     updateTally(msg, 'malware-tally', 'attack_type');
  112.     updateTally(msg, 'target-tally', 'country_target');
  113.     sortTable('attack-tally');
  114.     sortTable('malware-tally');
  115.     sortTable('target-tally');
  116.   });
  117. });
  118.  
  119. client.start();
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement