Esempio n. 1
0
    def test_create_fsw(self, mock_config, mock_avail):
        """
        Tests that create_filesystem_watcher returns the correct object

        create_filesystem_watcher should return an inotify filesystem watcher if
        pyinotify is available and configured, and a polling filesystem watcher otherwise
        :param mock_config: mock of whether pyinotify is configured or not according to is_inotify_config()
        :param mock_avail: mock of whether pyinotify is available or not according to is_inotify_avail()
        :return:
        """
        mock_config.return_value = True
        mock_avail.return_value = True
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.InotifyFilesystemWatcher)
        mock_config.return_value = False
        mock_avail.return_value = True
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
        mock_config.return_value = True
        mock_avail.return_value = False
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
        mock_config.return_value = False
        mock_avail.return_value = False
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
    def test_create_fsw(self, mock_config, mock_avail):
        """
        Tests that create_filesystem_watcher returns the correct object

        create_filesystem_watcher should return an inotify filesystem watcher if
        pyinotify is available and configured, and a polling filesystem watcher otherwise
        :param mock_config: mock of whether pyinotify is configured or not according to is_inotify_config()
        :param mock_avail: mock of whether pyinotify is available or not according to is_inotify_avail()
        :return:
        """
        mock_config.return_value = True
        mock_avail.return_value = True
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.InotifyFilesystemWatcher)
        mock_config.return_value = False
        mock_avail.return_value = True
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
        mock_config.return_value = True
        mock_avail.return_value = False
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
        mock_config.return_value = False
        mock_avail.return_value = False
        fsw = file_monitor.create_filesystem_watcher(self.dir_list)
        self.assertIsInstance(fsw, file_monitor.FilesystemWatcher)
Esempio n. 3
0
    def __init__(self, bus_class=None, bus_name=None, object_classes=None, bus_kwargs=None):
        """
        Create a connection to a bus defined by bus_class and bus_kwargs; instantiate objects in
        object_classes; expose them under bus_name and enter a GLib mainloop.  bus_kwargs are generally
        only necessary if you're using dbus.bus.BusConnection

        The object_classes argument is a list.  The list can contain either a class or a tuple consisting
        of a class and a dictionary of arguments to send that class's constructor.
        """

        # Configure mainloop for threading.  We must do so in GLib and python-dbus.
        GLib.threads_init()
        dbus.mainloop.glib.threads_init()

        self.bus_name = bus_name or constants.BUS_NAME
        bus_class = bus_class or dbus.SystemBus
        bus_kwargs = bus_kwargs or {}
        object_classes = object_classes or []
        self.objects = []
        self.object_map = {}

        try:
            self.bus = bus_class(**bus_kwargs)
        except dbus.exceptions.DBusException:
            log.exception("Could not create bus class")
            raise
        self.identity = inj.require(inj.IDENTITY)  # gives us consumer path
        config_cert_dir_path = "/etc/rhsm/rhsm.conf"
        products_cert_dir_path = conf['rhsm']['productCertDir']
        entitlement_cert_dir_path = conf['rhsm']['entitlementCertDir']
        syspurpose_cert_dir_path = "/etc/rhsm/syspurpose/syspurpose.json"

        self.connection_name = dbus.service.BusName(self.bus_name, self.bus)
        self.mainloop = GLib.MainLoop()

        for item in object_classes:
            try:
                clazz, kwargs = item[0], item[1]
            except TypeError:
                clazz = item
                kwargs = {}

            clazz_instance = clazz(object_path=clazz.default_dbus_path, bus_name=self.connection_name, **kwargs)
            self.objects.append(clazz_instance)
            self.object_map[str(clazz.__name__)] = clazz_instance

        consumer_dir_list = []
        entitlement_dir_list = []
        config_dir_list = []
        products_dir_list = []
        syspurpose_dir_list = []
        if "EntitlementDBusObject" in self.object_map:
            entitlement_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            consumer_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            products_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            syspurpose_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            entitlement_dir_list.append(self.object_map["EntitlementDBusObject"].EntitlementChanged)
        if "ConsumerDBusObject" in self.object_map:
            consumer_dir_list.append(self.object_map["ConsumerDBusObject"].ConsumerChanged)
        if "ConfigDBusObject" in self.object_map:
            config_dir_list.append(self.object_map["ConfigDBusObject"].reload)
            config_dir_list.append(self.object_map["ConfigDBusObject"].ConfigChanged)
        if "ProductsDBusObject" in self.object_map:
            products_dir_list.append(self.object_map["ProductsDBusObject"].InstalledProductsChanged)
        if "SyspurposeDBusObject" in self.object_map:
            syspurpose_dir_list.append(self.object_map["SyspurposeDBusObject"].SyspurposeChanged)

        consumer_dir_watch = DirectoryWatch(self.identity.cert_dir_path, consumer_dir_list)
        entitlement_dir_watch = DirectoryWatch(entitlement_cert_dir_path, entitlement_dir_list)
        config_dir_watch = DirectoryWatch(config_cert_dir_path, config_dir_list)
        products_dir_watch = DirectoryWatch(products_cert_dir_path, products_dir_list)
        syspurpose_dir_watch = DirectoryWatch(syspurpose_cert_dir_path, syspurpose_dir_list)

        self.filesystem_watcher = create_filesystem_watcher([
            consumer_dir_watch,
            entitlement_dir_watch,
            config_dir_watch,
            products_dir_watch,
            syspurpose_dir_watch,
        ])
        self._thread = threading.Thread(target=self.filesystem_watcher.loop)
        self._thread.start()
