diff --git a/pyiron_base/__init__.py b/pyiron_base/__init__.py index 7407b524f..13b9159b2 100644 --- a/pyiron_base/__init__.py +++ b/pyiron_base/__init__.py @@ -39,6 +39,7 @@ from pyiron_base.jobs.job.extension.server.queuestatus import validate_que_request from pyiron_base.state.settings import Settings from pyiron_base.state.install import install_dialog +from pyiron_base.state.check import check_executables_status from pyiron_base.jobs.datamining import PyironTable, TableJob from pyiron_base.interfaces.object import HasDatabase, HasStorage, PyironObject from pyiron_base.database.performance import get_database_statistics diff --git a/pyiron_base/state/check.py b/pyiron_base/state/check.py new file mode 100644 index 000000000..6266f643e --- /dev/null +++ b/pyiron_base/state/check.py @@ -0,0 +1,80 @@ +import os +import stat +import glob +import pandas + +try: + from conda.cli import python_api + + conda_imported_successful = True +except ImportError: + conda_imported_successful = False + +from pyiron_base import state + +conda_package_dict = { + "atomicrex": "atomicrex", + "cp2k": "cp2k", + "damask": "damask", + "mlip": "mlip", + "lammps": "lammps", + "quantumespresso": "qe", + "randspg": "randspg", + "runner": "runner", + "sphinx": "sphinxdft", +} + + +def check_for_conda_package(name): + lst = [l for l in python_api.run_command("list")[0].split("\n") if name + " " in l] + if len(lst) == 0: + return False + else: + return True + + +def check_executable_bit(resource_paths): + def check_bit(script_path): + filemode = os.stat(script_path).st_mode + return bool( + filemode & stat.S_IXUSR + or filemode & stat.S_IXGRP + or filemode & stat.S_IXOTH + ) + + path_lst = [] + for res_path in resource_paths: + path_lst += glob.glob(res_path + "/*/*/*.sh") + return {p: check_bit(script_path=p) for p in path_lst} + + +def check_executables_status(): + executables_dict = check_executable_bit( + resource_paths=state.settings.configuration["resource_paths"] + ) + if conda_imported_successful: + conda_lst = [ + check_for_conda_package(name=conda_package_dict[f]) + if f is not None and f in conda_package_dict.keys() + else False + for f in [ + p.split("/")[-3] if "/share/pyiron/" in p else None + for p in executables_dict.keys() + ] + ] + return pandas.DataFrame( + { + "name": [p.split("/")[-3] for p in executables_dict.keys()], + "path": list(executables_dict.keys()), + "executable_bit": list(executables_dict.values()), + "conda_package_installed": conda_lst, + } + ) + else: + return pandas.DataFrame( + { + "name": [p.split("/")[-3] for p in executables_dict.keys()], + "path": list(executables_dict.keys()), + "executable_bit": list(executables_dict.values()), + } + )