Explorar el Código

Adding Front-end code

Steve L. Nyemba hace 8 años
padre
commit
66e4091023
Se han modificado 92 ficheros con 21749 adiciones y 1004 borrados
  1. 1 0
      .gitignore
  2. 1 1
      config.json
  3. 15 0
      config.json_bak
  4. 0 0
      install.sh
  5. BIN
      sandbox-bak/bin/python
  6. 1 0
      sandbox-bak/bin/python3
  7. 1 0
      sandbox-bak/bin/python3.5
  8. 1 0
      sandbox-bak/include/python3.5m
  9. 1 0
      sandbox-bak/lib/python3.5/__future__.py
  10. 1 0
      sandbox-bak/lib/python3.5/_bootlocale.py
  11. 1 0
      sandbox-bak/lib/python3.5/_collections_abc.py
  12. 1 0
      sandbox-bak/lib/python3.5/_dummy_thread.py
  13. 1 0
      sandbox-bak/lib/python3.5/_weakrefset.py
  14. 1 0
      sandbox-bak/lib/python3.5/abc.py
  15. 1 0
      sandbox-bak/lib/python3.5/base64.py
  16. 1 0
      sandbox-bak/lib/python3.5/bisect.py
  17. 1 0
      sandbox-bak/lib/python3.5/codecs.py
  18. 1 0
      sandbox-bak/lib/python3.5/collections
  19. 1 0
      sandbox-bak/lib/python3.5/config-3.5m
  20. 1 0
      sandbox-bak/lib/python3.5/copy.py
  21. 1 0
      sandbox-bak/lib/python3.5/copyreg.py
  22. 1 0
      sandbox-bak/lib/python3.5/encodings
  23. 1 0
      sandbox-bak/lib/python3.5/fnmatch.py
  24. 1 0
      sandbox-bak/lib/python3.5/functools.py
  25. 1 0
      sandbox-bak/lib/python3.5/genericpath.py
  26. 1 0
      sandbox-bak/lib/python3.5/hashlib.py
  27. 1 0
      sandbox-bak/lib/python3.5/heapq.py
  28. 1 0
      sandbox-bak/lib/python3.5/hmac.py
  29. 1 0
      sandbox-bak/lib/python3.5/imp.py
  30. 1 0
      sandbox-bak/lib/python3.5/importlib
  31. 1 0
      sandbox-bak/lib/python3.5/io.py
  32. 1 0
      sandbox-bak/lib/python3.5/keyword.py
  33. 1 0
      sandbox-bak/lib/python3.5/lib-dynload
  34. 1 0
      sandbox-bak/lib/python3.5/linecache.py
  35. 1 0
      sandbox-bak/lib/python3.5/locale.py
  36. 0 0
      sandbox-bak/lib/python3.5/no-global-site-packages.txt
  37. 1 0
      sandbox-bak/lib/python3.5/ntpath.py
  38. 1 0
      sandbox-bak/lib/python3.5/operator.py
  39. 1 0
      sandbox-bak/lib/python3.5/orig-prefix.txt
  40. 1 0
      sandbox-bak/lib/python3.5/os.py
  41. 1 0
      sandbox-bak/lib/python3.5/plat-darwin
  42. 1 0
      sandbox-bak/lib/python3.5/posixpath.py
  43. 1 0
      sandbox-bak/lib/python3.5/random.py
  44. 1 0
      sandbox-bak/lib/python3.5/re.py
  45. 1 0
      sandbox-bak/lib/python3.5/reprlib.py
  46. 1 0
      sandbox-bak/lib/python3.5/rlcompleter.py
  47. 1 0
      sandbox-bak/lib/python3.5/shutil.py
  48. 758 0
      sandbox-bak/lib/python3.5/site.py
  49. 1 0
      sandbox-bak/lib/python3.5/sre_compile.py
  50. 1 0
      sandbox-bak/lib/python3.5/sre_constants.py
  51. 1 0
      sandbox-bak/lib/python3.5/sre_parse.py
  52. 1 0
      sandbox-bak/lib/python3.5/stat.py
  53. 1 0
      sandbox-bak/lib/python3.5/struct.py
  54. 1 0
      sandbox-bak/lib/python3.5/tarfile.py
  55. 1 0
      sandbox-bak/lib/python3.5/tempfile.py
  56. 1 0
      sandbox-bak/lib/python3.5/token.py
  57. 1 0
      sandbox-bak/lib/python3.5/tokenize.py
  58. 1 0
      sandbox-bak/lib/python3.5/types.py
  59. 1 0
      sandbox-bak/lib/python3.5/warnings.py
  60. 1 0
      sandbox-bak/lib/python3.5/weakref.py
  61. 69 50
      src/api/index.py
  62. 615 0
      src/api/static/chartist/chartist.css
  63. 10 0
      src/api/static/chartist/chartist.css.map
  64. 4488 0
      src/api/static/chartist/chartist.js
  65. 1 0
      src/api/static/chartist/chartist.min.css
  66. 10 0
      src/api/static/chartist/chartist.min.js
  67. 1 0
      src/api/static/chartist/chartist.min.js.map
  68. 241 0
      src/api/static/chartist/scss/chartist.scss
  69. 88 0
      src/api/static/chartist/scss/settings/_chartist-settings.scss
  70. 6 0
      src/api/static/css/animate.min.css
  71. 5 0
      src/api/static/css/bootstrap.min.css
  72. 2748 0
      src/api/static/css/dashboard.css
  73. 0 146
      src/api/static/css/default.css
  74. 1 1
      src/api/static/css/fa/scss/_core.scss
  75. 1081 0
      src/api/static/css/themify-icons.css
  76. BIN
      src/api/static/fonts/themify.eot
  77. 362 0
      src/api/static/fonts/themify.svg
  78. BIN
      src/api/static/fonts/themify.ttf
  79. BIN
      src/api/static/fonts/themify.woff
  80. 0 12
      src/api/static/index.html
  81. 248 0
      src/api/static/js/bootstrap-checkbox-radio.js
  82. 404 0
      src/api/static/js/bootstrap-notify.js
  83. 7 0
      src/api/static/js/bootstrap.min.js
  84. 9 0
      src/api/static/js/chartist.min.js
  85. 0 2
      src/api/static/js/colors.js
  86. 237 609
      src/api/static/js/dashboard.js
  87. 140 0
      src/api/static/js/default.js
  88. 9789 0
      src/api/static/js/jquery-1.10.2.js
  89. 351 183
      src/api/templates/dashboard.html
  90. 1 0
      src/api/templates/upgrade.html
  91. 1 0
      src/api/templates/user.html
  92. 8 0
      start.sh

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 sandbox
 *.pyc
+.DS_Store

+ 1 - 1
config.json

@@ -15,4 +15,4 @@
 	}
 	
 	
-}
+}

+ 15 - 0
config.json_bak

@@ -0,0 +1,15 @@
+{
+	"virtual-env":{
+		"class":"Sandbox",
+		"config":{
+			"3-launchpad":{"requirements":"/Users/michaelmead/Documents/git/repair-file/required.txt","sandbox":"/Users/michaelmead/Documents/git/sandbox"}
+		}
+	},
+	"processes":{
+		"class":"DetailProcess",
+		"config":{
+			"system":["postgresql","couchdb","httpd"]
+			}
+	}
+	
+}

+ 0 - 0
install.sh


BIN
sandbox-bak/bin/python


+ 1 - 0
sandbox-bak/bin/python3

@@ -0,0 +1 @@
+python

+ 1 - 0
sandbox-bak/bin/python3.5

@@ -0,0 +1 @@
+python

+ 1 - 0
sandbox-bak/include/python3.5m

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/include/python3.5m

+ 1 - 0
sandbox-bak/lib/python3.5/__future__.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/__future__.py

+ 1 - 0
sandbox-bak/lib/python3.5/_bootlocale.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/_bootlocale.py

+ 1 - 0
sandbox-bak/lib/python3.5/_collections_abc.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/_collections_abc.py

+ 1 - 0
sandbox-bak/lib/python3.5/_dummy_thread.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/_dummy_thread.py

+ 1 - 0
sandbox-bak/lib/python3.5/_weakrefset.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/_weakrefset.py

+ 1 - 0
sandbox-bak/lib/python3.5/abc.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/abc.py

+ 1 - 0
sandbox-bak/lib/python3.5/base64.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/base64.py

+ 1 - 0
sandbox-bak/lib/python3.5/bisect.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/bisect.py

+ 1 - 0
sandbox-bak/lib/python3.5/codecs.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/codecs.py

+ 1 - 0
sandbox-bak/lib/python3.5/collections

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/collections

+ 1 - 0
sandbox-bak/lib/python3.5/config-3.5m

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/config-3.5m

+ 1 - 0
sandbox-bak/lib/python3.5/copy.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/copy.py

+ 1 - 0
sandbox-bak/lib/python3.5/copyreg.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/copyreg.py

+ 1 - 0
sandbox-bak/lib/python3.5/encodings

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/encodings

+ 1 - 0
sandbox-bak/lib/python3.5/fnmatch.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/fnmatch.py

+ 1 - 0
sandbox-bak/lib/python3.5/functools.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/functools.py

+ 1 - 0
sandbox-bak/lib/python3.5/genericpath.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/genericpath.py

+ 1 - 0
sandbox-bak/lib/python3.5/hashlib.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/hashlib.py

+ 1 - 0
sandbox-bak/lib/python3.5/heapq.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/heapq.py

+ 1 - 0
sandbox-bak/lib/python3.5/hmac.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/hmac.py

+ 1 - 0
sandbox-bak/lib/python3.5/imp.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/imp.py

+ 1 - 0
sandbox-bak/lib/python3.5/importlib

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/importlib

+ 1 - 0
sandbox-bak/lib/python3.5/io.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/io.py

+ 1 - 0
sandbox-bak/lib/python3.5/keyword.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/keyword.py

+ 1 - 0
sandbox-bak/lib/python3.5/lib-dynload

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/lib-dynload

+ 1 - 0
sandbox-bak/lib/python3.5/linecache.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/linecache.py

+ 1 - 0
sandbox-bak/lib/python3.5/locale.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/locale.py

+ 0 - 0
sandbox-bak/lib/python3.5/no-global-site-packages.txt


+ 1 - 0
sandbox-bak/lib/python3.5/ntpath.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/ntpath.py

+ 1 - 0
sandbox-bak/lib/python3.5/operator.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/operator.py

+ 1 - 0
sandbox-bak/lib/python3.5/orig-prefix.txt

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda

+ 1 - 0
sandbox-bak/lib/python3.5/os.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/os.py

+ 1 - 0
sandbox-bak/lib/python3.5/plat-darwin

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/plat-darwin

+ 1 - 0
sandbox-bak/lib/python3.5/posixpath.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/posixpath.py

+ 1 - 0
sandbox-bak/lib/python3.5/random.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/random.py

+ 1 - 0
sandbox-bak/lib/python3.5/re.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/re.py

+ 1 - 0
sandbox-bak/lib/python3.5/reprlib.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/reprlib.py

+ 1 - 0
sandbox-bak/lib/python3.5/rlcompleter.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/rlcompleter.py

+ 1 - 0
sandbox-bak/lib/python3.5/shutil.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/shutil.py

+ 758 - 0
sandbox-bak/lib/python3.5/site.py