Esempio n. 4
0
    def __init__(self, bus_class=None, bus_name=None, object_classes=None, bus_kwargs=None):
        """
        Create a connection to a bus defined by bus_class and bus_kwargs; instantiate objects in
        object_classes; expose them under bus_name and enter a GLib mainloop.  bus_kwargs are generally
        only necessary if you're using dbus.bus.BusConnection

        The object_classes argument is a list.  The list can contain either a class or a tuple consisting
        of a class and a dictionary of arguments to send that class's constructor.
        """

        # Configure mainloop for threading.  We must do so in GLib and python-dbus.
        GLib.threads_init()
        dbus.mainloop.glib.threads_init()

        self.bus_name = bus_name or constants.BUS_NAME
        bus_class = bus_class or dbus.SystemBus
        bus_kwargs = bus_kwargs or {}
        object_classes = object_classes or []
        self.objects = []
        self.object_map = {}

        try:
            self.bus = bus_class(**bus_kwargs)
        except dbus.exceptions.DBusException:
            log.exception("Could not create bus class")
            raise
        self.identity = inj.require(inj.IDENTITY)  # gives us consumer path
        config_cert_dir_path = "/etc/rhsm/rhsm.conf"
        products_cert_dir_path = conf['rhsm']['productCertDir']
        entitlement_cert_dir_path = conf['rhsm']['entitlementCertDir']
        syspurpose_cert_dir_path = "/etc/rhsm/syspurpose/syspurpose.json"

        self.connection_name = dbus.service.BusName(self.bus_name, self.bus)
        self.mainloop = GLib.MainLoop()

        for item in object_classes:
            try:
                clazz, kwargs = item[0], item[1]
            except TypeError:
                clazz = item
                kwargs = {}

            clazz_instance = clazz(object_path=clazz.default_dbus_path, bus_name=self.connection_name, **kwargs)
            self.objects.append(clazz_instance)
            self.object_map[str(clazz.__name__)] = clazz_instance

        consumer_dir_list = [self.identity.reload]
        entitlement_dir_list = []
        config_dir_list = []
        products_dir_list = []
        syspurpose_dir_list = []
        if "EntitlementDBusObject" in self.object_map:
            entitlement_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            consumer_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            products_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            syspurpose_dir_list.append(self.object_map["EntitlementDBusObject"].reload)
            entitlement_dir_list.append(self.object_map["EntitlementDBusObject"].EntitlementChanged)
        if "ConsumerDBusObject" in self.object_map:
            consumer_dir_list.append(self.object_map["ConsumerDBusObject"].ConsumerChanged)
        if "ConfigDBusObject" in self.object_map:
            config_dir_list.append(self.object_map["ConfigDBusObject"].reload)
            config_dir_list.append(self.object_map["ConfigDBusObject"].ConfigChanged)
        if "ProductsDBusObject" in self.object_map:
            products_dir_list.append(self.object_map["ProductsDBusObject"].InstalledProductsChanged)
        if "SyspurposeDBusObject" in self.object_map:
            syspurpose_dir_list.append(self.object_map["SyspurposeDBusObject"].SyspurposeChanged)

        consumer_dir_watch = DirectoryWatch(self.identity.cert_dir_path, consumer_dir_list)
        entitlement_dir_watch = DirectoryWatch(entitlement_cert_dir_path, entitlement_dir_list)
        config_dir_watch = DirectoryWatch(config_cert_dir_path, config_dir_list)
        products_dir_watch = DirectoryWatch(products_cert_dir_path, products_dir_list)
        syspurpose_dir_watch = DirectoryWatch(syspurpose_cert_dir_path, syspurpose_dir_list)

        self.filesystem_watcher = create_filesystem_watcher([
            consumer_dir_watch,
            entitlement_dir_watch,
            config_dir_watch,
            products_dir_watch,
            syspurpose_dir_watch,
        ])
        self._thread = threading.Thread(target=self.filesystem_watcher.loop)
        self._thread.start()