From 5b1baf0ab8d57761db3f5b42cbcbc743fdb06112 Mon Sep 17 00:00:00 2001 From: ralphwetzel Date: Mon, 2 Dec 2019 23:02:58 +0100 Subject: [PATCH] 19.2 (#70) * Configuration parameter changed from proxy_path to base_path - to avoid ambiguities * Fix ambiguous situations around the period when DST changes. * Emit [Error] message when socket cannot be created. Resolves #63. * Refactored Storage class to better handle temp folder management. * Fixed a number of typos. * Preliminary Readme for 19.1 * Preparation for 19.1b1 * Preparation for 19.1b1 * Preparation for 19.1b1 * Preparation for 19.1b2 * Show error if verification fails in node properties dialog * Add reference to py3 only. * v19.2b3 * get_cc: 'SessionManager' object has no attribute 'delete': Fixed * fixed an issue due to lazy refactoring. * Linux: Suppress stderr output when querying for the ntp server information. * Network Bandwidth: 3 month chart substituted by 6 month chart - according oninooo. * Network Weights: 6 month chart included. * Fixed Keyboard (Left / Right) navigation in Dashboard * Preparation for v19.2b4 * Fix: Add NoneType guard when querying for messages. * Another fix for keyboard navigation on the Dashboard * Removed obsolete section 'control'. * Fixed typo in Readme * Updated tor.1.txt * 'New day' message added to the log of nodes. * Fixed: Cursor key (left, right) navigation at the Dashboard ... finally! * Fixed some minor issued around the HiddenService Cookie property. * Fixed 'new day' logging message * Hunting for an issue concerning the persistance of bandwidth data. * OO sometimes returns strings with encoded unicode characters. Fixed. * tor.1.txt updated. * Yet another attempt to fix the 'New Day' notification. * Fixed: Issue in the handshaking with the Update service. * Fixed: warning if bandwidth data cannot be persisted displays fpid yet not fp. * 19.2 --- .gitignore | 4 +- Docker/Dockerfile | 6 +- Docker/theonionbox.cfg | 131 +- LICENSE | 2 +- README.md | 50 +- cc/ControlCenter/__init__.pyj | 1 + .../ControlCenter/cards/__init__.pyj | 0 cc/ControlCenter/cards/node.pyj | 886 ++ cc/ControlCenter/controlcenter.pyj | 260 + cc/ControlCenter/controls/__init__.pyj | 0 cc/ControlCenter/controls/base.pyj | 13 + cc/ControlCenter/controls/connection.pyj | 48 + cc/ControlCenter/controls/flags.pyj | 169 + cc/ControlCenter/controls/smoothie.pyj | 652 + cc/ControlCenter/controls/version.pyj | 98 + cc/ControlCenter/controls/version_check.pyj | 59 + cc/ControlCenter/dialogs/__init__.pyj | 0 cc/ControlCenter/dialogs/about.pyj | 64 + cc/ControlCenter/dialogs/base.pyj | 84 + cc/ControlCenter/dialogs/launcher.pyj | 51 + cc/ControlCenter/dialogs/license.pyj | 61 + cc/ControlCenter/dialogs/login.pyj | 208 + cc/ControlCenter/dialogs/properties.pyj | 372 + cc/ControlCenter/utils/__init__.pyj | 0 cc/ControlCenter/utils/auth.pyj | 124 + cc/ControlCenter/utils/format_bytes.pyj | 48 + cc/ControlCenter/utils/make_id.pyj | 12 + cc/ControlCenter/utils/uuid.pyj | 15 + cc/ControlCenter/utils/variables.pyj | 28 + cc/lib/RapydSmoothie/__init__.pyj | 0 cc/lib/RapydSmoothie/smoothie.pyj | 786 ++ cc/lib/RapydSmoothie/timeseries.pyj | 95 + cc/lib/RapydSmoothie/util.pyj | 70 + docs/images/cc.png | Bin 0 -> 1006189 bytes setup.py | 58 +- theonionbox/config/theonionbox.example | 125 +- theonionbox/css/box.css | 1 + theonionbox/css/cc.css | 356 + theonionbox/css/latolatinfonts.css | 224 - theonionbox/{font => libs/LatoLatin}/OFL.txt | 0 theonionbox/libs/LatoLatin/README-WEB.txt | 72 + .../LatoLatin/fonts/LatoLatin-Black.eot | Bin .../LatoLatin/fonts/LatoLatin-Black.ttf | Bin .../LatoLatin/fonts/LatoLatin-Black.woff | Bin .../LatoLatin/fonts/LatoLatin-Black.woff2 | Bin .../LatoLatin/fonts/LatoLatin-BlackItalic.eot | Bin .../LatoLatin/fonts/LatoLatin-BlackItalic.ttf | Bin .../fonts/LatoLatin-BlackItalic.woff | Bin .../fonts/LatoLatin-BlackItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Bold.eot | Bin .../LatoLatin/fonts/LatoLatin-Bold.ttf | Bin .../LatoLatin/fonts/LatoLatin-Bold.woff | Bin .../LatoLatin/fonts/LatoLatin-Bold.woff2 | Bin .../LatoLatin/fonts/LatoLatin-BoldItalic.eot | Bin .../LatoLatin/fonts/LatoLatin-BoldItalic.ttf | Bin .../LatoLatin/fonts/LatoLatin-BoldItalic.woff | Bin .../fonts/LatoLatin-BoldItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Hairline.eot | Bin .../LatoLatin/fonts/LatoLatin-Hairline.ttf | Bin .../LatoLatin/fonts/LatoLatin-Hairline.woff | Bin .../LatoLatin/fonts/LatoLatin-Hairline.woff2 | Bin .../fonts/LatoLatin-HairlineItalic.eot | Bin .../fonts/LatoLatin-HairlineItalic.ttf | Bin .../fonts/LatoLatin-HairlineItalic.woff | Bin .../fonts/LatoLatin-HairlineItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Heavy.eot | Bin .../LatoLatin/fonts/LatoLatin-Heavy.ttf | Bin .../LatoLatin/fonts/LatoLatin-Heavy.woff | Bin .../LatoLatin/fonts/LatoLatin-Heavy.woff2 | Bin .../LatoLatin/fonts/LatoLatin-HeavyItalic.eot | Bin .../LatoLatin/fonts/LatoLatin-HeavyItalic.ttf | Bin .../fonts/LatoLatin-HeavyItalic.woff | Bin .../fonts/LatoLatin-HeavyItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Italic.eot | Bin .../LatoLatin/fonts/LatoLatin-Italic.ttf | Bin .../LatoLatin/fonts/LatoLatin-Italic.woff | Bin .../LatoLatin/fonts/LatoLatin-Italic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Light.eot | Bin .../LatoLatin/fonts/LatoLatin-Light.ttf | Bin .../LatoLatin/fonts/LatoLatin-Light.woff | Bin .../LatoLatin/fonts/LatoLatin-Light.woff2 | Bin .../LatoLatin/fonts/LatoLatin-LightItalic.eot | Bin .../LatoLatin/fonts/LatoLatin-LightItalic.ttf | Bin .../fonts/LatoLatin-LightItalic.woff | Bin .../fonts/LatoLatin-LightItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Medium.eot | Bin .../LatoLatin/fonts/LatoLatin-Medium.ttf | Bin .../LatoLatin/fonts/LatoLatin-Medium.woff | Bin .../LatoLatin/fonts/LatoLatin-Medium.woff2 | Bin .../fonts/LatoLatin-MediumItalic.eot | Bin .../fonts/LatoLatin-MediumItalic.ttf | Bin .../fonts/LatoLatin-MediumItalic.woff | Bin .../fonts/LatoLatin-MediumItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Regular.eot | Bin .../LatoLatin/fonts/LatoLatin-Regular.ttf | Bin .../LatoLatin/fonts/LatoLatin-Regular.woff | Bin .../LatoLatin/fonts/LatoLatin-Regular.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Semibold.eot | Bin .../LatoLatin/fonts/LatoLatin-Semibold.ttf | Bin .../LatoLatin/fonts/LatoLatin-Semibold.woff | Bin .../LatoLatin/fonts/LatoLatin-Semibold.woff2 | Bin .../fonts/LatoLatin-SemiboldItalic.eot | Bin .../fonts/LatoLatin-SemiboldItalic.ttf | Bin .../fonts/LatoLatin-SemiboldItalic.woff | Bin .../fonts/LatoLatin-SemiboldItalic.woff2 | Bin .../LatoLatin/fonts/LatoLatin-Thin.eot | Bin .../LatoLatin/fonts/LatoLatin-Thin.ttf | Bin .../LatoLatin/fonts/LatoLatin-Thin.woff | Bin .../LatoLatin/fonts/LatoLatin-Thin.woff2 | Bin .../LatoLatin/fonts/LatoLatin-ThinItalic.eot | Bin .../LatoLatin/fonts/LatoLatin-ThinItalic.ttf | Bin .../LatoLatin/fonts/LatoLatin-ThinItalic.woff | Bin .../fonts/LatoLatin-ThinItalic.woff2 | Bin theonionbox/libs/LatoLatin/latolatinfonts.css | 216 + .../css/bootstrap-grid.css.map | 1 - .../css/bootstrap-grid.min.css | 7 - .../css/bootstrap-grid.min.css.map | 1 - .../css/bootstrap-reboot.css.map | 1 - .../css/bootstrap-reboot.min.css | 8 - .../css/bootstrap-reboot.min.css.map | 1 - .../bootstrap-4.1.3/css/bootstrap.css.map | 1 - .../bootstrap-4.1.3/css/bootstrap.min.css | 7 - .../bootstrap-4.1.3/css/bootstrap.min.css.map | 1 - .../bootstrap-4.1.3/js/bootstrap.bundle.js | 6461 ---------- .../js/bootstrap.bundle.js.map | 1 - .../js/bootstrap.bundle.min.js | 7 - .../js/bootstrap.bundle.min.js.map | 1 - .../libs/bootstrap-4.1.3/js/bootstrap.js | 3944 ------ .../libs/bootstrap-4.1.3/js/bootstrap.js.map | 1 - .../libs/bootstrap-4.1.3/js/bootstrap.min.js | 7 - .../bootstrap-4.1.3/js/bootstrap.min.js.map | 1 - .../css/bootstrap-grid.css | 1833 ++- .../css/bootstrap-grid.css.map | 1 + .../css/bootstrap-grid.min.css | 7 + .../css/bootstrap-grid.min.css.map | 1 + .../css/bootstrap-reboot.css | 36 +- .../css/bootstrap-reboot.css.map | 1 + .../css/bootstrap-reboot.min.css | 8 + .../css/bootstrap-reboot.min.css.map | 1 + .../css/bootstrap.css | 1906 ++- .../bootstrap-4.3.1/css/bootstrap.css.map | 1 + .../bootstrap-4.3.1/css/bootstrap.min.css | 7 + .../bootstrap-4.3.1/css/bootstrap.min.css.map | 1 + .../bootstrap-4.3.1/js/bootstrap.bundle.js | 7013 +++++++++++ .../js/bootstrap.bundle.js.map | 1 + .../js/bootstrap.bundle.min.js | 7 + .../js/bootstrap.bundle.min.js.map | 1 + .../libs/bootstrap-4.3.1/js/bootstrap.js | 4435 +++++++ .../libs/bootstrap-4.3.1/js/bootstrap.js.map | 1 + .../libs/bootstrap-4.3.1/js/bootstrap.min.js | 7 + .../bootstrap-4.3.1/js/bootstrap.min.js.map | 1 + .../fontawesome-free-5.11.2-web/LICENSE.txt | 34 + .../fontawesome-free-5.11.2-web/css/all.css | 4423 +++++++ .../css/all.min.css | 5 + .../css/brands.css | 14 + .../css/brands.min.css | 5 + .../css/fontawesome.css | 4390 +++++++ .../css/fontawesome.min.css | 5 + .../css/regular.css | 15 + .../css/regular.min.css | 5 + .../fontawesome-free-5.11.2-web/css/solid.css | 16 + .../css/solid.min.css | 5 + .../css/svg-with-js.css | 371 + .../css/svg-with-js.min.css | 5 + .../css/v4-shims.css | 2166 ++++ .../css/v4-shims.min.css | 5 + .../webfonts/fa-brands-400.eot | Bin 0 -> 130906 bytes .../webfonts/fa-brands-400.svg | 3496 ++++++ .../webfonts/fa-brands-400.ttf | Bin 0 -> 130600 bytes .../webfonts/fa-brands-400.woff | Bin 0 -> 88428 bytes .../webfonts/fa-brands-400.woff2 | Bin 0 -> 75336 bytes .../webfonts/fa-regular-400.eot | Bin 0 -> 34394 bytes .../webfonts/fa-regular-400.svg | 803 ++ .../webfonts/fa-regular-400.ttf | Bin 0 -> 34096 bytes .../webfonts/fa-regular-400.woff | Bin 0 -> 16804 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 13584 bytes .../webfonts/fa-solid-900.eot | Bin 0 -> 192758 bytes .../webfonts/fa-solid-900.svg | 4667 +++++++ .../webfonts/fa-solid-900.ttf | Bin 0 -> 192472 bytes .../webfonts/fa-solid-900.woff | Bin 0 -> 98384 bytes .../webfonts/fa-solid-900.woff2 | Bin 0 -> 75728 bytes .../libs/glide-3.2.3/dist/glide.min.js | 6 - .../libs/{glide-3.2.3 => glide-3.4.1}/LICENSE | 0 .../dist/css/glide.core.css | 0 .../dist/css/glide.core.min.css | 0 .../dist/css/glide.theme.css | 0 .../dist/css/glide.theme.min.css | 0 .../dist/glide.esm.js | 120 +- .../dist/glide.js | 120 +- .../libs/glide-3.4.1/dist/glide.min.js | 6 + .../dist/glide.modular.esm.js | 120 +- theonionbox/libs/jquery-3.3.1/jquery-3.3.1.js | 10364 ---------------- .../libs/jquery-3.3.1/jquery-3.3.1.min.js | 2 - .../libs/jquery-3.3.1/jquery-3.3.1.min.map | 1 - .../libs/jquery-3.4.1/jquery-3.4.1.min.js | 2 + .../libs/jquery.pep-0.6.10/jquery.pep.js | 1205 ++ theonionbox/libs/js-md5-0.7.3/md5.js | 683 + .../LICENSE.txt | 0 .../smoothie.js | 73 +- theonionbox/pages/cc.html | 108 + theonionbox/pages/index.html | 3 +- theonionbox/scripts/authrequest_basic.js | 8 +- theonionbox/scripts/authrequest_digest.js | 12 +- theonionbox/scripts/box.js | 82 +- theonionbox/scripts/cc.js | 8586 +++++++++++++ theonionbox/scripts/md5.js | 342 - .../sections/accounting/accounting.html | 11 +- theonionbox/sections/accounting/accounting.js | 10 +- theonionbox/sections/config/config.html | 14 + theonionbox/sections/control/control.css | 92 - theonionbox/sections/control/control.html | 180 - theonionbox/sections/control/control.js | 174 - theonionbox/sections/host/host.html | 14 +- theonionbox/sections/host/host.js | 8 +- theonionbox/sections/license/license.html | 42 +- theonionbox/sections/local/local.html | 10 +- theonionbox/sections/local/local.js | 2 +- theonionbox/sections/messages/messages.css | 2 +- theonionbox/sections/messages/messages.html | 6 +- theonionbox/sections/messages/messages.js | 51 +- theonionbox/sections/monitor/monitor.js | 36 +- theonionbox/sections/network/network.html | 56 +- .../network_bandwidth/network_bandwidth.html | 8 +- .../network_bandwidth/network_bandwidth.js | 22 +- .../network_weights/network_weights.js | 6 +- theonionbox/sections/transport/transport.html | 34 + theonionbox/sections/transport/transport.js | 23 + theonionbox/stamp.py | 7 +- theonionbox/theonionbox.py | 3260 +---- theonionbox/tob/apps/__init__.py | 3 + theonionbox/tob/apps/base.py | 135 + theonionbox/tob/apps/controlcenter.py | 962 ++ theonionbox/tob/apps/dashboard.py | 922 ++ theonionbox/tob/authenticate.py | 85 + theonionbox/tob/box.py | 503 + theonionbox/tob/ccfile.py | 211 + theonionbox/tob/config.py | 54 + theonionbox/tob/controller.py | 732 -- theonionbox/tob/credits.py | 19 + theonionbox/tob/deviation.py | 191 +- theonionbox/tob/libraries/__init__.py | 9 + theonionbox/tob/libraries/fontawesome.py | 58 + theonionbox/tob/libraries/latolatin.py | 60 + theonionbox/tob/license.py | 26 + theonionbox/tob/livedata/__init__.py | 47 +- theonionbox/tob/livedata/recorder.py | 21 +- theonionbox/tob/livedata/recorder.pyi | 29 - theonionbox/tob/log.py | 216 +- theonionbox/tob/nodes.py | 339 - theonionbox/tob/nodes.pyi | 8 - theonionbox/tob/nodes/__init__.py | 3 + theonionbox/tob/nodes/manager.py | 119 + theonionbox/tob/nodes/node.py | 384 + theonionbox/tob/onionoo.py | 186 +- theonionbox/tob/osxtemp/__init__.pyi | 21 - theonionbox/tob/persistor.py | 96 +- theonionbox/tob/persistor.pyi | 47 - theonionbox/tob/plugin/__init__.py | 1 + theonionbox/tob/plugin/session.py | 53 + theonionbox/tob/proxy.py | 133 +- theonionbox/tob/scheduler.py | 39 +- theonionbox/tob/session.py | 430 +- theonionbox/tob/simplecontroller.py | 20 +- theonionbox/tob/stam/__init__.py | 0 theonionbox/tob/stam/control.py | 321 + theonionbox/tob/stam/socket.py | 74 + theonionbox/tob/static.py | 173 + theonionbox/tob/system/__init__.py | 159 + theonionbox/tob/system/darwin/__init__.py | 238 + .../{ => system/darwin}/osxtemp/__init__.py | 19 +- .../{ => system/darwin}/osxtemp/libsmc.dylib | Bin theonionbox/tob/system/darwin/systray.py | 55 + theonionbox/tob/system/freebsd.py | 82 + theonionbox/tob/system/linux.py | 127 + theonionbox/tob/system/windows/__init__.py | 103 + .../system/windows}/uptime/license.txt | 0 .../system/windows}/uptime/uptime.exe | Bin theonionbox/tob/transportation.py | 106 + theonionbox/tob/utils/__init__.py | 1 + theonionbox/tob/utils/attrdict.py | 33 + theonionbox/tob/version.py | 80 +- theonionbox/tob/wsgiserver.py | 2582 ---- theonionbox/tor/tor.1.html | 1280 +- theonionbox/tor/tor.1.ndx | 2 +- 284 files changed, 58505 insertions(+), 30602 deletions(-) create mode 100644 cc/ControlCenter/__init__.pyj rename theonionbox/tob/external/__init__.py => cc/ControlCenter/cards/__init__.pyj (100%) create mode 100644 cc/ControlCenter/cards/node.pyj create mode 100644 cc/ControlCenter/controlcenter.pyj create mode 100644 cc/ControlCenter/controls/__init__.pyj create mode 100644 cc/ControlCenter/controls/base.pyj create mode 100644 cc/ControlCenter/controls/connection.pyj create mode 100644 cc/ControlCenter/controls/flags.pyj create mode 100644 cc/ControlCenter/controls/smoothie.pyj create mode 100644 cc/ControlCenter/controls/version.pyj create mode 100644 cc/ControlCenter/controls/version_check.pyj create mode 100644 cc/ControlCenter/dialogs/__init__.pyj create mode 100644 cc/ControlCenter/dialogs/about.pyj create mode 100644 cc/ControlCenter/dialogs/base.pyj create mode 100644 cc/ControlCenter/dialogs/launcher.pyj create mode 100644 cc/ControlCenter/dialogs/license.pyj create mode 100644 cc/ControlCenter/dialogs/login.pyj create mode 100644 cc/ControlCenter/dialogs/properties.pyj create mode 100644 cc/ControlCenter/utils/__init__.pyj create mode 100644 cc/ControlCenter/utils/auth.pyj create mode 100644 cc/ControlCenter/utils/format_bytes.pyj create mode 100644 cc/ControlCenter/utils/make_id.pyj create mode 100644 cc/ControlCenter/utils/uuid.pyj create mode 100644 cc/ControlCenter/utils/variables.pyj create mode 100644 cc/lib/RapydSmoothie/__init__.pyj create mode 100644 cc/lib/RapydSmoothie/smoothie.pyj create mode 100644 cc/lib/RapydSmoothie/timeseries.pyj create mode 100644 cc/lib/RapydSmoothie/util.pyj create mode 100644 docs/images/cc.png create mode 100644 theonionbox/css/cc.css delete mode 100644 theonionbox/css/latolatinfonts.css rename theonionbox/{font => libs/LatoLatin}/OFL.txt (100%) mode change 100644 => 100755 create mode 100755 theonionbox/libs/LatoLatin/README-WEB.txt rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Black.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Black.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Black.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Black.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BlackItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BlackItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BlackItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BlackItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Bold.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Bold.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Bold.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Bold.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BoldItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BoldItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BoldItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-BoldItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Hairline.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Hairline.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Hairline.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Hairline.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HairlineItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HairlineItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HairlineItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HairlineItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Heavy.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Heavy.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Heavy.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Heavy.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HeavyItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HeavyItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HeavyItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-HeavyItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Italic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Italic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Italic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Italic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Light.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Light.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Light.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Light.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-LightItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-LightItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-LightItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-LightItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Medium.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Medium.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Medium.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Medium.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-MediumItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-MediumItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-MediumItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-MediumItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Regular.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Regular.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Regular.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Regular.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Semibold.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Semibold.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Semibold.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Semibold.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-SemiboldItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-SemiboldItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-SemiboldItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-SemiboldItalic.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Thin.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Thin.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Thin.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-Thin.woff2 (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-ThinItalic.eot (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-ThinItalic.ttf (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-ThinItalic.woff (100%) rename theonionbox/{font => libs}/LatoLatin/fonts/LatoLatin-ThinItalic.woff2 (100%) create mode 100644 theonionbox/libs/LatoLatin/latolatinfonts.css delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-grid.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-grid.min.css delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-grid.min.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-reboot.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-reboot.min.css delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap-reboot.min.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap.min.css delete mode 100644 theonionbox/libs/bootstrap-4.1.3/css/bootstrap.min.css.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.bundle.js delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.bundle.js.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.bundle.min.js delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.bundle.min.js.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.js delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.js.map delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.min.js delete mode 100644 theonionbox/libs/bootstrap-4.1.3/js/bootstrap.min.js.map rename theonionbox/libs/{bootstrap-4.1.3 => bootstrap-4.3.1}/css/bootstrap-grid.css (57%) create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-grid.css.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-grid.min.css create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-grid.min.css.map rename theonionbox/libs/{bootstrap-4.1.3 => bootstrap-4.3.1}/css/bootstrap-reboot.css (89%) create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-reboot.css.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-reboot.min.css create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap-reboot.min.css.map rename theonionbox/libs/{bootstrap-4.1.3 => bootstrap-4.3.1}/css/bootstrap.css (82%) create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap.css.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap.min.css create mode 100644 theonionbox/libs/bootstrap-4.3.1/css/bootstrap.min.css.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.bundle.js create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.bundle.js.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.bundle.min.js create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.bundle.min.js.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.js create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.js.map create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.min.js create mode 100644 theonionbox/libs/bootstrap-4.3.1/js/bootstrap.min.js.map create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/LICENSE.txt create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/all.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/all.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/brands.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/brands.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/fontawesome.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/fontawesome.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/regular.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/regular.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/solid.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/solid.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/svg-with-js.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/svg-with-js.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/v4-shims.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/css/v4-shims.min.css create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-brands-400.eot create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-brands-400.svg create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-brands-400.ttf create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-brands-400.woff create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-brands-400.woff2 create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-regular-400.eot create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-regular-400.svg create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-regular-400.ttf create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-regular-400.woff create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-regular-400.woff2 create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-solid-900.eot create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-solid-900.svg create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-solid-900.ttf create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-solid-900.woff create mode 100644 theonionbox/libs/fontawesome-free-5.11.2-web/webfonts/fa-solid-900.woff2 delete mode 100755 theonionbox/libs/glide-3.2.3/dist/glide.min.js rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/LICENSE (100%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/css/glide.core.css (100%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/css/glide.core.min.css (100%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/css/glide.theme.css (100%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/css/glide.theme.min.css (100%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/glide.esm.js (96%) mode change 100755 => 100644 rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/glide.js (96%) mode change 100755 => 100644 create mode 100644 theonionbox/libs/glide-3.4.1/dist/glide.min.js rename theonionbox/libs/{glide-3.2.3 => glide-3.4.1}/dist/glide.modular.esm.js (96%) mode change 100755 => 100644 delete mode 100644 theonionbox/libs/jquery-3.3.1/jquery-3.3.1.js delete mode 100644 theonionbox/libs/jquery-3.3.1/jquery-3.3.1.min.js delete mode 100644 theonionbox/libs/jquery-3.3.1/jquery-3.3.1.min.map create mode 100644 theonionbox/libs/jquery-3.4.1/jquery-3.4.1.min.js create mode 100644 theonionbox/libs/jquery.pep-0.6.10/jquery.pep.js create mode 100644 theonionbox/libs/js-md5-0.7.3/md5.js rename theonionbox/libs/{smoothie-1.34.0 => smoothie-1.36}/LICENSE.txt (100%) rename theonionbox/libs/{smoothie-1.34.0 => smoothie-1.36}/smoothie.js (93%) mode change 100755 => 100644 create mode 100644 theonionbox/pages/cc.html create mode 100644 theonionbox/scripts/cc.js delete mode 100644 theonionbox/scripts/md5.js delete mode 100644 theonionbox/sections/control/control.css delete mode 100644 theonionbox/sections/control/control.html delete mode 100644 theonionbox/sections/control/control.js create mode 100644 theonionbox/sections/transport/transport.html create mode 100644 theonionbox/sections/transport/transport.js create mode 100644 theonionbox/tob/apps/__init__.py create mode 100644 theonionbox/tob/apps/base.py create mode 100644 theonionbox/tob/apps/controlcenter.py create mode 100644 theonionbox/tob/apps/dashboard.py create mode 100644 theonionbox/tob/authenticate.py create mode 100644 theonionbox/tob/box.py create mode 100644 theonionbox/tob/ccfile.py create mode 100644 theonionbox/tob/config.py delete mode 100644 theonionbox/tob/controller.py create mode 100644 theonionbox/tob/credits.py create mode 100644 theonionbox/tob/libraries/__init__.py create mode 100644 theonionbox/tob/libraries/fontawesome.py create mode 100644 theonionbox/tob/libraries/latolatin.py create mode 100644 theonionbox/tob/license.py delete mode 100644 theonionbox/tob/livedata/recorder.pyi delete mode 100644 theonionbox/tob/nodes.py delete mode 100644 theonionbox/tob/nodes.pyi create mode 100644 theonionbox/tob/nodes/__init__.py create mode 100644 theonionbox/tob/nodes/manager.py create mode 100644 theonionbox/tob/nodes/node.py delete mode 100644 theonionbox/tob/osxtemp/__init__.pyi delete mode 100644 theonionbox/tob/persistor.pyi create mode 100644 theonionbox/tob/plugin/__init__.py create mode 100644 theonionbox/tob/plugin/session.py create mode 100644 theonionbox/tob/stam/__init__.py create mode 100644 theonionbox/tob/stam/control.py create mode 100644 theonionbox/tob/stam/socket.py create mode 100644 theonionbox/tob/static.py create mode 100644 theonionbox/tob/system/__init__.py create mode 100644 theonionbox/tob/system/darwin/__init__.py rename theonionbox/tob/{ => system/darwin}/osxtemp/__init__.py (80%) rename theonionbox/tob/{ => system/darwin}/osxtemp/libsmc.dylib (100%) create mode 100644 theonionbox/tob/system/darwin/systray.py create mode 100644 theonionbox/tob/system/freebsd.py create mode 100644 theonionbox/tob/system/linux.py create mode 100644 theonionbox/tob/system/windows/__init__.py rename theonionbox/{ => tob/system/windows}/uptime/license.txt (100%) rename theonionbox/{ => tob/system/windows}/uptime/uptime.exe (100%) create mode 100644 theonionbox/tob/transportation.py create mode 100644 theonionbox/tob/utils/__init__.py create mode 100644 theonionbox/tob/utils/attrdict.py delete mode 100644 theonionbox/tob/wsgiserver.py diff --git a/.gitignore b/.gitignore index 3246360..a25196b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ downloads/ eggs/ /xtor .eggs/ -lib/ + lib64/ parts/ sdist/ @@ -64,4 +64,4 @@ theonionbox/theonionbox.ltd # Special to The Onion Box # Glide Library comes with a 'dist' directory that we need! -!theonionbox/libs/glide-*/dist/ \ No newline at end of file +!theonionbox/libs/glide-*/dist/ diff --git a/Docker/Dockerfile b/Docker/Dockerfile index 7191ffa..19ff2b0 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -1,9 +1,9 @@ -FROM python:2.7 +FROM python:3.6 EXPOSE 8080 RUN pip install pip --upgrade && pip install theonionbox -COPY theonionbox.cfg /usr/local/lib/python2.7/site-packages/theonionbox +COPY theonionbox.cfg /usr/local/lib/python3.6/site-packages/theonionbox -ENTRYPOINT ["/usr/local/bin/theonionbox", "-c", "/usr/local/lib/python2.7/site-packages/theonionbox/theonionbox.cfg"] +ENTRYPOINT ["/usr/local/bin/theonionbox", "-c", "/usr/local/lib/python3.6/site-packages/theonionbox/theonionbox.cfg"] diff --git a/Docker/theonionbox.cfg b/Docker/theonionbox.cfg index dd3fb99..5a0a3ad 100644 --- a/Docker/theonionbox.cfg +++ b/Docker/theonionbox.cfg @@ -1,11 +1,5 @@ ## Configuration File for TheOnionBox -## Latest Modification: 2019510 for Dockerfile - - -[config] -## v4.0 will only support version = 2 -protocol = 2 - +## Latest Modification: 20190811 while preparing v5.0 - which then became 19.2 [TheOnionBox] ## Address of your Onion Box: @@ -48,8 +42,7 @@ host = 0.0.0.0 ## DON'T distribute this combined private/public key to clients! ## (see http://www.piware.de/2011/01/creating-an-https-server-in-python/#comment-11380) ## -## ssl = yes # deprecated 20170218 -## Just set ssl_certificate & ssl_key to enable ssl mode! + ## The file that holds the Certificate! # ssl_certificate = server.pem ## The file that holds the Key! @@ -92,13 +85,20 @@ host = 0.0.0.0 # port = 9051 ## Default for a TorBrowser # port = 9151 -## You may use 'default' (port = default) to test for 9051 (relay default) and 9151 (browser default) -# port = default -## Note: This defaults to port = default if not defined! + +## You may use 'auto' (port = auto) to test for 9051 (relay default) and 9151 (browser default) +# port = auto +## Note: This defaults to port = auto if not defined! ## ControlSocket of this Tor instance # socket = /var/run/tor/control +## Authorization Cookie - necessary to access a Tor node via a hidden service utilizing HiddenServiceAuthorizeClient +# auth_cookie = YourCookieHereLength22 +## There's no default value for this option. + +# TODO 20190811: [Tor] options below this line are deprecated! + ## Timeout when connecting to Tor. ## Usually the connection should be established very quick; ## you may increase this if connecting to very remote systems. @@ -126,119 +126,52 @@ host = 0.0.0.0 # tor_preserve_WARN = no # tor_preserve_NOTICE = no - [TorProxy] +## These parameters configure a connection to a Tor node acting as SocksProxy into the Tor network. ## Note: Operation via a proxy given by a unix domain socket is (as of 04/2017) not supported! ## If you establish connection cookies for hosts to be controlled via the control center, there is the need ## to verify that those cookies are defined. To perform the verification, we need valid control port ## settings of the node acting as proxy: + ## How shall we establish the connection to the node? ## => via a ControlSocket (define additionally 'socket' parameter): # control = socket ## => via a ControlPort (define additionally 'port' parameter): # control = port -## You may use control = default to operate with [Tor]control -## Note: This defaults to control = default if not defined! + +## You may use control = tor to operate with the node configured in [Tor] +# control = tor +## Note: This defaults to control = tor if not defined! ## Address of the proxy to use ## Do NOT use 'localhost' but 127.0.0.1 to connect locally -## You may use 'default' (host = default) to use [Tor]host -# host = default +## You may use 'tor' (host = tor) to use [Tor]host +# host = tor # host = 127.0.0.1 -## Note: This defaults to host = default if not defined! -## Port for the proxy +## SocksPort of the proxy ## Default for a Relay (or Bridge) # proxy = 9050 ## Default for a Tor Browser # proxy = 9150 -## You may use 'default' (proxy = default) to test for 9050 (relay default) and 9150 (browser default) -# proxy = default -## Note: This defaults to proxy = default if not defined! + +## You may use 'auto' (proxy = auto) to test for 9050 (relay default) and 9150 (browser default) +# proxy = auto +## Note: This defaults to proxy = auto if not defined! ## ControlPort of the proxy Tor node ## Default for a Relay (or Bridge) # port = 9051 ## Default for a Tor Browser # port = 9151 -## You may use 'default' (port = default) to test for 9051 (relay default) and 9151 (browser default) -# port = default -## Note: This defaults to port = default if not defined! - -## ControlSocket of the proxy Tor node -# socket = /var/run/tor/control -## You may use 'default' (socket = default) to use [Tor]socket -# socket = default -## Note: This defaults to socket = default if not defined! - - -##### -## Those are the Tor nodes to be controlled with the control center -## Note: You must not name any of the following sections 'config', 'TheOnionBox', 'Tor' or 'TorProxy'. - -## Define one section per node: -# [myControlledNode] +## You may use 'auto' (port = auto) to test for 9051 (relay default) and 9151 (browser default) +# port = auto +## You may use 'tor' (port = tor) to use [Tor]port +# port = tor -## Alternatively: Beginning the section identifier with '#' indicates a nickname; -## if you later omit the 'nick' parameter, the nickname will be derived from the section identifier. -# [#myControlledNode] -## If you intend to define several ways to connect to this node, -## add whatever you like after a ':' to distinguish the sections: -# [#myControlledNode:2] - -## Alternatively: You can use the fingerprint (with preceding '$') as section identifier. -## Ensure a length of 41 characters: '$' + fingerprint[40]; -## if you later omit the 'fp' parameter, the fingerprint will be derived from the section identifier. -# [$5COOL5C30AXX4B3DE460815323967087ZZ53D947] -## If you intend to define several ways to connect to this node, -## add whatever you like after a ':' to distinguish the sections: -# [$5COOL5C30AXX4B3DE460815323967087ZZ53D947:2] - - -## How shall we establish the connection to this node? -## => via a ControlSocket (define additionally 'socket' parameter): -# control = socket -## => via a ControlPort (define additionally 'host' & 'port' parameter): -# control = port -## => via a Proxy (define a proxy via the [Proxy] section and set 'host' to an address reachable through this proxy): -# control = proxy -## Note: There is no default setting. If not defined, this section (and thus the node) will be ignored. - -## IP Address of this Tor node -# host = 127.0.0.1 -## You may as well define an onion or http address -# host = takeonionaddress.onion -## Note: There is no default setting. - -## ControlPort of this Tor node -## Default for a Relay (or Bridge) -# port = 9051 -## Note: There is no default setting. - -## This is only relevant for very rare setups - yet if you like, you may use it! -## ControlSocket of this Tor node +## ControlSocket of the proxy Tor node # socket = /var/run/tor/control -## Note: There is no default setting. - -## Hidden Service connections may be secured by definition of a authorization cookie. -## To operate via those connections, you may define this cookie here. -## For further details refer to 'HiddenServiceAuthorizeClient' on https://www.torproject.org/docs/tor-manual.html -# cookie = xuseyourcookieherexTOB -## The Box will ensure that the cookie is registered before establishing the connection. -## Note: There is no default setting. - -## The nickname of this node -# nick = myControlledNode -## Defining a nickname here overrides a nickname defined as the name of the section. -## Note: The Box is able to retrieve the nickname itself, -## yet defining nickname (and fingerprint) parameters saves onionoo queries. -## Note: There is no default setting. - -## The fingerprint of this node -# fp = $5COOL5C30AXX4B3DE460815323967087ZZ53D947 -## Defining a fingerprint here overrides a fingerprint defined as the name of the section. -## Note: The Box is able to retrieve the fingerprint itself, -## yet defining fingerprint (and nickname) parameters saves onionoo queries. -## Note: There is no default setting. +## You may use 'tor' (socket = tor) to use [Tor]socket +# socket = tor diff --git a/LICENSE b/LICENSE index 3b70b64..ab450ac 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 - 2018 Ralph Wetzel +Copyright (c) 2015 - 2019 Ralph Wetzel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6c17766..69d52a5 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,41 @@ ![Supported Python versions](https://img.shields.io/pypi/pyversions/theonionbox.svg?style=flat-square) ![Status](https://img.shields.io/pypi/status/theonionbox.svg?style=flat-square) +--- +### The Onion Box v19: Preliminary documentation +## The ControlCenter + +This latest version of The Onion Box introduces three changes of relevance: +* The current versioning scheme was dropped in preference for [Calendar Versioning](www.calver.org). Thus v19.2 will become the successor of v4.3.1. +* The Onion Box v19.2 and later requires Python 3.6 or Python 3.7. If you need to operate with Python2, you have to stay with The Onion Box v4.3.1. +* In addition to the well known (legacy) dashboard, suitable to monitor just a single Tor instance, The Onion Box now provides a ControlCenter mode to monitor a(ny) number of Tor nodes in parallel. That's how it looks like: + +![image](docs/images/cc.png) + +This is the shorttrack way to enable the ControlCenter mode: + +1) Setup your Onion Box as you did before - and you'll get the legacy dashboard (as before). +2) Create a configuration file, that shall be used to store the configuration data of the ControlCenter. The easiest way to do this on a *nix-type system: + ``` + (theonionbox) ~/theonionbox $ touch cc.cfg + ``` + Please ensure write privileges for that file to the user running your Onion Box. +3) Tell your Onion Box where to find this configuration file - via the command line parameter `--controlcenter` or `-x`: + +``` +(theonionbox) ~/theonionbox $ theonionbox -x cc.cfg +``` + +4) Use the + - button in the upper right corner of the ControlCenter to add additional Tor nodes to be monitored. + +5) The legacy dashboard with detail data for each node will show up if you follow the dedicated 'Show Details' link of each node. + +6) To re-arrange the nodes in your ControlCenter, just Drag & Drop them around. + +Enjoy! + + +--- _The Onion Box_ provides a web interface to monitor the operation of a [Tor](https://www.torproject.org) node. It is able to monitor any Tor node operated as relay, as bridge and even as client - as long as it can establish a connection to the node and authenticate successfully. @@ -173,17 +208,16 @@ _Weights_ displays the weights history data as known to Onionoo. The number of available charts depends on the age of the Tor node monitored. You may switch the chart displayed via the _History Charts_ buttons. --- - ### Control Center -Do you intend to monitor more than one Tor node? Are you interested in the Oninooo data of other Tor nodes? The section _Box | Control Center_ provides that functionality. +~~Do you intend to monitor more than one Tor node? Are you interested in the Oninooo data of other Tor nodes? The section _Box | Control Center_ provides that functionality.~~ ![image](docs/images/control.png) #### Search -Enter a search phrase - which should be a (part of a) nickname of a Tor node or a (portion of a) fingerprint - into the _Search_ field and press enter. This search phrase will be used to query Onionoo - and the result presented in a popup bubble. If the search was successful, you may click on the links provided to display the Tor network status protocol data of that Tor node. +~~Enter a search phrase - which should be a (part of a) nickname of a Tor node or a (portion of a) fingerprint - into the _Search_ field and press enter. This search phrase will be used to query Onionoo - and the result presented in a popup bubble. If the search was successful, you may click on the links provided to display the Tor network status protocol data of that Tor node.~~ #### Controlled Hosts -If you provided access control information for additional Tor nodes in the configuration file of your box, those nodes are listed under _Controlled Hosts_. Click on the fingerprint and you will be connected to that Tor node. +~~If you provided access control information for additional Tor nodes in the configuration file of your box, those nodes are listed under _Controlled Hosts_. Click on the fingerprint and you will be connected to that Tor node.~~ --- @@ -386,8 +420,8 @@ Second finding! There were three additional subdirectories created: * `docs`, that holds the images used in this document. * `service`, to provide the launchers if you intend to run your box as a [system service / daemon](#the-onion-box-as-system-service-aka-daemon) and the files to support the [Docker](#the-onion-box-docker-support) image setup. -The python packages - for the box and all it's dependencies - are located in `lib/python2.7/site-packages/`. Be aware, that the `python ` path segment might be different (e.g. `lib/python3.6/site-packages/`) if your virtual environment operates with another version of python! -_The Box Launcher_ (named as well `theonionbox`) is located in `bin/`, next to the executables of the python version used in your virtual environment. +The Python packages - for the box and all it's dependencies - are located in `lib/python2.7/site-packages/`. Be aware, that the `python` path segment might be different (e.g. `lib/python3.6/site-packages/`) if your virtual environment operates with another version of Python! +_The Box Launcher_ (named as well `theonionbox`) is located in `bin/`, next to the executables of the Python version used in your virtual environment. If the structure of your installation looks equivalent, your box is now cleared for takeoff! @@ -1329,7 +1363,7 @@ ProxyPass "/theonionbox" "http://192.168.178.46:8080" After a restart of Apache, browsing to `localhost/theonionbox` on your proxy server should then redirect to `http://192.168.178.46:8080`. Doing so should open your *Box* page - yet it looks scrumbled and doesn't operate as it should. -To solve that issue you have to set the parameter `proxy_path` in your `theonionbox.cfg` configuration file to match the `` you defined earlier: +To solve that issue you have to set the parameter `base_path` in your `theonionbox.cfg` configuration file to match the `` you defined earlier: ``` # Per default, the Box operates at the root level of a domain e.g. http://localhost:8080/. @@ -1337,7 +1371,7 @@ To solve that issue you have to set the parameter `proxy_path` in your `theonion # you have to define that base path here. You are not limited to a single path element. # Please assure that this is an absolute filepath yet without the domain:port, beginning with a leading slash, # no trailing slash, no quotation marks: -proxy_path = /theonionbox +base_path = /theonionbox ``` Now everything should work as expected. diff --git a/cc/ControlCenter/__init__.pyj b/cc/ControlCenter/__init__.pyj new file mode 100644 index 0000000..dc97cf4 --- /dev/null +++ b/cc/ControlCenter/__init__.pyj @@ -0,0 +1 @@ +from controlcenter import ControlCenter \ No newline at end of file diff --git a/theonionbox/tob/external/__init__.py b/cc/ControlCenter/cards/__init__.pyj similarity index 100% rename from theonionbox/tob/external/__init__.py rename to cc/ControlCenter/cards/__init__.pyj diff --git a/cc/ControlCenter/cards/node.pyj b/cc/ControlCenter/cards/node.pyj new file mode 100644 index 0000000..dfbdfd7 --- /dev/null +++ b/cc/ControlCenter/cards/node.pyj @@ -0,0 +1,886 @@ +from utils.format_bytes import format_bytes +from utils.make_id import make_id as MakeID + +from controls.smoothie import Smoothie, TimeSeries +# from utils.auth import auth_from_header + +from dialogs.base import Message as MessageDialog +from dialogs.login import Login + +from controls.flags import Flags +from controls.connection import Connection +# from controls.mode import Mode +from controls.version_check import VersionCheck +from controls.version import Version + +from utils.variables import TimestampedVariable + +class Node: + + def __init__(self, id, base_path='', position=None): + + self.id = id + self.base_path = base_path + + self.update_timer = None + self.updating = None + self.update_timestamp = None + + self.chart_options = { + 'millisPerPixel': 500, + 'maxValueScale': 1.1, + 'minValueScale': 1.1, + 'maxDataSetLength': Math.max(screen.width, screen.height), + 'interpolation': 'step', + 'enableDpiScaling': True, + 'timeLabelLeftAlign': True, + 'timeLabelSeparation': 2, + 'grid': { + 'millisPerLine': 60000, + 'timeDividers': '', + 'fillStyle': '#E6E6E6', + 'strokeStyle': '#777777', + 'verticalSections': 1, + 'borderVisible': False + }, + 'labels': { + 'fontFamily': 'LatoLatinWebLight', + 'fillStyle': '#000000', + 'disabled': False, + 'fontSize': 10, + 'precision': 2 + }, + 'timestampFormatter': def(date): + def pad2(number): + return ('0' + number) if number < 10 else number + return pad2(date.getHours()) + ':' + pad2(date.getMinutes()) + , 'yMaxFormatter': def(data, precision = 2): + return format_bytes(data) + '/s' + , 'yMinFormatter': def(data, precision = 2): + return format_bytes(Math.abs(data)) + '/s' + , 'limitFPS': 10 + } + + self.chart = None + self.read_data = None + self.written_data = None + self.chart_monitor = None + + self.clone = None + self.card_index = TimestampedVariable(position) + + def make_id(self, tag=None, jquery=True): + return MakeID(self.id, tag, jquery) + + def attach(self, parent_element, after_element=None): + + if not v'(parent_element instanceof jQuery)': + parent_element = $(parent_element) + assert(parent_element.length > 0) + + if not v'(after_element instanceof jQuery)' and after_element is not None: + after_element = $(after_element) + if not after_element.length: + after_element = None + + self.parent = parent_element + self.after = after_element + + card_spinner = """ +
+
+
+
+
+
+
+ """ + + canvas_html = """ +
+ + +
+ """ + + xxx = """ + + + + + """ + + card_html = """ +
+
+
+ + {label} + + +
+
+
+ + + +
+
+
+
+ +
+ + + + +
+
+ """ + + card = str.format(card_html, + id=self.id, + base_path = self.base_path, + label = self.label or 'Connecting...', + version = self.version or '' + ) + + self.card = $(card) + self.position(self.card) + + $(self.make_id("retry")).on('click', def(): + self.retry() + return False + ) + + $(self.make_id("login")).on('click', def(): + self.perform_login(self.label) + return False + ) + + $(self.make_id("edit")).on('click', def(): + self.edit_node() + return False + ) + + self.set_links(retry=False) + + self.flags = Flags(self.id, 'flags') + self.connection = Connection(self.id, 'connection') + # self.tor_mode = Mode(self.id, 'mode') + self.version_check = VersionCheck(self.id, 'version.check') + self.tor_version = Version(self.id, 'version') + + self.init_pep() + + # This is done to decouple the inital data requests a bit from the launching sequence! + # Ensures as well that the fonts are loaded when we need the icons! + setTimeout(def(): + self.update() + , Math.random()*1000 + ) + + def set_links(self, edit=True, details=None, retry=None, login=None): + + # print(edit, details, retry, login) + + def set_link($control, status=None): + if status in [True, False]: + if $control.is(':hidden'): + $control.show() + $a = $control.find('a') + $s = $control.find('span') + if status is True: + $a.show() + $s.hide() + else: + $a.hide() + $s.show() + else: + if $control.is(':visible'): + $control.hide() + + set_link($(self.make_id("edit")), edit) + set_link($(self.make_id("details")), details) + set_link($(self.make_id("retry")), retry) + set_link($(self.make_id("login")), login) + + def detatch(self): + if self.update_timer is not None: + clearTimeout(self.update_timer) + + self.card.fadeOut('1500', def(): + self.card.remove() + ) + + def moveTo(self, after_element=None): + if not v'(after_element instanceof jQuery)' and after_element is not None: + after_element = $(after_element) + if not after_element.length: + after_element = None + + self.after = after_element + self.position(self.card) + + def perform_login(self, server): + + from utils.auth import Basic, Digest + + Login(server, self.id).show().then(def(data): + + if data? and data.password? and data.password.length > 0: + + url = self.base_path + "/" + self.id + "/cc/" + "login" + + # Cancel the update timer, + if self.update_timer is not None: + clearTimeout(self.update_timer) + + # display the spinner, ... + spinning = """ +
+ + + +
+ """ + $(self.make_id("top")).html(spinning) + + # ... then launch the auth sequence. + $.post({ + 'url': url, + 'timeout': 10000 + }) + .fail(def(request, textStatus, errorThrown): + if request.status == 401: + header = request.getResponseHeader('WWW-Authenticate') + # console.log(header) + elements = header.split(',') + if elements.length > 1: + auth = Digest(header, 'POST', url) + else: + auth = Basic(header) + + $.post({ + 'url': url, + 'timeout': 10000, + 'headers': { + 'Authorization': auth.create_auth_header(self.id, data.password) + } + }) + .done(def(data, textStatus, response): + # console.log("Done Date: " + data) + self.id = data + + # refetch of self.after + self.after = self.card.prev() + + self.card.remove() + self.attach(self.parent, self.after) + ) + .fail(def(request, textStatus, errorThrown): + # console.log("Fail textStatus: " + textStatus) + pass + ) + .always(def(): + self.update() + ) + + else: + self.update() + ) + .done(def(): + # by definition, this should not happen - yet you never know... + self.update() + ) + ) + + def edit_node(self): + url = self.base_path + "/" + self.id + "/cc/" + "edit" + $.post({ + 'url': url, + 'timeout': 10000 + }) + .done(def(data, textStatus, response): + data = JSON.parse(data) + + from dialogs.properties import Properties as NodeProperties + NodeProperties(self.id, self.base_path, data['config']).show() + ) + + + def retry(self): + retry = """ +
+ +
+ """ + $(self.make_id("top")).html(retry) + self.set_links(retry=False) + self.update() + + def update(self): + + if self.currently_updating is True: + return + + self.currently_updating = True + + # console.log(str.format("Now updating {id}.", id=self.id)) + + data = {} + + # This will suppress the initial values set prior to the first update run + if self.update_timestamp: + position = self.card_index.if_modified_since(self.update_timestamp) + if position is not None: + data['position'] = position + + post_params = { + 'url': self.base_path + "/" + self.id + "/cc/" + "data" + , 'headers': { + 'if-modified-since': self.ims, + 'timeout': 2000 + } + } + + if len(data) > 0: + post_params['data'] = data + + self.update_timestamp = (new Date).getTime() + + $.post(post_params) + .done(def(data, textStatus, response): + + status202 = """ +
+ + + +
+ """ + + if response.status == 202: + top = $(self.make_id("top")).html(status202) + self.set_links(retry=False) + + elif response.status == 200: + + # if canvas area does not exist... + c = self.make_id('chart') + + if not $(c).length: + + canv = """ + + + """ + + # ... create it ... + $(self.make_id("top")).html(str.format(canv, id=self.make_id('chart', jquery = False))) + + # ... initialize the chart object, + self.chart = Smoothie(self.chart_options) + + # ... create the TimeSeries + self.read_data = TimeSeries() + self.written_data = TimeSeries() + + # ... and add them to the chart. + self.chart.addTimeSeries(self.read_data, { 'lineWidth': 1, + 'strokeStyle': 'rgb(132, 54, 187)', + 'fillStyle': 'rgba(132, 54, 187, 0.30)' + }) + + self.chart.addTimeSeries(self.written_data, { 'lineWidth': 1, + 'strokeStyle': '#64B22B', + 'fillStyle': 'rgba(100, 178, 43, 0.30)' + }) + + # Finally: The streaming logic: + # Preparation... + self.chart.streamTo($(c)[0], 5000) # This does NOT launch the streaming... + + # ... & Enablement: + if (scrollMonitor?): + # if scrollMonitor.js is present - use this for optimization! + self.chart_monitor = scrollMonitor.create($(c)[0], 100) + self.chart_monitor.enterViewport(def(): + self.chart.start() + ) + self.chart_monitor.exitViewport(def(): + self.chart.stop() + ) + else: + self.chart.start() # ... but this does! + + self.ims = response.getResponseHeader('Last-Modified') + + show_edit = True + + d = JSON.parse(data) + for key in d: + if key in ['version', 'latest', 'versionflag', 'mode']: + self[key] = d[key] + elif key == 'flags': + + $container = $(self.make_id('flags-c')) + self.flags.update(d['flags'], self.mode) + + show = d['flags'].length > 0 + if show is False and $container.is(':visible'): + $container.hide('slow') + elif show is True and $container.is(':hidden'): + $container.show('slow') + + elif key == 'conn': + self.connection.update(d['conn']) + + if 'h' in d['conn']: + $card = $(self.make_id('card')) + if $card.hasClass('droppable'): + $card.addClass('border-primary').removeClass('droppable') + + $s = $(self.make_id()) + if $s.hasClass('pep'): + $s.removeClass('pep') + $.pep.unbind($s) + + show_edit = None + + elif key == 'label': + label = $(self.make_id('label')) + label.text(d['label']) + self.label = d['label'] + + elif key == 'details': + details = d['details'] + $details = $(self.make_id('details')) + if details == True: + if $details.is(':hidden'): + $details.show('slow') + else: + $details.hide('slow') + + elif key == 'bw': + + if 'representing' in d: + rep = d['representing'] + $(document).trigger("tobcc.bandwidth", [self.id, rep, d['bw']]) + + for datapoint in d['bw']: + ts = datapoint.s + self.read_data.append(ts, datapoint.r) + self.written_data.append(ts, datapoint.w) + + # to zeroise the chart after the last datapoint added + ts += 1000 + self.read_data.append(ts, 0) + self.written_data.append(ts, 0) + + dp = d['bw'][0] + + has_html = $(self.make_id('updown')).html().length > 0 + + # console.log(has_html) + + up_down = """ +
{down}
+
{up}
+ """ + # {down} | + # {up} + + up_down = str.format(up_down, + down=format_bytes(dp.tr, '', 'si'), + up=format_bytes(dp.tw, '', 'si') + ) + + $(self.make_id('updown')).html(up_down) + + if has_html == False: + $(self.make_id('updown')).slideDown('slow') + + elif key == 'style': + style = d['style'] + # console.log(style) + if style == 'readonly': + + $(self.make_id()).addClass('border-secondary') + pass + + # self.version_check.update(self.version, self.latest, self.versionflag) + self.tor_version.update(self.version, self.mode, self.latest, self.versionflag) + # self.mode_control.update(self.mode, self.version, None, self.latest) + # self.mode_control_1.update(self.mode, self.version, None, self.latest) + + self.set_links(edit=show_edit, details=True) + $(self.make_id('spinner')).hide() + + self.update_timer = setTimeout(def(): + self.update() + , 5000) + + # self.currently_updating = False + + ) + .fail(def(request, textStatus, errorThrown): + # console.log(str.format("Fail Updating {id}: {status}", id=self.id, status=textStatus)) + # console.log(request.readyState) + + status_rs0 = """ +
+ + + + +
+ """ + + + self.destroy_chart() + + if request.readyState == 0: + + # print("rs0!!!") + + status_rs0 = str.format(status_rs0, id=self.id) + top = $(self.make_id("top")).html(status_rs0) + + noconn = $(self.make_id("noconn")) + noconn.css('cursor', 'pointer') + noconn.on('click', def(): + self.retry() + return False + ) + + self.set_links(retry=False) + + elif request.status == 404 or request.status == 0: + + status404 = """ +
+ + + + +
+ """ + + status404 = str.format(status404, id=self.id) + top = $(self.make_id("top")).html(status404) + + # print("404!!!") + + exclam = $(self.make_id("exclam")) + exclam.css('cursor', 'pointer') + exclam.on('click', def(): + self.retry() + return False + ) + + self.set_links(retry=True) + + elif request.status == 401: + + status401 = """ +
+ + + + +
+ """ + status401 = str.format(status401, id=self.id) + + origin = request.getResponseHeader('Content-Location') + if origin? and origin.length > 0: + + split = origin.split('/') + if split.length == 3 and split[0] == 'Tor': + self.version = split[1] + if split[2].length > 0: + self.label = split[2] + else: + label='Loading...' + + $(self.make_id("label")).text(self.label) + # $(self.make_id("version")).text("Tor " + self.version) + self.tor_version.update(self.version) + + header = request.getResponseHeader('WWW-Authenticate') + if header? and header.length > 0: + # console.log(header) + # auth_from_header(header) + pass + + top = $(self.make_id("top")).html(status401) + + lock = $(self.make_id("login_lock")) + lock.css('cursor', 'pointer') + lock.on('click', def(): + self.perform_login(self.label) + return False + ) + + self.set_links(login=True) + + # Keep Alive signal... + self.update_timer = setTimeout(def(): + self.update() + , 25000) + ) + .always(def(data): + # # console.log(str.format("Always after Updating {id}.", id=self.id)) + # self.update_timer = setTimeout( + # def(): + # self.update(); + # , 5000 + # ) + + self.currently_updating = False + ) + + def destroy_chart(self): + + if self.chart_monitor is not None: + self.chart_monitor.destroy() + self.chart_monitor = None + + self.chart = None + self.written_data = None + self.read_data = None + + def position(self, el): + # print(self.after) + if self.after is None: + self.parent.prepend(el) + else: + # print(self.after) + self.after.after(el) + + # Drag & Drop functionality + def init_pep(self): + + $(self.make_id()).pep({ + 'droppable': '.droppable' + # , 'debug': True + , 'deferPlacement': True + , 'startThreshold': [5, 5] + , 'elementsWithInteraction': '.pep-click' + # 'useBoundingClientRect': True, + , 'constrainTo': 'parent' + # , 'callIfNotStarted': [] + , 'initiate': def (ev, obj): + + # If we have a clone, there's something already happening. + if self.clone?: + return False + + # This is the Card + $card = $(self.make_id()) + + # self is not its own droptarget + $card.children(":first").removeClass('droppable') + + # Create a clone of this Card... + self.clone = $card.clone() + # ... but without all the stuff pep adds. + self.clone.removeAttr('style') + + # alter all id's of the clone ... + self.clone.find('*').each(def(index): + id = $(this).prop('id') + if id? and id.substring(0, 6) == 'tobcc.': + $(this).prop('id', 'clone.' + id) + # console.log($(this).prop('id')) + ) + + # ... including that of the Card itself. + self.clone.prop('id', '') + + # if there's a chart + chart_id = self.make_id('chart') + if $(chart_id).length > 0: + # ... and it's clone + $chart_clone = self.clone.find('canvas') + if $chart_clone.length > 0: + # ...copy it's content to the clone + self.chart.snapshot_to($chart_clone[0]) + + # Opacity to distinguish the clone from the Card: + self.clone.css('opacity', 0.5) + + # This Clone is not a droptarget + self.clone.children(":first").removeClass('droppable') + + # The clone takes the position of the Card... + # ... which we re-fetch to prevent mis-ordering in case there had been d&d operations before! + self.after = $card.prev() + if self.after.length < 1: + self.after = None + + self.position(self.clone) + + # ... and the Card is moved to the end - to be on top of the zindex of all cards. + $(self.parent).append($card) + + , 'start': def(ev, obj): + + # This is the Card + $card = $(self.make_id()) + $card.children(":first").css('box-shadow', + '0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1)') + + , 'drag': def(ev, obj): + + mx = ev.pep.x - window.scrollX + my = ev.pep.y - window.scrollY + + for adr in this.activeDropRegions: + drop_cr = adr[0].getBoundingClientRect() + if !(mx > drop_cr.right or mx < drop_cr.left or my < drop_cr.top or my > drop_cr.bottom): + clone_cr = self.clone[0].getBoundingClientRect() + p = adr.parent() + if clone_cr.top < drop_cr.top: + p.after(self.clone) + elif clone_cr.top > drop_cr.top: + p.before(self.clone) + else: + if clone_cr.left < drop_cr.left: + p.after(self.clone) + elif clone_cr.left > drop_cr.left: + p.before(self.clone) + + # self.clone[0].scrollIntoView() + break + + , 'revert': True + , 'revertIf': def(): + + # We use the revert merchanic to smoothly move the card into it's position + # Challenge is to provide the correct coordinates of this new position + + # So this is the Card - currently in motion! + $card = $(self.make_id()) + + # calculate the diff between the Card and its Clone + cr = $card[0].getBoundingClientRect() + clone_cr = self.clone[0].getBoundingClientRect() + + pep = $card.data('plugin_pep') + dx = clone_cr.left - cr.left + dy = clone_cr.top - cr.top + + # Prepare deltas so pep hadles them correctly + dx = ("+=" + dx) if (dx > 0 ) else ("-=" + Math.abs(dx)) + dy = ("+=" + dy) if ( dy > 0 ) else ("-=" + Math.abs(dy)) + + # Disable the (standard) css algo... + pep.useCSSTranslation = False + + # ... yet enable the alternative & provide the intended motion parameters + pep.place = True + pep.initialPosition.left = dx + pep.initialPosition.top = dy + + # Now ... you may revert! + return True + + # Just be aware that the Card still sits at the wrong position in the HTML tree. + # It was just moved 'visually' to its new position. + # Cleanup will be performed @ rest. + + ,'rest': def(ev, obj): + + # The Card stopped at it's final position + # Time for cleanup. + + $card = $(self.make_id()) + + position_changed = False + + if self.clone?: + + assert(v'typeof(self.after)' == 'object') + + # Remember the id of the current position reference + # if self.after? and not self.after.attr?: + # console.log(self.after) + + current_pos = self.after.attr('id') if self.after? else None + + # Then: Get the (possibly altered) position of the Clone + self.after = self.clone.prev() + if self.after.length < 1: + self.after = None + + # Check if the position changed + new_pos = self.after.attr('id') if self.after? else None + position_changed = (current_pos != new_pos) + + # Then: Remove the Clone. Job Done. + self.clone.remove() + self.clone = None + + # Move Card to new position in HTML tree + self.position($card) + + # Notify the CC server about the change - if there was one + if position_changed is True and self.after is not None: + after_id = self.after.attr('id') # This begins with 'tobcc.', len(6) ... + $.post(self.base_path + "/" + self.id + "/cc/" + "position", {'position': after_id[6:]}) + + # Now this can be a droptarget again + $card.children(":first").addClass('droppable') + # yet needs no shadow any more + $card.children(":first").css('box-shadow', '') + + # Reset pep + obj.$el.removeAttr('style') + $.pep.unbind(obj.$el) + self.init_pep() + }) diff --git a/cc/ControlCenter/controlcenter.pyj b/cc/ControlCenter/controlcenter.pyj new file mode 100644 index 0000000..162517b --- /dev/null +++ b/cc/ControlCenter/controlcenter.pyj @@ -0,0 +1,260 @@ +from cards.node import Node as NodeCard + +from utils.make_id import make_id +from utils.format_bytes import format_bytes + +from controls.smoothie import Smoothie, TimeSeries +from dialogs.launcher import Launcher + +@external +class XMLHttpRequest: + pass + +class ControlCenter(): + + def __init__(self, launcher = True): + + if launcher: + Launcher().show() + + self.session_id = "{{session.id}}" + self.base_path = "{{virtual_basepath}}" + + self.cards = [] + + self.do_ping = True + self.ims = "Wed, 21 Oct 2015 07:28:00 GMT" # dummy value in the past! + + # self.buttonAdd = NavBarButton('Add Node') + # self.buttonAdd.append_to('#navbar_buttons') + # self.buttonAdd.on_click(_.bind(self.on_new_node, self)) + # + # self.buttonEdit = NavBarButton('Edit Node') + # self.buttonEdit.append_to('#navbar_buttons') + # self.buttonEdit.on_click(def(): + # self.buttonDetails.disabled = (not self.buttonDetails.disabled) + # ) + # + # self.buttonDetails = NavBarButton('Show Details') + # self.buttonDetails.append_to('#navbar_buttons') + # # self.buttonDetails.on_click(_.bind(self.on_new_node, self)) + # self.buttonDetails.disabled = True + + self.chart_options_1 = { + 'millisPerPixel': 500, + 'maxValueScale': 1.1, + 'minValueScale': 1.1, + 'maxDataSetLength': Math.max(screen.width, screen.height), + 'interpolation': 'step', + 'enableDpiScaling': True, + 'timeLabelLeftAlign': True, + 'timeLabelSeparation': 2, + 'grid': { + 'millisPerLine': 0, #300000, + 'timeDividers': '', + 'fillStyle': "rgba(255, 255, 255, 0.0)", + 'strokeStyle': "rgba(255, 255, 255, 0.75)", + 'verticalSections': 1, + 'borderVisible': False + }, + 'labels': { + 'fontFamily': 'LatoLatinWebLight', + 'fillStyle': "rgba(255, 255, 255, 1)", + 'disabled': False, + 'fontSize': 10, + 'precision': 2 + }, + 'timestampFormatter': def(date): + def pad2(number): + return ('0' + number) if number < 10 else number + return pad2(date.getHours()) + ':' + pad2(date.getMinutes()) + , 'yMaxFormatter': def(data, precision = 2): + return format_bytes(data) + '/s' + , 'yMinFormatter': def(data, precision = 2): + return format_bytes(Math.abs(data)) + '/s' + } + + self.chart = Smoothie(self.chart_options_1) + + # ... create the TimeSeries + self.read_data = TimeSeries() + self.written_data = TimeSeries() + + # ... and add them to the chart. + self.chart.addTimeSeries(self.read_data, { 'lineWidth': 1, + 'strokeStyle': 'rgb(255, 255, 255)', + 'fillStyle': 'rgba(255, 255, 255, 0.25)' + }) + + self.chart.addTimeSeries(self.written_data, { 'lineWidth': 1, + 'strokeStyle': 'rgb(255, 255, 255)', + 'fillStyle': 'rgba(255, 255, 255, 0.50)' + }) + + ts = int((new Date).getTime() / 1000) * 1000 + self.read_data.append(ts, 0, True) + self.written_data.append(ts, 0, True) + + c = $('#topchart') + self.chart.streamTo($(c)[0], 5000) # This does NOT launch the streaming... + + if (scrollMonitor?): + # if scrollMonitor.js is present - use this for optimization! + self.chart_monitor = scrollMonitor.create($(c)[0], 100) + self.chart_monitor.enterViewport(def(): + self.chart.start() + ) + self.chart_monitor.exitViewport(def(): + self.chart.stop() + ) + else: + self.chart.start() # ... but this does! + + self.stream_data_providers = {} + $(document).on('tobcc.bandwidth', def(event, id, rep, data): + + # print(self.stream_data_providers) + + sdp = {} + + if len(data) > 0 and rep in self.stream_data_providers: + sdp = self.stream_data_providers[rep] + if sdp.id != id and sdp.tss > int(data[0].s / 1000) - 15: + # if the registered sdp is different than the one just triggering + # and the registered one recently ( < 15 s) triggered as well + return + + sdp.id = id + + for datapoint in data: + # ts = Math.floor(datapoint.s / 1000) + # ts = datapoint.s + tss = int(datapoint.s / 1000) + + if sdp.tss?: + if tss == sdp.tss: + # if two consecutive timestamps fall into the same second + # take the second one and write it into a buffer + sdp.r = datapoint.r + sdp.w = datapoint.w + continue + + if tss > sdp.tss + 1 and sdp.r?: + # if there's a gap between two consecutive timestamps + # and the buffer is filled, emit the buffer... + self.read_data.append((sdp.tss + 1)*1000, sdp.r, True) + self.written_data.append((sdp.tss + 1)*1000, sdp.w, True) + + ts = tss * 1000 + self.read_data.append(ts, datapoint.r, True) + self.written_data.append(ts, datapoint.w, True) + + sdp.tss = tss + + # Clear the buffer: + sdp.r = None + sdp.w = None + + # to zeroise the chart after the last datapoint added + tss += 1 + self.read_data.append(tss * 1000, 0, True) + self.written_data.append(tss * 1000, 0, True) + + self.stream_data_providers[rep] = sdp + + ) + + $(document).one('tobcc.bandwidth', def(): + tc = $('#topchart') + if tc.is(':hidden'): + tc.fadeIn(2000) + tc.css('width', '450px') + tc.css('height', '50px') + ) + + # enable Drap&Drop + $('.pep').pep() + + # delay-launch the app... + setTimeout(def(): + self.ping() + , 250) + + def on_new_node(self): + + from dialogs.properties import Properties as NodeProperties + NodeProperties(self.session_id, base_path = self.base_path).show() + + def ping(self): + + if self.do_ping is not True: + return + + $.post({ + 'url': self.base_path + "/" + self.session_id + "/cc/" + "ping", + 'headers': { + 'if-modified-since': self.ims, + 'timeout': 5000 + } + }) + .done(def(data, textStatus, response): + if response.status == 200: + self.ims = response.getResponseHeader('last-modified') + d = JSON.parse(data) + if 'cards' in d: + + cards = d['cards'] + + # run through existing cards and check if they are still valid + new_cards = [] + for c in self.cards: + if c.id in cards: + new_cards.push(c) + else: + $.post({ + 'url': self.base_path + "/" + c.id + "/cc/" + "ciao.html", + }) + c.detatch() + + # run through received list of card.id's and establish sequence + + after_element = None + for cid in cards: + + done = False + + # Move existing card to appropriate position + for c in new_cards: + if c.id == cid: + c.moveTo(after_element) + done = True + break + + # if no card exists: Create a card + if done == False: + card = NodeCard(id=cid, base_path=self.base_path, position=0) + new_cards.push(card) + card.attach(parent_element='#cc-cards', after_element=after_element) + + after_element = make_id(cid) + + self.cards = new_cards + + ) + .always(def(data): + setTimeout( + def(): + self.ping(); + , 2000 + ) + ) + + def license(self): + from dialogs.license import License + License(self.session_id, self.base_path).show() + + def about(self): + from dialogs.about import About + About(self.session_id, self.base_path).show() + +window.ControlCenter = ControlCenter diff --git a/cc/ControlCenter/controls/__init__.pyj b/cc/ControlCenter/controls/__init__.pyj new file mode 100644 index 0000000..e69de29 diff --git a/cc/ControlCenter/controls/base.pyj b/cc/ControlCenter/controls/base.pyj new file mode 100644 index 0000000..70bad1c --- /dev/null +++ b/cc/ControlCenter/controls/base.pyj @@ -0,0 +1,13 @@ +from utils.make_id import make_id as MakeID + +class Base(): + + def __init__(self, id, tag): + self.id = id + self.tag = tag + + def update(self, value): + console.log("Base:update() Not implemented...") + + def make_id(self, tag=None, jquery=True): + return MakeID(self.id, tag, jquery) \ No newline at end of file diff --git a/cc/ControlCenter/controls/connection.pyj b/cc/ControlCenter/controls/connection.pyj new file mode 100644 index 0000000..d70caa4 --- /dev/null +++ b/cc/ControlCenter/controls/connection.pyj @@ -0,0 +1,48 @@ +from controls.base import Base as ControlBase + +class Connection(ControlBase): + + def __init__(self, id, tag='connection'): + ControlBase.__init__(self, id, tag) + + html = """ + + + + + """ + + html = str.format(html, id=self.id, tag=self.tag) + $(self.make_id(self.tag)).html(html) + + self.last = None + + def update(self, data): + + if data is None or data == self.last: + return + + icons = { + 'h': 'home', + 'p': 'password', + 'c': 'cookie', + 'x': 'proxy' + } + + for i in icons: + icon = $(self.make_id(self.tag + '.' + icons[i])) + if i in data: + if icon.is(':hidden'): + icon.show(1000) + icon.tooltip({'container': 'body', + 'trigger': 'click hover'}) + else: + if icon.is(':visible'): + icon.hide(500) + icon.tooltip('dispose') + + self.last = data \ No newline at end of file diff --git a/cc/ControlCenter/controls/flags.pyj b/cc/ControlCenter/controls/flags.pyj new file mode 100644 index 0000000..4470b71 --- /dev/null +++ b/cc/ControlCenter/controls/flags.pyj @@ -0,0 +1,169 @@ +from controls.base import Base as ControlBase + + +class Flags(ControlBase): + + def __init__(self, id, tag): + + ControlBase.__init__(self, id, tag) + + # console.log("Flags created for " + id) + self.flags = [] + + self.known_flags = { + 'Authority': '' + , 'BadExit': """ + + + + + """ + , 'BadDirectory': """ + + + + + """ + , 'Exit': '' + , 'Fast': '' + , 'Guard': '' + , 'HSDir': '' + , 'Named': '' + , 'Stable': '' + , 'Running': '' + , 'Unnamed': """ + + + + + """ + # , 'unknown': '' + , 'unknown': """ + + + B + + """ + , 'Valid': """ + + + + + """ + , 'soft': '' + , 'hard': '' + , 'mode': '' + } + + def create_flag_icon_html(self, flag, tor_mode): + + # if flag in ['C', 'B', 'R']: + # + # cbr = { + # 'C': 'Client', + # 'B': 'Bridge', + # 'R': 'Relay' + # } + # + # flag_html = """ + # + # + # + # {mode} + # + # + # """ + # flag_html = str.format(flag_html, mode=flag) + # + # tooltip = cbr[flag] + ' Mode' + # + # return str.format(html, id=self.id, flag=flag.toLowerCase(), tooltip=tooltip, html=flag_html) + + if flag in self.known_flags: + + html = """ +
+ {html} +
+ """ + + tooltips = { + 'soft': 'Hibernating | Soft' + , 'hard': 'Hibernating | Hard' + , 'mode': '' + } + + if flag == 'unknown' and tor_mode == 'Client': + tooltip = "Tor @ Client Mode maintains no flags." + elif flag in tooltips: + tooltip = tooltips[flag] + else: + tooltip = flag + + return str.format(html, id=self.id, flag=flag.toLowerCase(), tooltip=tooltip, html=self.known_flags[flag]) + + + html = """ +
+ {flag} +
+ """ + return str.format(html, id=self.id, flag=flag, lflag=flag.toLowerCase()) + + + def update(self, value=None, tor_mode=None): + + flag_container = $(self.make_id(self.tag)) + + if not value?: + value = [] + + if value != self.flags: + + for flag in self.flags: + if flag not in value: + f = $(self.make_id('flags.' + flag.toLowerCase())) + if f.length > 0: + f.tooltip('dispose') + f.remove() + + # flag_check = flag_container.children(":first") + flag_count = 0 + flag_row = None + flag_row_count = 0 + + for flag in value: + if (flag_count % 4) == 0: + flag_row_count += 1 + flag_row = $(self.make_id('flags.row.' + flag_row_count)) + if flag_row.length < 1: + html = "
" + flag_row = $(str.format(html, id=self.id, count=flag_row_count)).appendTo(flag_container) + flag_check = flag_row.children(":first") + + else: + flag_check = flag_check.next() + + flag_count +=1 + f = $(self.make_id('flags.' + flag.toLowerCase())) + + if f.length > 0: + if f.is(flag_check): + continue + else: + f.tooltip('dispose') + f.remove() + + new_flag = $(self.create_flag_icon_html(flag, tor_mode)) + if flag_check.length > 0: + new_flag.insertBefore(flag_check) + else: + new_flag.appendTo(flag_row) + + new_flag.tooltip({'container': 'body', + 'trigger': 'click hover'}) + + self.flags = value diff --git a/cc/ControlCenter/controls/smoothie.pyj b/cc/ControlCenter/controls/smoothie.pyj new file mode 100644 index 0000000..45f8672 --- /dev/null +++ b/cc/ControlCenter/controls/smoothie.pyj @@ -0,0 +1,652 @@ +from RapydSmoothie.smoothie import RapydSmoothie, DefaultChartOptions, DefaultSeriesPresentationOptions +from RapydSmoothie.timeseries import TimeSeries as RSTimeSeries +from RapydSmoothie.util import extend + +class TimeSeries(RSTimeSeries): + + def resetBounds(self, oldestValidTime = None): + # patched to stop at oldestValidTime + + if oldestValidTime is None: + return RSTimeSeries.resetBounds(self) + + if len(self.data) == 0: + self.maxValue = None + self.minValue = None + return + + self.maxValue = self.data[0][1] + self.minValue = self.data[0][1] + + for element in reversed(self.data): + + if element[0] < oldestValidTime: + break + + value = element[1] + if value > self.maxValue: + self.maxValue = value + elif value < self.minValue: + self.minValue = value + + +class Smoothie(RapydSmoothie): + + def __init__(self, options = DefaultChartOptions()): + + # to ensure that the new chartOptions (used for rendering) are handled correctly + if not options.timeLabelLeftAlign?: + options.timeLabelLeftAlign = False + if not options.timeLabelSeparation?: + options.timeLabelSeparation = 0 + if not options.grid.strokeStyleHor?: + options.grid.strokeStyleHor = '#d4d4d4' + + RapydSmoothie.__init__(self, options) + + # 20190421 RDW: What for ... ? + if not options.yMinFormatter?: + self.options.yMinFormatter = None + + if not options.yMaxFormatter?: + self.options.yMaxFormatter = None + + # Flag to size the chart to the dimensions of the parent element + self.options.sizeToParent = True + + # this.mousemove = this.mousemove.bind(this); + # this.mouseout = SmoothieChart.prototype.mouseout.bind(this); + + # self.options.responsive = True + + def streamTo(self, canvas, delayMillis): + # Overrides standard streamTo + # You need to call .start() to launch rendering! + + self.canvas = canvas + self.delay = delayMillis + + def resize(self): + + # Customized resize function to respect the size of the parent container + # as well as the DPI scaling of the screen + # To ensure that this works as expected, canvas elements have to have + # the style="vertical-align: middle" assigned! + + if not window?: + return False + + haveResized = False + + if self.options.sizeToParent: + if not self.css_style_parent?: + self.css_style_parent = window.getComputedStyle(self.canvas.parentNode) + width = parseFloat(self.css_style_parent.getPropertyValue('width')) + height = parseFloat(self.css_style_parent.getPropertyValue('height')) + else: + if not self.css_style?: + self.css_style = window.getComputedStyle(self.canvas) + width = parseFloat(self.css_style.getPropertyValue('width')) + height = parseFloat(self.css_style.getPropertyValue('height')) + + dpr = window.devicePixelRatio if self.options.enableDpiScaling else 1 + dprWidth = Math.floor(parseFloat(self.canvas.getAttribute('width'))) + dprHeight = Math.floor(parseFloat(self.canvas.getAttribute('height'))) + + width = Math.floor(width) + height = Math.floor(height) + # dprWidth = Math.floor(dprWidth) + # dprHeight = Math.floor(dprHeight) + + if not self.originalWidth? or (Math.floor(self.originalWidth * dpr) != dprWidth or self.originalWidth != width): + self.originalWidth = width + self.canvas.setAttribute('width', (Math.floor(width * dpr)).toString()) + self.canvas.style.width = width + 'px' + self.canvas.getContext('2d').scale(dpr, dpr) + + haveResized = True + + if not self.originalHeight? or (Math.floor(self.originalHeight * dpr) != dprHeight or self.originalHeight != height): + self.originalHeight = height + self.canvas.setAttribute('height', (Math.floor(height * dpr)).toString()) + self.canvas.style.height = height + 'px' + self.canvas.getContext('2d').scale(dpr, dpr) + + haveResized = True + + return haveResized + + def render(self, canvas, time): + + nowMillis = Date.now() + if self.options.limitFPS > 0: + if nowMillis - self.lastRenderTImeMillis < (1000 / self.options.limitFPS): + return + + if self.isAnimatingScale is False: + maxIdleMillis = min(1000/6, self.options.millisPerPixel) + if nowMillis - self.lastRenderTimeMillis < maxIdleMillis: + return + + + self.resize() + self.updateTooltip() + + self.lastRenderTimeMillis = nowMillis + + canvas = canvas or self.canvas + time = time or nowMillis - (self.delay or 0) + + # Round time down to pixel granularity, so motion appears smoother. + time -= time % self.options.millisPerPixel + + self.lastChartTimestamp = time + + context = canvas.getContext('2d') + chartOptions = self.options + dimensions = { + 'top': 0, + 'left': 0, + 'width': canvas.clientWidth, + 'height': canvas.clientHeight + } + + # Calculate the threshold time for the oldest data points. + oldestValidTime = time - (dimensions.width * chartOptions.millisPerPixel) + + valueToYPixel = def(value): + offset = value - self.currentVisMinValue + if this.currentValueRange == 0: + return dimensions.height + return dimensions.height - (Math.round((offset / this.currentValueRange) * dimensions.height)) + .bind(self) + + def timeToXPixel(t): + if chartOptions.scrollBackwards is True: + return Math.round((time - t) / chartOptions.millisPerPixel) + return Math.round(dimensions.width - ((time - t) / chartOptions.millisPerPixel)) + + self.updateValueRange() + + context.font = chartOptions.labels.fontSize + 'px ' + chartOptions.labels.fontFamily + + # Move origin, create clipping rectangle, clear area + self.render_10(context, chartOptions, dimensions) + + # Grid lines: Vertical & Horizontal, Bounding Rect + # self.render_20(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + # Horizontal + self.render_25(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + # Vertical + vertical_dividers = self.render_23(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + # Rect -> pushed to later stage + # self.render_27(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + # Draw any horizontal lines... + self.render_30(context, chartOptions, dimensions, valueToYPixel) + + # Draw the TimeSeries + # self.render_40(context, chartOptions, dimensions, oldestValidTime, timeToXPixel, valueToYPixel) + self.render_41(context, chartOptions, dimensions, oldestValidTime, timeToXPixel, valueToYPixel) + + # Draw the y0 - line + self.render_48(context, chartOptions, dimensions, valueToYPixel) + + # Draw vertical bar to show tooltip position + self.render_50(context, chartOptions, dimensions) + + # to catch the calculations in _61 + minValueRect = {'left': 0, 'top': 0, 'width': 0, 'height': chartOptions.labels.fontSize} + maxValueRect = {'left': 0, 'top': 0, 'width': 0, 'height': chartOptions.labels.fontSize} + + # Draw the axis values on the chart. + # self.render_60(context, chartOptions, dimensions) + self.render_61(context, chartOptions, dimensions, minValueRect, maxValueRect) + + # Display intermediate y axis labels along y-axis to the left of the chart + # RDW 20190425: Don't need this... + # self.render_70(context, chartOptions, dimensions) + + # Display timestamps along x-axis at the bottom of the chart. + # 20190425 RDW: Replaced by _81 + # self.render_80(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + # Optimized version of _80 + self.render_81(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel, valueToYPixel, + minValueRect, maxValueRect, vertical_dividers) + + # 20190425 RDW: + # 1: returns vertical_dividers (list) + # 2: adapted to allow drawing of 'weekly', 'monthly' lines + def render_23(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel): + + vertical_dividers = [] + + context.save() + context.lineWidth = chartOptions.grid.lineWidth + context.strokeStyle = chartOptions.grid.strokeStyle + + # Vertical (time) dividers. + if (chartOptions.grid.millisPerLine > 0): + context.beginPath() + t = time - (time % chartOptions.grid.millisPerLine) + + while t>= oldestValidTime: + + vertical_dividers.push(t) + + gx = timeToXPixel(t) + if chartOptions.grid.sharpLines: + gx -= 0.5 + context.moveTo(gx, 0) + context.lineTo(gx, dimensions.height) + + t -= chartOptions.grid.millisPerLine + + # to allow rendering of the vertical divider label + # even when the divider scolled out of view + vertical_dividers.push(t); + + context.stroke() + context.closePath() + + # inserted to draw 'weekly', 'monthly' lines + elif chartOptions.grid.timeDividers in ['weekly', 'monthly', 'yearly']: + + start_time = None + next_time_div = None + + if chartOptions.grid.timeDividers == 'weekly': + + # http://stackoverflow.com/questions/4156434/javascript-get-the-first-day-of-the-week-from-current-date + def getMonday(date): + day = date.getDay() or 7 + if day != 1: + date.setHours(-24 * (day - 1)) + return date + + this_monday = Date(time) + this_monday = getMonday(this_monday) + this_monday.setHours(0) + this_monday.setMinutes(0) + this_monday.setSeconds(0) + + start_time = this_monday.getTime() + next_time_div = def(t): + return t - 604800000 # 1000 * 60 * 60 * 24 * 7 + + elif chartOptions.grid.timeDividers == 'monthly': + + this_month = Date(time) + this_month.setMinutes(0) + this_month.setHours(0) + this_month.setDate(1) + + start_time = this_month.getTime() + next_time_div = def(t): + nm = Date(t) + cm = nm.getMonth() + if cm: + nm.setMonth(cm - 1) + else: + nm.setFullYear(nm.getFullYear() - 1) + nm.setMonth(11) + + return nm.getTime() + elif chartOptions.grid.timeDividers == 'yearly': + + this_year = Date(time) + this_year.setMinutes(0) + this_year.setHours(0) + this_year.setDate(1) + this_year.setMonth(0) + + start_time = this_year.getTime() + next_time_div = def(t): + ny = Date(t) + ny.setFullYear(ny.getFullYear() - 1) + return ny.getTime() + + if start_time is not None: + + context.beginPath() + + t = start_time + + while t >= oldestValidTime: + + vertical_dividers.push(t) + + gx = timeToXPixel(t) + if chartOptions.grid.sharpLines: + gx -= 0.5 + context.moveTo(gx, 0) + context.lineTo(gx, dimensions.height) + + t = next_time_div(t) + + # to allow rendering of the vertical divider label + # even when the divider scolled out of view + vertical_dividers.push(t) + + context.stroke() + context.closePath() + + context.restore() + return vertical_dividers + + # 20190425 RDW: 'strokeStyleHor' + def render_25(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel): + + # Horizontal (value) dividers. + context.save() + context.lineWidth = chartOptions.grid.lineWidth + context.strokeStyle = chartOptions.grid.strokeStyleHor + + v = 1 + while v < chartOptions.grid.verticalSections: + + gy = Math.round(v * dimensions.height / chartOptions.grid.verticalSections) + if chartOptions.grid.sharpLines: + gy -= 0.5 + + context.beginPath() + context.moveTo(0, gy) + context.lineTo(dimensions.width, gy) + context.stroke() + context.closePath() + + v += 1 + + context.restore() + + # 20190425 RDW: calling sequence (now after render_80) + def render_27(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel): + + # Bounding rectangle + if chartOptions.grid.borderVisible: + context.save() + + br = $(self.canvas).css('border-radius') + br = parseFloat(br) + + context.save() + context.lineWidth = 2 + + if br == 0: + context.beginPath() + context.strokeRect(0, 0, dimensions.width, dimensions.height) + context.closePath() + else: + dw = dimensions.width + dh = dimensions.height + context.beginPath() + context.moveTo(br, 0) + context.lineTo(dw - br, 0) + context.quadraticCurveTo(dw, 0, dw, br) + context.lineTo(dw, dh - br) + context.quadraticCurveTo(dw, dh, dw - br, dh) + context.lineTo(br, dh) + context.quadraticCurveTo(0, dh, 0, dh - br) + context.lineTo(0, br) + context.quadraticCurveTo(0, 0, br, 0) + context.closePath() + context.stroke() + + context.restore() + + # 20190425 RDW: modified for alternate filling algo + def render_41(self, context, chartOptions, dimensions, oldestValidTime, timeToXPixel, valueToYPixel): + + # For each data set... + for serie in self.seriesSet: + context.save() + ts = serie.timeSeries + if ts.disabled is True: + continue + + dataSet = ts.data + seriesOptions = serie.options + + # Delete old data that's moved off the left of the chart. + ts.dropOldData(oldestValidTime, chartOptions.maxDataSetLength) + + # Set style for this dataSet. + context.lineWidth = seriesOptions.lineWidth + context.strokeStyle = seriesOptions.strokeStyle + + # Draw the line... + context.beginPath() + + # Retain lastX, lastY for calculating the control points of bezier curves. + firstX = 0 + lastX = 0 + lastY = 0 + + if len(dataSet) > 1: + for index, set in enumerate(dataSet): + + has_null = False + x = None + y = None + + x = timeToXPixel(set[0]) + y_data = set[1] + if y_data is not None: + y = valueToYPixel(y_data) + elif seriesOptions.nullTo0 == True: + y = valueToYPixel(0) + else: + has_null = True + + if index == 0: + firstX = x + context.moveTo(x, 0 if y is None else y) + elif y is not None: + if chartOptions.interpolation in ['linear', 'line']: + context.lineTo(x, y) + + elif chartOptions.interpolation == 'step': + if lastY is None: + context.moveTo(x, y) + else: + context.lineTo(x, lastY) + context.lineTo(x, y) + + else: + # Great explanation of Bezier curves: http://en.wikipedia.org/wiki/Bezier_curve#Quadratic_curves + # + # Assuming A was the last point in the line plotted and B is the new point, + # we draw a curve with control points P and Q as below. + # + # A---P + # | + # | + # | + # Q---B + # + # Importantly, A and P are at the same y coordinate, as are B and Q. This is + # so adjacent curves appear to flow as one. + # + + + context.bezierCurveTo( # startPoint (A) is implicit from last iteration of loop + Math.round((lastX + x) / 2), lastY, # controlPoint1 (P) + Math.round((lastX + x)) / 2, y, # controlPoint2 (Q) + x, y) # endPoint (B) + + + lastX = x + lastY = y + + y0 = valueToYPixel(0) + + if len(dataSet) > 1: + if seriesOptions.fillStyle and not has_null: + # Close up the fill region. + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, lastY) + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, y0) + context.lineTo(firstX, y0) + + context.fillStyle = seriesOptions.fillStyle + context.fill() + + if seriesOptions.strokeStyle and seriesOptions.strokeStyle is not 'none': + context.stroke() + + context.closePath() + + context.restore() + + def render_48(self, context, chartOptions, dimensions, valueToYPixel): + # Draw the y0 - line + + y0 = valueToYPixel(0) + + context.save() + context.lineWidth = chartOptions.grid.lineWidth + context.strokeStyle = chartOptions.grid.strokeStyleHor + context.beginPath() + context.moveTo(0, y0) + context.lineTo(dimensions.width, y0) + context.stroke() + context.closePath() + context.restore() + + def render_61(self, context, chartOptions, dimensions, minValueRect, maxValueRect): + + maxValueString = "" + minValueString = "" + + # Draw the axis values on the chart. + if chartOptions.labels.disabled is False and self.valueRange.min is not NaN and self.valueRange.max is not NaN: + + context.save() + + if chartOptions.yMaxFormatter?: + maxValueString = chartOptions.yMaxFormatter(self.valueRange.max, chartOptions.labels.precision) + maxValueRect.width = context.measureText(maxValueString).width + + if chartOptions.yMinFormatter?: + minValueString = chartOptions.yMinFormatter(self.valueRange.min, chartOptions.labels.precision) + minValueRect.width = context.measureText(minValueString).width + + if chartOptions.scrollBackwards is True: + maxLabelPos = 0 + minLabelPos = 0 + else: + maxLabelPos = dimensions.width - context.measureText(maxValueString).width - 2 + minLabelPos = dimensions.width - context.measureText(minValueString).width - 2 + + context.fillStyle = chartOptions.labels.fillStyle + + if len(maxValueString) > 0: + context.fillText(maxValueString, maxLabelPos, chartOptions.labels.fontSize) + maxValueRect.left += maxLabelPos + maxValueRect.top += chartOptions.labels.fontSize + + if len(minValueString) > 0: + context.fillText(minValueString, minLabelPos, dimensions.height - 2) + minValueRect.left += minLabelPos + minValueRect.top += dimensions.height - 2 + + context.restore() + + def render_81(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel, valueToYPixel, + minValueRect, maxValueRect, vertical_dividers): + # Display timestamps along x-axis at the bottom of the chart. + def intersect(a, b): + return (a.left <= b.left + b.width + and b.left <= a.left + a.width + and a.top <= b.top + b.height + and b.top <= a.top + a.height) + + if chartOptions.timestampFormatter? and len(vertical_dividers) > 0: + + y0 = valueToYPixel(0) + context.save() + + if chartOptions.scrollBackwards is True or chartOptions.timeLabelLeftAlign is True: + textUntilX = dimensions.width + else: + textUntilX = 0 + + for t in vertical_dividers: + # Formats the timestamp based on user specified formatting function + # SmoothieChart.timeFormatter function above is one such formatting option + tx = Date(t); + ts = chartOptions.timestampFormatter(tx) + tsRect = {'left': 0, 'top': 0, 'width': context.measureText(ts).width, 'height': chartOptions.labels.fontSize} + + gx = timeToXPixel(t) + tsRect.top += y0 - 2 + + if tsRect.top < tsRect.height: + tsRect.top += tsRect.height + 2 * 2 + + if chartOptions.scrollBackwards? or chartOptions.timeLabelLeftAlign is True: + + tsRect.left = gx + chartOptions.timeLabelSeparation + 2 + + if ((tsRect.left + tsRect.width) < textUntilX + and intersect(tsRect, minValueRect) is False + and intersect(tsRect, maxValueRect) is False): + context.fillStyle = chartOptions.labels.fillStyle + context.fillText(ts, tsRect.left, tsRect.top) + textUntilX = tsRect.left + tsRect.width + else: + tsRect.left = gx - tsRect.width - chartOptions.timeLabelSeparation - 2 + + if ((tsRect.left + tsRect.width) > textUntilX + and intersect(tsRect, minValueRect) is False + and intersect(tsRect, maxValueRect) is False): + context.fillStyle = chartOptions.labels.fillStyle + context.fillText(ts, tsRect.left, tsRect.top) + textUntilX = tsRect.left + tsRect.width + + context.restore() + + def addTimeSeries(self, ts: TimeSeries, options: dict = {}): + + # patched to calculate & forward 'oldestValidTime' to resetBounds + + opt = extend({}, DefaultSeriesPresentationOptions(), options) + new_series = {'timeSeries': ts, 'options': opt} + self.seriesSet.push(new_series) + + if ts.options.resetBounds and ts.options.resetBoundsInterval > 0: + ts.resetBounds() + ts.resetBoundsTimerId = setInterval(def(): + oldestValidTime = None + # out = "xxx" + if (self.canvas?): + now = new Date().getTime() + width = self.canvas.clientWidth + oldestValidTime = now - (width * this.options.millisPerPixel) - 10000 # 10s more... + + # t = new Date(oldestValidTime) + # out = t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds() + + # console.log(out) + ts.resetBounds(oldestValidTime) + .bind(self) + , ts.options.resetBoundsInterval + ) + + def snapshot_to(self, canvas): + + dpr = window.devicePixelRatio if self.options.enableDpiScaling else 1 + + width = self.canvas.getAttribute('width') + canvas.setAttribute('width', width.toString()) + canvas.style.width = self.canvas.style.width + + height = self.canvas.getAttribute('height') + canvas.setAttribute('height', height.toString()) + canvas.style.height = self.canvas.style.height + + context = canvas.getContext('2d') + context.scale(dpr, dpr) + context.drawImage(self.canvas, 0, 0, width / dpr, height / dpr) diff --git a/cc/ControlCenter/controls/version.pyj b/cc/ControlCenter/controls/version.pyj new file mode 100644 index 0000000..e91f7dd --- /dev/null +++ b/cc/ControlCenter/controls/version.pyj @@ -0,0 +1,98 @@ +from controls.base import Base as ControlBase + +class Version(ControlBase): + + def __init__(self, id, tag): + + ControlBase.__init__(self, id, tag) + + # print(self.tag, self.make_id(self.tag)) + + $me = $(self.make_id(self.tag)) + # assert($me.length > 0) + + html = """ +
+ + +
+ + """ + + html = str.format(html, id=self.id, tag=self.tag) + $me.html(html) + + def update(self, version, mode = '', latest = None, flag = None): + + if (version == self.version and + mode == self.mode and + latest == self.latest and + flag == self.flag): + return True + + red_flags = ['obsolete', 'old', 'unrecommended', 'unknown'] + + $version = $(self.make_id(self.tag + '.version')) + $version.text('Tor ' + version) + + $check = $(self.make_id(self.tag + '.check')) + $check.tooltip('dispose') + + if latest is None or (version == latest and flag not in red_flags): + if $check.is(':visible'): + $check.hide(500) + + else: + html = """ + + """ + color = 'black' + title = '' + + if flag in red_flags: + color = 'tomato' + if len(title) > 0: + title += '
' + title += 'This Tor version is ' + flag + '!' + + if latest is not None: + # console.log(latest) + if len(title) > 0: + title += '
' + title += 'Latest stable Tor version is ' + latest + '.' + + html = str.format(html, color=color) + $check.html(html) + + if $check.is(':hidden'): + $check.show(1000) + + $check.tooltip({'container': 'body', + 'trigger': 'click hover', + 'html': True, + 'title': title + }) + + $mode = $(self.make_id(self.tag + '.mode')) + + if mode == '': + if $mode.is(':visible'): + $mode.hide('slow') + $container = $(self.make_id(self.tag + '.container')) + $container.addClass('text-center').removeClass('text-right') + + else: + + $mode.text(mode + " Mode") + + if $mode.is(':hidden'): + $mode.show('slow') + $container = $(self.make_id(self.tag + '.container')) + $container.removeClass('text-center').addClass('text-right') + + self.version = version + self.mode = mode + self.latest = latest + self.flag = flag + + return True diff --git a/cc/ControlCenter/controls/version_check.pyj b/cc/ControlCenter/controls/version_check.pyj new file mode 100644 index 0000000..67b848f --- /dev/null +++ b/cc/ControlCenter/controls/version_check.pyj @@ -0,0 +1,59 @@ +from controls.base import Base as ControlBase + +class VersionCheck(ControlBase): + + def update(self, version=None, latest=None, flag=None): + + if version == self.version and latest == self.latest and flag == self.flag: + return True + + red_flags = ['obsolete', 'old', 'unrecommended', 'unknown'] + + $me = $(self.make_id(self.tag)) + if $me.length < 1: + return False + + $me.tooltip('dispose') + + # print(version, latest, flag) + + if version == latest and flag not in red_flags: + if $me.is(':visible'): + $me.hide(500) + return True + + html = """ + + """ + color = 'black' + title = '' + + if flag in red_flags: + color = 'tomato' + if len(title) > 0: + title += '
' + title += 'This Tor version is ' + flag + '!' + + if latest is not None: + # console.log(latest) + if len(title) > 0: + title += '
' + title += 'Latest stable Tor version is ' + latest + '.' + + html = str.format(html, color=color) + $me.html(html) + + if $me.is(':hidden'): + $me.show(1000) + + $me.tooltip({'container': 'body', + 'trigger': 'click hover', + 'html': True, + 'title': title + }) + + self.version = version + self.latest = latest + self.flag = flag + + return True diff --git a/cc/ControlCenter/dialogs/__init__.pyj b/cc/ControlCenter/dialogs/__init__.pyj new file mode 100644 index 0000000..e69de29 diff --git a/cc/ControlCenter/dialogs/about.pyj b/cc/ControlCenter/dialogs/about.pyj new file mode 100644 index 0000000..aa3ae9e --- /dev/null +++ b/cc/ControlCenter/dialogs/about.pyj @@ -0,0 +1,64 @@ +from dialogs.base import Base as DialogBase +from utils.auth import Basic, Digest + +class About(DialogBase): + + def __init__(self, session_id, base_path = None): + DialogBase.__init__(self) + self.base_path = base_path + self.session_id = session_id + + def create(self): + + html = """ + + """ + + # html = str.format(html, id=self.id, server=self.server) + DialogBase.create(self, html) + + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + $.post({ + 'url': self.base_path + "/" + self.session_id + "/cc/" + "about" + , 'timeout': 2000 + }) + .done(def(data): + $('#about').removeClass('text-center').addClass('text-left') + .css('color', 'black') + .html(data) + ) + + return p \ No newline at end of file diff --git a/cc/ControlCenter/dialogs/base.pyj b/cc/ControlCenter/dialogs/base.pyj new file mode 100644 index 0000000..f4fc689 --- /dev/null +++ b/cc/ControlCenter/dialogs/base.pyj @@ -0,0 +1,84 @@ +from utils.uuid import uuid4 + +class Base(): + + def __init__(self): + self.modal = None + + # https://stackoverflow.com/questions/29552904/return-a-value-from-bootstraps-modal-box-yes-or-no-option + self.dfd = jQuery.Deferred() + self.id = uuid4().replace(v'/-/g', "") + self.esc_to_dismiss = True + + def remove(self): + if self.modal is not None: + self.modal.remove() + del self.modal + + def create(self, html = '
'): + self.remove() + self.modal = $(html).modal({'backdrop': 'static', 'keyboard': False}) + return self.modal + + def show(self, html = None): + if html is not None: + self.create(html) + + if self.modal is not None: + $('body').append(self.modal) + + self.modal.on('hidden.bs.modal', def(event): + self.remove() + ) + + self.modal.on('keydown', def(event): + if event.which == 27: # Esc + if self.esc_to_dismiss == True: + self.modal.modal('hide') + ) + + self.modal.modal('show') + + return self.dfd.promise() + + +class Message(Base): + + def __init__(self, message = None, title = 'The Onion Box'): + + Base.__init__(self) + self.title = title + self. message = message + + def create(self): + + html = """ + + """ + + html = str.format(html, id=self.id, title = self.title, message = self.message) + return Base.create(self, html) + + def show(self): + + if self.modal is None: + self.create() + + return Base.show(self) \ No newline at end of file diff --git a/cc/ControlCenter/dialogs/launcher.pyj b/cc/ControlCenter/dialogs/launcher.pyj new file mode 100644 index 0000000..0f2abb8 --- /dev/null +++ b/cc/ControlCenter/dialogs/launcher.pyj @@ -0,0 +1,51 @@ +from dialogs.base import Base as DialogBase + +class Launcher(DialogBase): + + def __init__(self, session_id, base_path = None): + DialogBase.__init__(self) + self.base_path = base_path + self.session_id = session_id + + def create(self): + + html = """ + + """ + + # html = str.format(html, id=self.id, server=self.server) + DialogBase.create(self, html) + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + setTimeout(def(): + self.modal.modal('hide') + , 3000) + + return p \ No newline at end of file diff --git a/cc/ControlCenter/dialogs/license.pyj b/cc/ControlCenter/dialogs/license.pyj new file mode 100644 index 0000000..d58633d --- /dev/null +++ b/cc/ControlCenter/dialogs/license.pyj @@ -0,0 +1,61 @@ +from dialogs.base import Base as DialogBase +from utils.auth import Basic, Digest + +class License(DialogBase): + + def __init__(self, session_id, base_path = None): + DialogBase.__init__(self) + self.base_path = base_path + self.session_id = session_id + + def create(self): + + html = """ + + """ + + # html = str.format(html, id=self.id, server=self.server) + DialogBase.create(self, html) + + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + $.post({ + 'url': self.base_path + "/" + self.session_id + "/cc/" + "license" + , 'timeout': 2000 + }) + .done(def(data): + $('#license').removeClass('text-center').addClass('text-left') + .css('color', 'black') + .html(data) + ) + + return p \ No newline at end of file diff --git a/cc/ControlCenter/dialogs/login.pyj b/cc/ControlCenter/dialogs/login.pyj new file mode 100644 index 0000000..a4e1813 --- /dev/null +++ b/cc/ControlCenter/dialogs/login.pyj @@ -0,0 +1,208 @@ +from dialogs.base import Base as DialogBase +from utils.auth import Basic, Digest + +class Login_orig(DialogBase): + + def __init__(self, server, session_id, base_path = None): + DialogBase.__init__(self) + self.server = server + self.base_path = base_path + self.session_id = session_id + + def create(self): + + html = """ + + """ + + html = str.format(html, id=self.id, server=self.server) + DialogBase.create(self, html) + + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + $('#bLogin' + self.id).on('click', def(e): + + # console.log("bLogin click") + + $('#bLogin' + self.id).prop("disabled", True) + $('#bClose' + self.id).prop("disabled", True) + $('#bCancel' + self.id).prop("disabled", True) + $('#iPassword' + self.id).prop("disabled", True) + self.esc_to_dismiss = False + + pwd = $('#iPassword' + self.id).val() + if not pwd?: + self.modal.modal('hide') + return + + url = self.base_path + "/" + self.session_id + "/cc/" + "login" + + $.post({ + 'url': url, + 'timeout': 2000 + }) + .fail(def(request, textStatus, errorThrown): + if request.status == 401: + header = request.getResponseHeader('WWW-Authenticate') + # console.log(header) + elements = header.split(',') + if elements.length > 1: + auth = Digest(header, 'POST', url) + else: + auth = Basic(header) + + $.post({ + 'url': url, + 'timeout': 2000, + 'headers': { + 'Authorization': auth.create_auth_header(self.session_id, pwd) + } + }) + .fail(def(request, textStatus, errorThrown): + error_html = """ +
Failed to authenticate.
+ """ + $('#lStatus' + self.id).html(error_html) + $('#bClose' + self.id).prop("disabled", False) + $('#bCancel' + self.id).prop("disabled", False) + self.esc_to_dismiss = True + return + ) + .done(def(data, textStatus, response): + self.dfd.resolve({'id': data}) + self.modal.modal('hide') + return + ) + + else: + error_html = """ +
Failed to launch authentication sequence.
+ """ + $('#lStatus' + self.id).html(error_html) + $('#bClose' + self.id).prop("disabled", False) + $('#bCancel' + self.id).prop("disabled", False) + self.esc_to_dismiss = True + return + ) + ) + + return p + + +class Login(DialogBase): + + def __init__(self, server, session_id): + DialogBase.__init__(self) + self.server = server + self.session_id = session_id + + def create(self): + + html = """ + + """ + + html = str.format(html, id=self.id, server=self.server) + DialogBase.create(self, html) + + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + $('#bLogin' + self.id).on('click', def(e): + + pwd = $('#iPassword' + self.id).val() + self.dfd.resolve({'password': pwd}) + self.modal.modal('hide') + return + ) + + return p \ No newline at end of file diff --git a/cc/ControlCenter/dialogs/properties.pyj b/cc/ControlCenter/dialogs/properties.pyj new file mode 100644 index 0000000..1139cdc --- /dev/null +++ b/cc/ControlCenter/dialogs/properties.pyj @@ -0,0 +1,372 @@ +from dialogs.base import Base as DialogBase + +class Properties(DialogBase): + + def __init__(self, session_id, base_path = '', config = None, title = None): + DialogBase.__init__(self) + self.session_id = session_id + # self.config = config or [] + self.base_path = base_path + self.title = title + + if config is None: + self.config = [] + self.remove_button = False + else: + self.config = config + self.remove_button = True + + self.password_modified = False + self.cookie_modified = False + + def create(self): + + html = """ + + """ + + trunc_cookie = '' + if self.config.cookie? and self.config.cookie[-3:] == '...': + trunc_cookie = '
Please be aware, that the value displayed here was truncated for safety reasons.' + + btn_remove = '' + if self.remove_button is True: + btn_remove = '' + + title = '' + if self.title is not None: + title = ': ' + self.title + + html = str.format(html, + base_path=self.base_path, + session_id=self.session_id, + trunc_cookie=trunc_cookie, + btn_remove=btn_remove, + title=title + ) + + DialogBase.create(self, html) + + def host(self): + address = $('#iAddress').val() + match = address.match(v'/(.*)(?::)(?:[0-9]+)$/') + + if match is None: + return '' + return match[1] if len(match) > 1 else '' + + def port(self): + address = $('#iAddress').val() + match = address.match(v'/(?:.*)(?::)([0-9]+)$/') + + if match is None: + return '' + return match[1] if len(match) > 1 else '' + + def connect(self): + $selected = $('div#connect-tab a.active') + return $selected.attr('id') + + def confirm_delete(self): + $('#bDelete').removeClass('btn-outline-dark') + .addClass('btn-danger') + .html(' Confirm: Remove Node') + .off() + .on('click', def(e): + $('#bDelete').prop("disabled", True) + .html(' Confirm: Remove Node') + $.post({ + 'url': self.base_path + "/" + self.session_id + "/cc/" + "remove", + 'timeout': 5000}) + .done(def(data): + self.modal.modal('hide') + ) + .fail(def(data): + $('#bDelete').removeClass('btn-danger') + .addClass('btn-outline-dark') + .html(' Remove Node') + .prop("disabled", False) + .off() + .on('click', def(): + self.confirm_delete() + ) + ) + ) + + def show(self): + if self.modal is None: + self.create() + + p = DialogBase.show(self) + + # $('#bLogin' + self.id).on('click', def(e): + # + # pwd = $('#iPassword' + self.id).val() + # self.dfd.resolve({'password': pwd}) + # self.modal.modal('hide') + # return + # ) + + connect_to = ['port', 'socket', 'proxy'] + connect = self.config.connect or 'port' + for c in connect_to: + if c == connect: + $('#' + c).addClass('active') + else: + $('#' + c).removeClass('active') + + if self.config.label?: + $('#iLabel').val(self.config.label) + + $('div#connect-tab a').on('show.bs.tab', def(e): + $('#vAddress').removeClass().addClass("btn btn-outline-secondary") + $('#vAddress').tooltip('dispose') + $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + ) + + $('#iAddress').val(self.config.address or None) + $('#iAddress').on('input', def(e): + $('#vAddress').removeClass().addClass("btn btn-outline-secondary") + $('#vAddress').tooltip('dispose') + $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + $('#iPassword').val('') + self.password_modified = True + ) + + $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + $('#vAddress').on('click', def(e): + $("#vAddress").prop("disabled", True) + + connect = self.connect() + query = {'connect': connect, + 'host': $('#iAddress').val() if connect == 'socket' else self.host(), + 'port': '' if connect == 'socket' else self.port(), + # 'password': $('#iPassword').val(), + 'cookie': self.config.unmod if self.cookie_modified is False else $('#iCookie').val() + } + + $.post(self.base_path + "/" + self.session_id + "/cc/" + "check", query) + .done(def(data): + if data == '250 OK': + $('#vAddress').removeClass().addClass("btn btn-success") + else: + $('#vAddress').removeClass().addClass("btn btn-danger") + + d = data.split('\n') + if len(d) > 1 and d[0] == '500 NOK': + $('#vAddress').tooltip({'title': d[1]}) + $('#vAddress').tooltip('show') + ) + .fail(def(data): + $('#vAddress').removeClass().addClass("btn btn-danger") + ) + .always(def(data): + $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + ) + ) + + if self.config.pwd?: + $('#iPassword').val('******') + + $('#iPassword').on('keydown',def(e): + if self.password_modified is False: + self.password_modified = True + $('#iPassword').val('') + ) + # $('#iPassword').on('input', def(e): + # $('#vAddress').removeClass().addClass("btn btn-outline-secondary") + # $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + # ) + + $('#iCookie').val(self.config.cookie or None) + $('#iCookie').on('keydown',def(e): + if self.cookie_modified is False: + self.cookie_modified = True + $('#iCookie').val('') + ) + $('#iCookie').on('input', def(e): + $('#vAddress').removeClass().addClass("btn btn-outline-secondary") + $("#vAddress").prop("disabled", len($('#iAddress').val()) == 0) + ) + + $('#bDelete').on('click', def(): + self.confirm_delete() + ) + + $('#bSave').on('click', def(e): + $("#bSave").prop("disabled", True) + + connect = self.connect() + + query = {'label': $('#iLabel').val(), + 'connect': connect, + 'host': $('#iAddress').val() if connect == 'socket' else self.host(), + 'port': '' if connect == 'socket' else self.port(), + 'password': self.config.unmod if self.password_modified is False else $('#iPassword').val(), + 'cookie': self.config.unmod if self.cookie_modified is False else $('#iCookie').val() + } + + $.post(self.base_path + "/" + self.session_id + "/cc/" + "save", query) + .done(def(data): + self.modal.modal('hide') + ) + .fail(def(data): + $('#bSave').removeClass().addClass("btn btn-danger") + ) + .always(def(data): + $("#bSave").prop("disabled", False) + ) + ) + + return p \ No newline at end of file diff --git a/cc/ControlCenter/utils/__init__.pyj b/cc/ControlCenter/utils/__init__.pyj new file mode 100644 index 0000000..e69de29 diff --git a/cc/ControlCenter/utils/auth.pyj b/cc/ControlCenter/utils/auth.pyj new file mode 100644 index 0000000..65c1b2f --- /dev/null +++ b/cc/ControlCenter/utils/auth.pyj @@ -0,0 +1,124 @@ +class NotImplemetedError(Exception): + def __init__(self, message): + self.name = 'NotImplementedError' + self.message = message + +class Base(): + + def __init__(self, header): + self.header = header + + def create_auth_header(self, username, password): + raise NotImplemetedError('Not implemented.') + +class Basic(Base): + + def create_auth_header(self, username, password): + + headers = self.header.split(',') + if headers.length > 1: + # not a 'basic' header + return None + + regex = v'/(.+) realm=(.+)/g' + elements = regex.exec(headers[0]) + + if not elements? or elements.length != 3: + return None + + scheme = elements[1] + response = btoa(username+':'+password) + + return scheme + " " + response + +class Digest(Base): + + def __init__(self, header, method='GET', url='login'): + + Base.__init__(self, header) + self.method = method + self.url = url + self.nc = 1 + + def create_auth_header(self, username, password): + + # This code is based on the contribution from + # Jamie Perkins' "Digest Auth Request" + # https://github.com/inorganik/digest-auth-request + # adapted to suit our needs! + + # requires an md5 implementation - to be provided seperately! + + # generate 16 char client nonce + def generate_client_nonce(): + characters = 'abcdef0123456789' + token = '' + + for i in range(16): + randNum = Math.round(Math.random() * characters.length) + token += characters.substr(randNum, 1) + + return token + + + headers = self.header.split(', ') + if headers.length == 1: + # not a 'digest' header + return None + + hh = headers[0].split(' ') + if not hh.length == 2: + return None + + auth_method = hh[0] + headers[0] = hh[1] + + for item in headers: + item = item.split(',')[0] + data = item.split('=') + if data.length != 2: + continue + + if data[0] == 'realm': + realm = data[1] + elif data[0] == 'nonce': + nonce = data[1] + elif data[0] == 'opaque': + opaque = data[1] + elif data[0] == 'qop': + qop = data[1] + + cnonce = generate_client_nonce() + self.nc += 1 + + # generate response + # md5 by md5.js + + ha1_prep = username + ':' + realm + ':' + password + HA1 = md5(ha1_prep) + ha2_prep = self.method + ':' + self.url + HA2 = md5(ha2_prep) + response = md5(HA1 + ':' + nonce + ':' + ('00000000' + self.nc).slice(-8) + ':' + cnonce + ':' + + qop + ':' + HA2) if qop else md5(HA1 + ':' + nonce + ':' + HA2) + + if qop: + return (auth_method + ' ' + + 'username="' + username + '", ' + + 'realm="' + realm + '", ' + + 'nonce="' + nonce + '", ' + + 'uri="' + self.url + '", ' + + 'response="' + response + '", ' + + 'opaque="' + opaque + '", ' + + 'qop=' + qop + '", ' + + 'nc=' + ('00000000' + self.nc).slice(-8)+', '+ + 'cnonce="' + cnonce + '"' + ) + + return (auth_method + ' ' + + 'username="' + username + '", ' + + 'realm="' + realm + '", ' + + 'nonce="' + nonce + '", ' + + 'uri="' + self.url + '", ' + + 'response="' + response + '"' + ) + diff --git a/cc/ControlCenter/utils/format_bytes.pyj b/cc/ControlCenter/utils/format_bytes.pyj new file mode 100644 index 0000000..53f9b72 --- /dev/null +++ b/cc/ControlCenter/utils/format_bytes.pyj @@ -0,0 +1,48 @@ +def format_bytes(pBytes, pCalc = 'iec', pUnits = 'si', separator = None): + + # Thank's to 'Brennan T' on + # http://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript + + if separator is None: + separator = ' ' + + # Handle some special cases + if pBytes == 0: + return '0 Bytes' + if pBytes == 1: + return '1 Byte' + if pBytes == -1: + return '-1 Byte' + + bytes = Math.abs(pBytes) + + # Attention: arm calculates according IEC, yet displays 'si' - Abbreviations + # Therefore we have to enable this wrong behaviour here! + + # IEC units use 2^10 as an order of magnitude + orderOfMagnitude = Math.pow(2, 10) + if pCalc is not None and pCalc.toLowerCase() == 'si': + #SI units use the Metric representation based on 10^3 as a order of magnitude + orderOfMagnitude = Math.pow(10, 3) + + # IEC units use 2^10 as an order of magnitude + abbreviations = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] + if pUnits is not None and pUnits.toLowerCase() == 'si': + # SI units use the Metric representation based on 10^3 as a order of magnitude + abbreviations = ['Bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + + i = Math.floor(Math.log(bytes) / Math.log(orderOfMagnitude)) + result = bytes / Math.pow(orderOfMagnitude, i) + + # This will get the sign right + if pBytes < 0: + result *= -1 + + # This bit here is purely for show. it drops the precision on numbers greater than 100 before the units. + # it also always shows the full number of bytes if bytes is the unit. + if result >= 99.995 or i == 0: + if result.toFixed(0) == 1: + return '1 Byte' + return result.toFixed(0) + separator + abbreviations[i] + + return result.toFixed(2) + separator + abbreviations[i] diff --git a/cc/ControlCenter/utils/make_id.pyj b/cc/ControlCenter/utils/make_id.pyj new file mode 100644 index 0000000..711efa1 --- /dev/null +++ b/cc/ControlCenter/utils/make_id.pyj @@ -0,0 +1,12 @@ +def make_id(id, tag=None, jquery=True): + + mid = "tobcc." + id + if tag is not None: + mid += "." + tag + + if jquery: + # https://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/ + # attention: '\\' has to be escaped @ $1 => '\\\\' @ v'' (Literal JavaScript) + return "#" + v'mid.replace( /(:|\.|\[|\]|,|=|@)/g, "\\\\$1" )' + + return mid diff --git a/cc/ControlCenter/utils/uuid.pyj b/cc/ControlCenter/utils/uuid.pyj new file mode 100644 index 0000000..0dc5b4d --- /dev/null +++ b/cc/ControlCenter/utils/uuid.pyj @@ -0,0 +1,15 @@ +def uuid4(): + + # https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript/8809472#8809472 + + d = Date().getTime() + if performance? and v'typeof performance.now' == 'function': + d += performance.now() + + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(v'/[xy]/g', def(c): + nonlocal d + r = (d + Math.random() * 16) % 16 | 0 + d = Math.floor(d / 16) + return (r if c == 'x' else (r & 0x3 | 0x8)).toString(16) + ) + diff --git a/cc/ControlCenter/utils/variables.pyj b/cc/ControlCenter/utils/variables.pyj new file mode 100644 index 0000000..5d56bd0 --- /dev/null +++ b/cc/ControlCenter/utils/variables.pyj @@ -0,0 +1,28 @@ +class TimestampedVariable(): + + def __init__(self, *args): + + assert(len(args) == 1) + + self.v = args[0] + self.type = $.type(self.v) + self.modified = (new Date).getTime() + + @property + def value(self): + return self.v + + @value.setter + def value(self, value): + assert($.type(value) == self.type) + self.v = value + self.modified = (new Date).getTime() + + def if_modified_since(self, timestamp): + # msg = 'last_mod: ' + self.modified + '| ims: ' + timestamp + # msg += ( ' ==> Modified') if self.modified > timestamp else '' + # console.log(msg) + if self.modified > timestamp: + return self.v + else: + return None \ No newline at end of file diff --git a/cc/lib/RapydSmoothie/__init__.pyj b/cc/lib/RapydSmoothie/__init__.pyj new file mode 100644 index 0000000..e69de29 diff --git a/cc/lib/RapydSmoothie/smoothie.pyj b/cc/lib/RapydSmoothie/smoothie.pyj new file mode 100644 index 0000000..2de9028 --- /dev/null +++ b/cc/lib/RapydSmoothie/smoothie.pyj @@ -0,0 +1,786 @@ +# +# RapydSmoothie +# A RapydScript-NG clone of SmoothieChart +# +# SmoothieChart Copyright (c) 2010-2013, Joe Walnes +# 2013-2018, Drew Noakes +# Details: www.smoothiechart.org / https://github.com/joewalnes/smoothie +# License: MIT @ https://github.com/joewalnes/smoothie/blob/master/LICENSE.txt +# +# RapydSmoothie Copyright (c) 2018, Ralph Wetzel +# License: MIT +# Language: RapydScript-NG Python to Javascript Transpiler +# https://github.com/kovidgoyal/rapydscript-ng +# Coverage: SmoothieChart 1.36 ("Add title option, by @mesca") +# + + +from RapydSmoothie.timeseries import TimeSeries +from RapydSmoothie.util import extend, DefaultOptionsBase + +# Date.now polyfill +Date.now = Date.now or def(): return Date().getTime() + +class DefaultChartOptions(DefaultOptionsBase): + + minValue = None + maxValue = None + maxValueScale = 1 + minValueScale = 1 + yRangeFunction = None + scaleSmoothing = 0.125 + millisPerPixel = 20 + enableDpiScaling = True + yMinFormatter = def(min, precision): + return parseFloat(min).toFixed(precision) + yMaxFormatter = def(max, precision): + return parseFloat(max).toFixed(precision) + yIntermediateFormatter = def(intermediate, precision): + return parseFloat(intermediate).toFixed(precision) + maxDataSetLength = 2 + interpolation = 'bezier' + timestampFormatter = None # will become RapydSmoothie.timeFormatter at __init__ + scrollBackwards = False + horizontalLines = [] + grid = { + 'fillStyle': '#000000', + 'lineWidth': 1, + 'strokeStyle': '#777777', + 'millisPerLine': 1000, + 'sharpLines': False, + 'verticalSections': 2, + 'borderVisible': True + } + labels = { + 'disabled': False, + 'fillStyle': '#ffffff', + 'fontSize': 10, + 'fontFamily': 'monospace', + 'precision': 2, + 'showIntermediateLabels': False, + 'intermediateLabelSameAxis': True + } + title = { + 'text': '', + 'fillStyle': '#ffffff', + 'fontSize': 15, + 'fontFamily': 'monospace', + 'verticalAlign': 'middle' + } + tooltip = False + tooltipLine = { + 'lineWidth': 1, + 'strokeStyle': '#BBBBBB' + } + tooltipFormatter = def(): + return + nonRealtimeData = False + displayDataFromPercentile = 1 + responsive = False + limitFPS = 25 + + +class DefaultSeriesPresentationOptions(DefaultOptionsBase): + lineWidth = 1 + strokeStyle = '#ffffff' + +class RapydSmoothie: + + def __init__(self, options: dict = {}): + + self.options = {} + self.options = extend(self.options, DefaultChartOptions(), {'timestampFormatter': RapydSmoothie.timeFormatter}, options) + + self.seriesSet = [] + self.currentValueRange = 1 + self.currentVisMinValue = 0 + self.lastRenderTimeMillis = 0 + self.lastChartTimestamp = 0 + + self.mousemove = self.on_mousemove.bind(self) + self.mouseout = self.on_mouseout.bind(self) + + self.valueRange = { 'min': Number.NaN, 'max': Number.NaN } + + self.canvas = None + + # from __python__ import bound_methods + + @staticmethod + def tooltipFormatter(timestamp, data): + # tooltipFormatter = def(timestamp, data): + + timestampFormatter = this.options.timestampFormatter or RapydSmoothie.timeFormatter + lines = [timestampFormatter(new Date(timestamp))] + + for item in data: + lines.push('' + + this.options.yMaxFormatter(item.value, this.options.labels.precision) + '') + + return lines.join('
') + + # from __python__ import no_bound_methods + + # @staticmethod + AnimateCompatibility = (def(): + + requestAF = def(callback, element): + r_AF = window.requestAnimationFrame or + window.webkitRequestAnimationFrame or + window.mozRequestAnimationFrame or + window.oRequestAnimationFrame or + window.msRequestAnimationFrame or + def(callback): return window.setTimeout(def(callback): callback(Date.now());, 16) + + return r_AF.call(window, callback, element) + + cancelAF = def(id): + c_AF = window.cancelAnimationFrame or + def(id): clearTimeout(id) + + return c_AF.call(window, id) + + return { + 'requestAnimationFrame': requestAF + + , 'cancelAnimationFrame': cancelAF + } + )() + + def addTimeSeries(self, ts: TimeSeries, options: dict = {}): + + opt = extend({}, DefaultSeriesPresentationOptions(), options) + self.seriesSet.push({'timeSeries': ts, + 'options': opt}) + + if ts.options.resetBounds and ts.options.resetBoundsInterval > 0: + ts.resetBoundsTimerId = setInterval(def(): + ts.resetBounds() + , ts.options.resetBoundsInterval) + + def removeTimeSeries(self, ts: TimeSeries): + + for index, serie in enumerate(self.seriesSet): + if serie.timeSeries is ts: + del self.seriesSet[index] + break + + if ts.resetBoundsTimerId: + clearInterval(ts.resetBoundsTimerId) + + def getTimeSeriesOptions(self, ts: TimeSeries): + + for serie in self.seriesSet: + if serie.timeSeries is ts: + return serie.options + + def bringToFront(self, ts: TimeSeries): + + for index, serie in enumerate(self.seriesSet): + if serie.timeSeries is ts: + del self.seriesSet[index] + self.seriesSet.push(serie) + break + + def streamTo(self, canvas, delayMillis): + self.canvas = canvas + self.delay = delayMillis + self.start() + + def getTooltipEl(self): + + if not self.tooltipEl?: + self.tooltipEl = document.createElement('div') + self.tooltipEl.className = 'smoothie-chart-tooltip' + self.tooltipEl.style.position = 'absolute' + self.tooltipEl.style.display = 'none' + document.body.appendChild(this.tooltipEl) + + return self.tooltipEl + + def updateTooltip(self): + + from RapydSmoothie.util import binarySearch + + el = self.getTooltipEl() + if not self.mouseover? or self.options.tooltip is False: + el.style.display = 'none' + return + + time = self.lastChartTimestamp + if self.options.scrollBackwards is True: + t = time - self.mouseX * self.options.millisPerPixel + else: + t = time - (self.canvas.offsetWidth - self.mouseX) * self.options.millisPerPixel + + data = [] + + for serie in self.seriesSet: + ts = serie.timeSeries + if ts.disabled == True: + continue + + closeIdx = binarySearch(ts.data, t) + if closeIdx > 0 and closeIdx < ts.data.length: + data.push({'series': serie, + 'index': closeIdx, + 'value': ts.data[closeIdx][1]}) + + if len(data) > 0: + el.innerHTML = self.options.tooltipFormatter.call(self, t, data) + el.style.display = 'block' + else: + el.style.display = 'none' + + def on_mousemove(self, event): + self.mouseover = True + self.mouseX = event.offsetX + self.mouseY = event.offsetY + self.mousePageX = event.pageX + self.mousePageY = event.pageY + + el = self.getTooltipEl() + el.style.top = Math.round(this.mousePageY) + 'px' + el.style.left = Math.round(this.mousePageX) + 'px' + self.updateTooltip() + + def on_mouseout(self): + self.mouseover = False + self.mouseX = None + self.mouseY = None + if self.tooltipEl is not None: + self.tooltipEl.style.display = 'none' + + def resize(self): + dpr = 1 + if self.options.enableDpiScaling is True and window is not None: + dpr = window.devicePixelRatio + + width = 0 + height = 0 + + if self.options.responsive: + width = self.canvas.offsetWidth + height = self.canvas.offsetHeight + + if width != self.lastWidth: + self.lastWidth = width + self.canvas.setAttribute('width', (Math.floor(width * dpr)).toString()) + if height != self.lastHeight: + self.lastHeight = height + self.canvas.setAttribute('height', (Math.floor(height * dpr)).toString()) + + elif dpr != 1: + + width = parseInt(self.canvas.getAttribute('width')) + height = parseInt(self.canvas.getAttribute('height')) + + if self.originalWidth is None or Math.floor(self.originalWidth * dpr) != width: + self.originalWidth = width + self.canvas.setAttribute('width', (Math.floor(width * dpr)).toString()) + self.canvas.style.width = width + 'px' + self.canvas.getContext('2d').scale(dpr, dpr) + + if self.originalHeight is None or Math.floor(self.originalHeight * dpr) != height: + self.originalHeight = height + self.canvas.setAttribute('height', (Math.floor(height * dpr)).toString()) + self.canvas.style.height = height + 'px' + self.canvas.getContext('2d').scale(dpr, dpr) + + def start(self): + if self.frame: + return + + self.canvas.addEventListener('mousemove', self.mousemove) + self.canvas.addEventListener('mouseout', self.mouseout) + + animate = def(): + + this.frame = this.AnimateCompatibility.requestAnimationFrame( + def(): + # reducer = def(max, series): + # dataSet = series.timeSeries.data + # lds = len(dataSet) + # indexToCheck = Math.round(self.options.displayDataFromPercentile * lds) - 1 + # indexToCheck = max(indexToCheck, 0) + # indexToCheck = min(indexToCheck, lds - 1) + # if dataSet is not None and lds > 0: + # lastDataTimeStamp = dataSet[indexToCheck][0] + # max = max(max, lastDataTimeStamp) + # return max + # .bind(this) + + # reducer = reduce_f.bind(this) + + if this.options.nonRealtimeData: + dateZero = new Date(0) + maxTimeStamp = this.seriesSet.reduce( + def(max, series): + dataSet = series.timeSeries.data + lds = len(dataSet) + indexToCheck = Math.round(this.options.displayDataFromPercentile * lds) - 1 + indexToCheck = max(indexToCheck, 0) + indexToCheck = min(indexToCheck, lds - 1) + if dataSet is not None and lds > 0: + lastDataTimeStamp = dataSet[indexToCheck][0] + max = max(max, lastDataTimeStamp) + return max + .bind(this), + dateZero) + + this.render(this.canvas, maxTimeStamp if maxTimeStamp > dateZero else None) + + else: + this.render() + + animate() + + .bind(this) + ) + + .bind(this) + + animate() + + + def stop(self): + if self.frame: + self.AnimateCompatibility.cancelAnimationFrame(self.frame) + self.frame = None + self.canvas.removeEventListener('mousemove', self.mousemove) + self.canvas.removeEventListener('mouseout', self.mouseout) + + + def updateValueRange(self): + + chartOptions = self.options + chartMaxValue = Number.NaN + chartMinValue = Number.NaN + + for serie in self.seriesSet: + ts = serie.timeSeries + if ts.disabled is True: + continue + + if ts.maxValue is not NaN: + chartMaxValue = max(chartMaxValue, ts.maxValue) if chartMaxValue is not NaN else ts.maxValue + + if ts.minValue is not NaN: + chartMinValue = min(chartMinValue, ts.minValue) if chartMinValue is not NaN else ts.minValue + + if chartOptions.maxValue?: + chartMaxValue = chartOptions.maxValue + else: + chartMaxValue *= chartOptions.maxValueScale + + if chartOptions.minValue?: + chartMinValue = chartOptions.minValue + else: + chartMinValue -= Math.abs(chartMinValue * chartOptions.minValueScale - chartMinValue) + + if self.options.yRangeFunction?: + rnge = self.options.yRangeFunction({'min': chartMinValue, 'max': chartMaxValue}) + chartMinValue = rnge.min + chartMaxValue = rnge.max + + if chartMaxValue is not NaN and chartMinValue is not NaN: + targetValueRange = chartMaxValue - chartMinValue + valueRangeDiff = targetValueRange - self.currentValueRange + minValueDiff = chartMinValue - self.currentVisMinValue + self.isAnimatingScale = Math.abs(valueRangeDiff) > 0.1 or Math.abs(minValueDiff) > 0.1 + self.currentValueRange += chartOptions.scaleSmoothing * valueRangeDiff + self.currentVisMinValue += chartOptions.scaleSmoothing * minValueDiff + + self.valueRange = { 'min': chartMinValue, 'max': chartMaxValue } + + def render(self, canvas, time): + + nowMillis = Date.now() + if self.options.limitFPS > 0: + if nowMillis - self.lastRenderTImeMillis < (1000 / self.options.limitFPS): + return + + if self.isAnimatingScale is False: + maxIdleMillis = min(1000/6, self.options.millisPerPixel) + if nowMillis - self.lastRenderTimeMillis < maxIdleMillis: + return + + + self.resize() + self.updateTooltip() + + self.lastRenderTimeMillis = nowMillis + + canvas = canvas or self.canvas + time = time or nowMillis - (self.delay or 0) + + # Round time down to pixel granularity, so motion appears smoother. + time -= time % self.options.millisPerPixel + + self.lastChartTimestamp = time + + context = canvas.getContext('2d') + chartOptions = self.options + dimensions = { + 'top': 0, + 'left': 0, + 'width': canvas.clientWidth, + 'height': canvas.clientHeight + } + + # Calculate the threshold time for the oldest data points. + oldestValidTime = time - (dimensions.width * chartOptions.millisPerPixel) + + valueToYPixel = def(value): + offset = value - self.currentVisMinValue + if self.currentValueRange == 0: + return dimensions.height + return dimensions.height - (Math.round((offset / self.currentValueRange) * dimensions.height)) + .bind(self) + + def timeToXPixel(t): + if chartOptions.scrollBackwards is True: + return Math.round((time - t) / chartOptions.millisPerPixel) + return Math.round(dimensions.width - ((time - t) / chartOptions.millisPerPixel)) + + self.updateValueRange() + + context.font = chartOptions.labels.fontSize + 'px ' + chartOptions.labels.fontFamily + + # Move origin, create clipping rectangle, clear area + self.render_10(context, chartOptions, dimensions) + + # Grid lines Vertical & Horizontal, Bounding Rect + self.render_20(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + # Draw any horizontal lines... + self.render_30(context, chartOptions, dimensions, valueToYPixel) + + # Draw the TimeSeries + self.render_40(context, chartOptions, dimensions, oldestValidTime, timeToXPixel, valueToYPixel) + + # Draw vertical bar to show tooltip position + self.render_50(context, chartOptions, dimensions) + + # Draw the axis values on the chart. + self.render_60(context, chartOptions, dimensions) + + # Display intermediate y axis labels along y-axis to the left of the chart + self.render_70(context, chartOptions, dimensions) + + # Display timestamps along x-axis at the bottom of the chart. + self.render_80(context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel) + + + def render_10(self, context, chartOptions, dimensions): + + # Save the state of the canvas context, any transformations applied in this method + # will get removed from the stack at the end of this method when .restore() is called. + context.save() + + # Move the origin. + context.translate(dimensions.left, dimensions.top) + + # Create a clipped rectangle - anything we draw will be constrained to this rectangle. + # This prevents the occasional pixels from curves near the edges overrunning and creating + # screen cheese (that phrase should need no explanation). + context.beginPath() + context.rect(0, 0, dimensions.width, dimensions.height) + context.clip() + + # Clear the working area. + context.save() + context.fillStyle = chartOptions.grid.fillStyle + context.clearRect(0, 0, dimensions.width, dimensions.height) + context.fillRect(0, 0, dimensions.width, dimensions.height) + + context.restore() + + def render_20(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel): + + # Grid lines... + context.save() + context.lineWidth = chartOptions.grid.lineWidth + context.strokeStyle = chartOptions.grid.strokeStyle + # print(chartOptions.grid.strokeStyle) + + # Vertical (time) dividers. + if (chartOptions.grid.millisPerLine > 0): + context.beginPath() + t = time - (time % chartOptions.grid.millisPerLine) + + while t>= oldestValidTime: + + gx = timeToXPixel(t) + if chartOptions.grid.sharpLines: + gx -= 0.5 + context.moveTo(gx, 0) + context.lineTo(gx, dimensions.height) + + t -= chartOptions.grid.millisPerLine + + context.stroke() + context.closePath() + + # Horizontal (value) dividers. + v = 1 + while v < chartOptions.grid.verticalSections: + + gy = Math.round(v * dimensions.height / chartOptions.grid.verticalSections) + if chartOptions.grid.sharpLines: + gy -= 0.5 + + context.beginPath() + context.moveTo(0, gy) + context.lineTo(dimensions.width, gy) + context.stroke() + context.closePath() + + v += 1 + + # Bounding rectangle + if chartOptions.grid.borderVisible: + context.beginPath() + context.strokeRect(0, 0, dimensions.width, dimensions.height) + context.closePath() + + context.restore() + + def render_30(self, context, chartOptions, dimensions, valueToYPixel): + + # Draw any horizontal lines... + context.save() + + for line in chartOptions.horizontalLines: + hly = Math.round(valueToYPixel(line.value)) - 0.5 + context.strokeStyle = line.color or '#ffffff' + context.lineWidth = line.lineWidth or 1 + context.beginPath() + context.moveTo(0, hly) + context.lineTo(dimensions.width, hly) + context.stroke() + context.closePath() + + context.restore() + + def render_40(self, context, chartOptions, dimensions, oldestValidTime, timeToXPixel, valueToYPixel): + + # For each data set... + for serie in self.seriesSet: + context.save() + ts = serie.timeSeries + if ts.disabled is True: + continue + + dataSet = ts.data + seriesOptions = serie.options + + # Delete old data that's moved off the left of the chart. + ts.dropOldData(oldestValidTime, chartOptions.maxDataSetLength) + + # Set style for this dataSet. + context.lineWidth = seriesOptions.lineWidth + context.strokeStyle = seriesOptions.strokeStyle + + # Draw the line... + context.beginPath() + + # Retain lastX, lastY for calculating the control points of bezier curves. + firstX = 0 + lastX = 0 + lastY = 0 + + if len(dataSet) > 1: + for index, set in enumerate(dataSet): + x = timeToXPixel(set[0]) + y = valueToYPixel(set[1]) + + if index == 0: + firstX = x + context.moveTo(x, y) + else: + if chartOptions.interpolation in ['linear', 'line']: + context.lineTo(x, y) + + elif chartOptions.interpolation == 'step': + context.lineTo(x, lastY) + context.lineTo(x, y) + + else: + # Great explanation of Bezier curves: http://en.wikipedia.org/wiki/Bezier_curve#Quadratic_curves + # + # Assuming A was the last point in the line plotted and B is the new point, + # we draw a curve with control points P and Q as below. + # + # A---P + # | + # | + # | + # Q---B + # + # Importantly, A and P are at the same y coordinate, as are B and Q. This is + # so adjacent curves appear to flow as one. + # + + + context.bezierCurveTo( # startPoint (A) is implicit from last iteration of loop + Math.round((lastX + x) / 2), lastY, # controlPoint1 (P) + Math.round((lastX + x)) / 2, y, # controlPoint2 (Q) + x, y) # endPoint (B) + + + lastX = x + lastY = y + + if len(dataSet) > 1: + if seriesOptions.fillStyle: + # Close up the fill region. + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, lastY) + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, + dimensions.height + seriesOptions.lineWidth + 1) + context.lineTo(firstX, dimensions.height + seriesOptions.lineWidth) + context.fillStyle = seriesOptions.fillStyle + context.fill() + + if seriesOptions.strokeStyle and seriesOptions.strokeStyle is not 'none': + context.stroke() + + context.closePath() + + context.restore() + + def render_50(self, context, chartOptions, dimensions): + # Draw vertical bar to show tooltip position + + if chartOptions.tooltip and self.mouseX >= 0: + context.save() + + context.lineWidth = chartOptions.tooltipLine.lineWidth + context.strokeStyle = chartOptions.tooltipLine.strokeStyle + context.beginPath() + context.moveTo(self.mouseX, 0) + context.lineTo(self.mouseX, dimensions.height) + context.closePath() + context.stroke() + self.updateTooltip() + + context.restore() + + def render_60(self, context, chartOptions, dimensions): + + # Draw the axis values on the chart. + if chartOptions.labels.disabled is False: + if self.valueRange.min is not NaN: + if self.valueRange.max is not NaN: + + context.save() + + maxValueString = chartOptions.yMaxFormatter(self.valueRange.max, chartOptions.labels.precision) + minValueString = chartOptions.yMinFormatter(self.valueRange.min, chartOptions.labels.precision) + if chartOptions.scrollBackwards is True: + maxLabelPos = 0 + minLabelPos = 0 + else: + maxLabelPos = dimensions.width - context.measureText(maxValueString).width - 2 + minLabelPos = dimensions.width - context.measureText(minValueString).width - 2 + + context.fillStyle = chartOptions.labels.fillStyle + context.fillText(maxValueString, maxLabelPos, chartOptions.labels.fontSize) + context.fillText(minValueString, minLabelPos, dimensions.height - 2) + + context.restore() + + def render_70(self, context, chartOptions, dimensions): + # Display intermediate y axis labels along y-axis to the left of the chart + + if chartOptions.labels.showIntermediateLabels is True: + + + if self.valueRange.min is not NaN and self.valueRange.max is not NaN: + if chartOptions.grid.verticalSections > 0: + # show a label above every vertical section divider + + context.save() + + step = (self.valueRange.max - self.valueRange.min) / chartOptions.grid.verticalSections + stepPixels = dimensions.height / chartOptions.grid.verticalSections + v = 1 + while v < chartOptions.grid.verticalSections: + gy = dimensions.height - Math.round(v * stepPixels) + if chartOptions.grid.sharpLines: + gy -= 0.5 + yValue = chartOptions.yIntermediateFormatter(self.valueRange.min + (v * step), + chartOptions.labels.precision) + + # left of right axis? + if chartOptions.labels.intermediateLabelSameAxis is True: + if chartOptions.scrollBackwards is True: + intermediateLabelPos = 0 + else: + intermediateLabelPos = dimensions.width - context.measureText(yValue).width - 2 + else: + if chartOptions.scrollBackwards is True: + intermediateLabelPos = dimensions.width - context.measureText(yValue).width - 2 + else: + intermediateLabelPos = 0 + + context.fillText(yValue, intermediateLabelPos, gy - chartOptions.grid.lineWidth) + + v += 1 + + context.restore() + + def render_80(self, context, chartOptions, dimensions, time, oldestValidTime, timeToXPixel): + # Display timestamps along x-axis at the bottom of the chart. + + if chartOptions.timestampFormatter? and chartOptions.grid.millisPerLine > 0: + + context.save() + + if self.valueRange.min is not NaN: + minValueString = chartOptions.yMinFormatter(self.valueRange.min, chartOptions.labels.precision) + else: + minValueString = '' + + if chartOptions.scrollBackwards is True: + textUntilX = context.measureText(minValueString).width + else: + textUntilX = dimensions.width - context.measureText(minValueString).width + 4 + + t = time - (time % chartOptions.grid.millisPerLine) + + while t >= oldestValidTime: + + gx = timeToXPixel(t) + # Only draw the timestamp if it won't overlap with the previously drawn one. + + if (chartOptions.scrollBackwards is False and gx < textUntilX) or (chartOptions.scrollBackwards is True and gx > textUntilX): + # Formats the timestamp based on user specified formatting function + # SmoothieChart.timeFormatter function above is one such formatting option + + tx = Date(t) + tsf = chartOptions.timestampFormatter(tx) + tsWidth = context.measureText(tsf).width + + textUntilX = (gx + tsWidth + 2) if chartOptions.scrollBackwards is True else (gx - tsWidth - 2) + + context.fillStyle = chartOptions.labels.fillStyle + if chartOptions.scrollBackwards: + context.fillText(tsf, gx, dimensions.height - 2) + else: + context.fillText(tsf, gx - tsWidth, dimensions.height - 2) + + t -= chartOptions.grid.millisPerLine + + context.restore() + + # Sample timestamp formatting function + @staticmethod + def timeFormatter(date): + def pad2(number): + return ('0' if number < 10 else '') + number + + return pad2(date.getHours()) + ':' + pad2(date.getMinutes()) + ':' + pad2(date.getSeconds()) + + +window.RapydSmoothie = RapydSmoothie \ No newline at end of file diff --git a/cc/lib/RapydSmoothie/timeseries.pyj b/cc/lib/RapydSmoothie/timeseries.pyj new file mode 100644 index 0000000..1e9a89d --- /dev/null +++ b/cc/lib/RapydSmoothie/timeseries.pyj @@ -0,0 +1,95 @@ +# +# Part of RapydSmoothie +# A RapydScript-NG clone of SmoothieChart +# +# SmoothieChart Copyright (c) 2010-2013, Joe Walnes +# 2013-2018, Drew Noakes +# Details: www.smoothiechart.org / https://github.com/joewalnes/smoothie +# License: MIT @ https://github.com/joewalnes/smoothie/blob/master/LICENSE.txt +# +# RapydSmoothie Copyright (c) 2018, Ralph Wetzel +# License: MIT +# Language: RapydScript-NG Transpiler +# https://github.com/kovidgoyal/rapydscript-ng +# Coverage: SmoothieChart 1.36 ("Add title option, by @mesca") +# + +from RapydSmoothie.util import extend + +class TimeSeries(): + + defaultOptions = { + "resetBoundsInterval": 3000, + "resetBounds": True + } + + def __init__(self, options: dict = {}): + + self.options = extend({}, TimeSeries.defaultOptions, options) + self.disabled = False + self.clear() + + # Clears all data and state from this TimeSeries object. + def clear(self): + self.data = [] + self.maxValue = None + self.minValue = None + + # Recalculate the min/max values for this TimeSeries object. + # This causes the graph to scale itself in the y-axis. + def resetBounds(self): + + if len(self.data) > 0: + self.minValue = self.data[0][1] + self.maxValue = self.data[0][1] + for p in self.data: + pv = p[1] + if pv < self.minValue: + self.minValue = pv + elif pv > self.maxValue: + self.maxValue = pv + else: + self.maxValue = None + self.minValue = None + + # Adds a new data point to the TimeSeries, preserving chronological order. + def append(self, timestamp, value, sumRepeatedTimeStampValues=False): + + i = len(self.data) - 1 + + while i>=0 and self.data[i][0] > timestamp: + i-=1 + + if i == -1: + # This new item is the oldest data + self.data.insert(0, [timestamp, value]) + elif len(self.data)>0 and self.data[i][0] == timestamp: + # Update existing values in the array + if sumRepeatedTimeStampValues is True: + # Sum this value into the existing 'bucket' + self.data[i][1] += value + else: + # Replace the previous value + self.data[i][1] = value + elif i < len(self.data) - 1: + # Splice into the correct position to keep timestamps in order + self.data.insert(i+1, [timestamp, value]) + else: + # Add to the end of the array + self.data.push([timestamp, value]) + + self.maxValue = value if self.maxValue is None else max(self.maxValue, value) + self.minValue = value if self.minValue is None else min(self.minValue, value) + + def dropOldData(self, oldestValidTime, maxDataSetLength): + # We must always keep one expired data point as we need this to draw the + # line that comes into the chart from the left, but any points prior to that can be removed. + removeCount = 0 + lsd = len(self.data) + + while lsd - removeCount >= maxDataSetLength and self.data[removeCount + 1][0] < oldestValidTime: + removeCount += 1 + if removeCount != 0: + self.data.splice(0, removeCount) + +window.TimeSeries = TimeSeries \ No newline at end of file diff --git a/cc/lib/RapydSmoothie/util.pyj b/cc/lib/RapydSmoothie/util.pyj new file mode 100644 index 0000000..e97cdc4 --- /dev/null +++ b/cc/lib/RapydSmoothie/util.pyj @@ -0,0 +1,70 @@ +##### +# +# Part of RapydSmoothie +# A RapydScript-NG clone of SmoothieChart +# +# SmoothieChart Copyright (c) 2010-2013, Joe Walnes +# 2013-2018, Drew Noakes +# Details: www.smoothiechart.org / https://github.com/joewalnes/smoothie +# License: MIT @ https://github.com/joewalnes/smoothie/blob/master/LICENSE.txt +# +# RapydSmoothie Copyright (c) 2018, Ralph Wetzel +# License: MIT +# Language: RapydScript-NG Transpiler +# https://github.com/kovidgoyal/rapydscript-ng +# Coverage: SmoothieChart 1.36 ("Add title option, by @mesca") +# +##### + +class DefaultOptionsBase: + + def hasOwnProperty(self, key): + rv = key not in ['constructor', '__init__', '__repr__', '__str__', 'hasOwnProperty'] + # console.log('hOP: ' + key + " => " + rv) + return rv + + +def extend(*args): + + def all_property_keys(o): + v"""var keys = []; + for (var k in o) { + keys.push(k); + } + return keys""" + + args[0] = args[0] or {}; + + al = len(args) + i = 1 + + while i < al: + keys = all_property_keys(args[i]) + for key in keys: + if args[i].hasOwnProperty(key): + # second test necessary as typeof(null) == 'object' + if v"typeof(args[i][key]) === 'object'" and args[i][key]?: + if Array.isArray(args[i][key]) is True: + args[0][key] = args[i][key] + else: + args[0][key] = extend(args[0][key], args[i][key]) + else: + args[0][key] = args[i][key] + + i += 1 + + return args[0] + +def binarySearch(data, value): + + low = 0 + high = len(data) + + while low < high: + mid = (low + high) >> 1 + if value < data[mid][0]: + high = mid + else: + low = mid + 1 + + return low \ No newline at end of file diff --git a/docs/images/cc.png b/docs/images/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5f1c9d7cd48b94e4e27baf911a618e20d6e62e GIT binary patch literal 1006189 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�SgjI|&idj~rFOHnuHXww6XQ~c6-J$f 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

3_4gacEkZQ|#0ix_yV5dU+s-DU_I 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%0D~|o}LRt9$t_@fOT8{ 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

ljv2n*NFzzAx*bo#TF2z$3N^kdXMk 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