@@ -0,0 +1,758 @@
+"""Append module search paths for third-party packages to sys.path.
+
+****************************************************************
+* This module is automatically imported during initialization. *
+****************************************************************
+
+In earlier versions of Python (up to 1.5a3), scripts or modules that
+needed to use site-specific modules would place ``import site''
+somewhere near the top of their code.  Because of the automatic
+import, this is no longer necessary (but code that does it still
+works).
+
+This will append site-specific paths to the module search path.  On
+Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
+appends lib/python<version>/site-packages as well as lib/site-python.
+It also supports the Debian convention of
+lib/python<version>/dist-packages.  On other platforms (mainly Mac and
+Windows), it uses just sys.prefix (and sys.exec_prefix, if different,
+but this is unlikely).  The resulting directories, if they exist, are
+appended to sys.path, and also inspected for path configuration files.
+
+FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
+Local addons go into /usr/local/lib/python<version>/site-packages
+(resp. /usr/local/lib/site-python), Debian addons install into
+/usr/{lib,share}/python<version>/dist-packages.
+
+A path configuration file is a file whose name has the form
+<package>.pth; its contents are additional directories (one per line)
+to be added to sys.path.  Non-existing directories (or
+non-directories) are never added to sys.path; no directory is added to
+sys.path more than once.  Blank lines and lines beginning with
+'#' are skipped. Lines starting with 'import' are executed.
+
+For example, suppose sys.prefix and sys.exec_prefix are set to
+/usr/local and there is a directory /usr/local/lib/python2.X/site-packages
+with three subdirectories, foo, bar and spam, and two path
+configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
+following:
+
+  # foo package configuration
+  foo
+  bar
+  bletch
+
+and bar.pth contains:
+
+  # bar package configuration
+  bar
+
+Then the following directories are added to sys.path, in this order:
+
+  /usr/local/lib/python2.X/site-packages/bar
+  /usr/local/lib/python2.X/site-packages/foo
+
+Note that bletch is omitted because it doesn't exist; bar precedes foo
+because bar.pth comes alphabetically before foo.pth; and spam is
+omitted because it is not mentioned in either path configuration file.
+
+After these path manipulations, an attempt is made to import a module
+named sitecustomize, which can perform arbitrary additional
+site-specific customizations.  If this import fails with an
+ImportError exception, it is silently ignored.
+
+"""
+
+import sys
+import os
+try:
+    import __builtin__ as builtins
+except ImportError:
+    import builtins
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+# Prefixes for site-packages; add additional prefixes like /usr/local here
+PREFIXES = [sys.prefix, sys.exec_prefix]
+# Enable per user site-packages directory
+# set it to False to disable the feature or True to force the feature
+ENABLE_USER_SITE = None
+# for distutils.commands.install
+USER_SITE = None
+USER_BASE = None
+
+_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
+_is_pypy = hasattr(sys, 'pypy_version_info')
+_is_jython = sys.platform[:4] == 'java'
+if _is_jython:
+    ModuleType = type(os)
+
+def makepath(*paths):
+    dir = os.path.join(*paths)
+    if _is_jython and (dir == '__classpath__' or
+                       dir.startswith('__pyclasspath__')):
+        return dir, dir
+    dir = os.path.abspath(dir)
+    return dir, os.path.normcase(dir)
+
+def abs__file__():
+    """Set all module' __file__ attribute to an absolute path"""
+    for m in sys.modules.values():
+        if ((_is_jython and not isinstance(m, ModuleType)) or
+            hasattr(m, '__loader__')):
+            # only modules need the abspath in Jython. and don't mess
+            # with a PEP 302-supplied __file__
+            continue
+        f = getattr(m, '__file__', None)
+        if f is None:
+            continue
+        m.__file__ = os.path.abspath(f)
+
+def removeduppaths():
+    """ Remove duplicate entries from sys.path along with making them
+    absolute"""
+    # This ensures that the initial path provided by the interpreter contains
+    # only absolute pathnames, even if we're running from the build directory.
+    L = []
+    known_paths = set()
+    for dir in sys.path:
+        # Filter out duplicate paths (on case-insensitive file systems also
+        # if they only differ in case); turn relative paths into absolute
+        # paths.
+        dir, dircase = makepath(dir)
+        if not dircase in known_paths:
+            L.append(dir)
+            known_paths.add(dircase)
+    sys.path[:] = L
+    return known_paths
+
+# XXX This should not be part of site.py, since it is needed even when
+# using the -S option for Python.  See http://www.python.org/sf/586680
+def addbuilddir():
+    """Append ./build/lib.<platform> in case we're running in the build dir
+    (especially for Guido :-)"""
+    from distutils.util import get_platform
+    s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
+    if hasattr(sys, 'gettotalrefcount'):
+        s += '-pydebug'
+    s = os.path.join(os.path.dirname(sys.path[-1]), s)
+    sys.path.append(s)
+
+def _init_pathinfo():
+    """Return a set containing all existing directory entries from sys.path"""
+    d = set()
+    for dir in sys.path:
+        try:
+            if os.path.isdir(dir):
+                dir, dircase = makepath(dir)
+                d.add(dircase)
+        except TypeError:
+            continue
+    return d
+
+def addpackage(sitedir, name, known_paths):
+    """Add a new path to known_paths by combining sitedir and 'name' or execute
+    sitedir if it starts with 'import'"""
+    if known_paths is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname, "rU")
+    except IOError:
+        return
+    try:
+        for line in f:
+            if line.startswith("#"):
+                continue
+            if line.startswith("import"):
+                exec(line)
+                continue
+            line = line.rstrip()
+            dir, dircase = makepath(sitedir, line)
+            if not dircase in known_paths and os.path.exists(dir):
+                sys.path.append(dir)
+                known_paths.add(dircase)
+    finally:
+        f.close()
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitedir(sitedir, known_paths=None):
+    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
+    'sitedir'"""
+    if known_paths is None:
+        known_paths = _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in known_paths:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name.endswith(os.extsep + "pth"):
+            addpackage(sitedir, name, known_paths)
+    if reset:
+        known_paths = None
+    return known_paths
+
+def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
+    """Add site-packages (and possibly site-python) to sys.path"""
+    prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
+    if exec_prefix != sys_prefix:
+        prefixes.append(os.path.join(exec_prefix, "local"))
+
+    for prefix in prefixes:
+        if prefix:
+            if sys.platform in ('os2emx', 'riscos') or _is_jython:
+                sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+            elif _is_pypy:
+                sitedirs = [os.path.join(prefix, 'site-packages')]
+            elif sys.platform == 'darwin' and prefix == sys_prefix:
+
+                if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python
+
+                    sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"),
+                                os.path.join(prefix, "Extras", "lib", "python")]
+
+                else: # any other Python distros on OSX work this way
+                    sitedirs = [os.path.join(prefix, "lib",
+                                             "python" + sys.version[:3], "site-packages")]
+
+            elif os.sep == '/':
+                sitedirs = [os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "site-packages"),
+                            os.path.join(prefix, "lib", "site-python"),
+                            os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
+                lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
+                if (os.path.exists(lib64_dir) and
+                    os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
+                    if _is_64bit:
+                        sitedirs.insert(0, lib64_dir)
+                    else:
+                        sitedirs.append(lib64_dir)
+                try:
+                    # sys.getobjects only available in --with-pydebug build
+                    sys.getobjects
+                    sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
+                except AttributeError:
+                    pass
+                # Debian-specific dist-packages directories:
+                sitedirs.append(os.path.join(prefix, "local/lib",
+                                             "python" + sys.version[:3],
+                                             "dist-packages"))
+                if sys.version[0] == '2':
+                    sitedirs.append(os.path.join(prefix, "lib",
+                                                 "python" + sys.version[:3],
+                                                 "dist-packages"))
+                else:
+                    sitedirs.append(os.path.join(prefix, "lib",
+                                                 "python" + sys.version[0],
+                                                 "dist-packages"))
+                sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
+            else:
+                sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+            if sys.platform == 'darwin':
+                # for framework builds *only* we add the standard Apple
+                # locations. Currently only per-user, but /Library and
+                # /Network/Library could be added too
+                if 'Python.framework' in prefix:
+                    home = os.environ.get('HOME')
+                    if home:
+                        sitedirs.append(
+                            os.path.join(home,
+                                         'Library',
+                                         'Python',
+                                         sys.version[:3],
+                                         'site-packages'))
+            for sitedir in sitedirs:
+                if os.path.isdir(sitedir):
+                    addsitedir(sitedir, known_paths)
+    return None
+
+def check_enableusersite():
+    """Check if user site directory is safe for inclusion
+
+    The function tests for the command line flag (including environment var),
+    process uid/gid equal to effective uid/gid.
+
+    None: Disabled for security reasons
+    False: Disabled by user (command line option)
+    True: Safe and enabled
+    """
+    if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False):
+        return False
+
+    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
+        # check process uid == effective uid
+        if os.geteuid() != os.getuid():
+            return None
+    if hasattr(os, "getgid") and hasattr(os, "getegid"):
+        # check process gid == effective gid
+        if os.getegid() != os.getgid():
+            return None
+
+    return True
+
+def addusersitepackages(known_paths):
+    """Add a per user site-package to sys.path
+
+    Each user has its own python directory with site-packages in the
+    home directory.
+
+    USER_BASE is the root directory for all Python versions
+
+    USER_SITE is the user specific site-packages directory
+
+    USER_SITE/.. can be used for data.
+    """
+    global USER_BASE, USER_SITE, ENABLE_USER_SITE
+    env_base = os.environ.get("PYTHONUSERBASE", None)
+
+    def joinuser(*args):
+        return os.path.expanduser(os.path.join(*args))
+
+    #if sys.platform in ('os2emx', 'riscos'):
+    #    # Don't know what to put here
+    #    USER_BASE = ''
+    #    USER_SITE = ''
+    if os.name == "nt":
+        base = os.environ.get("APPDATA") or "~"
+        if env_base:
+            USER_BASE = env_base
+        else:
+            USER_BASE = joinuser(base, "Python")
+        USER_SITE = os.path.join(USER_BASE,
+                                 "Python" + sys.version[0] + sys.version[2],
+                                 "site-packages")
+    else:
+        if env_base:
+            USER_BASE = env_base
+        else:
+            USER_BASE = joinuser("~", ".local")
+        USER_SITE = os.path.join(USER_BASE, "lib",
+                                 "python" + sys.version[:3],
+                                 "site-packages")
+
+    if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
+        addsitedir(USER_SITE, known_paths)
+    if ENABLE_USER_SITE:
+        for dist_libdir in ("lib", "local/lib"):
+            user_site = os.path.join(USER_BASE, dist_libdir,
+                                     "python" + sys.version[:3],
+                                     "dist-packages")
+            if os.path.isdir(user_site):
+                addsitedir(user_site, known_paths)
+    return known_paths
+
+
+
+def setBEGINLIBPATH():
+    """The OS/2 EMX port has optional extension modules that do double duty
+    as DLLs (and must use the .DLL file extension) for other extensions.
+    The library search path needs to be amended so these will be found
+    during module import.  Use BEGINLIBPATH so that these are at the start
+    of the library search path.
+
+    """
+    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
+    libpath = os.environ['BEGINLIBPATH'].split(';')
+    if libpath[-1]:
+        libpath.append(dllpath)
+    else:
+        libpath[-1] = dllpath
+    os.environ['BEGINLIBPATH'] = ';'.join(libpath)
+
+
+def setquit():
+    """Define new built-ins 'quit' and 'exit'.
+    These are simply strings that display a hint on how to exit.
+
+    """
+    if os.sep == ':':
+        eof = 'Cmd-Q'
+    elif os.sep == '\\':
+        eof = 'Ctrl-Z plus Return'
+    else:
+        eof = 'Ctrl-D (i.e. EOF)'
+
+    class Quitter(object):
+        def __init__(self, name):
+            self.name = name
+        def __repr__(self):
+            return 'Use %s() or %s to exit' % (self.name, eof)
+        def __call__(self, code=None):
+            # Shells like IDLE catch the SystemExit, but listen when their
+            # stdin wrapper is closed.
+            try:
+                sys.stdin.close()
+            except:
+                pass
+            raise SystemExit(code)
+    builtins.quit = Quitter('quit')
+    builtins.exit = Quitter('exit')
+
+
+class _Printer(object):
+    """interactive prompt objects for printing the license text, a list of
+    contributors and the copyright notice."""
+
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for filename in self.__files:
+                filename = os.path.join(dir, filename)
+                try:
+                    fp = open(filename, "rU")
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print(self.__lines[i])
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    try:
+                        key = raw_input(prompt)
+                    except NameError:
+                        key = input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+def setcopyright():
+    """Set 'copyright' and 'credits' in __builtin__"""
+    builtins.copyright = _Printer("copyright", sys.copyright)
+    if _is_jython:
+        builtins.credits = _Printer(
+            "credits",
+            "Jython is maintained by the Jython developers (www.jython.org).")
+    elif _is_pypy:
+        builtins.credits = _Printer(
+            "credits",
+            "PyPy is maintained by the PyPy developers: http://pypy.org/")
+    else:
+        builtins.credits = _Printer("credits", """\
+    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+    for supporting Python development.  See www.python.org for more information.""")
+    here = os.path.dirname(os.__file__)
+    builtins.license = _Printer(
+        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+        ["LICENSE.txt", "LICENSE"],
+        [os.path.join(here, os.pardir), here, os.curdir])
+
+
+class _Helper(object):
+    """Define the built-in 'help'.
+    This is a wrapper around pydoc.help (with a twist).
+
+    """
+
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+def sethelper():
+    builtins.help = _Helper()
+
+def aliasmbcs():
+    """On Windows, some default encodings are not provided by Python,
+    while they are always available as "mbcs" in each locale. Make
+    them usable by aliasing to "mbcs" in such a case."""
+    if sys.platform == 'win32':
+        import locale, codecs
+        enc = locale.getdefaultlocale()[1]
+        if enc.startswith('cp'):            # "cp***" ?
+            try:
+                codecs.lookup(enc)
+            except LookupError:
+                import encodings
+                encodings._cache[enc] = encodings._unknown
+                encodings.aliases.aliases[enc] = 'mbcs'
+
+def setencoding():
+    """Set the string encoding used by the Unicode implementation.  The
+    default is 'ascii', but if you're willing to experiment, you can
+    change this."""
+    encoding = "ascii" # Default value set by _PyUnicode_Init()
+    if 0:
+        # Enable to support locale aware default string encodings.
+        import locale
+        loc = locale.getdefaultlocale()
+        if loc[1]:
+            encoding = loc[1]
+    if 0:
+        # Enable to switch off string to Unicode coercion and implicit
+        # Unicode to string conversion.
+        encoding = "undefined"
+    if encoding != "ascii":
+        # On Non-Unicode builds this will raise an AttributeError...
+        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+
+def execsitecustomize():
+    """Run custom site specific code, if available."""
+    try:
+        import sitecustomize
+    except ImportError:
+        pass
+
+def virtual_install_main_packages():
+    f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt'))
+    sys.real_prefix = f.read().strip()
+    f.close()
+    pos = 2
+    hardcoded_relative_dirs = []
+    if sys.path[0] == '':
+        pos += 1
+    if _is_jython:
+        paths = [os.path.join(sys.real_prefix, 'Lib')]
+    elif _is_pypy:
+        if sys.version_info > (3, 2):
+            cpyver = '%d' % sys.version_info[0]
+        elif sys.pypy_version_info >= (1, 5):
+            cpyver = '%d.%d' % sys.version_info[:2]
+        else:
+            cpyver = '%d.%d.%d' % sys.version_info[:3]
+        paths = [os.path.join(sys.real_prefix, 'lib_pypy'),
+                 os.path.join(sys.real_prefix, 'lib-python', cpyver)]
+        if sys.pypy_version_info < (1, 9):
+            paths.insert(1, os.path.join(sys.real_prefix,
+                                         'lib-python', 'modified-%s' % cpyver))
+        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
+        #
+        # This is hardcoded in the Python executable, but relative to sys.prefix:
+        for path in paths[:]:
+            plat_path = os.path.join(path, 'plat-%s' % sys.platform)
+            if os.path.exists(plat_path):
+                paths.append(plat_path)
+    elif sys.platform == 'win32':
+        paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
+    else:
+        paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
+        hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
+        lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
+        if os.path.exists(lib64_path):
+            if _is_64bit:
+                paths.insert(0, lib64_path)
+            else:
+                paths.append(lib64_path)
+        # This is hardcoded in the Python executable, but relative to
+        # sys.prefix.  Debian change: we need to add the multiarch triplet
+        # here, which is where the real stuff lives.  As per PEP 421, in
+        # Python 3.3+, this lives in sys.implementation, while in Python 2.7
+        # it lives in sys.
+        try:
+            arch = getattr(sys, 'implementation', sys)._multiarch
+        except AttributeError:
+            # This is a non-multiarch aware Python.  Fallback to the old way.
+            arch = sys.platform
+        plat_path = os.path.join(sys.real_prefix, 'lib',
+                                 'python'+sys.version[:3],
+                                 'plat-%s' % arch)
+        if os.path.exists(plat_path):
+            paths.append(plat_path)
+    # This is hardcoded in the Python executable, but
+    # relative to sys.prefix, so we have to fix up:
+    for path in list(paths):
+        tk_dir = os.path.join(path, 'lib-tk')
+        if os.path.exists(tk_dir):
+            paths.append(tk_dir)
+
+    # These are hardcoded in the Apple's Python executable,
+    # but relative to sys.prefix, so we have to fix them up:
+    if sys.platform == 'darwin':
+        hardcoded_paths = [os.path.join(relative_dir, module)
+                           for relative_dir in hardcoded_relative_dirs
+                           for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')]
+
+        for path in hardcoded_paths:
+            if os.path.exists(path):
+                paths.append(path)
+
+    sys.path.extend(paths)
+
+def force_global_eggs_after_local_site_packages():
+    """
+    Force easy_installed eggs in the global environment to get placed
+    in sys.path after all packages inside the virtualenv.  This
+    maintains the "least surprise" result that packages in the
+    virtualenv always mask global packages, never the other way
+    around.
+
+    """
+    egginsert = getattr(sys, '__egginsert', 0)
+    for i, path in enumerate(sys.path):
+        if i > egginsert and path.startswith(sys.prefix):
+            egginsert = i
+    sys.__egginsert = egginsert + 1
+
+def virtual_addsitepackages(known_paths):
+    force_global_eggs_after_local_site_packages()
+    return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
+
+def fixclasspath():
+    """Adjust the special classpath sys.path entries for Jython. These
+    entries should follow the base virtualenv lib directories.
+    """
+    paths = []
+    classpaths = []
+    for path in sys.path:
+        if path == '__classpath__' or path.startswith('__pyclasspath__'):
+            classpaths.append(path)
+        else:
+            paths.append(path)
+    sys.path = paths
+    sys.path.extend(classpaths)
+
+def execusercustomize():
+    """Run custom user specific code, if available."""
+    try:
+        import usercustomize
+    except ImportError:
+        pass
+
+
+def main():
+    global ENABLE_USER_SITE
+    virtual_install_main_packages()
+    abs__file__()
+    paths_in_sys = removeduppaths()
+    if (os.name == "posix" and sys.path and
+        os.path.basename(sys.path[-1]) == "Modules"):
+        addbuilddir()
+    if _is_jython:
+        fixclasspath()
+    GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt'))
+    if not GLOBAL_SITE_PACKAGES:
+        ENABLE_USER_SITE = False
+    if ENABLE_USER_SITE is None:
+        ENABLE_USER_SITE = check_enableusersite()
+    paths_in_sys = addsitepackages(paths_in_sys)
+    paths_in_sys = addusersitepackages(paths_in_sys)
+    if GLOBAL_SITE_PACKAGES:
+        paths_in_sys = virtual_addsitepackages(paths_in_sys)
+    if sys.platform == 'os2emx':
+        setBEGINLIBPATH()
+    setquit()
+    setcopyright()
+    sethelper()
+    aliasmbcs()
+    setencoding()
+    execsitecustomize()
+    if ENABLE_USER_SITE:
+        execusercustomize()
+    # Remove sys.setdefaultencoding() so that users cannot change the
+    # encoding after initialization.  The test for presence is needed when
+    # this module is run as a script, because this code is executed twice.
+    if hasattr(sys, "setdefaultencoding"):
+        del sys.setdefaultencoding
+
+main()
+
+def _script():
+    help = """\
+    %s [--user-base] [--user-site]
+
+    Without arguments print some useful information
+    With arguments print the value of USER_BASE and/or USER_SITE separated
+    by '%s'.
+
+    Exit codes with --user-base or --user-site:
+      0 - user site directory is enabled
+      1 - user site directory is disabled by user
+      2 - uses site directory is disabled by super user
+          or for security reasons
+     >2 - unknown error
+    """
+    args = sys.argv[1:]
+    if not args:
+        print("sys.path = [")
+        for dir in sys.path:
+            print("    %r," % (dir,))
+        print("]")
+        def exists(path):
+            if os.path.isdir(path):
+                return "exists"
+            else:
+                return "doesn't exist"
+        print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE)))
+        print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE)))
+        print("ENABLE_USER_SITE: %r" %  ENABLE_USER_SITE)
+        sys.exit(0)
+
+    buffer = []
+    if '--user-base' in args:
+        buffer.append(USER_BASE)
+    if '--user-site' in args:
+        buffer.append(USER_SITE)
+
+    if buffer:
+        print(os.pathsep.join(buffer))
+        if ENABLE_USER_SITE:
+            sys.exit(0)
+        elif ENABLE_USER_SITE is False:
+            sys.exit(1)
+        elif ENABLE_USER_SITE is None:
+            sys.exit(2)
+        else:
+            sys.exit(3)
+    else:
+        import textwrap
+        print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
+        sys.exit(10)
+
+if __name__ == '__main__':
+    _script()

+ 1 - 0
sandbox-bak/lib/python3.5/sre_compile.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/sre_compile.py

+ 1 - 0
sandbox-bak/lib/python3.5/sre_constants.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/sre_constants.py

+ 1 - 0
sandbox-bak/lib/python3.5/sre_parse.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/sre_parse.py

+ 1 - 0
sandbox-bak/lib/python3.5/stat.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/stat.py

+ 1 - 0
sandbox-bak/lib/python3.5/struct.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/struct.py

+ 1 - 0
sandbox-bak/lib/python3.5/tarfile.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/tarfile.py

+ 1 - 0
sandbox-bak/lib/python3.5/tempfile.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/tempfile.py

+ 1 - 0
sandbox-bak/lib/python3.5/token.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/token.py

+ 1 - 0
sandbox-bak/lib/python3.5/tokenize.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/tokenize.py

+ 1 - 0
sandbox-bak/lib/python3.5/types.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/types.py

+ 1 - 0
sandbox-bak/lib/python3.5/warnings.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/warnings.py

+ 1 - 0
sandbox-bak/lib/python3.5/weakref.py

@@ -0,0 +1 @@
+/Users/michaelmead/anaconda/lib/python3.5/weakref.py

+ 69 - 50
src/api/index.py

@@ -1,7 +1,7 @@
 """
 	This is a RESTful interface implemented using Flask micro framework.
 	The API is driven by configuration that is organized in terms of the monitoring classes
