From 0b00db2fc257c003a78167d3e7c6dc9364f20a41 Mon Sep 17 00:00:00 2001 From: Daniel Goldberg Date: Mon, 11 Jul 2016 19:07:34 +0300 Subject: [PATCH 1/8] Fixed path bug --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2e36856a..bdd4cb3e3 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The Monkey itself has been tested on Windows XP, 7, 8.1 and 10. The Linux build ### Installation -For off the shelf use, download our pre-compiled binaries from our website, to setup the C&C server follow the instructions in [Monkey Island readme](monkey_island/readme.txt). If you with to compile the binaries yourself, follow the build instructions in the appropiate [readme](build_env/readme.txt). +For off the shelf use, download our pre-compiled binaries from our website, to setup the C&C server follow the instructions in [Monkey Island readme](monkey_island/readme.txt). If you with to compile the binaries yourself, follow the build instructions in the appropiate [readme](chaos_monkey/readme.txt). Usage ----- From aa9ded7ff28eb932641976bdc0ec8aa89c101717 Mon Sep 17 00:00:00 2001 From: Daniel Goldberg Date: Tue, 12 Jul 2016 22:22:10 +0300 Subject: [PATCH 2/8] Windows flow does not require hardcoded paths. --- monkey_island/readme.txt | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/monkey_island/readme.txt b/monkey_island/readme.txt index 1e9408e6c..edc101a13 100644 --- a/monkey_island/readme.txt +++ b/monkey_island/readme.txt @@ -11,27 +11,19 @@ How to set C&C server: python -m pip install Flask-Pymongo python -m pip install Flask-Restful python -m pip install python-dateutil - mkdir C:\MonkeyIsland\bin - mkdir C:\MonkeyIsland\db - mkdir C:\MonkeyIsland\cc\binaries -4. Put monkey binaries in C:\MonkeyIsland\cc\binaries: + mkdir MonkeyIsland\bin + mkdir MonkeyIsland\db + mkdir MonkeyIsland\cc\binaries +4. Put monkey binaries in MonkeyIsland\cc\binaries: monkey-linux-64 - monkey binary for linux 64bit monkey-linux-32 - monkey binary for linux 32bit monkey-windows-32.exe - monkey binary for windows 32bit monkey-windows-64.exe - monkey binary for windows 64bit -4. Download MongoDB & Extract to C:\MonkeyIsland\bin\mongodb +4. Download MongoDB & Extract to MonkeyIsland\bin\mongodb http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-latest.zip 5. Install OpenSSL https://slproweb.com/download/Win64OpenSSL_Light-1_0_2d.exe -6. Generate SSL Certificate, Run create_certificate.bat - -How to Connect to build environment: -1. set hostname to MONKEYCC -2. Put monkey source code at C:\Code\monkey -3. Run: - net share binaries=C:\MonkeyIsland\cc\binaries - net share sources=C:\Code\monkey\chaos_monkey -4. Run batch/sh script according to build environment readme +6. Generate SSL Certificate, run create_certificate.bat when your current working directory is MonkeyIsland How to run: 1. start run_mongodb.bat From 4d7b129b9030d45f5d91264e127e314efd0f5d19 Mon Sep 17 00:00:00 2001 From: Daniel Goldberg Date: Fri, 15 Jul 2016 09:17:14 +0300 Subject: [PATCH 3/8] Changed license table, changed installation link --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bdd4cb3e3..a47e488f1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ The Monkey itself has been tested on Windows XP, 7, 8.1 and 10. The Linux build ### Installation -For off the shelf use, download our pre-compiled binaries from our website, to setup the C&C server follow the instructions in [Monkey Island readme](monkey_island/readme.txt). If you with to compile the binaries yourself, follow the build instructions in the appropiate [readme](chaos_monkey/readme.txt). +For off the shelf use, download our pre-compiled binaries from our website, to setup the C&C server follow the instructions in [Monkey Island readme](monkey_island/readme.txt). If you with to compile the binaries yourself, follow the build instructions later on in this readme. + Usage ----- @@ -148,7 +149,7 @@ Dependency | License | ----------------------------|---------------------------- libffi-dev | https://github.com/atgreen/libffi/blob/master/LICENSE PyCrypto | Public domain - upx | Custom license, http://upx.sourceforge.net/upx-license.html, according to it (IANL) we're fine as long as we're not modifying UPX + upx | Custom license, http://upx.sourceforge.net/upx-license.html bson | BSD enum34 | BSD pyasn1 | BSD From 3da0c1a57c5cbeb57463e307314071966b6e9bb3 Mon Sep 17 00:00:00 2001 From: itsikkes Date: Fri, 15 Jul 2016 16:54:46 +0300 Subject: [PATCH 4/8] Added auto-scan subnets option Monkey is now able to auto scan the local host subnets, removing the need to preconfigure it to scan the network subnets (option is on by default) --- chaos_monkey/config.py | 5 +- chaos_monkey/control.py | 3 +- chaos_monkey/network/info.py | 102 +++++++++++++++++------- chaos_monkey/network/network_scanner.py | 6 +- chaos_monkey/network/range.py | 10 ++- chaos_monkey/readme.txt | 3 +- 6 files changed, 93 insertions(+), 36 deletions(-) diff --git a/chaos_monkey/config.py b/chaos_monkey/config.py index c3767a362..dd6da0a4d 100644 --- a/chaos_monkey/config.py +++ b/chaos_monkey/config.py @@ -141,12 +141,15 @@ class Configuration(object): retry_failed_explotation = True - internet_services = ["www.guardicore.com", "www.google.com"] + internet_services = ["monkey.guardicore.com", "www.google.com"] ########################### # scanners config ########################### + # Auto detect and scan local subnets + local_network_scan = True + range_class = FixedRange range_size = 1 range_fixed = ["", ] diff --git a/chaos_monkey/control.py b/chaos_monkey/control.py index dc4bf198d..d262a78ee 100644 --- a/chaos_monkey/control.py +++ b/chaos_monkey/control.py @@ -53,7 +53,8 @@ class ControlClient(object): data=json.dumps(monkey), headers={'content-type': 'application/json'}, verify=False, - proxies=ControlClient.proxies) + proxies=ControlClient.proxies, + timeout=20) break except Exception, exc: diff --git a/chaos_monkey/network/info.py b/chaos_monkey/network/info.py index 09c484605..491274970 100644 --- a/chaos_monkey/network/info.py +++ b/chaos_monkey/network/info.py @@ -4,46 +4,74 @@ import socket import struct import array import psutil +import ipaddress from random import randint -__author__ = 'hoffer' - if sys.platform == "win32": + import netifaces + def local_ips(): local_hostname = socket.gethostname() return socket.gethostbyname_ex(local_hostname)[2] + def get_host_subnets(only_ips=False): + network_adapters = [] + valid_ips = local_ips() + if only_ips: + return valid_ips + interfaces = [netifaces.ifaddresses(x) for x in netifaces.interfaces()] + for inte in interfaces: + if netifaces.AF_INET in inte: + for add in inte[netifaces.AF_INET]: + if "netmask" in add and add["addr"] in valid_ips: + network_adapters.append((add["addr"], add["netmask"])) + return network_adapters + else: import fcntl - def local_ips(): - result = [] - try: - is_64bits = sys.maxsize > 2**32 - struct_size = 40 if is_64bits else 32 - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - max_possible = 8 # initial value - while True: - bytes = max_possible * struct_size - names = array.array('B', '\0' * bytes) - outbytes = struct.unpack('iL', fcntl.ioctl( - s.fileno(), - 0x8912, # SIOCGIFCONF - struct.pack('iL', bytes, names.buffer_info()[0]) - ))[0] - if outbytes == bytes: - max_possible *= 2 - else: - break - namestr = names.tostring() + def get_host_subnets(only_ips=False): + """Get the list of Linux network adapters.""" + import fcntl + max_bytes = 8096 + is_64bits = sys.maxsize > 2 ** 32 + if is_64bits: + offset1 = 16 + offset2 = 40 + else: + offset1 = 32 + offset2 = 32 + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + names = array.array('B', '\0' * max_bytes) + outbytes = struct.unpack('iL', fcntl.ioctl( + sock.fileno(), + 0x8912, + struct.pack('iL', max_bytes, names.buffer_info()[0])))[0] + adapter_names = [names.tostring()[n_cnt:n_cnt + offset1].split('\0', 1)[0] + for n_cnt in xrange(0, outbytes, offset2)] + network_adapters = [] + for adapter_name in adapter_names: + ip_address = socket.inet_ntoa(fcntl.ioctl( + sock.fileno(), + 0x8915, + struct.pack('256s', adapter_name))[20:24]) + if ip_address.startswith('127'): + continue + subnet_mask = socket.inet_ntoa(fcntl.ioctl( + sock.fileno(), + 0x891b, + struct.pack('256s', adapter_name))[20:24]) - for i in range(0, outbytes, struct_size): - addr = socket.inet_ntoa(namestr[i+20:i+24]) - if not addr.startswith('127'): - result.append(addr) - # name of interface is (namestr[i:i+16].split('\0', 1)[0] - finally: - return result + if only_ips: + network_adapters.append(ip_address) + else: + network_adapters.append((ip_address, subnet_mask)) + + return network_adapters + + + def local_ips(): + return get_host_subnets(only_ips=True) def get_free_tcp_port(min_range=1000, max_range=65535): @@ -60,9 +88,25 @@ def get_free_tcp_port(min_range=1000, max_range=65535): return None + def check_internet_access(services): ping_str = "-n 1" if sys.platform.startswith("win") else "-c 1" for host in services: if os.system("ping " + ping_str + " " + host) == 0: return True return False + + +def get_ips_from_interfaces(): + res = [] + ifs = get_host_subnets() + for interface in ifs: + ipint = ipaddress.ip_interface(u"%s/%s" % interface) + # limit subnet scans to class C only + if ipint.network.num_addresses > 255: + ipint = ipaddress.ip_interface(u"%s/24" % interface[0]) + for addr in ipint.network.hosts(): + if str(addr) == interface[0]: + continue + res.append(str(addr)) + return res diff --git a/chaos_monkey/network/network_scanner.py b/chaos_monkey/network/network_scanner.py index 430c4f68a..9c03ca4b8 100644 --- a/chaos_monkey/network/network_scanner.py +++ b/chaos_monkey/network/network_scanner.py @@ -2,7 +2,7 @@ import time import logging from . import HostScanner from config import WormConfiguration -from info import local_ips +from info import local_ips, get_ips_from_interfaces from range import * __author__ = 'itamar' @@ -27,10 +27,12 @@ class NetworkScanner(object): LOG.info("Found local IP addresses of the machine: %r", self._ip_addresses) # for fixed range, only scan once. if WormConfiguration.range_class is FixedRange: - self._ranges = [WormConfiguration.range_class('0.0.0.0')] + self._ranges = [WormConfiguration.range_class(None)] else: self._ranges = [WormConfiguration.range_class(ip_address) for ip_address in self._ip_addresses] + if WormConfiguration.local_network_scan: + self._ranges += [FixedRange([ip_address for ip_address in get_ips_from_interfaces()])] LOG.info("Base local networks to scan are: %r", self._ranges) def get_victim_machines(self, scan_type, max_find=5, stop_callback=None): diff --git a/chaos_monkey/network/range.py b/chaos_monkey/network/range.py index 0dfcf69ad..f62e895d1 100644 --- a/chaos_monkey/network/range.py +++ b/chaos_monkey/network/range.py @@ -58,10 +58,16 @@ class RelativeRange(NetworkRange): class FixedRange(NetworkRange): - def __init__(self, base_address, shuffle=True): + def __init__(self, fixed_addresses=None, shuffle=True): base_address = 0 super(FixedRange, self).__init__(base_address, shuffle=shuffle) - self._fixed_addresses = self._config.range_fixed + if not fixed_addresses: + self._fixed_addresses = self._config.range_fixed + else: + if type(fixed_addresses) is str: + self._fixed_addresses = [fixed_addresses] + else: + self._fixed_addresses = list(fixed_addresses) def __repr__(self): return "" % (",".join(self._fixed_addresses)) diff --git a/chaos_monkey/readme.txt b/chaos_monkey/readme.txt index 23a1c2aa0..82bb61f9b 100644 --- a/chaos_monkey/readme.txt +++ b/chaos_monkey/readme.txt @@ -21,7 +21,8 @@ Windows: python -m pip install requests python -m pip install odict python -m pip install paramiko - python -m pip install psutil + python -m pip install psutil + python -m pip install netifaces python -m pip install PyInstaller type > C:\Python27\Lib\site-packages\zope\__init__.py 7. Download and extract UPX binary to [source-path]\monkey\chaos_monkey\bin\upx.exe: From 2c3d0af3e360e4c2af01695f09163e15965fa170 Mon Sep 17 00:00:00 2001 From: itsikkes Date: Fri, 15 Jul 2016 17:00:55 +0300 Subject: [PATCH 5/8] merge fix --- chaos_monkey/config.py | 14 +++++--------- chaos_monkey/example.conf | 1 + 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/chaos_monkey/config.py b/chaos_monkey/config.py index 763bd2793..8f4ae841e 100644 --- a/chaos_monkey/config.py +++ b/chaos_monkey/config.py @@ -106,13 +106,13 @@ class Configuration(object): ########################### # monkey config ########################### - #sets whether or not the monkey is alive. if false will stop scanning and exploiting + # sets whether or not the monkey is alive. if false will stop scanning and exploiting alive = True - #sets whether or not to self delete the monkey executable when stopped + # sets whether or not to self delete the monkey executable when stopped self_delete_in_cleanup = False - #string of the mutex name for single instance + # string of the mutex name for single instance singleton_mutex_name = "{2384ec59-0df8-4ab9-918c-843740924a28}" # how long to wait between scan iterations @@ -140,15 +140,11 @@ class Configuration(object): "127.0.0.1:5000" ] - #sets whether or not to retry failed hosts on next scan + # sets whether or not to retry failed hosts on next scan retry_failed_explotation = True -<<<<<<< HEAD + # addresses of internet servers to ping and check if the monkey has internet acccess. internet_services = ["monkey.guardicore.com", "www.google.com"] -======= - #addresses of internet servers to ping and check if the monkey has internet acccess. - internet_services = ["www.guardicore.com", "www.google.com"] ->>>>>>> origin/master ########################### # scanners config diff --git a/chaos_monkey/example.conf b/chaos_monkey/example.conf index 6aac82c1c..99288f91d 100644 --- a/chaos_monkey/example.conf +++ b/chaos_monkey/example.conf @@ -65,6 +65,7 @@ "singleton_mutex_name": "{2384ec59-0df8-4ab9-918c-843740924a28}", "skip_exploit_if_file_exist": true, "ssh_user": "root", + "local_network_scan": true, "tcp_scan_get_banner": true, "tcp_scan_interval": 200, "tcp_scan_timeout": 10000, From 9e1b9db646532b381f6d546da58bda66d541ec4e Mon Sep 17 00:00:00 2001 From: itsikkes Date: Sat, 16 Jul 2016 12:21:26 +0300 Subject: [PATCH 6/8] minor scan UI bugfix --- monkey_island/cc/admin/ui/js/monkeys-admin.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/monkey_island/cc/admin/ui/js/monkeys-admin.js b/monkey_island/cc/admin/ui/js/monkeys-admin.js index 760a5e728..1afd4adba 100644 --- a/monkey_island/cc/admin/ui/js/monkeys-admin.js +++ b/monkey_island/cc/admin/ui/js/monkeys-admin.js @@ -30,6 +30,10 @@ const EDGE_TYPE_PARENT = "parent"; const EDGE_TYPE_TUNNEL = "tunnel"; const EDGE_TYPE_SCAN = "scan"; +const EDGE_COLOR_PARENT = "red"; +const EDGE_COLOR_TUNNEL = "blue"; +const EDGE_COLOR_SCAN = "gray"; + // General options // If variable from local storage != null, assign it, otherwise set it's default value. @@ -213,7 +217,7 @@ function createEdges() { var parent = getMonkeyByGuid(monkey.parent); if(parent && !edgeExists([parent.id, monkey.id, EDGE_TYPE_PARENT])) { - edges.push({from: parent.id, to: monkey.id, arrows:'middle', type: EDGE_TYPE_PARENT, color: 'red'}); + edges.push({from: parent.id, to: monkey.id, arrows:'middle', type: EDGE_TYPE_PARENT, color: EDGE_COLOR_PARENT}); } } } @@ -228,7 +232,7 @@ function createTunnels() { var tunnel = getMonkeyByGuid(monkey.tunnel_guid); if(tunnel && !edgeExists([monkey.id, tunnel.id, EDGE_TYPE_TUNNEL])) { - edges.push({from: monkey.id, to: tunnel.id, arrows:'middle', type: EDGE_TYPE_TUNNEL, color:'blue'}); + edges.push({from: monkey.id, to: tunnel.id, arrows:'middle', type: EDGE_TYPE_TUNNEL, color: EDGE_COLOR_TUNNEL}); } } } @@ -237,13 +241,14 @@ function createTunnels() { } function createScanned() { - //For each existing monkey, gets all the scans performed by it - //For each non exploited machine, adds a new node and connects it as a scanned node. + var genTime = temelGenerationDate; // save the initial value as it's going to be changed in each json call + // For each existing monkey, gets all the scans performed by it + // For each non exploited machine, adds a new node and connects it as a scanned node. for (var i = 0; i < monkeys.length; i++) { var monkey = monkeys[i]; - //Get scans for each monkey + // Get scans for each monkey // Reading the JSON file containing the monkeys' informations - $.getJSON(jsonFileTelemetry +'?timestamp='+ temelGenerationDate+ "&monkey_guid=" + monkey.guid+"&telem_type=scan", function(json) { + $.getJSON(jsonFileTelemetry +'?timestamp='+ genTime + "&monkey_guid=" + monkey.guid+"&telem_type=scan", function(json) { temelGenerationDate = json.timestamp; var scans = json.objects; for (var i = 0; i < scans.length; i++) { @@ -265,7 +270,7 @@ function createScanned() { } if(!edgeExists([monkey.id, machineNode.id, EDGE_TYPE_SCAN])) { - edges.push({from: monkey.id, to: machineNode.id, arrows:'middle', type: EDGE_TYPE_SCAN, color: 'red'}); + edges.push({from: monkey.id, to: machineNode.id, arrows:'middle', type: EDGE_TYPE_SCAN, color: EDGE_COLOR_SCAN}); } } }); From ef325928a923275da5eff63b2a88b26639537a06 Mon Sep 17 00:00:00 2001 From: itsikkes Date: Sun, 17 Jul 2016 19:12:30 +0300 Subject: [PATCH 7/8] minor UI Improvements Scanned hosts displayed with their OS, Total monkeys num now presented --- .../ui/css/img/objects/computer-linux.png | Bin 0 -> 6589 bytes .../ui/css/img/objects/computer-windows.png | Bin 0 -> 6613 bytes monkey_island/cc/admin/ui/index.html | 17 +++++++++++++++++ monkey_island/cc/admin/ui/js/monkeys-admin.js | 16 +++++++++++++++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 monkey_island/cc/admin/ui/css/img/objects/computer-linux.png create mode 100644 monkey_island/cc/admin/ui/css/img/objects/computer-windows.png diff --git a/monkey_island/cc/admin/ui/css/img/objects/computer-linux.png b/monkey_island/cc/admin/ui/css/img/objects/computer-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5dc728ef2cb885cfcf254b836f6d181c4805df GIT binary patch literal 6589 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 + +
+
+ +
+
+ Num of Monkeys: +
+
+
+
+ + + +
diff --git a/monkey_island/cc/admin/ui/js/monkeys-admin.js b/monkey_island/cc/admin/ui/js/monkeys-admin.js index 1afd4adba..ef253ca60 100644 --- a/monkey_island/cc/admin/ui/js/monkeys-admin.js +++ b/monkey_island/cc/admin/ui/js/monkeys-admin.js @@ -63,6 +63,8 @@ function initAdmin() { edges: edges }; + $('#infoNumOfMonkeys').html(monkeys.length) + var options = { }; @@ -132,6 +134,7 @@ function updateMonkeys() { { monkeys.push(new_monkeys[i]); nodes.push(createMonkeyNode(new_monkeys[i])); + $('#infoNumOfMonkeys').html(monkeys.length) } } @@ -196,7 +199,18 @@ function createMonkeyNode(monkey) { } function createMachineNode(machine) { - img = ICONS_DIR + "computer" + ICONS_EXT; + img = "computer"; + + if (undefined != machine.os.type) { + if (machine.os.type == "linux") { + img += "-linux"; + } + else if (machine.os.type == "windows") { + img += "-windows"; + } + } + + img = ICONS_DIR + img + ICONS_EXT; return { 'id': machine.ip_addr, From e9e21b77da53b8a9cd5c3b1c192d642a4f3c572b Mon Sep 17 00:00:00 2001 From: itsikkes Date: Mon, 18 Jul 2016 17:09:48 +0300 Subject: [PATCH 8/8] minor UI improvements more verbose run summary, changed "enable monkey" to toggle button --- .../cc/admin/ui/css/bootstrap-switch.min.css | 22 ++++ monkey_island/cc/admin/ui/index.html | 44 ++++--- .../cc/admin/ui/js/bootstrap-switch.min.js | 22 ++++ monkey_island/cc/admin/ui/js/monkeys-admin.js | 116 +++++++++++++++--- 4 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 monkey_island/cc/admin/ui/css/bootstrap-switch.min.css create mode 100644 monkey_island/cc/admin/ui/js/bootstrap-switch.min.js diff --git a/monkey_island/cc/admin/ui/css/bootstrap-switch.min.css b/monkey_island/cc/admin/ui/css/bootstrap-switch.min.css new file mode 100644 index 000000000..c63cfe2f9 --- /dev/null +++ b/monkey_island/cc/admin/ui/css/bootstrap-switch.min.css @@ -0,0 +1,22 @@ +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:4px;border:1px solid #ccc;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:4px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block!important;height:100%;padding:6px 12px;font-size:14px;line-height:20px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{text-align:center;z-index:1}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary{color:#fff;background:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info{color:#fff;background:#5bc0de}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success{color:#fff;background:#5cb85c}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning{background:#f0ad4e;color:#fff}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger{color:#fff;background:#d9534f}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default{color:#000;background:#eee}.bootstrap-switch .bootstrap-switch-label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;color:#333;background:#fff}.bootstrap-switch .bootstrap-switch-handle-on{border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch .bootstrap-switch-handle-off{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;top:0;left:0;margin:0;z-index:-1;opacity:0;filter:alpha(opacity=0)}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{padding:1px 5px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{padding:5px 10px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{padding:6px 16px;font-size:18px;line-height:1.3333333}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{opacity:.5;filter:alpha(opacity=50);cursor:default!important}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;-o-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on{border-radius:0 3px 3px 0}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off{border-radius:3px 0 0 3px}.bootstrap-switch.bootstrap-switch-focused{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-bottom-left-radius:3px;border-top-left-radius:3px} \ No newline at end of file diff --git a/monkey_island/cc/admin/ui/index.html b/monkey_island/cc/admin/ui/index.html index 33ffbf4ba..d96ae3536 100644 --- a/monkey_island/cc/admin/ui/index.html +++ b/monkey_island/cc/admin/ui/index.html @@ -10,6 +10,7 @@ + @@ -23,6 +24,7 @@ + @@ -79,7 +81,12 @@
- Num of Monkeys: + Num of Monkeys: ( by exploiting)
+ Num of Hosts Detected:
+ Num of Tunnels Used:
+
+
+ Display Scanned Hosts:
@@ -92,7 +99,7 @@
- - - - - - +
+
+ + + + +
diff --git a/monkey_island/cc/admin/ui/js/bootstrap-switch.min.js b/monkey_island/cc/admin/ui/js/bootstrap-switch.min.js new file mode 100644 index 000000000..9849658bc --- /dev/null +++ b/monkey_island/cc/admin/ui/js/bootstrap-switch.min.js @@ -0,0 +1,22 @@ +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +(function(){var t=[].slice;!function(e,i){"use strict";var n;return n=function(){function t(t,i){null==i&&(i={}),this.$element=e(t),this.options=e.extend({},e.fn.bootstrapSwitch.defaults,{state:this.$element.is(":checked"),size:this.$element.data("size"),animate:this.$element.data("animate"),disabled:this.$element.is(":disabled"),readonly:this.$element.is("[readonly]"),indeterminate:this.$element.data("indeterminate"),inverse:this.$element.data("inverse"),radioAllOff:this.$element.data("radio-all-off"),onColor:this.$element.data("on-color"),offColor:this.$element.data("off-color"),onText:this.$element.data("on-text"),offText:this.$element.data("off-text"),labelText:this.$element.data("label-text"),handleWidth:this.$element.data("handle-width"),labelWidth:this.$element.data("label-width"),baseClass:this.$element.data("base-class"),wrapperClass:this.$element.data("wrapper-class")},i),this.prevOptions={},this.$wrapper=e("
",{"class":function(t){return function(){var e;return e=[""+t.options.baseClass].concat(t._getClasses(t.options.wrapperClass)),e.push(t.options.state?t.options.baseClass+"-on":t.options.baseClass+"-off"),null!=t.options.size&&e.push(t.options.baseClass+"-"+t.options.size),t.options.disabled&&e.push(t.options.baseClass+"-disabled"),t.options.readonly&&e.push(t.options.baseClass+"-readonly"),t.options.indeterminate&&e.push(t.options.baseClass+"-indeterminate"),t.options.inverse&&e.push(t.options.baseClass+"-inverse"),t.$element.attr("id")&&e.push(t.options.baseClass+"-id-"+t.$element.attr("id")),e.join(" ")}}(this)()}),this.$container=e("
",{"class":this.options.baseClass+"-container"}),this.$on=e("",{html:this.options.onText,"class":this.options.baseClass+"-handle-on "+this.options.baseClass+"-"+this.options.onColor}),this.$off=e("",{html:this.options.offText,"class":this.options.baseClass+"-handle-off "+this.options.baseClass+"-"+this.options.offColor}),this.$label=e("",{html:this.options.labelText,"class":this.options.baseClass+"-label"}),this.$element.on("init.bootstrapSwitch",function(e){return function(){return e.options.onInit.apply(t,arguments)}}(this)),this.$element.on("switchChange.bootstrapSwitch",function(i){return function(n){return!1===i.options.onSwitchChange.apply(t,arguments)?i.$element.is(":radio")?e("[name='"+i.$element.attr("name")+"']").trigger("previousState.bootstrapSwitch",!0):i.$element.trigger("previousState.bootstrapSwitch",!0):void 0}}(this)),this.$container=this.$element.wrap(this.$container).parent(),this.$wrapper=this.$container.wrap(this.$wrapper).parent(),this.$element.before(this.options.inverse?this.$off:this.$on).before(this.$label).before(this.options.inverse?this.$on:this.$off),this.options.indeterminate&&this.$element.prop("indeterminate",!0),this._init(),this._elementHandlers(),this._handleHandlers(),this._labelHandlers(),this._formHandler(),this._externalLabelHandler(),this.$element.trigger("init.bootstrapSwitch",this.options.state)}return t.prototype._constructor=t,t.prototype.setPrevOptions=function(){return this.prevOptions=e.extend(!0,{},this.options)},t.prototype.state=function(t,i){return"undefined"==typeof t?this.options.state:this.options.disabled||this.options.readonly?this.$element:this.options.state&&!this.options.radioAllOff&&this.$element.is(":radio")?this.$element:(this.$element.is(":radio")?e("[name='"+this.$element.attr("name")+"']").trigger("setPreviousOptions.bootstrapSwitch"):this.$element.trigger("setPreviousOptions.bootstrapSwitch"),this.options.indeterminate&&this.indeterminate(!1),t=!!t,this.$element.prop("checked",t).trigger("change.bootstrapSwitch",i),this.$element)},t.prototype.toggleState=function(t){return this.options.disabled||this.options.readonly?this.$element:this.options.indeterminate?(this.indeterminate(!1),this.state(!0)):this.$element.prop("checked",!this.options.state).trigger("change.bootstrapSwitch",t)},t.prototype.size=function(t){return"undefined"==typeof t?this.options.size:(null!=this.options.size&&this.$wrapper.removeClass(this.options.baseClass+"-"+this.options.size),t&&this.$wrapper.addClass(this.options.baseClass+"-"+t),this._width(),this._containerPosition(),this.options.size=t,this.$element)},t.prototype.animate=function(t){return"undefined"==typeof t?this.options.animate:(t=!!t,t===this.options.animate?this.$element:this.toggleAnimate())},t.prototype.toggleAnimate=function(){return this.options.animate=!this.options.animate,this.$wrapper.toggleClass(this.options.baseClass+"-animate"),this.$element},t.prototype.disabled=function(t){return"undefined"==typeof t?this.options.disabled:(t=!!t,t===this.options.disabled?this.$element:this.toggleDisabled())},t.prototype.toggleDisabled=function(){return this.options.disabled=!this.options.disabled,this.$element.prop("disabled",this.options.disabled),this.$wrapper.toggleClass(this.options.baseClass+"-disabled"),this.$element},t.prototype.readonly=function(t){return"undefined"==typeof t?this.options.readonly:(t=!!t,t===this.options.readonly?this.$element:this.toggleReadonly())},t.prototype.toggleReadonly=function(){return this.options.readonly=!this.options.readonly,this.$element.prop("readonly",this.options.readonly),this.$wrapper.toggleClass(this.options.baseClass+"-readonly"),this.$element},t.prototype.indeterminate=function(t){return"undefined"==typeof t?this.options.indeterminate:(t=!!t,t===this.options.indeterminate?this.$element:this.toggleIndeterminate())},t.prototype.toggleIndeterminate=function(){return this.options.indeterminate=!this.options.indeterminate,this.$element.prop("indeterminate",this.options.indeterminate),this.$wrapper.toggleClass(this.options.baseClass+"-indeterminate"),this._containerPosition(),this.$element},t.prototype.inverse=function(t){return"undefined"==typeof t?this.options.inverse:(t=!!t,t===this.options.inverse?this.$element:this.toggleInverse())},t.prototype.toggleInverse=function(){var t,e;return this.$wrapper.toggleClass(this.options.baseClass+"-inverse"),e=this.$on.clone(!0),t=this.$off.clone(!0),this.$on.replaceWith(t),this.$off.replaceWith(e),this.$on=t,this.$off=e,this.options.inverse=!this.options.inverse,this.$element},t.prototype.onColor=function(t){var e;return e=this.options.onColor,"undefined"==typeof t?e:(null!=e&&this.$on.removeClass(this.options.baseClass+"-"+e),this.$on.addClass(this.options.baseClass+"-"+t),this.options.onColor=t,this.$element)},t.prototype.offColor=function(t){var e;return e=this.options.offColor,"undefined"==typeof t?e:(null!=e&&this.$off.removeClass(this.options.baseClass+"-"+e),this.$off.addClass(this.options.baseClass+"-"+t),this.options.offColor=t,this.$element)},t.prototype.onText=function(t){return"undefined"==typeof t?this.options.onText:(this.$on.html(t),this._width(),this._containerPosition(),this.options.onText=t,this.$element)},t.prototype.offText=function(t){return"undefined"==typeof t?this.options.offText:(this.$off.html(t),this._width(),this._containerPosition(),this.options.offText=t,this.$element)},t.prototype.labelText=function(t){return"undefined"==typeof t?this.options.labelText:(this.$label.html(t),this._width(),this.options.labelText=t,this.$element)},t.prototype.handleWidth=function(t){return"undefined"==typeof t?this.options.handleWidth:(this.options.handleWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.labelWidth=function(t){return"undefined"==typeof t?this.options.labelWidth:(this.options.labelWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.baseClass=function(t){return this.options.baseClass},t.prototype.wrapperClass=function(t){return"undefined"==typeof t?this.options.wrapperClass:(t||(t=e.fn.bootstrapSwitch.defaults.wrapperClass),this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" ")),this.$wrapper.addClass(this._getClasses(t).join(" ")),this.options.wrapperClass=t,this.$element)},t.prototype.radioAllOff=function(t){return"undefined"==typeof t?this.options.radioAllOff:(t=!!t,t===this.options.radioAllOff?this.$element:(this.options.radioAllOff=t,this.$element))},t.prototype.onInit=function(t){return"undefined"==typeof t?this.options.onInit:(t||(t=e.fn.bootstrapSwitch.defaults.onInit),this.options.onInit=t,this.$element)},t.prototype.onSwitchChange=function(t){return"undefined"==typeof t?this.options.onSwitchChange:(t||(t=e.fn.bootstrapSwitch.defaults.onSwitchChange),this.options.onSwitchChange=t,this.$element)},t.prototype.destroy=function(){var t;return t=this.$element.closest("form"),t.length&&t.off("reset.bootstrapSwitch").removeData("bootstrap-switch"),this.$container.children().not(this.$element).remove(),this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch"),this.$element},t.prototype._width=function(){var t,e;return t=this.$on.add(this.$off),t.add(this.$label).css("width",""),e="auto"===this.options.handleWidth?Math.max(this.$on.width(),this.$off.width()):this.options.handleWidth,t.width(e),this.$label.width(function(t){return function(i,n){return"auto"!==t.options.labelWidth?t.options.labelWidth:e>n?e:n}}(this)),this._handleWidth=this.$on.outerWidth(),this._labelWidth=this.$label.outerWidth(),this.$container.width(2*this._handleWidth+this._labelWidth),this.$wrapper.width(this._handleWidth+this._labelWidth)},t.prototype._containerPosition=function(t,e){return null==t&&(t=this.options.state),this.$container.css("margin-left",function(e){return function(){var i;return i=[0,"-"+e._handleWidth+"px"],e.options.indeterminate?"-"+e._handleWidth/2+"px":t?e.options.inverse?i[1]:i[0]:e.options.inverse?i[0]:i[1]}}(this)),e?setTimeout(function(){return e()},50):void 0},t.prototype._init=function(){var t,e;return t=function(t){return function(){return t.setPrevOptions(),t._width(),t._containerPosition(null,function(){return t.options.animate?t.$wrapper.addClass(t.options.baseClass+"-animate"):void 0})}}(this),this.$wrapper.is(":visible")?t():e=i.setInterval(function(n){return function(){return n.$wrapper.is(":visible")?(t(),i.clearInterval(e)):void 0}}(this),50)},t.prototype._elementHandlers=function(){return this.$element.on({"setPreviousOptions.bootstrapSwitch":function(t){return function(e){return t.setPrevOptions()}}(this),"previousState.bootstrapSwitch":function(t){return function(e){return t.options=t.prevOptions,t.options.indeterminate&&t.$wrapper.addClass(t.options.baseClass+"-indeterminate"),t.$element.prop("checked",t.options.state).trigger("change.bootstrapSwitch",!0)}}(this),"change.bootstrapSwitch":function(t){return function(i,n){var o;return i.preventDefault(),i.stopImmediatePropagation(),o=t.$element.is(":checked"),t._containerPosition(o),o!==t.options.state?(t.options.state=o,t.$wrapper.toggleClass(t.options.baseClass+"-off").toggleClass(t.options.baseClass+"-on"),n?void 0:(t.$element.is(":radio")&&e("[name='"+t.$element.attr("name")+"']").not(t.$element).prop("checked",!1).trigger("change.bootstrapSwitch",!0),t.$element.trigger("switchChange.bootstrapSwitch",[o]))):void 0}}(this),"focus.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.addClass(t.options.baseClass+"-focused")}}(this),"blur.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.removeClass(t.options.baseClass+"-focused")}}(this),"keydown.bootstrapSwitch":function(t){return function(e){if(e.which&&!t.options.disabled&&!t.options.readonly)switch(e.which){case 37:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!1);case 39:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!0)}}}(this)})},t.prototype._handleHandlers=function(){return this.$on.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!1),t.$element.trigger("focus.bootstrapSwitch")}}(this)),this.$off.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!0),t.$element.trigger("focus.bootstrapSwitch")}}(this))},t.prototype._labelHandlers=function(){return this.$label.on({click:function(t){return t.stopPropagation()},"mousedown.bootstrapSwitch touchstart.bootstrapSwitch":function(t){return function(e){return t._dragStart||t.options.disabled||t.options.readonly?void 0:(e.preventDefault(),e.stopPropagation(),t._dragStart=(e.pageX||e.originalEvent.touches[0].pageX)-parseInt(t.$container.css("margin-left"),10),t.options.animate&&t.$wrapper.removeClass(t.options.baseClass+"-animate"),t.$element.trigger("focus.bootstrapSwitch"))}}(this),"mousemove.bootstrapSwitch touchmove.bootstrapSwitch":function(t){return function(e){var i;if(null!=t._dragStart&&(e.preventDefault(),i=(e.pageX||e.originalEvent.touches[0].pageX)-t._dragStart,!(i<-t._handleWidth||i>0)))return t._dragEnd=i,t.$container.css("margin-left",t._dragEnd+"px")}}(this),"mouseup.bootstrapSwitch touchend.bootstrapSwitch":function(t){return function(e){var i;if(t._dragStart)return e.preventDefault(),t.options.animate&&t.$wrapper.addClass(t.options.baseClass+"-animate"),t._dragEnd?(i=t._dragEnd>-(t._handleWidth/2),t._dragEnd=!1,t.state(t.options.inverse?!i:i)):t.state(!t.options.state),t._dragStart=!1}}(this),"mouseleave.bootstrapSwitch":function(t){return function(e){return t.$label.trigger("mouseup.bootstrapSwitch")}}(this)})},t.prototype._externalLabelHandler=function(){var t;return t=this.$element.closest("label"),t.on("click",function(e){return function(i){return i.preventDefault(),i.stopImmediatePropagation(),i.target===t[0]?e.toggleState():void 0}}(this))},t.prototype._formHandler=function(){var t;return t=this.$element.closest("form"),t.data("bootstrap-switch")?void 0:t.on("reset.bootstrapSwitch",function(){return i.setTimeout(function(){return t.find("input").filter(function(){return e(this).data("bootstrap-switch")}).each(function(){return e(this).bootstrapSwitch("state",this.checked)})},1)}).data("bootstrap-switch",!0)},t.prototype._getClasses=function(t){var i,n,o,s;if(!e.isArray(t))return[this.options.baseClass+"-"+t];for(n=[],o=0,s=t.length;s>o;o++)i=t[o],n.push(this.options.baseClass+"-"+i);return n},t}(),e.fn.bootstrapSwitch=function(){var i,o,s;return o=arguments[0],i=2<=arguments.length?t.call(arguments,1):[],s=this,this.each(function(){var t,a;return t=e(this),a=t.data("bootstrap-switch"),a||t.data("bootstrap-switch",a=new n(this,o)),"string"==typeof o?s=a[o].apply(a,i):void 0}),s},e.fn.bootstrapSwitch.Constructor=n,e.fn.bootstrapSwitch.defaults={state:!0,size:null,animate:!0,disabled:!1,readonly:!1,indeterminate:!1,inverse:!1,radioAllOff:!1,onColor:"primary",offColor:"default",onText:"ON",offText:"OFF",labelText:" ",handleWidth:"auto",labelWidth:"auto",baseClass:"bootstrap-switch",wrapperClass:"wrapper",onInit:function(){},onSwitchChange:function(){}}}(window.jQuery,window)}).call(this); \ No newline at end of file diff --git a/monkey_island/cc/admin/ui/js/monkeys-admin.js b/monkey_island/cc/admin/ui/js/monkeys-admin.js index ef253ca60..190542f7e 100644 --- a/monkey_island/cc/admin/ui/js/monkeys-admin.js +++ b/monkey_island/cc/admin/ui/js/monkeys-admin.js @@ -21,11 +21,19 @@ $.getJSON(jsonFile, function(json) { var network = null; var nodes = []; var edges = []; +var numOfParentLinks = 0; +var numOfTunnelLinks = 0; +var numOfScanLinks = 0; + +var showScannedHosts = true; // Images/icons constants const ICONS_DIR = "./css/img/objects/"; const ICONS_EXT = ".png"; +const HOST_TYPE_MONKEY = "monkey"; +const HOST_TYPE_SCAN = "scanned"; + const EDGE_TYPE_PARENT = "parent"; const EDGE_TYPE_TUNNEL = "tunnel"; const EDGE_TYPE_SCAN = "scan"; @@ -63,7 +71,7 @@ function initAdmin() { edges: edges }; - $('#infoNumOfMonkeys').html(monkeys.length) + updateCounters(); var options = { }; @@ -73,6 +81,9 @@ function initAdmin() { network = new vis.Network(container, data, options); + $("[name='chboxShowScanned']").bootstrapSwitch('onSwitchChange', toggleScannedHosts); + $("[name='chboxMonkeyEnabled']").bootstrapSwitch('onSwitchChange', toggleMonkeyEnabled); + prepareSearchEngine(); monkeyCfg = new JSONEditor(document.getElementById('monkey-config'),{ @@ -121,6 +132,55 @@ function initAdmin() { addEventsListeners(); } +function toggleScannedHosts(event, state) { + if (event.type != "switchChange") { + return; + } + if (state) { + showScannedHosts = true; + } + else { + showScannedHosts = false; + } + refreshDrawing(); +} + +function refreshDrawing() { + // function called before first init + if (network == null) { + return; + } + + // keep old selection + var selNode = network.getSelectedNodes(); + + if (showScannedHosts) { + network.setData({nodes: nodes, edges: edges}); + } + else { + var selectiveNodes = []; + var selectiveEdges = []; + for (var i=0; i 0) { + refreshDrawing(); + updateCounters(); + } }); } } @@ -316,6 +375,13 @@ function buildMonkeyDescription(monkey) { return html; } +function updateCounters() { + $('#infoNumOfMonkeys').html(monkeys.length); + $('#infoNumOfHosts').html(scannedMachines.length); + $('#infoNumOfParents').html(numOfParentLinks); + $('#infoNumOfTunnels').html(numOfTunnelLinks); +} + /** * Preparing the autocompletion search engine for the monkeys @@ -389,7 +455,8 @@ function onSelect(properties) { var content = "No selection" $("#selectionInfo").html(content); $('#monkey-config').hide() - $('#btnConfigLoad, #btnConfigUpdate, #btnKillMonkey, #btnReviveMonkey').hide(); + $('#btnConfigLoad, #btnConfigUpdate').hide(); + $('#monkey-enabled').hide(); telemTable.clear(); telemTable.draw(); } @@ -422,14 +489,12 @@ function onNodeSelect(nodeId) { loadMonkeyConfig(); if (monkey.config.alive) { - $('#btnKillMonkey').show(); - $('#btnReviveMonkey').hide(); + $("[name='chboxMonkeyEnabled']").bootstrapSwitch('state', true); } else { - $('#btnKillMonkey').hide(); - $('#btnReviveMonkey').show(); + $("[name='chboxMonkeyEnabled']").bootstrapSwitch('state', false); } - + $('#monkey-enabled').show(); $.getJSON('/api/telemetry/' + monkey.guid, function(json) { telemTable.clear(); @@ -453,6 +518,19 @@ function onEdgeSelect(edge) { } +function toggleMonkeyEnabled(event, state) { + if (event.type != "switchChange") { + return; + } + if (state) { + reviveMonkey(); + } + else { + killMonkey(); + } +} + + function killMonkey() { var curr_config = monkeyCfg.getValue(); curr_config.alive = false;