def __init__(self): """ Create a new firstboot Module for the 'register' screen. """ super(moduleClass, self).__init__() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) GLib.threads_init() dbus.mainloop.glib.threads_init() self.mode = constants.MODE_REGULAR self.title = _("Subscription Management Registration") self.sidebarTitle = _("Subscription Registration") self.priority = 200.1 # NOTE: all of this is copied form former firstboot_base module # and may no longer be needed # set this so subclasses can override behaviour if needed self._is_compat = False reg_info = registergui.RegisterInfo() self.backend = managergui.Backend() self.plugin_manager = inj.require(inj.PLUGIN_MANAGER) self.register_widget = registergui.FirstbootWidget( self.backend, reg_info) self.register_widget.connect("notify::screen-ready", self._on_screen_ready_change) # Will be False if we are on an older RHEL version where # rhn-client-tools already does some things so we don't have to. self.standalone = True distribution = HardwareCollector().get_distribution() log.debug("Distribution: %s" % str(distribution)) try: dist_version = float(distribution[1]) # We run this for Fedora as well, but all we really care about here # is if this is prior to RHEL 7, so this comparison should be safe. if dist_version < 7: self.standalone = False except Exception as e: log.error("Unable to parse a distribution version.") log.exception(e) log.debug("Running standalone firstboot: %s" % self.standalone) self.manual_message = None self._skip_apply_for_page_jump = False self._cached_credentials = None self._registration_finished = False self.interface = None self.finished = False self.proxies_were_enabled_from_gui = None self._apply_result = constants.RESULT_FAILURE self.page_status = constants.RESULT_FAILURE
def on_cert_sorter_cert_change(self): # gather data used in GUI refresh self._show_overrides = self._should_show_overrides() self._can_redeem = self._should_show_redeem() self.installed_tab.update() self.my_subs_tab.update_subscriptions(update_gui=False) # don't update GUI since we're in a different thread # queue up in the main thread since the cert check may be done by another thread. ga_GLib.idle_add(self._cert_change_update)
def __init__(self): """ Create a new firstboot Module for the 'register' screen. """ super(moduleClass, self).__init__() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) GLib.threads_init() dbus.mainloop.glib.threads_init() self.mode = constants.MODE_REGULAR self.title = _("Subscription Management Registration") self.sidebarTitle = _("Subscription Registration") self.priority = 200.1 # NOTE: all of this is copied form former firstboot_base module # and may no longer be needed # set this so subclasses can override behaviour if needed self._is_compat = False reg_info = registergui.RegisterInfo() self.backend = managergui.Backend() self.plugin_manager = inj.require(inj.PLUGIN_MANAGER) self.register_widget = registergui.FirstbootWidget(self.backend, reg_info) self.register_widget.connect("notify::screen-ready", self._on_screen_ready_change) # Will be False if we are on an older RHEL version where # rhn-client-tools already does some things so we don't have to. self.standalone = True distribution = HardwareCollector().get_distribution() log.debug("Distribution: %s" % str(distribution)) try: dist_version = float(distribution[1]) # We run this for Fedora as well, but all we really care about here # is if this is prior to RHEL 7, so this comparison should be safe. if dist_version < 7: self.standalone = False except Exception as e: log.error("Unable to parse a distribution version.") log.exception(e) log.debug("Running standalone firstboot: %s" % self.standalone) self.manual_message = None self._skip_apply_for_page_jump = False self._cached_credentials = None self._registration_finished = False self.interface = None self.finished = False self.proxies_were_enabled_from_gui = None self._apply_result = constants.RESULT_FAILURE self.page_status = constants.RESULT_FAILURE
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 = [] try: self.bus = bus_class(**bus_kwargs) except dbus.exceptions.DBusException: log.exception("Could not create bus class") raise self.terminate_loop = False # if 'pyinotify' in sys.modules and inotify_enabled(): log.debug('Using pyinotify %s' % pyinotify.__version__) self._thread = threading.Thread(target=inotify.inotify_worker, args=(self, )) else: self._thread = threading.Thread(target=polling_worker, args=(self, )) self._thread.start() 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 = {} self.objects.append( clazz(object_path=clazz.default_dbus_path, bus_name=self.connection_name, **kwargs))
def run(self, started_event=None, stopped_event=None): """The two arguments, started_event and stopped_event, should be instances of threading.Event that will be set when the mainloop has finished starting and stopping.""" try: GLib.idle_add(self.notify_started, started_event) self.mainloop.run() except KeyboardInterrupt as e: log.exception(e) except SystemExit as e: log.exception(e) except Exception as e: log.exception(e) finally: if stopped_event: stopped_event.set()
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 = [] try: self.bus = bus_class(**bus_kwargs) except dbus.exceptions.DBusException: log.exception("Could not create bus class") raise self.terminate_loop = False # if 'pyinotify' in sys.modules and inotify_enabled(): log.debug('Using pyinotify %s' % pyinotify.__version__) self._thread = threading.Thread(target=inotify.inotify_worker, args=(self,)) else: self._thread = threading.Thread(target=polling_worker, args=(self,)) self._thread.start() 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 = {} self.objects.append( clazz(object_path=clazz.default_dbus_path, bus_name=self.connection_name, **kwargs) )
def run(self, started_event=None, stopped_event=None): """ The two arguments, started_event and stopped_event, should be instances of threading. Event that will be set when the mainloop has finished starting and stopping. """ try: GLib.idle_add(self.notify_started, started_event) self.mainloop.run() except KeyboardInterrupt as e: log.exception(e) except SystemExit as e: log.exception(e) except Exception as e: log.exception(e) finally: # Terminate loop of notifier self.terminate_loop = True if stopped_event: stopped_event.set()
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()
def __init__(self, backend=None, facts=None, ent_dir=None, prod_dir=None, auto_launch_registration=False): super(MainWindow, self).__init__() self.backend = backend or Backend() self.identity = require(IDENTITY) self.facts = facts or Facts(self.backend.entitlement_dir, self.backend.product_dir) # We need to make sure facts are loaded immediately, some GUI operations # are done in separate threads, and if facts try to load in another # thread the virt guest detection code breaks due to hwprobe's use of # signals. self.facts.get_facts() log.debug("Client Versions: %s " % get_client_versions()) # Log the server version asynchronously ga_GLib.idle_add(self.log_server_version, self.backend.cp_provider.get_consumer_auth_cp()) settings = self.main_window.get_settings() # prevent gtk from trying to save a list of recently used files, which # as root, causes gtk warning: # "Attempting to set the permissions of `/root/.local/share/recently-used.xbel' # The __name__ use is just for the 'origin' value gtk uses to store # where a Gtk.Settings value was set. settings.set_long_property('gtk-recent-files-max-age', 0, "%s:%s" % (__name__, type(self).__name__)) self.product_dir = prod_dir or self.backend.product_dir self.entitlement_dir = ent_dir or self.backend.entitlement_dir self.system_facts_dialog = factsgui.SystemFactsDialog(self.facts) self.preferences_dialog = PreferencesDialog(self.backend, self._get_window()) self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.import_sub_dialog = ImportSubDialog() self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._config_changed) self.redeem_dialog = redeem.RedeemDialog(self.backend) self.installed_tab_icon = ga_Gtk.Image() self.installed_tab_icon.set_from_stock(ga_Gtk.STOCK_YES, ga_Gtk.IconSize.MENU) self.installed_tab = InstalledProductsTab(self.backend, self.facts, self.installed_tab_icon, self, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.my_subs_tab = MySubscriptionsTab(self.backend, self.main_window, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.all_subs_tab = AllSubscriptionsTab(self.backend, self.facts, self.main_window) hbox = ga_Gtk.HBox(spacing=6) hbox.pack_start(self.installed_tab_icon, False, False, 0) hbox.pack_start(ga_Gtk.Label(self.installed_tab.get_label()), False, False, 0) self.notebook.append_page(self.installed_tab.get_content(), hbox) hbox.show_all() self.notebook.append_page(self.my_subs_tab.get_content(), ga_Gtk.Label(self.my_subs_tab.get_label())) self.connect_signals({ "on_register_menu_item_activate": self._register_item_clicked, "on_unregister_menu_item_activate": self._unregister_item_clicked, "on_import_cert_menu_item_activate": self._import_cert_item_clicked, "on_view_facts_menu_item_activate": self._facts_item_clicked, "on_proxy_config_menu_item_activate": self._proxy_config_item_clicked, "on_redeem_menu_item_activate": self._redeem_item_clicked, "on_preferences_menu_item_activate": self._preferences_item_clicked, "on_repos_menu_item_activate": self._repos_item_clicked, "on_about_menu_item_activate": self._about_item_clicked, "on_getting_started_menu_item_activate": self._getting_started_item_clicked, "on_online_docs_menu_item_activate": self._online_docs_item_clicked, "on_quit_menu_item_activate": ga_Gtk.main_quit, }) # TODO: why is this defined in the init scope? # When something causes cert_sorter to upate it's state, refresh the gui # The cert directories being updated will cause this (either noticed # from a timer, or via cert_sort.force_cert_check). def on_cert_sorter_cert_change(): # Update installed products self.installed_tab.update_products() self.installed_tab._set_validity_status() # Update attached subs self.my_subs_tab.update_subscriptions() # Update main window self.refresh() # Reset repos dialog, see bz 1132919 self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.backend.cs.add_callback(on_cert_sorter_cert_change) self.main_window.show_all() # Check to see if already registered to old RHN/Spacewalk # and show dialog if so self._check_rhn_classic() # Update everything with compliance data self.backend.cs.notify() # managergui needs cert_sort.cert_monitor.run_check() to run # on a timer to detect cert changes from outside the gui # (via rhsmdd for example, or manually provisioned). ga_GLib.timeout_add(2000, self._on_cert_check_timer) if auto_launch_registration and not self.registered(): self._register_item_clicked(None)
def __init__(self, backend=None, ent_dir=None, prod_dir=None, auto_launch_registration=False): super(MainWindow, self).__init__() rhsm_cfg = config.initConfig() proxy_server = rhsm_cfg.get("server", "proxy_hostname") proxy_port = int(rhsm_cfg.get("server", "proxy_port") or config.DEFAULT_PROXY_PORT) def show_proxy_error_dialog(proxy_auth_required=False): """ When proxy server is set in configuration and it is not possible to connect to proxy server, then open dialog for setting proxy server. """ if proxy_auth_required: proxy_user = rhsm_cfg.get("server", "proxy_user") proxy_password = rhsm_cfg.get("server", "proxy_password") if proxy_user or proxy_password: err_msg = _("Wrong proxy username or password, please check your settings.") else: err_msg = _("Proxy authentication required, please check your settings.") else: err_msg = _("Proxy connection failed, please check your settings.") print_error(err_msg) error_dialog = messageWindow.ContinueDialog(err_msg, self._get_window()) error_dialog.connect("response", self._on_proxy_error_dialog_response) self.network_config_dialog = networkConfig.NetworkConfigDialog() # Sub-man gui will be terminated after saving settings and it is # necessary to start it once again. self.network_config_dialog.saveButton.connect("clicked", self._exit) self.network_config_dialog.cancelButton.connect("clicked", self._exit) self.backend = backend or Backend() cp = self.backend.cp_provider.get_consumer_auth_cp() if proxy_server: if not utils.test_proxy_reachability(proxy_server, proxy_port): show_proxy_error_dialog() return try: # Try to send to the simplest Rest API call to Candlepin server. # This result will be used for getting version of Candlepin server. # See self.log_server_version. cp.supports_resource("status") except socket.error as err: # See https://tools.ietf.org/html/rfc7235#section-4.3 if "407 Proxy Authentication Required" in err.message: show_proxy_error_dialog(proxy_auth_required=True) return self.identity = require(IDENTITY) log.debug("Client Versions: %s " % get_client_versions()) ga_GLib.idle_add(self.log_server_version, cp) settings = self.main_window.get_settings() # prevent gtk from trying to save a list of recently used files, which # as root, causes gtk warning: # "Attempting to set the permissions of `/root/.local/share/recently-used.xbel' # The __name__ use is just for the 'origin' value gtk uses to store # where a Gtk.Settings value was set. settings.set_long_property('gtk-recent-files-max-age', 0, "%s:%s" % (__name__, type(self).__name__)) ga_Gtk.Window.set_default_icon_name("subscription-manager") self.product_dir = prod_dir or self.backend.product_dir self.entitlement_dir = ent_dir or self.backend.entitlement_dir self.system_facts_dialog = factsgui.SystemFactsDialog(update_callback=self._handle_facts_updated) self.preferences_dialog = PreferencesDialog(self.backend, self._get_window()) self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.import_sub_dialog = ImportSubDialog() self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._config_changed) self.redeem_dialog = redeem.RedeemDialog(self.backend) self.installed_tab_icon = ga_Gtk.Image() self.installed_tab_icon.set_from_stock(ga_Gtk.STOCK_YES, ga_Gtk.IconSize.MENU) self.installed_tab = InstalledProductsTab(self.backend, self.installed_tab_icon, self, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.my_subs_tab = MySubscriptionsTab(self.backend, self.main_window, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.all_subs_tab = AllSubscriptionsTab(self.backend, self.main_window) hbox = ga_Gtk.HBox(spacing=6) hbox.pack_start(self.installed_tab_icon, False, False, 0) hbox.pack_start(ga_Gtk.Label(self.installed_tab.get_label()), False, False, 0) self.notebook.append_page(self.installed_tab.get_content(), hbox) hbox.show_all() self.notebook.append_page(self.my_subs_tab.get_content(), ga_Gtk.Label(self.my_subs_tab.get_label())) self.connect_signals({ "on_register_menu_item_activate": self._register_item_clicked, "on_unregister_menu_item_activate": self._unregister_item_clicked, "on_import_cert_menu_item_activate": self._import_cert_item_clicked, "on_view_facts_menu_item_activate": self._facts_item_clicked, "on_proxy_config_menu_item_activate": self._proxy_config_item_clicked, "on_redeem_menu_item_activate": self._redeem_item_clicked, "on_preferences_menu_item_activate": self._preferences_item_clicked, "on_repos_menu_item_activate": self._repos_item_clicked, "on_about_menu_item_activate": self._about_item_clicked, "on_getting_started_menu_item_activate": self._getting_started_item_clicked, "on_online_docs_menu_item_activate": self._online_docs_item_clicked, "on_quit_menu_item_activate": ga_Gtk.main_quit, }) # various state tracking for async operations self._show_overrides = False self._can_redeem = False self.backend.cs.add_callback(self.on_cert_sorter_cert_change) self.main_window.show_all() # Check to see if already registered to old RHN/Spacewalk # and show dialog if so self._check_rhn_classic() # Update everything with compliance data self.backend.cs.notify() # managergui needs cert_sort.cert_monitor.run_check() to run # on a timer to detect cert changes from outside the gui # (via rhsmdd for example, or manually provisioned). cert_monitor_thread = threading.Thread(target=self._cert_check_timer, name="CertMonitorThread") cert_monitor_thread.daemon = True cert_monitor_thread.start() if auto_launch_registration and not self.registered(): self._register_item_clicked(None) enabled_yum_plugins = YumPluginManager.enable_pkg_plugins() if len(enabled_yum_plugins) > 0: messageWindow.InfoDialog( YumPluginManager.warning_message(enabled_yum_plugins), self._get_window(), _("Warning - subscription-manager plugins were automatically enabled") )
def __init__(self, backend=None, ent_dir=None, prod_dir=None, auto_launch_registration=False): super(MainWindow, self).__init__() if not self.test_proxy_connection(): print_error(_("Proxy connection failed, please check your settings.")) error_dialog = messageWindow.ContinueDialog(_("Proxy connection failed, please check your settings."), self._get_window()) error_dialog.connect("response", self._on_proxy_error_dialog_response) self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._exit) self.network_config_dialog.cancelButton.connect("clicked", self._exit) return self.backend = backend or Backend() self.identity = require(IDENTITY) log.debug("Client Versions: %s " % get_client_versions()) # Log the server version asynchronously ga_GLib.idle_add(self.log_server_version, self.backend.cp_provider.get_consumer_auth_cp()) settings = self.main_window.get_settings() # prevent gtk from trying to save a list of recently used files, which # as root, causes gtk warning: # "Attempting to set the permissions of `/root/.local/share/recently-used.xbel' # The __name__ use is just for the 'origin' value gtk uses to store # where a Gtk.Settings value was set. settings.set_long_property('gtk-recent-files-max-age', 0, "%s:%s" % (__name__, type(self).__name__)) ga_Gtk.Window.set_default_icon_name("subscription-manager") self.product_dir = prod_dir or self.backend.product_dir self.entitlement_dir = ent_dir or self.backend.entitlement_dir self.system_facts_dialog = factsgui.SystemFactsDialog(update_callback=self._handle_facts_updated) self.preferences_dialog = PreferencesDialog(self.backend, self._get_window()) self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.import_sub_dialog = ImportSubDialog() self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._config_changed) self.redeem_dialog = redeem.RedeemDialog(self.backend) self.installed_tab_icon = ga_Gtk.Image() self.installed_tab_icon.set_from_stock(ga_Gtk.STOCK_YES, ga_Gtk.IconSize.MENU) self.installed_tab = InstalledProductsTab(self.backend, self.installed_tab_icon, self, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.my_subs_tab = MySubscriptionsTab(self.backend, self.main_window, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.all_subs_tab = AllSubscriptionsTab(self.backend, self.main_window) hbox = ga_Gtk.HBox(spacing=6) hbox.pack_start(self.installed_tab_icon, False, False, 0) hbox.pack_start(ga_Gtk.Label(self.installed_tab.get_label()), False, False, 0) self.notebook.append_page(self.installed_tab.get_content(), hbox) hbox.show_all() self.notebook.append_page(self.my_subs_tab.get_content(), ga_Gtk.Label(self.my_subs_tab.get_label())) self.connect_signals({ "on_register_menu_item_activate": self._register_item_clicked, "on_unregister_menu_item_activate": self._unregister_item_clicked, "on_import_cert_menu_item_activate": self._import_cert_item_clicked, "on_view_facts_menu_item_activate": self._facts_item_clicked, "on_proxy_config_menu_item_activate": self._proxy_config_item_clicked, "on_redeem_menu_item_activate": self._redeem_item_clicked, "on_preferences_menu_item_activate": self._preferences_item_clicked, "on_repos_menu_item_activate": self._repos_item_clicked, "on_about_menu_item_activate": self._about_item_clicked, "on_getting_started_menu_item_activate": self._getting_started_item_clicked, "on_online_docs_menu_item_activate": self._online_docs_item_clicked, "on_quit_menu_item_activate": ga_Gtk.main_quit, }) # various state tracking for async operations self._show_overrides = False self._can_redeem = False self.backend.cs.add_callback(self.on_cert_sorter_cert_change) self.main_window.show_all() # Check to see if already registered to old RHN/Spacewalk # and show dialog if so self._check_rhn_classic() # Update everything with compliance data self.backend.cs.notify() # managergui needs cert_sort.cert_monitor.run_check() to run # on a timer to detect cert changes from outside the gui # (via rhsmdd for example, or manually provisioned). cert_monitor_thread = threading.Thread(target=self._cert_check_timer, name="CertMonitorThread") cert_monitor_thread.daemon = True cert_monitor_thread.start() if auto_launch_registration and not self.registered(): self._register_item_clicked(None)
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()
def __init__(self, backend=None, ent_dir=None, prod_dir=None, auto_launch_registration=False): super(MainWindow, self).__init__() rhsm_cfg = config.initConfig() proxy_server = rhsm_cfg.get("server", "proxy_hostname") proxy_port = int( rhsm_cfg.get("server", "proxy_port") or config.DEFAULT_PROXY_PORT) def show_proxy_error_dialog(proxy_auth_required=False): """ When proxy server is set in configuration and it is not possible to connect to proxy server, then open dialog for setting proxy server. """ if proxy_auth_required: proxy_user = rhsm_cfg.get("server", "proxy_user") proxy_password = rhsm_cfg.get("server", "proxy_password") if proxy_user or proxy_password: err_msg = _( "Wrong proxy username or password, please check your settings." ) else: err_msg = _( "Proxy authentication required, please check your settings." ) else: err_msg = _( "Proxy connection failed, please check your settings.") print_error(err_msg) error_dialog = messageWindow.ContinueDialog( err_msg, self._get_window()) error_dialog.connect("response", self._on_proxy_error_dialog_response) self.network_config_dialog = networkConfig.NetworkConfigDialog() # Sub-man gui will be terminated after saving settings and it is # necessary to start it once again. self.network_config_dialog.saveButton.connect( "clicked", self._exit) self.network_config_dialog.cancelButton.connect( "clicked", self._exit) self.backend = backend or Backend() cp = self.backend.cp_provider.get_consumer_auth_cp() if proxy_server: if not utils.test_proxy_reachability(proxy_server, proxy_port): show_proxy_error_dialog() return try: # Try to send to the simplest Rest API call to Candlepin server. # This result will be used for getting version of Candlepin server. # See self.log_server_version. cp.supports_resource("status") except socket.error as err: # See https://tools.ietf.org/html/rfc7235#section-4.3 if "407 Proxy Authentication Required" in err.message: show_proxy_error_dialog(proxy_auth_required=True) return self.identity = require(IDENTITY) log.debug("Client Versions: %s " % get_client_versions()) ga_GLib.idle_add(self.log_server_version, cp) settings = self.main_window.get_settings() # prevent gtk from trying to save a list of recently used files, which # as root, causes gtk warning: # "Attempting to set the permissions of `/root/.local/share/recently-used.xbel' # The __name__ use is just for the 'origin' value gtk uses to store # where a Gtk.Settings value was set. settings.set_long_property('gtk-recent-files-max-age', 0, "%s:%s" % (__name__, type(self).__name__)) ga_Gtk.Window.set_default_icon_name("subscription-manager") self.product_dir = prod_dir or self.backend.product_dir self.entitlement_dir = ent_dir or self.backend.entitlement_dir self.system_facts_dialog = factsgui.SystemFactsDialog( update_callback=self._handle_facts_updated) self.preferences_dialog = PreferencesDialog(self.backend, self._get_window()) self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.import_sub_dialog = ImportSubDialog() self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._config_changed) self.redeem_dialog = redeem.RedeemDialog(self.backend) self.installed_tab_icon = ga_Gtk.Image() self.installed_tab_icon.set_from_stock(ga_Gtk.STOCK_YES, ga_Gtk.IconSize.MENU) self.installed_tab = InstalledProductsTab(self.backend, self.installed_tab_icon, self, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.my_subs_tab = MySubscriptionsTab(self.backend, self.main_window, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.all_subs_tab = AllSubscriptionsTab(self.backend, self.main_window) hbox = ga_Gtk.HBox(spacing=6) hbox.pack_start(self.installed_tab_icon, False, False, 0) hbox.pack_start(ga_Gtk.Label(self.installed_tab.get_label()), False, False, 0) self.notebook.append_page(self.installed_tab.get_content(), hbox) hbox.show_all() self.notebook.append_page(self.my_subs_tab.get_content(), ga_Gtk.Label(self.my_subs_tab.get_label())) self.connect_signals({ "on_register_menu_item_activate": self._register_item_clicked, "on_unregister_menu_item_activate": self._unregister_item_clicked, "on_import_cert_menu_item_activate": self._import_cert_item_clicked, "on_view_facts_menu_item_activate": self._facts_item_clicked, "on_proxy_config_menu_item_activate": self._proxy_config_item_clicked, "on_redeem_menu_item_activate": self._redeem_item_clicked, "on_preferences_menu_item_activate": self._preferences_item_clicked, "on_repos_menu_item_activate": self._repos_item_clicked, "on_about_menu_item_activate": self._about_item_clicked, "on_getting_started_menu_item_activate": self._getting_started_item_clicked, "on_online_docs_menu_item_activate": self._online_docs_item_clicked, "on_quit_menu_item_activate": ga_Gtk.main_quit, }) # various state tracking for async operations self._show_overrides = False self._can_redeem = False self.backend.cs.add_callback(self.on_cert_sorter_cert_change) self.main_window.show_all() # Check to see if already registered to old RHN/Spacewalk # and show dialog if so self._check_rhn_classic() # Update everything with compliance data self.backend.cs.notify() # managergui needs cert_sort.cert_monitor.run_check() to run # on a timer to detect cert changes from outside the gui # (via rhsmdd for example, or manually provisioned). cert_monitor_thread = threading.Thread(target=self._cert_check_timer, name="CertMonitorThread") cert_monitor_thread.daemon = True cert_monitor_thread.start() if auto_launch_registration and not self.registered(): self._register_item_clicked(None) enabled_yum_plugins = YumPluginManager.enable_pkg_plugins() if len(enabled_yum_plugins) > 0: messageWindow.InfoDialog( YumPluginManager.warning_message(enabled_yum_plugins), self._get_window(), _("Warning - subscription-manager plugins were automatically enabled" ))
def __init__(self, backend=None, facts=None, ent_dir=None, prod_dir=None, auto_launch_registration=False): super(MainWindow, self).__init__() if not self.test_proxy_connection(): print_error(_("Proxy connection failed, please check your settings.")) error_dialog = messageWindow.ContinueDialog(_("Proxy connection failed, please check your settings."), self._get_window()) error_dialog.connect("response", self._on_proxy_error_dialog_response) self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._exit) self.network_config_dialog.cancelButton.connect("clicked", self._exit) return self.backend = backend or Backend() self.identity = require(IDENTITY) self.facts = facts or Facts(self.backend.entitlement_dir, self.backend.product_dir) # We need to make sure facts are loaded immediately, some GUI operations # are done in separate threads, and if facts try to load in another # thread the virt guest detection code breaks due to hwprobe's use of # signals. self.facts.get_facts() log.debug("Client Versions: %s " % get_client_versions()) # Log the server version asynchronously ga_GLib.idle_add(self.log_server_version, self.backend.cp_provider.get_consumer_auth_cp()) settings = self.main_window.get_settings() # prevent gtk from trying to save a list of recently used files, which # as root, causes gtk warning: # "Attempting to set the permissions of `/root/.local/share/recently-used.xbel' # The __name__ use is just for the 'origin' value gtk uses to store # where a Gtk.Settings value was set. settings.set_long_property('gtk-recent-files-max-age', 0, "%s:%s" % (__name__, type(self).__name__)) ga_Gtk.Window.set_default_icon_name("subscription-manager") self.product_dir = prod_dir or self.backend.product_dir self.entitlement_dir = ent_dir or self.backend.entitlement_dir self.system_facts_dialog = factsgui.SystemFactsDialog(self.facts, update_callback=self._handle_facts_updated) self.preferences_dialog = PreferencesDialog(self.backend, self._get_window()) self.repos_dialog = RepositoriesDialog(self.backend, self._get_window()) self.import_sub_dialog = ImportSubDialog() self.network_config_dialog = networkConfig.NetworkConfigDialog() self.network_config_dialog.saveButton.connect("clicked", self._config_changed) self.redeem_dialog = redeem.RedeemDialog(self.backend) self.installed_tab_icon = ga_Gtk.Image() self.installed_tab_icon.set_from_stock(ga_Gtk.STOCK_YES, ga_Gtk.IconSize.MENU) self.installed_tab = InstalledProductsTab(self.backend, self.facts, self.installed_tab_icon, self, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.my_subs_tab = MySubscriptionsTab(self.backend, self.main_window, ent_dir=self.entitlement_dir, prod_dir=self.product_dir) self.all_subs_tab = AllSubscriptionsTab(self.backend, self.facts, self.main_window) hbox = ga_Gtk.HBox(spacing=6) hbox.pack_start(self.installed_tab_icon, False, False, 0) hbox.pack_start(ga_Gtk.Label(self.installed_tab.get_label()), False, False, 0) self.notebook.append_page(self.installed_tab.get_content(), hbox) hbox.show_all() self.notebook.append_page(self.my_subs_tab.get_content(), ga_Gtk.Label(self.my_subs_tab.get_label())) self.connect_signals({ "on_register_menu_item_activate": self._register_item_clicked, "on_unregister_menu_item_activate": self._unregister_item_clicked, "on_import_cert_menu_item_activate": self._import_cert_item_clicked, "on_view_facts_menu_item_activate": self._facts_item_clicked, "on_proxy_config_menu_item_activate": self._proxy_config_item_clicked, "on_redeem_menu_item_activate": self._redeem_item_clicked, "on_preferences_menu_item_activate": self._preferences_item_clicked, "on_repos_menu_item_activate": self._repos_item_clicked, "on_about_menu_item_activate": self._about_item_clicked, "on_getting_started_menu_item_activate": self._getting_started_item_clicked, "on_online_docs_menu_item_activate": self._online_docs_item_clicked, "on_quit_menu_item_activate": ga_Gtk.main_quit, }) # various state tracking for async operations self._show_overrides = False self._can_redeem = False self.backend.cs.add_callback(self.on_cert_sorter_cert_change) self.main_window.show_all() # Check to see if already registered to old RHN/Spacewalk # and show dialog if so self._check_rhn_classic() # Update everything with compliance data self.backend.cs.notify() # managergui needs cert_sort.cert_monitor.run_check() to run # on a timer to detect cert changes from outside the gui # (via rhsmdd for example, or manually provisioned). cert_monitor_thread = threading.Thread(target=self._cert_check_timer, name="CertMonitorThread") cert_monitor_thread.daemon = True cert_monitor_thread.start() if auto_launch_registration and not self.registered(): self._register_item_clicked(None)