Esempio n. 1
0
 def test_format_thumbslug_url_with_port(self):
     local_url = "https://someserver.example.com:8088"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://someserver.example.com:8088",
                       format_baseurl(hostname, port, prefix))
Esempio n. 2
0
 def test_format_not_fqdn_with_port(self):
     local_url = "https://foo-bar:8088"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://foo-bar:8088",
                       format_baseurl(hostname, port, prefix))
Esempio n. 3
0
 def test_format_base_url(self):
     local_url = "https://cdn.redhat.com"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(local_url, format_baseurl(hostname, port, prefix))
Esempio n. 4
0
 def test_format_base_url_with_port(self):
     local_url = "https://cdn.redhat.com:443"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://cdn.redhat.com",
                       format_baseurl(hostname, port, prefix))
 def test_format_not_fqdn_with_port(self):
     local_url = "https://foo-bar:8088"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://foo-bar:8088", format_baseurl(hostname, port, prefix))
 def test_format_thumbslug_url_with_port(self):
     local_url = "https://someserver.example.com:8088"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://someserver.example.com:8088", format_baseurl(hostname, port, prefix))
 def test_format_base_url_with_port(self):
     local_url = "https://cdn.redhat.com:443"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(prefix, DEFAULT_CDN_PREFIX)
     self.assertEquals("https://cdn.redhat.com", format_baseurl(hostname, port, prefix))
 def test_format_base_url(self):
     local_url = "https://cdn.redhat.com"
     (hostname, port, prefix) = parse_baseurl_info(local_url)
     self.assertEquals(local_url, format_baseurl(hostname, port, prefix))