-	
+
 	The API is both restful and websocket/socketio enabled.
 
 	We designed the classes to be reusable (and powered by labels):
@@ -47,7 +47,7 @@ factory = DataSourceFactory()
 
 atexit.register(ThreadManager.stop)
 @app.route('/get/<id>')
-def procs(id):	
+def procs(id):
 	try:
 		gReader = factory.instance(type=class_read,args=p)
 		data =  gReader.read()
@@ -67,14 +67,14 @@ def procs(id):
 				# Let us determine if this is a normal operation or not
 				# We will update the status of the information ...
 				#
-				
-				for row in r[label] :	
-					index = r[label].index(row)			
+
+				for row in r[label] :
+					index = r[label].index(row)
 					if row['label'] in learn:
 						id = row['label']
 						px = ahandler.predict([row],learn[id])
 						if px :
-							
+
 							# row['anomaly'] = px[1]==1
 							print ""
 							print label,' *** ',index
@@ -83,12 +83,12 @@ def procs(id):
 							#
 							# @TODO:
 							# Compile a report here that will be sent to the mailing list
-							# 
-					
+							#
+
 	except Exception, e:
 		print e
 		r = []
-	
+
 	return json.dumps(r)
 
 """
@@ -98,7 +98,7 @@ def procs(id):
 @app.route('/sandbox')
 def sandbox():
 	global CONFIG
-	
+
 	if 'sandbox' in CONFIG: #CONFIG['monitor']:
 		#handler = HANDLERS['sandbox']['class']
 		#conf = HANDLERS['sandbox']['config']
@@ -106,7 +106,7 @@ def sandbox():
 		# p = Factory.instance('sandbox',CONFIG)
 		handler = monitor.Sandbox()
 		conf	= CONFIG['sandbox']
-		
+
 		for id in conf:
 			try:
 				handler.init(conf[id])
@@ -114,27 +114,27 @@ def sandbox():
 			except Exception,e:
 				pass
 	else:
-		
+
 		r = []
 
 
 	return json.dumps(r)
-@app.route('/trends') 
+@app.route('/trends')
 def trends ():
 	id = request.args.get('id')
 	app = request.args.get('app').strip()
 	p = CONFIG['store']['args']
 	class_read = CONFIG['store']['class']['read']
 
-	
-	gReader = factory.instance(type=class_read,args=p)	
+
+	gReader = factory.instance(type=class_read,args=p)
 	r = gReader.read()
 	if id in r:
 		r = r[id] #--matrix
 		series = []
 
 		for row in r:
-			
+
 			series += [item for item in row if str(item['label'])== app]
 		if len(series) > 12 :
 			beg = len(series) - 8
@@ -149,30 +149,51 @@ def requirements():
 	stream = "\n".join(json.loads(stream))
 	headers = {"content-disposition":"attachment; filename=requirements.txt"}
 	return Response(stream,mimetype='text/plain',headers=headers)
+
 @app.route('/dashboard')
 def dashboard():
 	context = PARAMS['context']
 	if 'title' in PARAMS :
 		title = PARAMS['title']
 	else:
-		title = 'Zulu OverWatch'
+		title = 'Dashboard'
 	return render_template('dashboard.html',context=context,title=title)
 
+@app.route('/upgrade')
+def upgrade():
+	context = PARAMS['context']
+	if 'title' in PARAMS :
+		title = PARAMS['title']
+	else:
+		title = 'Upgrade'
+	return render_template('upgrade.html',context=context,title=title)
+
+@app.route('/user')
+def user():
+	context = PARAMS['context']
+	if 'title' in PARAMS :
+		title = PARAMS['title']
+	else:
+		title = 'Upgrade'
+	return render_template('user.html',context=context,title=title)
+
+
 """
 	This function is designed to trigger learning for anomaly detection
 	@TODO: forward this to a socket i.e non-blocking socket
 """
+
 @app.route('/anomalies/get')
 def learn():
 	global CONFIG
 	p = CONFIG['store']['args']
-	class_read = CONFIG['store']['class']['read']	
+	class_read = CONFIG['store']['class']['read']
 	gReader = factory.instance(type=class_read,args=p)
 	d =  gReader.read()
-	
+
 	if 'learn' in d :
 		info = d['learn']
-		
+
 		del d['learn']
 	else :
 		info = []
@@ -182,44 +203,44 @@ def learn():
 		d = d[id]
 		params = {}
 		for item in info:
-			
+
 			label = item['label']
 			params[label] = item
-		
+
 		#apps = list(set(ML.Extract(['label'],d)))
 		r = []
 		if params :
 			#
-			# If we have parameters available 
+			# If we have parameters available
 			p = AnomalyDetection()
-			apps = params.keys()			
+			apps = params.keys()
 			for name in apps :
 				if name not in params:
 					continue
-				_info	= params[name]		
+				_info	= params[name]
 				try:
-					xo 	= ML.Filter('label',name,d)	
+					xo 	= ML.Filter('label',name,d)
 				except Exception,e:
 					xo = []
 					#print name,e
-				if len(xo) == 0:					
-					continue	
+				if len(xo) == 0:
+					continue
 				xo 	= [xo[ len(xo) -1]]
-				
+
 				value	= p.predict(xo,_info)[0]
-				
+
 				if len(value):
 					report = dict(_info,**{'predicton':value})
 					r.append(report)
-				
-				
-				
+
+
+
 			#print app,value
 			#if value is not None:
 			#	r.append(value)
-	
+
 	return json.dumps(r)
-		
+
 
 """
 	This function returns anomalies for a given context or group of processes
