Skip to content
Snippets Groups Projects
Select Git revision
  • a29e16097a5e1f77ed557fa7b95057d83c525705
  • main default protected
  • f-better-sss-bin-dir
  • dev protected
  • f-remove-dropoffbox
  • f-sss4grpc
  • f-refactor-compose
  • f-real-id
  • f-doip
  • f-filesystem-import
  • henrik-tmp
  • f-filesystem-link
  • f-filesystem-directory
  • f-filesystem-core
  • f-filesystem-cleanup
  • f-string-ids
  • f-filesystem-main
  • f-linkahead-rename-before
  • f-linkahead-rename
  • f-rename-li
  • f-experiment-trino
  • v0.13.0 protected
  • v0.12.3 protected
  • v0.12.2 protected
  • v0.12.1 protected
  • v0.12.0 protected
  • v0.11.0 protected
  • v0.10.0 protected
  • v0.9.0 protected
  • v0.8.1 protected
  • v0.8.0 protected
  • v0.7.3 protected
  • v0.7.2 protected
  • v0.7.1 protected
  • v0.6.0 protected
  • v0.5.0 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • working_sss protected
  • v0.1 protected
40 results

diagnostics.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    diagnostics.py 3.93 KiB
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #
    # ** header v3.0
    # This file is a part of the CaosDB Project.
    #
    # Copyright (C) 2018 Research Group Biomedical Physics,
    # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
    # Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
    # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU Affero General Public License as
    # published by the Free Software Foundation, either version 3 of the
    # License, or (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU Affero General Public License for more details.
    #
    # You should have received a copy of the GNU Affero General Public License
    # along with this program. If not, see <https://www.gnu.org/licenses/>.
    #
    # ** end header
    #
    """diagnostics.py
    
    A script which returns a json representation of various parameters which might
    be interesting for debugging the server-side scripting functionality and which
    should not be executable for non-admin users.
    """
    
    import sys
    
    TEST_MODULES = [
        "linkahead",
        "numpy",
        "pandas",
        "validate_email"
    ]
    
    
    def get_files():
        from os import walk
        from os.path import join
        result = []
        for p, dirs, files in walk("."):
            for f in files:
                result.append(join(p, f))
            for d in dirs:
                result.append(join(p, d))
        return result
    
    
    def get_option(name, default=None):
        for arg in sys.argv:
            if arg.startswith("--{}=".format(name)):
                index = len(name) + 3
                return arg[index:]
        return default
    
    
    def get_exit_code():
        return int(get_option("exit", 0))
    
    
    def get_auth_token():
        return get_option("auth-token")
    
    
    def get_query():
        return get_option("query")
    
    
    def get_linkahead_info(auth_token):
        import linkahead as db
        result = dict()
        result["version"] = db.version.version
    
        try:
            db.configure_connection(
                auth_token=auth_token,
                password_method="auth_token")
    
            info = db.Info()
    
            result["info"] = str(info)
            result["username"] = info.user_info.name
            result["realm"] = info.user_info.realm
            result["roles"] = info.user_info.roles
    
            # execute a query and return the results
            query = get_query()
            if query is not None:
                query_result = db.execute_query(query)
                result["query"] = (query, str(query_result))
    
        except Exception as e:
            result["exception"] = str(e)
        return result
    
    
    def test_imports(modules):
        result = dict()
        for m in modules:
            try:
                i = __import__(m)
                if hasattr(i, "__version__") and i.__version__ is not None:
                    v = i.__version__
                else:
                    v = "unknown version"
                result[m] = (True, v)
            except ImportError as e:
                result[m] = (False, str(e))
        return result
    
    
    def main():
        try:
            import json
        except ImportError:
            print('{{"python_version":"{v}",'
                  '"python_path":["{p}"]}}'.format(v=sys.version,
                                                   p='","'.join(sys.path)))
            raise
    
        try:
            diagnostics = dict()
            diagnostics["python_version"] = sys.version
            diagnostics["python_path"] = sys.path
            diagnostics["call"] = sys.argv
            diagnostics["import"] = test_imports(TEST_MODULES)
            diagnostics["files"] = get_files()
    
            auth_token = get_auth_token()
            diagnostics["auth_token"] = auth_token
    
            if diagnostics["import"]["linkahead"][0] is True:
                diagnostics["linkahead"] = get_linkahead_info(auth_token)
    
        finally:
            json.dump(diagnostics, sys.stdout)
    
        sys.exit(get_exit_code())
    
    
    if __name__ == "__main__":
        main()