Esempio n. 9
0
    def main(self, args=None):

        # TODO: For now, we disable the CLI entirely. We may want to allow some commands in the future.
        if rhsm.config.in_container():
            system_exit(
                os.EX_CONFIG,
                _("subscription-manager is disabled when running inside a container. Please refer to your host system for subscription management.\n"
                  ))

        config_changed = False

        # In testing we sometimes specify args, otherwise use the default:
        if not args:
            args = sys.argv[1:]

        (self.options, self.args) = self.parser.parse_known_args(args)

        # we dont need argv[0] in this list...
        self.args = self.args[1:]
        # check for unparsed arguments
        if self.args:
            for arg in self.args:
                print(_("cannot parse argument: {}").format(arg))
            system_exit(os.EX_USAGE)

        if hasattr(self.options, "insecure") and self.options.insecure:
            conf["server"]["insecure"] = "1"
            config_changed = True

        if hasattr(self.options, "server_url") and self.options.server_url:
            try:
                (self.server_hostname, self.server_port,
                 self.server_prefix) = parse_server_info(
                     self.options.server_url, conf)
            except ServerUrlParseError as e:
                print(_("Error parsing serverurl:"))
                handle_exception("Error parsing serverurl:", e)

            conf["server"]["hostname"] = self.server_hostname
            conf["server"]["port"] = self.server_port
            conf["server"]["prefix"] = self.server_prefix
            if self.server_port:
                self.server_port = int(self.server_port)
            config_changed = True

        if hasattr(self.options, "base_url") and self.options.base_url:
            try:
                (baseurl_server_hostname, baseurl_server_port,
                 baseurl_server_prefix) = parse_baseurl_info(
                     self.options.base_url)
            except ServerUrlParseError as e:
                print(_("Error parsing baseurl:"))
                handle_exception("Error parsing baseurl:", e)

            conf["rhsm"]["baseurl"] = format_baseurl(baseurl_server_hostname,
                                                     baseurl_server_port,
                                                     baseurl_server_prefix)
            config_changed = True

        # support foo.example.com:3128 format
        if hasattr(self.options, "proxy_url") and self.options.proxy_url:
            parts = remove_scheme(self.options.proxy_url).split(':')
            self.proxy_hostname = parts[0]
            # no ':'
            if len(parts) > 1:
                self.proxy_port = int(parts[1])
            else:
                # if no port specified, use the one from the config, or fallback to the default
                self.proxy_port = conf['server'].get_int(
                    'proxy_port') or rhsm.config.DEFAULT_PROXY_PORT
            config_changed = True

        if hasattr(self.options, "proxy_user") and self.options.proxy_user:
            self.proxy_user = self.options.proxy_user
        if hasattr(self.options,
                   "proxy_password") and self.options.proxy_password:
            self.proxy_password = self.options.proxy_password
        if hasattr(self.options, "no_proxy") and self.options.no_proxy:
            self.no_proxy = self.options.no_proxy

        # Proxy information isn't written to the config, so we have to make sure
        # the sorter gets it
        connection_info = {}
        if self.proxy_hostname:
            connection_info['proxy_hostname_arg'] = self.proxy_hostname
        if self.proxy_port:
            connection_info['proxy_port_arg'] = self.proxy_port
        if self.proxy_user:
            connection_info['proxy_user_arg'] = self.proxy_user
        if self.proxy_password:
            connection_info['proxy_password_arg'] = self.proxy_password
        if self.server_hostname:
            connection_info['host'] = self.server_hostname
        if self.server_port:
            connection_info['ssl_port'] = self.server_port
        if self.server_prefix:
            connection_info['handler'] = self.server_prefix
        if self.no_proxy:
            connection_info['no_proxy_arg'] = self.no_proxy

        self.cp_provider = inj.require(inj.CP_PROVIDER)
        self.cp_provider.set_connection_info(**connection_info)
        self.log.debug("X-Correlation-ID: {id}".format(id=self.correlation_id))
        self.cp_provider.set_correlation_id(self.correlation_id)

        self.log_client_version()

        if self.require_connection():
            # make sure we pass in the new server info, otherwise we
            # we use the defaults from connection module init
            # we've set self.proxy* here, so we'll use them if they
            # are set
            self.cp = self.cp_provider.get_consumer_auth_cp()

            # no auth cp for get / (resources) and
            # get /status (status and versions)
            self.no_auth_cp = self.cp_provider.get_no_auth_cp()

            self.entcertlib = EntCertActionInvoker()

            if config_changed:
                try:
                    # catch host/port issues; does not catch auth issues
                    if not self.test_proxy_connection():
                        system_exit(
                            os.EX_UNAVAILABLE,
                            _("Proxy connection failed, please check your settings."
                              ))

                    # this tries to actually connect to the server and ping it
                    if not is_valid_server_info(self.no_auth_cp):
                        system_exit(
                            os.EX_UNAVAILABLE,
                            _("Unable to reach the server at {host}:{port}{handler}"
                              ).format(host=self.no_auth_cp.host,
                                       port=self.no_auth_cp.ssl_port,
                                       handler=self.no_auth_cp.handler))

                except MissingCaCertException:
                    system_exit(
                        os.EX_CONFIG,
                        _("Error: CA certificate for subscription service has not been installed."
                          ))
                except ProxyException:
                    system_exit(
                        os.EX_UNAVAILABLE,
                        _("Proxy connection failed, please check your settings."
                          ))

        else:
            self.cp = None

        # do the work, catch most common errors here:
        try:

            return_code = self._do_command()

            # Only persist the config changes if there was no exception
            if config_changed and self.persist_server_options():
                conf.persist()

            if return_code is not None:
                return return_code
        except (CertificateException, ssl.SSLError) as e:
            log.error(e)
            system_exit(os.EX_SOFTWARE,
                        _('System certificates corrupted. Please reregister.'))
        except connection.GoneException as ge:
            if ge.deleted_id == self.identity.uuid:
                log.critical(
                    "Consumer profile \"{uuid}\" has been deleted from the server."
                    .format(uuid=self.identity.uuid))
                system_exit(
                    os.EX_UNAVAILABLE,
                    _("Consumer profile \"{uuid}\" has been deleted from the server. You can use command clean or unregister to remove local profile."
                      ).format(uuid=self.identity.uuid))
            else:
                raise ge
        except InvalidCLIOptionError as err:
            # This exception is handled in cli module
            raise err
        except Exception as err:
            handle_exception("exception caught in subscription-manager", err)