@@ -229,12 +250,12 @@ def learn():
 def anomalies_status():
 	global CONFIG
 	p = CONFIG['store']['args']
-	class_read = CONFIG['store']['class']['read']	
+	class_read = CONFIG['store']['class']['read']
 	gReader = factory.instance(type=class_read,args=p)
 	d =  gReader.read()
 	if 'learn' in d :
 		info = d['learn']
-		
+
 		del d['learn']
 	else :
 		info = []
@@ -248,7 +269,7 @@ def anomalies_status():
 def get_folders():
 	global CONFIG
 	p = CONFIG['store']['args']
-	class_read = CONFIG['store']['class']['read']	
+	class_read = CONFIG['store']['class']['read']
 	gReader = factory.instance(type=class_read,args=p)
 	d =  gReader.read()
 	if 'folders' in d:
@@ -256,7 +277,7 @@ def get_folders():
 		hosts = set([row[0]['id'] for row in d])
 		m = {}
 		for id in hosts:
-			for row in d:				
+			for row in d:
 				if id == row[0]['id'] :
 					m[id] = row
 		d = m.values()
@@ -264,11 +285,11 @@ def get_folders():
 			print row[0]['id']
 		# index = len(d) - 1
 		# d = d[index]
-		
-			
+
+
 		# m = {}
 		# for row in d :
-			
+
 		# 	key = row.keys()[0]
 
 		# 	row = row[key]
@@ -281,15 +302,13 @@ def get_folders():
 		# d = r
 	else:
 		d = []
-	
+
 	return json.dumps(d)
-	
+
 if __name__== '__main__':
-	
-#	ThreadManager.start(CONFIG)	
+
+#	ThreadManager.start(CONFIG)
 	if 'port' not in SYS_ARGS.PARAMS :
-		SYS_ARGS.PARAMS['port'] = 5000
+		SYS_ARGS.PARAMS['port'] = 8484
 	PORT = int(SYS_ARGS.PARAMS['port'])
-	app.run(host='0.0.0.0',port=PORT,debug=True,threaded=True)
-
-	
+	app.run(host='0.0.0.0' ,port=PORT,debug=True,threaded=True)

+ 615 - 0
src/api/static/chartist/chartist.css

