Module glasswall.libraries.library

Expand source code
import ctypes as ct
import os

import glasswall
from glasswall import utils


class Library:
    """ A Glasswall library. """

    def __init__(self, library_path: str):
        self.library_path = library_path

    def load_library(self, library_path: str):
        if not os.path.isfile(library_path):
            if os.path.isdir(library_path):
                library_path = utils.get_library(self.__class__.__name__, library_path)
            else:
                raise FileNotFoundError(library_path)

        self.library_path = library_path

        # Preload dependencies to avoid "OSError: ...: cannot open shared object file: No such file or directory"
        dependencies = [
            os.path.join(os.path.dirname(self.library_path), dependency)
            for dependency in glasswall.libraries.os_info[glasswall._OPERATING_SYSTEM][utils.as_snake_case(self.__class__.__name__)]["dependencies"]
        ]
        missing_dependencies = utils.load_dependencies(dependencies, ignore_errors=True)

        with utils.CwdHandler(new_cwd=self.library_path):
            try:
                # Try to load library
                return ct.cdll.LoadLibrary(self.library_path)
            except OSError as e:
                # If library fails to load and there are missing dependencies, list them
                if missing_dependencies:
                    raise FileNotFoundError(f"Unable to load {self.__class__.__name__}. Below dependencies are missing in directory: {os.path.dirname(self.library_path)}\n{', '.join(missing_dependencies)}") from e
                raise

Classes

class Library (library_path: str)

A Glasswall library.

Expand source code
class Library:
    """ A Glasswall library. """

    def __init__(self, library_path: str):
        self.library_path = library_path

    def load_library(self, library_path: str):
        if not os.path.isfile(library_path):
            if os.path.isdir(library_path):
                library_path = utils.get_library(self.__class__.__name__, library_path)
            else:
                raise FileNotFoundError(library_path)

        self.library_path = library_path

        # Preload dependencies to avoid "OSError: ...: cannot open shared object file: No such file or directory"
        dependencies = [
            os.path.join(os.path.dirname(self.library_path), dependency)
            for dependency in glasswall.libraries.os_info[glasswall._OPERATING_SYSTEM][utils.as_snake_case(self.__class__.__name__)]["dependencies"]
        ]
        missing_dependencies = utils.load_dependencies(dependencies, ignore_errors=True)

        with utils.CwdHandler(new_cwd=self.library_path):
            try:
                # Try to load library
                return ct.cdll.LoadLibrary(self.library_path)
            except OSError as e:
                # If library fails to load and there are missing dependencies, list them
                if missing_dependencies:
                    raise FileNotFoundError(f"Unable to load {self.__class__.__name__}. Below dependencies are missing in directory: {os.path.dirname(self.library_path)}\n{', '.join(missing_dependencies)}") from e
                raise

Subclasses

Methods

def load_library(self, library_path: str)
Expand source code
def load_library(self, library_path: str):
    if not os.path.isfile(library_path):
        if os.path.isdir(library_path):
            library_path = utils.get_library(self.__class__.__name__, library_path)
        else:
            raise FileNotFoundError(library_path)

    self.library_path = library_path

    # Preload dependencies to avoid "OSError: ...: cannot open shared object file: No such file or directory"
    dependencies = [
        os.path.join(os.path.dirname(self.library_path), dependency)
        for dependency in glasswall.libraries.os_info[glasswall._OPERATING_SYSTEM][utils.as_snake_case(self.__class__.__name__)]["dependencies"]
    ]
    missing_dependencies = utils.load_dependencies(dependencies, ignore_errors=True)

    with utils.CwdHandler(new_cwd=self.library_path):
        try:
            # Try to load library
            return ct.cdll.LoadLibrary(self.library_path)
        except OSError as e:
            # If library fails to load and there are missing dependencies, list them
            if missing_dependencies:
                raise FileNotFoundError(f"Unable to load {self.__class__.__name__}. Below dependencies are missing in directory: {os.path.dirname(self.library_path)}\n{', '.join(missing_dependencies)}") from e
            raise