devicescripts.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. var deviceScripts = {
  2. manualRouter: {
  3. onPacketReceived: function(device, packet) {
  4. for (var i = 0; i < device.rules.length; i++) {
  5. if (device.rules[i].dstip == packet.network.dstip) {
  6. sendPacket(device.id, device.rules[i].portNum, packet);
  7. }
  8. }
  9. }
  10. },
  11. hub: {
  12. onPacketReceived: function (device, packet) {
  13. //.
  14. }
  15. },
  16. ping: {
  17. onPacketReceived: function(device, packet) {
  18. if(packet.hasOwnProperty("transport") && packet["transport"].hasOwnProperty("proto")){
  19. var proto = packet.transport.proto.trim().toLowerCase();
  20. if (proto == "icmp" || proto == "example") { // did this to make basics5 a little more clear
  21. var new_packet = {
  22. network: {
  23. srcip: packet.network.dstip,
  24. dstip: packet.network.srcip
  25. },
  26. transport: {
  27. proto: packet.transport.proto
  28. }
  29. };
  30. sendPacket(device.id, 0, new_packet);
  31. }
  32. }
  33. }
  34. },
  35. modem: {
  36. onPacketReceived: function(device, packet, portNum) {
  37. if (!device.hasOwnProperty("rules")) device.rules = {};
  38. if (packet.network.dstip == device.id) {
  39. // TODO: use something other than proto for NAT table
  40. if (device.rules.hasOwnProperty( packet.transport.proto )) {
  41. packet.network.dstip = device.rules[packet.transport.proto].dstip;
  42. sendPacket(device.id, device.rules[packet.transport.proto].portNum, packet);
  43. }
  44. } else {
  45. if (packet.hasOwnProperty("transport") && packet.transport.hasOwnProperty("proto")) {
  46. device.rules[packet.transport.proto] = {portNum:portNum, dstip: packet.network.srcip};
  47. console.log(device.rules);
  48. }
  49. packet.network.srcip = device.id;
  50. sendPacket(device.id, 0, packet);
  51. }
  52. }
  53. },
  54. /* if(packet.network.dstip == device.id){//look up ip in NAT table
  55. var new_packet = {};
  56. for (var i = 0; i < packetFields.length; i++) {
  57. if(packet.hasOwnProperty(packetFields[i].layer)){
  58. new_packet[packetFields[i].layer] = {};
  59. for (var j = 0; j < packetFields[i].fields.length; j++) {
  60. if(packet[packetFields[i].layer].hasOwnProperty(packetFields[i].fields[j])){
  61. new_packet[packetFields[i].layer][ packetFields[i].fields[j] ] = packet[packetFields[i].layer][ packetFields[i].fields[j] ];
  62. }
  63. }
  64. }
  65. }
  66. new_packet.network.dstip = getPortRecipient(device.id, 0);
  67. sendPacket(device.id, 0, new_packet);
  68. } else { //replace src ip with device IP and save in NAT table
  69. var new_packet = {};
  70. for (var i = 0; i < packetFields.length; i++) {
  71. if(packet.hasOwnProperty(packetFields[i].layer)){
  72. new_packet[packetFields[i].layer] = {};
  73. for (var j = 0; j < packetFields[i].fields.length; j++) {
  74. if(packet[packetFields[i].layer].hasOwnProperty(packetFields[i].fields[j])){
  75. new_packet[packetFields[i].layer][ packetFields[i].fields[j] ] = packet[packetFields[i].layer][ packetFields[i].fields[j] ];
  76. }
  77. }
  78. }
  79. }
  80. new_packet.network.srcip = device.id;
  81. sendPacket(device.id, 1, new_packet);
  82. }
  83. }
  84. },*/
  85. switch: {
  86. onPacketReceived: function(device, packet, portNum) {
  87. var found = false;
  88. for (var i = 0; (i < device.rules.length) && !found; i++) {
  89. if (device.rules[i].dstip == packet.network.dstip) {
  90. sendPacket(device.id, device.rules[i].portNum, packet);
  91. found = true;
  92. }
  93. }
  94. if(!found){
  95. //broadcast packet to all ports except where it was received
  96. for(var i=0; i<device.ports.length; i++){
  97. if(i != portNum){
  98. sendPacket(device.id, i, packet);
  99. }
  100. }
  101. }
  102. //update rules with info from this packet
  103. var found = false;
  104. for (var i = 0; (i < device.rules.length) && !found; i++) {
  105. if (device.rules[i].dstip == packet.network.srcip) {
  106. device.rules[i].portNum = portNum;
  107. found = true;
  108. }
  109. }
  110. if(!found){
  111. device.rules[device.rules.length] = {
  112. dstip: packet.network.srcip,
  113. portNum: portNum
  114. }
  115. }
  116. }
  117. },
  118. firewall: {
  119. onPacketReceived: function(device, packet) {
  120. function checkRules(rule){
  121. return rule.srcip == packet.network.srcip;
  122. }
  123. if(device.rules.find(checkRules) == undefined){
  124. sendPacket(device.id, 0, packet);
  125. }
  126. }
  127. },
  128. broadcast: {
  129. onPacketReceived: function(device, packet, portNum){
  130. function checkRules(rule){
  131. return rule.dstip == packet.network.dstip;
  132. }
  133. var rule = device.rules.find(checkRules);
  134. if (rule != undefined){
  135. sendPacket(device.id, rule.portNum, packet);
  136. } else {
  137. if(packet.network.dstip == "Broadcast"){
  138. for(var i=0; i<device.ports.length; i++){
  139. if((i != portNum) && (getPortRecipient(device.id, i) != "Google")){
  140. newPacket = copyPacket(packet);
  141. newPacket.network.dstip = getPortRecipient(device.id, i);
  142. sendPacket(device.id, i, newPacket);
  143. }
  144. }
  145. }
  146. }
  147. }
  148. },
  149. encryption: {
  150. onPacketReceived: function(device, packet, portNum) {
  151. if(packet.hasOwnProperty("transport") && packet["transport"].hasOwnProperty("proto")){
  152. if(packet.transport.proto == "encryption"){
  153. if(packet.hasOwnProperty("application") && packet["application"].hasOwnProperty("type")){
  154. var type = packet.application.type;
  155. switch(type) {
  156. case "keyrequest":
  157. var new_packet = {
  158. network: {
  159. srcip: packet.network.dstip,
  160. dstip: packet.network.srcip
  161. },
  162. transport: {
  163. proto: "encryption"
  164. },
  165. application: {
  166. type: "keyresponse",
  167. key: "123456"
  168. }
  169. }
  170. sendPacket(device.id, portNum, new_packet);
  171. break;
  172. case "keyresponse":
  173. var new_packet = {
  174. network: {
  175. srcip: packet.network.dstip,
  176. dstip: packet.network.srcip
  177. },
  178. transport: {
  179. proto: "encryption"
  180. },
  181. application: {
  182. type: "message",
  183. key: packet.application.key
  184. }
  185. }
  186. sendPacket(device.id, portNum, new_packet);
  187. break;
  188. default:
  189. break;
  190. }
  191. }
  192. }
  193. }
  194. }
  195. },
  196. tappedRouter: {//Note: port 0 should be hooked up to tap device
  197. onPacketReceived: function(device, packet, portNum) {
  198. for (var i = 0; i < device.rules.length; i++) {
  199. if (device.rules[i].dstip == packet.network.dstip) {
  200. if(portNum == 0){
  201. sendPacket(device.id, device.rules[i].portNum, packet);
  202. } else {
  203. sendPacket(device.id, 0, packet);
  204. }
  205. }
  206. }
  207. }
  208. }
  209. }
  210. function copyPacket (packet) {
  211. newPacket = {};
  212. for (var i = 0; i < packetFields.length; i++) {
  213. if(packet.hasOwnProperty(packetFields[i].layer)){
  214. newPacket[packetFields[i].layer] = {};
  215. for (var j = 0; j < packetFields[i].fields.length; j++) {
  216. if(packet[packetFields[i].layer].hasOwnProperty(packetFields[i].fields[j])){
  217. newPacket[packetFields[i].layer][ packetFields[i].fields[j] ] = packet[packetFields[i].layer][ packetFields[i].fields[j] ];
  218. }
  219. }
  220. }
  221. }
  222. return newPacket;
  223. }