@@ -0,0 +1,615 @@
+.ct-label {
+  fill: rgba(0, 0, 0, 0.4);
+  color: rgba(0, 0, 0, 0.4);
+  font-size: 0.75rem;
+  line-height: 1; }
+
+.ct-chart-line .ct-label,
+.ct-chart-bar .ct-label {
+  display: block;
+  display: -webkit-box;
+  display: -moz-box;
+  display: -ms-flexbox;
+  display: -webkit-flex;
+  display: flex; }
+
+.ct-chart-pie .ct-label,
+.ct-chart-donut .ct-label {
+  dominant-baseline: central; }
+
+.ct-label.ct-horizontal.ct-start {
+  -webkit-box-align: flex-end;
+  -webkit-align-items: flex-end;
+  -ms-flex-align: flex-end;
+  align-items: flex-end;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: start; }
+
+.ct-label.ct-horizontal.ct-end {
+  -webkit-box-align: flex-start;
+  -webkit-align-items: flex-start;
+  -ms-flex-align: flex-start;
+  align-items: flex-start;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: start; }
+
+.ct-label.ct-vertical.ct-start {
+  -webkit-box-align: flex-end;
+  -webkit-align-items: flex-end;
+  -ms-flex-align: flex-end;
+  align-items: flex-end;
+  -webkit-box-pack: flex-end;
+  -webkit-justify-content: flex-end;
+  -ms-flex-pack: flex-end;
+  justify-content: flex-end;
+  text-align: right;
+  text-anchor: end; }
+
+.ct-label.ct-vertical.ct-end {
+  -webkit-box-align: flex-end;
+  -webkit-align-items: flex-end;
+  -ms-flex-align: flex-end;
+  align-items: flex-end;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: start; }
+
+.ct-chart-bar .ct-label.ct-horizontal.ct-start {
+  -webkit-box-align: flex-end;
+  -webkit-align-items: flex-end;
+  -ms-flex-align: flex-end;
+  align-items: flex-end;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  -ms-flex-pack: center;
+  justify-content: center;
+  text-align: center;
+  text-anchor: start; }
+
+.ct-chart-bar .ct-label.ct-horizontal.ct-end {
+  -webkit-box-align: flex-start;
+  -webkit-align-items: flex-start;
+  -ms-flex-align: flex-start;
+  align-items: flex-start;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  -ms-flex-pack: center;
+  justify-content: center;
+  text-align: center;
+  text-anchor: start; }
+
+.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start {
+  -webkit-box-align: flex-end;
+  -webkit-align-items: flex-end;
+  -ms-flex-align: flex-end;
+  align-items: flex-end;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: start; }
+
+.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end {
+  -webkit-box-align: flex-start;
+  -webkit-align-items: flex-start;
+  -ms-flex-align: flex-start;
+  align-items: flex-start;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: start; }
+
+.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start {
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+  align-items: center;
+  -webkit-box-pack: flex-end;
+  -webkit-justify-content: flex-end;
+  -ms-flex-pack: flex-end;
+  justify-content: flex-end;
+  text-align: right;
+  text-anchor: end; }
+
+.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end {
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  -ms-flex-align: center;
+  align-items: center;
+  -webkit-box-pack: flex-start;
+  -webkit-justify-content: flex-start;
+  -ms-flex-pack: flex-start;
+  justify-content: flex-start;
+  text-align: left;
+  text-anchor: end; }
+
+.ct-grid {
+  stroke: rgba(0, 0, 0, 0.2);
+  stroke-width: 1px;
+  stroke-dasharray: 2px; }
+
+.ct-grid-background {
+  fill: none; }
+
+.ct-point {
+  stroke-width: 10px;
+  stroke-linecap: round; }
+
+.ct-line {
+  fill: none;
+  stroke-width: 4px; }
+
+.ct-area {
+  stroke: none;
+  fill-opacity: 0.1; }
+
+.ct-bar {
+  fill: none;
+  stroke-width: 10px; }
+
+.ct-slice-donut {
+  fill: none;
+  stroke-width: 60px; }
+
+.ct-series-a .ct-point, .ct-series-a .ct-line, .ct-series-a .ct-bar, .ct-series-a .ct-slice-donut {
+  stroke: #d70206; }
+
+.ct-series-a .ct-slice-pie, .ct-series-a .ct-slice-donut-solid, .ct-series-a .ct-area {
+  fill: #d70206; }
+
+.ct-series-b .ct-point, .ct-series-b .ct-line, .ct-series-b .ct-bar, .ct-series-b .ct-slice-donut {
+  stroke: #f05b4f; }
+
+.ct-series-b .ct-slice-pie, .ct-series-b .ct-slice-donut-solid, .ct-series-b .ct-area {
+  fill: #f05b4f; }
+
+.ct-series-c .ct-point, .ct-series-c .ct-line, .ct-series-c .ct-bar, .ct-series-c .ct-slice-donut {
+  stroke: #f4c63d; }
+
+.ct-series-c .ct-slice-pie, .ct-series-c .ct-slice-donut-solid, .ct-series-c .ct-area {
+  fill: #f4c63d; }
+
+.ct-series-d .ct-point, .ct-series-d .ct-line, .ct-series-d .ct-bar, .ct-series-d .ct-slice-donut {
+  stroke: #d17905; }
+
+.ct-series-d .ct-slice-pie, .ct-series-d .ct-slice-donut-solid, .ct-series-d .ct-area {
+  fill: #d17905; }
+
+.ct-series-e .ct-point, .ct-series-e .ct-line, .ct-series-e .ct-bar, .ct-series-e .ct-slice-donut {
+  stroke: #453d3f; }
+
+.ct-series-e .ct-slice-pie, .ct-series-e .ct-slice-donut-solid, .ct-series-e .ct-area {
+  fill: #453d3f; }
+
+.ct-series-f .ct-point, .ct-series-f .ct-line, .ct-series-f .ct-bar, .ct-series-f .ct-slice-donut {
+  stroke: #59922b; }
+
+.ct-series-f .ct-slice-pie, .ct-series-f .ct-slice-donut-solid, .ct-series-f .ct-area {
+  fill: #59922b; }
+
+.ct-series-g .ct-point, .ct-series-g .ct-line, .ct-series-g .ct-bar, .ct-series-g .ct-slice-donut {
+  stroke: #0544d3; }
+
+.ct-series-g .ct-slice-pie, .ct-series-g .ct-slice-donut-solid, .ct-series-g .ct-area {
+  fill: #0544d3; }
+
+.ct-series-h .ct-point, .ct-series-h .ct-line, .ct-series-h .ct-bar, .ct-series-h .ct-slice-donut {
+  stroke: #6b0392; }
+
+.ct-series-h .ct-slice-pie, .ct-series-h .ct-slice-donut-solid, .ct-series-h .ct-area {
+  fill: #6b0392; }
+
+.ct-series-i .ct-point, .ct-series-i .ct-line, .ct-series-i .ct-bar, .ct-series-i .ct-slice-donut {
+  stroke: #f05b4f; }
+
+.ct-series-i .ct-slice-pie, .ct-series-i .ct-slice-donut-solid, .ct-series-i .ct-area {
+  fill: #f05b4f; }
+
+.ct-series-j .ct-point, .ct-series-j .ct-line, .ct-series-j .ct-bar, .ct-series-j .ct-slice-donut {
+  stroke: #dda458; }
+
+.ct-series-j .ct-slice-pie, .ct-series-j .ct-slice-donut-solid, .ct-series-j .ct-area {
+  fill: #dda458; }
+
+.ct-series-k .ct-point, .ct-series-k .ct-line, .ct-series-k .ct-bar, .ct-series-k .ct-slice-donut {
+  stroke: #eacf7d; }
+
+.ct-series-k .ct-slice-pie, .ct-series-k .ct-slice-donut-solid, .ct-series-k .ct-area {
+  fill: #eacf7d; }
+
+.ct-series-l .ct-point, .ct-series-l .ct-line, .ct-series-l .ct-bar, .ct-series-l .ct-slice-donut {
+  stroke: #86797d; }
+
+.ct-series-l .ct-slice-pie, .ct-series-l .ct-slice-donut-solid, .ct-series-l .ct-area {
+  fill: #86797d; }
+
+.ct-series-m .ct-point, .ct-series-m .ct-line, .ct-series-m .ct-bar, .ct-series-m .ct-slice-donut {
+  stroke: #b2c326; }
+
+.ct-series-m .ct-slice-pie, .ct-series-m .ct-slice-donut-solid, .ct-series-m .ct-area {
+  fill: #b2c326; }
+
+.ct-series-n .ct-point, .ct-series-n .ct-line, .ct-series-n .ct-bar, .ct-series-n .ct-slice-donut {
+  stroke: #6188e2; }
+
+.ct-series-n .ct-slice-pie, .ct-series-n .ct-slice-donut-solid, .ct-series-n .ct-area {
+  fill: #6188e2; }
+
+.ct-series-o .ct-point, .ct-series-o .ct-line, .ct-series-o .ct-bar, .ct-series-o .ct-slice-donut {
+  stroke: #a748ca; }
+
+.ct-series-o .ct-slice-pie, .ct-series-o .ct-slice-donut-solid, .ct-series-o .ct-area {
+  fill: #a748ca; }
+
+.ct-square {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-square:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 100%; }
+  .ct-square:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-square > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-minor-second {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-minor-second:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 93.75%; }
+  .ct-minor-second:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-minor-second > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-second {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-second:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 88.8888888889%; }
+  .ct-major-second:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-second > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-minor-third {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-minor-third:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 83.3333333333%; }
+  .ct-minor-third:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-minor-third > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-third {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-third:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 80%; }
+  .ct-major-third:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-third > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-perfect-fourth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-perfect-fourth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 75%; }
+  .ct-perfect-fourth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-perfect-fourth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-perfect-fifth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-perfect-fifth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 66.6666666667%; }
+  .ct-perfect-fifth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-perfect-fifth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-minor-sixth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-minor-sixth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 62.5%; }
+  .ct-minor-sixth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-minor-sixth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-golden-section {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-golden-section:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 61.804697157%; }
+  .ct-golden-section:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-golden-section > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-sixth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-sixth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 60%; }
+  .ct-major-sixth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-sixth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-minor-seventh {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-minor-seventh:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 56.25%; }
+  .ct-minor-seventh:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-minor-seventh > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-seventh {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-seventh:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 53.3333333333%; }
+  .ct-major-seventh:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-seventh > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-octave {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-octave:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 50%; }
+  .ct-octave:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-octave > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-tenth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-tenth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 40%; }
+  .ct-major-tenth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-tenth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-eleventh {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-eleventh:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 37.5%; }
+  .ct-major-eleventh:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-eleventh > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-major-twelfth {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-major-twelfth:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 33.3333333333%; }
+  .ct-major-twelfth:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-major-twelfth > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+.ct-double-octave {
+  display: block;
+  position: relative;
+  width: 100%; }
+  .ct-double-octave:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: 25%; }
+  .ct-double-octave:after {
+    content: "";
+    display: table;
+    clear: both; }
+  .ct-double-octave > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0; }
+
+/*# sourceMappingURL=chartist.css.map */

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 10 - 0
src/api/static/chartist/chartist.css.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4488 - 0
src/api/static/chartist/chartist.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
src/api/static/chartist/chartist.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 10 - 0
src/api/static/chartist/chartist.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
src/api/static/chartist/chartist.min.js.map


+ 241 - 0
src/api/static/chartist/scss/chartist.scss

@@ -0,0 +1,241 @@
+@import "settings/chartist-settings";
+
+@mixin ct-responsive-svg-container($width: 100%, $ratio: $ct-container-ratio) {
+  display: block;
+  position: relative;
+  width: $width;
+
+  &:before {
+    display: block;
+    float: left;
+    content: "";
+    width: 0;
+    height: 0;
+    padding-bottom: $ratio * 100%;
+  }
+
+  &:after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+
+  > svg {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+  }
+}
+
+@mixin ct-align-justify($ct-text-align: $ct-text-align, $ct-text-justify: $ct-text-justify) {
+  -webkit-box-align: $ct-text-align;
+  -webkit-align-items: $ct-text-align;
+  -ms-flex-align: $ct-text-align;
+  align-items: $ct-text-align;
+  -webkit-box-pack: $ct-text-justify;
+  -webkit-justify-content: $ct-text-justify;
+  -ms-flex-pack: $ct-text-justify;
+  justify-content: $ct-text-justify;
+  // Fallback to text-align for non-flex browsers
+  @if($ct-text-justify == 'flex-start') {
+    text-align: left;
+  } @else if ($ct-text-justify == 'flex-end') {
+    text-align: right;
+  } @else {
+    text-align: center;
+  }
+}
+
+@mixin ct-flex() {
+  // Fallback to block
+  display: block;
+  display: -webkit-box;
+  display: -moz-box;
+  display: -ms-flexbox;
+  display: -webkit-flex;
+  display: flex;
+}
+
+@mixin ct-chart-label($ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-text-line-height: $ct-text-line-height) {
+  fill: $ct-text-color;
+  color: $ct-text-color;
+  font-size: $ct-text-size;
+  line-height: $ct-text-line-height;
+}
+
+@mixin ct-chart-grid($ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray) {
+  stroke: $ct-grid-color;
+  stroke-width: $ct-grid-width;
+
+  @if ($ct-grid-dasharray) {
+    stroke-dasharray: $ct-grid-dasharray;
+  }
+}
+
+@mixin ct-chart-point($ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape) {
+  stroke-width: $ct-point-size;
+  stroke-linecap: $ct-point-shape;
+}
+
+@mixin ct-chart-line($ct-line-width: $ct-line-width, $ct-line-dasharray: $ct-line-dasharray) {
+  fill: none;
+  stroke-width: $ct-line-width;
+
+  @if ($ct-line-dasharray) {
+    stroke-dasharray: $ct-line-dasharray;
+  }
+}
+
+@mixin ct-chart-area($ct-area-opacity: $ct-area-opacity) {
+  stroke: none;
+  fill-opacity: $ct-area-opacity;
+}
+
+@mixin ct-chart-bar($ct-bar-width: $ct-bar-width) {
+  fill: none;
+  stroke-width: $ct-bar-width;
+}
+
+@mixin ct-chart-donut($ct-donut-width: $ct-donut-width) {
+  fill: none;
+  stroke-width: $ct-donut-width;
+}
+
+@mixin ct-chart-series-color($color) {
+  .#{$ct-class-point}, .#{$ct-class-line}, .#{$ct-class-bar}, .#{$ct-class-slice-donut} {
+    stroke: $color;
+  }
+
+  .#{$ct-class-slice-pie}, .#{$ct-class-slice-donut-solid}, .#{$ct-class-area} {
+    fill: $color;
+  }
+}
+
+@mixin ct-chart($ct-container-ratio: $ct-container-ratio, $ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray, $ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape, $ct-line-width: $ct-line-width, $ct-bar-width: $ct-bar-width, $ct-donut-width: $ct-donut-width, $ct-series-names: $ct-series-names, $ct-series-colors: $ct-series-colors) {
+
+  .#{$ct-class-label} {
+    @include ct-chart-label($ct-text-color, $ct-text-size);
+  }
+
+  .#{$ct-class-chart-line} .#{$ct-class-label},
+  .#{$ct-class-chart-bar} .#{$ct-class-label} {
+    @include ct-flex();
+  }
+
+  .#{$ct-class-chart-pie} .#{$ct-class-label},
+  .#{$ct-class-chart-donut} .#{$ct-class-label} {
+    dominant-baseline: central;
+  }
+
+  .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
+    @include ct-align-justify(flex-end, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
+    @include ct-align-justify(flex-start, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} {
+    @include ct-align-justify(flex-end, flex-end);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: end;
+  }
+
+  .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} {
+    @include ct-align-justify(flex-end, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
+    @include ct-align-justify(flex-end, center);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
+    @include ct-align-justify(flex-start, center);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
+    @include ct-align-justify(flex-end, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
+    @include ct-align-justify(flex-start, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: start;
+  }
+
+  .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} {
+    //@include ct-chart-label($ct-text-color, $ct-text-size, center, $ct-vertical-text-justify);
+    @include ct-align-justify(center, flex-end);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: end;
+  }
+
+  .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} {
+    @include ct-align-justify(center, flex-start);
+    // Fallback for browsers that don't support foreignObjects
+    text-anchor: end;
+  }
+
+  .#{$ct-class-grid} {
+    @include ct-chart-grid($ct-grid-color, $ct-grid-width, $ct-grid-dasharray);
+  }
+
+  .#{$ct-class-grid-background} {
+    fill: $ct-grid-background-fill;
+  }
+
+  .#{$ct-class-point} {
+    @include ct-chart-point($ct-point-size, $ct-point-shape);
+  }
+
+  .#{$ct-class-line} {
+    @include ct-chart-line($ct-line-width);
+  }
+
+  .#{$ct-class-area} {
+    @include ct-chart-area();
+  }
+
+  .#{$ct-class-bar} {
+    @include ct-chart-bar($ct-bar-width);
+  }
+
+  .#{$ct-class-slice-donut} {
+    @include ct-chart-donut($ct-donut-width);
+  }
+
+  @if $ct-include-colored-series {
+    @for $i from 0 to length($ct-series-names) {
+      .#{$ct-class-series}-#{nth($ct-series-names, $i + 1)} {
+        $color: nth($ct-series-colors, $i + 1);
+
+        @include ct-chart-series-color($color);
+      }
+    }
+  }
+}
+
+@if $ct-include-classes {
+  @include ct-chart();
+
+  @if $ct-include-alternative-responsive-containers {
+    @for $i from 0 to length($ct-scales-names) {
+      .#{nth($ct-scales-names, $i + 1)} {
+        @include ct-responsive-svg-container($ratio: nth($ct-scales, $i + 1));
+      }
+    }
+  }
+}

+ 88 - 0
src/api/static/chartist/scss/settings/_chartist-settings.scss

@@ -0,0 +1,88 @@
+// Scales for responsive SVG containers
+$ct-scales: ((1), (15/16), (8/9), (5/6), (4/5), (3/4), (2/3), (5/8), (1/1.618), (3/5), (9/16), (8/15), (1/2), (2/5), (3/8), (1/3), (1/4)) !default;
+$ct-scales-names: (ct-square, ct-minor-second, ct-major-second, ct-minor-third, ct-major-third, ct-perfect-fourth, ct-perfect-fifth, ct-minor-sixth, ct-golden-section, ct-major-sixth, ct-minor-seventh, ct-major-seventh, ct-octave, ct-major-tenth, ct-major-eleventh, ct-major-twelfth, ct-double-octave) !default;
+
+// Class names to be used when generating CSS
+$ct-class-chart: ct-chart !default;
+$ct-class-chart-line: ct-chart-line !default;
+$ct-class-chart-bar: ct-chart-bar !default;
+$ct-class-horizontal-bars: ct-horizontal-bars !default;
+$ct-class-chart-pie: ct-chart-pie !default;
+$ct-class-chart-donut: ct-chart-donut !default;
+$ct-class-label: ct-label !default;
+$ct-class-series: ct-series !default;
+$ct-class-line: ct-line !default;
+$ct-class-point: ct-point !default;
+$ct-class-area: ct-area !default;
+$ct-class-bar: ct-bar !default;
+$ct-class-slice-pie: ct-slice-pie !default;
+$ct-class-slice-donut: ct-slice-donut !default;
+$ct-class-slice-donut-solid: ct-slice-donut-solid !default;
+$ct-class-grid: ct-grid !default;
+$ct-class-grid-background: ct-grid-background !default;
+$ct-class-vertical: ct-vertical !default;
+$ct-class-horizontal: ct-horizontal !default;
+$ct-class-start: ct-start !default;
+$ct-class-end: ct-end !default;
+
+// Container ratio
+$ct-container-ratio: (1/1.618) !default;
+
+// Text styles for labels
+$ct-text-color: rgba(0, 0, 0, 0.4) !default;
+$ct-text-size: 0.75rem !default;
+$ct-text-align: flex-start !default;
+$ct-text-justify: flex-start !default;
+$ct-text-line-height: 1;
+
+// Grid styles
+$ct-grid-color: rgba(0, 0, 0, 0.2) !default;
+$ct-grid-dasharray: 2px !default;
+$ct-grid-width: 1px !default;
+$ct-grid-background-fill: none !default;
+
+// Line chart properties
+$ct-line-width: 4px !default;
+$ct-line-dasharray: false !default;
+$ct-point-size: 10px !default;
+// Line chart point, can be either round or square
+$ct-point-shape: round !default;
+// Area fill transparency between 0 and 1
+$ct-area-opacity: 0.1 !default;
+
+// Bar chart bar width
+$ct-bar-width: 10px !default;
+
+// Donut width (If donut width is to big it can cause issues where the shape gets distorted)
+$ct-donut-width: 60px !default;
+
+// If set to true it will include the default classes and generate CSS output. If you're planning to use the mixins you
+// should set this property to false
+$ct-include-classes: true !default;
+
+// If this is set to true the CSS will contain colored series. You can extend or change the color with the
+// properties below
+$ct-include-colored-series: $ct-include-classes !default;
+
+// If set to true this will include all responsive container variations using the scales defined at the top of the script
+$ct-include-alternative-responsive-containers: $ct-include-classes !default;
+
+// Series names and colors. This can be extended or customized as desired. Just add more series and colors.
+$ct-series-names: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) !default;
+$ct-series-colors: (
+  #d70206,
+  #f05b4f,
+  #f4c63d,
+  #d17905,
+  #453d3f,
+  #59922b,
+  #0544d3,
+  #6b0392,
+  #f05b4f,
+  #dda458,
+  #eacf7d,
+  #86797d,
+  #b2c326,
+  #6188e2,
+  #a748ca
+) !default;

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 6 - 0
src/api/static/css/animate.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
src/api/static/css/bootstrap.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2748 - 0
src/api/static/css/dashboard.css


+ 0 - 146
src/api/static/css/default.css

@@ -1,146 +0,0 @@
-body, .default {
-	font-size:14px;
-	font-family:sans-serif;
-	font-weight:lighter;
-	padding:10px;
-	
-}
-.jsgrid-grid-header{
-	background: #f9f9f9;
-	background-color: rgb(249, 249, 249);
-	background-image: none;
-	background-repeat: repeat;
-	background-attachment: scroll;
-	background-clip: border-box;
-	background-origin: padding-box;
-	background-position-x: 0%;
-	background-position-y: 0%;
-	background-size: auto auto;
-	max-height: 48px;
-}
-.jsgrid-grid-body {
-	overflow-x:hidden;
-	overflow-y:scroll;
-	-webkit-overflow-scrolling:touch
-}
-
-
-.small {
-	font-family:sans-serif;
-	font-size:12px;
-	font-weight:lighter;
-}
-.bold {font-weight:bold}
-.left {float:left}
-.right{float:right}
-.caption {
-	font-size:22px;
-	margin:2px;
-	padding:2px;
-	height:30px;
-	font-family:sans-serif;
-	font-weight:lighter;
-	
-}
-.button {
-	padding:8px;
-	margin:2px;
-	border-radius:4px;
-	-moz-border-radius:4px;
-	-webkit-border-radius:4px;
-	cursor:pointer;
-}
-.button:hover{
-	background-color:#4682B4 ;
-	color:#ffffff;
-	
-}
-.no-border{ border:1px solid transparent}
-.border { border:1px solid #CAD5E0}
-.border-bottom{	border-bottom:1px solid #CAD5E0;}
-.border-right { border-right:1px solid #CAD5E0;}
-.border-left { border-left:1px solid #CAD5E0;}
-.border-top { border-top:1px solid #CAD5E0;}
-.grid {
-	font-family:sans-serif;
-	font-weight:lighter;
-	
-	margin:4px;
-	padding:4px;
-}
-.grid-half {
-	height:195px;
-	margin:4px;
-	width:98%;
-	padding:4px;
-}
-.grid .fa-check {color:green}
-.grid .fa-times {color:maroon; }
-
-.menu {
-	margin:4px;
-	padding:4px;
-}
-.menu .fa-chevron-right {color:transparent; margin:4px; }
-.menu .menu-item { border:1px solid transparent; cursor:pointer; padding-bottom:4px; margin:2px;}
-.menu .menu-item:hover {
-	border-bottom-color:#4682B4;
-}
-.menu .menu-item:hover .fa-chevron-right { color:#4582b4}
-input[type=text]{
-	padding:4px;
-	margin:4px;
-	outline:0px;
-	border:1px solid transparent;
-	background-color:#f3f3f3;
-	font-size:14px;
-	font-weight:lighter;
-	font-family:sans-serif;
-}
-input[type=text]:focus{
-	border-left-color:#4682B4;
-}
-
-.padding-2x{padding:4px;}
-.margin-2x {margin:4px;}
-.info {
-	
-	margin:4px;
-	width:43%;
-	
-	
-}
-.height-quarter{height:24%;}
-.height-half{height:47%}
-.width-quarter {width:24%}
-.width-half {width:47%; }
-.width-75 {width:72%}
-
-.bad { color:maroon}
-.good{ color:green}
-.fa-warning, .warning{color:orange}
-.number {font-size:42px; font-weight:lighter; padding:2px; margin:2px;}
-
-.action {cursor:pointer; padding:2px; margin:2px; border:1px solid transparent}
-.action:hover { border-bottom-color:#4682B4}
-.shadow{box-shadow: 7px 7px 5px #888888;}
-.gradient {
-  background-image:
-    linear-gradient(
-      #4682b4, #ffffff,#ffffff
-    );
-}
-.simple-gradient {
-background-image: -ms-linear-gradient(top, #CAD5E0 0%, #F3F3F3 40%);
-
-background-image: -moz-linear-gradient(top, #CAD5E0 0%, #F3F3F3 40%);
-
-background-image: -o-linear-gradient(top, #CAD5E0 0%, #F3F3F3 40%);
-
-background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #CAD5E0), color-stop(40, #F3F3F3));
-
-background-image: -webkit-linear-gradient(top, #CAD5E0 0%, #F3F3F3 40%);
-
-background-image: linear-gradient(to bottom, #CAD5E0 0%, #F3F3F3 40%);
-	
-}

+ 1 - 1
src/api/static/css/fa/scss/_core.scss

@@ -5,7 +5,7 @@
   display: inline-block;
   font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
   font-size: inherit; // can't have font-size inherit on line above, so need to override
-  text-rendering: auto; // optimizelegibility throws things off #1094
+  text-rendering: auto; // optimize legibility throws things off #1094
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1081 - 0
src/api/static/css/themify-icons.css


BIN
src/api/static/fonts/themify.eot


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 362 - 0
src/api/static/fonts/themify.svg


BIN
src/api/static/fonts/themify.ttf


BIN
src/api/static/fonts/themify.woff


+ 0 - 12
src/api/static/index.html

@@ -1,12 +0,0 @@
-<link type="text/css" rel="stylesheet" href="{{ context }}/js/jsgrid/jsgrid.min.css" />
-<link type="text/css" rel="stylesheet" href="{{ context }}/js/jsgrid/jsgrid-theme.min.css" />
-<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
-<script src="{{ context }}/static/js/jsgrid.js"></script>
-<script src="{{ context }}/static/js/jquery/jquery.min.js"></script>
-
-<title></title>
-<body>
-<div class="caption">
-<div class="left">Process Monitoring</div>
-</div>
-</body>

+ 248 - 0
src/api/static/js/bootstrap-checkbox-radio.js

@@ -0,0 +1,248 @@
+!function ($) {
+
+ /* CHECKBOX PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Checkbox = function (element, options) {
+    this.init(element, options);
+  }
+
+  Checkbox.prototype = {
+
+    constructor: Checkbox
+
+  , init: function (element, options) {
+    var $el = this.$element = $(element)
+
+    this.options = $.extend({}, $.fn.checkbox.defaults, options);
+    $el.before(this.options.template);
+    this.setState();
+  }
+
+  , setState: function () {
+      var $el = this.$element
+        , $parent = $el.closest('.checkbox');
+
+        $el.prop('disabled') && $parent.addClass('disabled');
+        $el.prop('checked') && $parent.addClass('checked');
+    }
+
+  , toggle: function () {
+      var ch = 'checked'
+        , $el = this.$element
+        , $parent = $el.closest('.checkbox')
+        , checked = $el.prop(ch)
+        , e = $.Event('toggle')
+
+      if ($el.prop('disabled') == false) {
+        $parent.toggleClass(ch) && checked ? $el.removeAttr(ch) : $el.prop(ch, ch);
+        $el.trigger(e).trigger('change');
+      }
+    }
+
+  , setCheck: function (option) {
+      var d = 'disabled'
+        , ch = 'checked'
+        , $el = this.$element
+        , $parent = $el.closest('.checkbox')
+        , checkAction = option == 'check' ? true : false
+        , e = $.Event(option)
+
+      $parent[checkAction ? 'addClass' : 'removeClass' ](ch) && checkAction ? $el.prop(ch, ch) : $el.removeAttr(ch);
+      $el.trigger(e).trigger('change');
+    }
+
+  }
+
+
+ /* CHECKBOX PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.checkbox
+
+  $.fn.checkbox = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('checkbox')
+        , options = $.extend({}, $.fn.checkbox.defaults, $this.data(), typeof option == 'object' && option);
+      if (!data) $this.data('checkbox', (data = new Checkbox(this, options)));
+      if (option == 'toggle') data.toggle()
+      if (option == 'check' || option == 'uncheck') data.setCheck(option)
+      else if (option) data.setState();
+    });
+  }
+
+  $.fn.checkbox.defaults = {
+    template: '<span class="icons"><span class="first-icon fa fa-square fa-base"></span><span class="second-icon fa fa-check-square fa-base"></span></span>'
+  }
+
+
+ /* CHECKBOX NO CONFLICT
+  * ================== */
+
+  $.fn.checkbox.noConflict = function () {
+    $.fn.checkbox = old;
+    return this;
+  }
+
+
+ /* CHECKBOX DATA-API
+  * =============== */
+
+  $(document).on('click.checkbox.data-api', '[data-toggle^=checkbox], .checkbox', function (e) {
+    var $checkbox = $(e.target);
+    if (e.target.tagName != "A") {
+      e && e.preventDefault() && e.stopPropagation();
+      if (!$checkbox.hasClass('checkbox')) $checkbox = $checkbox.closest('.checkbox');
+      $checkbox.find(':checkbox').checkbox('toggle');
+    }
+  });
+
+  $(function () {
+    $('input[type="checkbox"]').each(function () {
+      var $checkbox = $(this);
+      $checkbox.checkbox();
+    });
+  });
+
+}(window.jQuery);
+
+/* =============================================================
+ * flatui-radio v0.0.3
+ * ============================================================ */
+
+!function ($) {
+
+ /* RADIO PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Radio = function (element, options) {
+    this.init(element, options);
+  }
+
+  Radio.prototype = {
+
+    constructor: Radio
+
+  , init: function (element, options) {
+      var $el = this.$element = $(element)
+
+      this.options = $.extend({}, $.fn.radio.defaults, options);
+      $el.before(this.options.template);
+      this.setState();
+    }
+
+  , setState: function () {
+      var $el = this.$element
+        , $parent = $el.closest('.radio');
+
+        $el.prop('disabled') && $parent.addClass('disabled');
+        $el.prop('checked') && $parent.addClass('checked');
+    }
+
+  , toggle: function () {
+      var d = 'disabled'
+        , ch = 'checked'
+        , $el = this.$element
+        , checked = $el.prop(ch)
+        , $parent = $el.closest('.radio')
+        , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
+        , $elemGroup = $parentWrap.find(':radio[name="' + $el.attr('name') + '"]')
+        , e = $.Event('toggle')
+
+        if ($el.prop(d) == false) {
+            $elemGroup.not($el).each(function () {
+              var $el = $(this)
+                , $parent = $(this).closest('.radio');
+
+                if ($el.prop(d) == false) {
+                  $parent.removeClass(ch) && $el.removeAttr(ch).trigger('change');
+                }
+            });
+
+            if (checked == false) $parent.addClass(ch) && $el.prop(ch, true);
+            $el.trigger(e);
+
+            if (checked !== $el.prop(ch)) {
+                $el.trigger('change');
+            }
+        }
+    }
+
+  , setCheck: function (option) {
+      var ch = 'checked'
+        , $el = this.$element
+        , $parent = $el.closest('.radio')
+        , checkAction = option == 'check' ? true : false
+        , checked = $el.prop(ch)
+        , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
+        , $elemGroup = $parentWrap.find(':radio[name="' + $el['attr']('name') + '"]')
+        , e = $.Event(option)
+
+      $elemGroup.not($el).each(function () {
+        var $el = $(this)
+          , $parent = $(this).closest('.radio');
+
+          $parent.removeClass(ch) && $el.removeAttr(ch);
+      });
+
+      $parent[checkAction ? 'addClass' : 'removeClass'](ch) && checkAction ? $el.prop(ch, ch) : $el.removeAttr(ch);
+      $el.trigger(e);
+
+      if (checked !== $el.prop(ch)) {
+        $el.trigger('change');
+      }
+    }
+
+  }
+
+
+ /* RADIO PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.radio
+
+  $.fn.radio = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('radio')
+        , options = $.extend({}, $.fn.radio.defaults, $this.data(), typeof option == 'object' && option);
+      if (!data) $this.data('radio', (data = new Radio(this, options)));
+      if (option == 'toggle') data.toggle()
+      if (option == 'check' || option == 'uncheck') data.setCheck(option)
+      else if (option) data.setState();
+    });
+  }
+
+  $.fn.radio.defaults = {
+    template: '<span class="icons"><span class="first-icon fa fa-circle-o fa-base"></span><span class="second-icon fa fa-dot-circle-o fa-base"></span></span>'
+  }
+
+
+ /* RADIO NO CONFLICT
+  * ================== */
+
+  $.fn.radio.noConflict = function () {
+    $.fn.radio = old;
+    return this;
+  }
+
+
+ /* RADIO DATA-API
+  * =============== */
+
+  $(document).on('click.radio.data-api', '[data-toggle^=radio], .radio', function (e) {
+    var $radio = $(e.target);
+    e && e.preventDefault() && e.stopPropagation();
+    if (!$radio.hasClass('radio')) $radio = $radio.closest('.radio');
+    $radio.find(':radio').radio('toggle');
+  });
+
+  $(function () {
+    $('input[type="radio"]').each(function () {
+      var $radio = $(this);
+      $radio.radio();
+    });
+  });
+
+}(window.jQuery);

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 404 - 0
src/api/static/js/bootstrap-notify.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 7 - 0
src/api/static/js/bootstrap.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9 - 0
src/api/static/js/chartist.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 2
src/api/static/js/colors.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 237 - 609
src/api/static/js/dashboard.js


+ 140 - 0
src/api/static/js/default.js

@@ -0,0 +1,140 @@
+var fixedTop = false;
+var transparent = true;
+var navbar_initialized = false;
+
+$(document).ready(function(){
+    window_width = $(window).width();
+
+    // Init navigation toggle for small screens
+    if(window_width <= 991){
+        pd.initRightMenu();
+    }
+
+    //  Activate the tooltips
+    $('[rel="tooltip"]').tooltip();
+
+});
+
+// activate collapse right menu when the windows is resized
+$(window).resize(function(){
+    if($(window).width() <= 991){
+        pd.initRightMenu();
+    }
+});
+
+pd = {
+    misc:{
+        navbar_menu_visible: 0
+    },
+    checkScrollForTransparentNavbar: debounce(function() {
+        if($(document).scrollTop() > 381 ) {
+            if(transparent) {
+                transparent = false;
+                $('.navbar-color-on-scroll').removeClass('navbar-transparent');
+                $('.navbar-title').removeClass('hidden');
+            }
+        } else {
+            if( !transparent ) {
+                transparent = true;
+                $('.navbar-color-on-scroll').addClass('navbar-transparent');
+                $('.navbar-title').addClass('hidden');
+            }
+        }
+    }),
+    initRightMenu: function(){
+         if(!navbar_initialized){
+            $off_canvas_sidebar = $('nav').find('.navbar-collapse').first().clone(true);
+
+            $sidebar = $('.sidebar');
+            sidebar_bg_color = $sidebar.data('background-color');
+            sidebar_active_color = $sidebar.data('active-color');
+
+            $logo = $sidebar.find('.logo').first();
+            logo_content = $logo[0].outerHTML;
+
+            ul_content = '';
+
+            // set the bg color and active color from the default sidebar to the off canvas sidebar;
+            $off_canvas_sidebar.attr('data-background-color',sidebar_bg_color);
+            $off_canvas_sidebar.attr('data-active-color',sidebar_active_color);
+
+            $off_canvas_sidebar.addClass('off-canvas-sidebar');
+
+            //add the content from the regular header to the right menu
+            $off_canvas_sidebar.children('ul').each(function(){
+                content_buff = $(this).html();
+                ul_content = ul_content + content_buff;
+            });
+
+            // add the content from the sidebar to the right menu
+            content_buff = $sidebar.find('.nav').html();
+            ul_content = ul_content + '<li class="divider"></li>'+ content_buff;
+
+            ul_content = '<ul class="nav navbar-nav">' + ul_content + '</ul>';
+
+            navbar_content = logo_content + ul_content;
+            navbar_content = '<div class="sidebar-wrapper">' + navbar_content + '</div>';
+
+            $off_canvas_sidebar.html(navbar_content);
+
+            $('body').append($off_canvas_sidebar);
+
+             $toggle = $('.navbar-toggle');
+
+             $off_canvas_sidebar.find('a').removeClass('btn btn-round btn-default');
+             $off_canvas_sidebar.find('button').removeClass('btn-round btn-fill btn-info btn-primary btn-success btn-danger btn-warning btn-neutral');
+             $off_canvas_sidebar.find('button').addClass('btn-simple btn-block');
+
+             $toggle.click(function (){
+                if(pd.misc.navbar_menu_visible == 1) {
+                    $('html').removeClass('nav-open');
+                    pd.misc.navbar_menu_visible = 0;
+                    $('#bodyClick').remove();
+                     setTimeout(function(){
+                        $toggle.removeClass('toggled');
+                     }, 400);
+
+                } else {
+                    setTimeout(function(){
+                        $toggle.addClass('toggled');
+                    }, 430);
+
+                    div = '<div id="bodyClick"></div>';
+                    $(div).appendTo("body").click(function() {
+                        $('html').removeClass('nav-open');
+                        pd.misc.navbar_menu_visible = 0;
+                        $('#bodyClick').remove();
+                         setTimeout(function(){
+                            $toggle.removeClass('toggled');
+                         }, 400);
+                    });
+
+                    $('html').addClass('nav-open');
+                    pd.misc.navbar_menu_visible = 1;
+
+                }
+            });
+            navbar_initialized = true;
+        }
+
+    }
+}
+
+
+// Returns a function, that, as long as it continues to be invoked, will not
+// be triggered. The function will be called after it stops being called for
+// N milliseconds. If `immediate` is passed, trigger the function on the
+// leading edge, instead of the trailing.
+
+function debounce(func, wait, immediate) {
+	var timeout;
+	return function() {
+		var context = this, args = arguments;
+		clearTimeout(timeout);
+		timeout = setTimeout(function() {
+			timeout = null;
+			if (!immediate) func.apply(context, args);
+		}, wait);
+		if (immediate && !timeout) func.apply(context, args);
+	};
+};

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9789 - 0
src/api/static/js/jquery-1.10.2.js


+ 351 - 183
src/api/templates/dashboard.html

@@ -1,184 +1,352 @@
-<meta charset="UTF-8">
-<meta http-equiv="cache-control" content="no-cache">
-<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1">
-<link type="text/css" rel="stylesheet" href="{{ context }}/static/js/jsgrid/jsgrid.min.css" >
-<link type="text/css" rel="stylesheet" href="{{ context }}/static/js/jsgrid/jsgrid-theme.min.css" >
-<link href="{{context}}/static/css/default.css" rel="stylesheet" type="text/css">
-<link href="{{context}}/static/css/fa/css/font-awesome.min.css" rel="stylesheet" type="text/css">
-<link rel="icon" href="data:;base64,iVBORw0KGgo=">
-
-<script src="{{ context }}/static/js/jquery/jquery.min.js"></script>
-<script src="{{context}}/static/js/chart.js/chart.bundle.js"></script>
-
-<script src="{{context}}/static/js/jx/rpc.js"></script>
-<script src="{{context}}/static/js/jx/dom.js"></script>
-<script src="{{context}}/static/js/jx/utils.js"></script>
-<script src="{{context}}/static/js/jx/ext/math.js"></script>
-<script src="{{ context }}/static/js/jsgrid/jsgrid.js"></script>
-<script src="{{context}}/static/js/colors.js"></script>
-<script src="{{context}}/static/js/dashboard.js"></script>
-<title>{{title}}</title>
-<script>
-	var HTTP_CONTEXT="{{context}}"
-	$(document).ready(function(){
-		monitor.folders.init()
-		monitor.processes.fetch()
-		
-	})
-</script>
-<body class="">
-	<div class="border-bottom caption" style="height:42px">
-		<div class="">{{title}}</div>
-		<div class="small" style="margin:4px">The Phi Technology LLC</div>
-	</div>
-	<i class="fa fa-reorder default left action" onclick="monitor.menu.event.toggle()"></i>
-	<div id="menuframe" class="left small " style="width:10%; height:90%">
-		 <div id="menu" class="menu"></div>
-	</div>
-	
-	<div class="left info ">
-		<div class="shadow border-right" style="margin:4px; margin-top:2%">
-			<div class="" style="height:28px; ">
-				<div class=" bold">Monitoring 
-					<span id="latest_processes_label" class="default bold"></span>
-				</div>
-				<div class="small">Last Lookup <span id="node_last_lookup"></span></div>
-				
-			</div>
-			
-			<div class = "" style="padding:2px; margin:4px; height:170px">	
-				<div id="latest_processes" class="grid" ></div>
-			</div>
-			<div style="height:22px; padding:2px" class="small">
-				<div id="latest_process_pager" align="center"></div>
-			</div>
-		</div>
-		<div id="process_summary" class="simple-gradient shadow grid border-right" style="margin:4px; margin-top:2%">
-			<div style="margin:4px; padding:2px; margin-bottom:4px; height:28px">
-				<div class="bold" style="color:#4682B4">Application Summary By Status</div>
-				<div  class="small">Latest Lookup <span id="app-summary-date"></span></div>
-			</div>
-			
-			<div class=""  style="padding:2px; height:250px; margin:4px; margin-top:10px">
-				<div class=" " style="height:100%">
-					<div class="small left" style="margin-left:2%; margin-top:1%">
-						<div class="bold">Total Applications that have:</div>
-						<br>
-							<div style="margin:0px; margin-left:20px; padding:4px; height:12px"><div class="left width-half"><i class="fa fa-check"></i> Running</div> <span id="total-running" class="right"></span></div>
-							<div style="margin:0px; margin-left:20px; padding:4px; height:12px"><div class="left width-half"><i class="fa fa-times"></i> Crash</div> <span id="total-crash" class="right"></span></div>
-							<div style="margin:0px; margin-left:20px; padding:4px; height:12px"><div class="left width-half"><i class="fa fa-ellipsis-h"></i> Idle</div> <span id="total-idle" class="right"></span></div>
-
-
-					</div>
-					<div id="summary_chart" class="right width-half"></div>
-				</div>
-				
-			</div> 
-			<div id="summary_details" class="right"></div>
-		</div>
-		
-		<div class="shadow simple-gradient  grid border-right" style="margin:4px; margin-top:10px;">
-			<div style="height:28px">
-				<div class="bold" style="margin:4px; padding:4px; color:#4682B4;">Application Summary By Groups</div>
-			</div>
-			<div class="width" id="summary_ranking" style=" margin:4px; padding:2px; text-transform:capitalize"></div>
-		</div>
-	</div>	
-	<div class="left info">
-		<div class="shadow simple-gradient" style="padding:4px; margin-top:2%">
-			<div class="" style="height:28px">
-				<div class="small bold">CPU & Memory Usage Trend for <i class="fa fa-quote-left"></i> <span id="trend_info" class="default bold"></span> <i class="fa fa-quote-right"></i></div>
-				<div class="small">Last Lookup <span id="trend_last_lookup"></span> <i id="has_anomaly" class="fa fa-warning right" ></i></div>
-				
-
-			</div>
-			
-			<div  style="height:270px; margin-top:4px">
-				<div id="trends_chart" class="small grid" style="height:250px"></div>
-			</div>
-		</div>
-		<div id="sandbox" class="border-top" style="padding:4px; margin-top:10px">
-			<div style="height:28px">
-				<div id="inspect_sandbox" class="right button border" style="display:none" onclick="monitor.sandbox.init()">Inspect</div>
-				<div class="bold">Python Virtual Environment Analysis</div>
-				
-				<div class="small">Last Lookup <span id="sandbox_date"></span></div>
-			</div>
-						
-			<div class="shadow " style="margin-top:10px; height:135px">
-				<div id="sandbox_status" class="">
-				</div>
-				<div id="sandbox_pager"></div>
-			</div>
-		</div>
-		<div style="margin-top:2%">
-			<div id="folder_summary" class="shadow">
-				<div style="height:28px">
-					
-					<div class="bold">Folder Analysis/Monitoring</div>
-					<div class="small">Powered By Machine Learning</div>
-				</div>
-				<div class="">
-					<div class=" border-top" style="margin-top:4px; padding:2px; height:34px">
-						<i class="fa fa-search left" style="margin:4px; padding:4px; ; color:gray;"></i> 
-						<input id="folder_search" type="text" class="small left" placeholder="hostname" style="width:87%; padding-left:4px;" onkeyup="monitor.folders.search.init()"/>
-						<i class="fa fa-trash right action right" style="margin:4px; padding:4px; color:maroon" onclick="monitor.folders.search.reset()"></i>
-					</div>
-					<div id="gfolderframe" style="margin-top:10px; height:170px; width:100%">
-						<div style="height:130px">
-							<div id="gridfolders" style=""></div>
-						</div>
-						<div id="folderspager" class="small" style="height:22px; margin:4px;"></div>
-					</div>
-				</div>
-			</div>
-
-			<div id="folder_plan" style="display:none">
-				<div class="border-bottom" style="height:32px">
-					<div class="bold">Deletion/Archiving Plan 
-						<i class="fa fa-quote-left"></i> <span id="folder_name"></span> <i class="fa fa-quote-right"></i>
-						<i class="fa fa-angle-up action right bold" style="font-size:16px; margin:4px;" onclick="monitor.folders.show.grid()"></i>
-					</div>
-					<div class="small left">Powered By Machine Learning</div>
-					
-				</div>
-
-				<div id="delete_age" class="left width-half border-right" style="margin:2px; padding:2px;">
-					<div class="small" align="left">By Age</div>
-					<div class="number" style="height:42px">
-						
-						<div id="age_count"  align="right" class="left width-75" style="margin-right:4px">00</div>
-						<div class="small" class="left" style="height:100%; padding-top:15px">Files</div>
-							
-						
-					</div>
-					<div class="small border-top" align="center" style="padding-top:4px">
-						Approximately <span id="age_value">00</span> <span id="age_units"></span>
-					</div>
-					
-				</div>
-				<div id="delete_size" class="right width-half" class="number" style="margin:2px; padding:2px">
-					<div class="small" align="left">By Size</div>
-					
-					<div  class=" number" style="height:42px">
-						
-						<div id="size_count" align="right" class="left width-75" style="margin-right:4px">00</div>	
-						<div class="small" class="left" style="height:100%; padding-top:15px">Files</div>						
-					</div>
-					<div class="small border-top"align="center" style="padding-top:4px">
-						Approximately <span id="size_value">00</span> <span id="size_units"></span>
-					</div>
-					
-					
-				</div>
-			</div>
-			<div id="chartfolder" ></div>
-		</div>
-			
-		
-
-		
-	</div>
-	
-	
+<!doctype html>
+<html lang="en">
+<head>
+	<meta charset="utf-8" />
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+
+	<title>Monitor</title>
+
+	<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
+    <meta name="viewport" content="width=device-width" />
+
+
+    <!-- Bootstrap core CSS   -->
+    <link href="{{context}}/static/css/bootstrap.min.css" rel="stylesheet" />
+
+    <!-- Animation library for notifications   -->
+    <link href="{{context}}/static/css/animate.min.css" rel="stylesheet"/>
+
+    <!--  Dashboard core CSS    -->
+    <link href="{{context}}/static/css/dashboard.css" rel="stylesheet"/>
+
+    <!--  Fonts and icons     -->
+    <link href="http://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet">
+    <link href='https://fonts.googleapis.com/css?family=Muli:400,300' rel='stylesheet' type='text/css'>
+    <link href="{{context}}/static/css/themify-icons.css" rel="stylesheet">
+
+</head>
+<body>
+
+<div class="wrapper">
+    <div class="sidebar" data-background-color="white" data-active-color="danger">
+
+    <!--
+		Tip 1: you can change the color of the sidebar's background using: data-background-color="white | black"
+		Tip 2: you can change the color of the active button using the data-active-color="primary | info | success | warning | danger"
+	-->
+
+    	<div class="sidebar-wrapper">
+            <div class="logo">
+                <a href="#" class="simple-text">
+                    Monitor
+                </a>
+            </div>
+
+            <ul class="nav">
+                <li class="active">
+                    <a href="dash.html">
+                        <i class="ti-panel"></i>
+                        <p>Dashboard</p>
+                    </a>
+                </li>
+                <li>
+                    <a href= "/user">
+                        <i class="ti-user"></i>
+                        <p>User Profile</p>
+                    </a>
+                </li>
+				<li class="active-pro">
+                    <a href="/upgrade">
+                        <i class="ti-export"></i>
+                        <p>Upgrade to PRO</p>
+                    </a>
+                </li>
+            </ul>
+    	</div>
+    </div>
+    <!-- End Side Bar   -->
+    <div class="main-panel">
+        <nav class="navbar navbar-default">
+            <div class="container-fluid">
+                <div class="navbar-header">
+                    <button type="button" class="navbar-toggle">
+                        <span class="sr-only">Toggle navigation</span>
+                        <span class="icon-bar bar1"></span>
+                        <span class="icon-bar bar2"></span>
+                        <span class="icon-bar bar3"></span>
+                    </button>
+                    <a class="navbar-brand" href="#">Dashboard</a>
+                </div>
+                <div class="collapse navbar-collapse">
+                    <ul class="nav navbar-nav navbar-right">
+                        <li>
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                                <i class="ti-panel"></i>
+								<p>Stats</p>
+                            </a>
+                        </li>
+                        <li class="dropdown">
+                              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                                    <i class="ti-server"></i>
+                                    <!-- <p class="notification">5</p> -->
+									<p>Servers</p>
+									<b class="caret"></b>
+                              </a>
+                              <ul class="dropdown-menu">
+                                <li><a href="#">apps@osx</a></li>
+                                <li><a href="#">server 2</a></li>
+                                <li><a href="#">server 3</a></li>
+                                <li><a href="#">server 4</a></li>
+                                <li><a href="#">server 5</a></li>
+                              </ul>
+                        </li>
+						<li>
+                            <a href="#">
+								<i class="ti-settings"></i>
+								<p>Settings</p>
+                            </a>
+                        </li>
+                    </ul>
+
+                </div>
+            </div>
+        </nav>
+        <!-- End Menu Bar -->
+
+        <div class="content">
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-3 col-sm-6">
+                        <div class="card">
+                            <div class="content">
+                                <div class="row">
+                                    <div class="col-xs-5">
+                                        <div class="icon-big icon-warning text-center">
+                                            <i class="ti-dashboard"></i>
+                                        </div>
+                                    </div>
+                                    <div class="col-xs-7">
+                                        <div class="numbers">
+                                            <p>Total CPU</p>
+
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="footer">
+                                    <hr />
+                                    <div class="stats">
+                                        <i class="ti-reload"></i> Updated now
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-lg-3 col-sm-6">
+                        <div class="card">
+                            <div class="content">
+                                <div class="row">
+                                    <div class="col-xs-5">
+                                        <div class="icon-big icon-success text-center">
+                                            <i class="ti-harddrive"></i>
+                                        </div>
+                                    </div>
+                                    <div class="col-xs-7">
+                                        <div class="numbers">
+                                            <p>Total memory used %</p>
+
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="footer">
+                                    <hr />
+                                    <div class="stats">
+                                        <i class="ti-calendar"></i> Last day
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-lg-3 col-sm-6">
+                        <div class="card">
+                            <div class="content">
+                                <div class="row">
+                                    <div class="col-xs-5">
+                                        <div class="icon-big icon-danger text-center">
+                                            <i class="ti-pulse"></i>
+                                        </div>
+                                    </div>
+                                    <div class="col-xs-7">
+                                        <div class="numbers">
+                                            <p>Errors</p>
+                                            <!-- show errors API. Crashed? -->
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="footer">
+                                    <hr />
+                                    <div class="stats">
+                                        <i class="ti-timer"></i> In the last hour
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-lg-3 col-sm-6">
+                        <div class="card">
+                            <div class="content">
+                                <div class="row">
+                                    <div class="col-xs-5">
+                                        <div class="icon-big icon-info text-center">
+                                            <i class="ti-folder"></i>
+                                        </div>
+                                    </div>
+                                    <div class="col-xs-7">
+                                        <div class="numbers">
+                                            <p>Folder Analysis</p>
+                                            <!-- Folder Analysis API here. -->
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="footer">
+                                    <hr />
+                                    <div class="stats">
+                                        <i class="ti-reload"></i> Updated now
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+
+                    <div class="col-md-12">
+                        <div class="card">
+                            <div class="header">
+                                <h4 class="title">Monitoring Apps</h4>
+                                <p class="category">performance</p>
+                            </div>
+                            <div class="content">
+                                <div id="chartHours" class="ct-chart"></div>
+
+                                <div class="footer">
+                                    <div class="chart-legend">
+                                        <!-- confirm these three are right with new API. -->
+                                        <i class="fa fa-circle text-info"></i> cpu usage
+                                        <i class="fa fa-circle text-danger"></i> memory usage
+                                        <i class="fa fa-circle text-warning"></i> memory available
+                                    </div>
+                                    <hr>
+                                    <div class="stats">
+                                        <i class="ti-reload"></i> Updated 3 minutes ago
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="card">
+                            <div class="header">
+                                <h4 class="title">Summary</h4>
+                                <p class="category">Running|Idle|Crash</p>
+                            </div>
+                            <div class="content">
+                                <div id="chartPreferences" class="ct-chart ct-perfect-fourth"></div>
+
+                                <div class="footer">
+                                    <div class="chart-legend">
+                                        <i class="fa fa-circle text-info"></i> Running
+                                        <i class="fa fa-circle text-danger"></i> Crashed
+                                        <i class="fa fa-circle text-warning"></i> Idle
+                                    </div>
+                                    <hr>
+                                    <div class="stats">
+                                        <i class="ti-timer"></i> Some footer
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="card ">
+                            <div class="header">
+                                <h4 class="title">CPU and Memory</h4>
+                                <p class="category">Usage Trends</p>
+                            </div>
+                            <div class="content">
+                                <div id="chartActivity" class="ct-chart"></div>
+
+                                <div class="footer">
+                                    <div class="chart-legend">
+                                        <i class="fa fa-circle text-info"></i> CPU
+                                        <i class="fa fa-circle text-warning"></i> Memory
+                                    </div>
+                                    <hr>
+                                    <div class="stats">
+                                        <i class="ti-check"></i> Data information certified
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <footer class="footer">
+            <div class="container-fluid">
+                <nav class="pull-left">
+                    <ul>
+
+                        <li>
+                            <a href="#">
+                                Monitor
+                            </a>
+                        </li>
+                        <li>
+                            <a href="#">
+                               Invy
+                            </a>
+                        </li>
+                    </ul>
+                </nav>
+            </div>
+        </footer>
+    </div>
+</div>
+
 </body>
+
+    <!--   Core JS Files   -->
+    <script src="{{context}}/static/js/jquery-1.10.2.js" type="text/javascript"></script>
+	<script src="{{context}}/static/js/bootstrap.min.js" type="text/javascript"></script>
+
+	<!--  Checkbox, Radio & Switch Plugins -->
+	<script src="{{context}}/static/js/bootstrap-checkbox-radio.js"></script>
+
+	<!--  Charts Plugin -->
+	<script src="{{context}}/static/js/chartist.min.js"></script>
+
+    <!--  Notifications Plugin    -->
+    <script src="{{context}}/static/js/bootstrap-notify.js"></script>
+
+    <!--  Google Maps Plugin    -->
+    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>
+
+    <!-- Paper Dashboard Core javascript and methods for Demo purpose -->
+    <!-- <script src="{{context}}/static/js/dash.js"></script> -->
+	<script src="{{context}}/static/js/default.js"></script>
+
+	<!-- Paper Dashboard DEMO methods, don't include it in your project! -->
+	<script src="{{context}}/static/js/dashboard.js"></script>
+
+	<script type="text/javascript">
+    	$(document).ready(function(){
+
+        	dashboard.initChartist();
+
+    	});
+	</script>
+
+</html>

+ 1 - 0
src/api/templates/upgrade.html

@@ -0,0 +1 @@
+<H1>Upgrade</Hi>

+ 1 - 0
src/api/templates/user.html

@@ -0,0 +1 @@
+<H1>User</H1>

+ 8 - 0
start.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+#script_dir=`dirname $0`
+#cd $script_dir
+#/bin/bash -c ". activate sandbox; exec /bin/bash -i"
+`source activate sandbox`
+export PYTHONPATH=$PWD/src
+python src/utils/agents/data-collector.py --path /Users/michaelmead/Documents/Programming/monitor/config.json --title "Seekers Dashboard"