def _perform_disable(self, silent=False): """Disable specific entitlement @return: True on success, False otherwise. """ if not util.which(LIVEPATCH_CMD): return True util.subp([LIVEPATCH_CMD, "disable"], capture=True) return True
def get_cloud_type() -> "Optional[str]": if util.which("cloud-id"): # Present in cloud-init on >= Xenial out, _err = util.subp(["cloud-id"]) return out.strip() try: return get_cloud_type_from_result_file() except FileNotFoundError: pass return None
def get_cloud_type() -> Tuple[Optional[str], Optional[NoCloudTypeReason]]: if util.which("cloud-id"): # Present in cloud-init on >= Xenial try: out, _err = util.subp(["cloud-id"]) return (out.strip(), None) except exceptions.ProcessExecutionError: return (None, NoCloudTypeReason.CLOUD_ID_ERROR) # If no cloud-id command, assume not on cloud return (None, NoCloudTypeReason.NO_CLOUD_DETECTED)
def disable(self, silent=False): """Disable specific entitlement @return: True on success, False otherwise. """ if not self.can_disable(silent): return False if not util.which("/snap/bin/canonical-livepatch"): return True util.subp(["/snap/bin/canonical-livepatch", "disable"], capture=True) return True
def enable(self, *, silent_if_inapplicable: bool = False) -> bool: """Enable specific entitlement. :param silent_if_inapplicable: Don't emit any messages until after it has been determined that this entitlement is applicable to the current machine. @return: True on success, False otherwise. """ if not self.can_enable(silent=silent_if_inapplicable): return False if not util.which("/snap/bin/canonical-livepatch"): if not util.which(SNAP_CMD): print("Installing snapd") util.subp( ["apt-get", "install", "--assume-yes", "snapd"], capture=True, retry_sleeps=apt.APT_RETRIES, ) util.subp([SNAP_CMD, "wait", "system", "seed.loaded"], capture=True) elif "snapd" not in apt.get_installed_packages(): raise exceptions.UserFacingError( "/usr/bin/snap is present but snapd is not installed;" " cannot enable {}".format(self.title)) print("Installing canonical-livepatch snap") try: util.subp( [SNAP_CMD, "install", "canonical-livepatch"], capture=True, retry_sleeps=SNAP_INSTALL_RETRIES, ) except util.ProcessExecutionError as e: msg = "Unable to install Livepatch client: " + str(e) raise exceptions.UserFacingError(msg) return self.setup_livepatch_config(process_directives=True, process_token=True)
def disable(self, silent=False): """Disable specific entitlement @return: True on success, False otherwise. """ if not self.can_disable(silent): return False if not util.which("/snap/bin/canonical-livepatch"): return True util.subp(["/snap/bin/canonical-livepatch", "disable"], capture=True) logging.debug("Removing canonical-livepatch snap") if not silent: print("Removing canonical-livepatch snap") util.subp([SNAP_CMD, "remove", "canonical-livepatch"], capture=True) return True
def disable(self, silent=False, force=False): """Disable specific entitlement @return: True on success, False otherwise. """ if not self.can_disable(silent, force): return False if not util.which('/snap/bin/canonical-livepatch'): return True util.subp(['/snap/bin/canonical-livepatch', 'disable'], capture=True) logging.debug('Removing canonical-livepatch snap...') if not silent: print('Removing canonical-livepatch snap...') util.subp(['snap', 'remove', 'canonical-livepatch'], capture=True) if not silent: print(status.MESSAGE_DISABLED_TMPL.format(title=self.title)) return True
def unconfigure_livepatch_proxy( protocol_type: str, retry_sleeps: Optional[List[float]] = None ) -> None: """ Unset livepatch configuration settings for http and https proxies. :param protocol_type: String either http or https :param retry_sleeps: Optional list of sleep lengths to apply between retries. Specifying a list of [0.5, 1] tells subp to retry twice on failure; sleeping half a second before the first retry and 1 second before the second retry. """ if not util.which(LIVEPATCH_CMD): return util.subp( [LIVEPATCH_CMD, "config", "{}-proxy=".format(protocol_type)], retry_sleeps=retry_sleeps, )
def application_status( self, ) -> Tuple[ApplicationStatus, Optional[messages.NamedMessage]]: status = (ApplicationStatus.ENABLED, None) if not util.which(LIVEPATCH_CMD): return (ApplicationStatus.DISABLED, messages.LIVEPATCH_NOT_ENABLED) try: util.subp( [LIVEPATCH_CMD, "status"], retry_sleeps=LIVEPATCH_RETRIES ) except exceptions.ProcessExecutionError as e: # TODO(May want to parse INACTIVE/failure assessment) logging.debug("Livepatch not enabled. %s", str(e)) return ( ApplicationStatus.DISABLED, messages.NamedMessage(name="", msg=str(e)), ) return status
def unconfigure_snap_proxy(protocol_type: str, retry_sleeps: Optional[List[float]] = None) -> None: """ Unset snap configuration settings for http and https proxies. :param protocol_type: String either http or https :param retry_sleeps: Optional list of sleep lengths to apply between retries. Specifying a list of [0.5, 1] tells subp to retry twice on failure; sleeping half a second before the first retry and 1 second before the second retry. """ if not util.which(SNAP_CMD): logging.debug( "Skipping unconfigure snap proxy. {} does not exist.".format( SNAP_CMD)) return util.subp( ["snap", "unset", "system", "proxy.{}".format(protocol_type)], retry_sleeps=retry_sleeps, )
def configure_snap_proxy( http_proxy: Optional[str] = None, https_proxy: Optional[str] = None, retry_sleeps: Optional[List[float]] = None, ) -> None: """ Configure snap to use http and https proxies. :param http_proxy: http proxy to be used by snap. If None, it will not be configured :param https_proxy: https proxy to be used by snap. If None, it will not be configured :param retry_sleeps: Optional list of sleep lengths to apply between retries. Specifying a list of [0.5, 1] tells subp to retry twice on failure; sleeping half a second before the first retry and 1 second before the second retry. """ if not util.which(SNAP_CMD): logging.debug( "Skipping configure snap proxy. {} does not exist.".format( SNAP_CMD)) return if http_proxy or https_proxy: event.info(messages.SETTING_SERVICE_PROXY.format(service="snap")) if http_proxy: util.subp( ["snap", "set", "system", "proxy.http={}".format(http_proxy)], retry_sleeps=retry_sleeps, ) if https_proxy: util.subp( ["snap", "set", "system", "proxy.https={}".format(https_proxy)], retry_sleeps=retry_sleeps, )
def _perform_enable(self, silent: bool = False) -> bool: """Enable specific entitlement. @return: True on success, False otherwise. """ if not util.which(snap.SNAP_CMD): event.info("Installing snapd") event.info(messages.APT_UPDATING_LISTS) try: apt.run_apt_update_command() except exceptions.UserFacingError as e: logging.debug( "Trying to install snapd." " Ignoring apt-get update failure: %s", str(e), ) util.subp( ["apt-get", "install", "--assume-yes", "snapd"], capture=True, retry_sleeps=apt.APT_RETRIES, ) elif "snapd" not in apt.get_installed_packages(): raise exceptions.SnapdNotProperlyInstalledError( snap_cmd=snap.SNAP_CMD, service=self.title ) try: util.subp( [snap.SNAP_CMD, "wait", "system", "seed.loaded"], capture=True ) except exceptions.ProcessExecutionError as e: if re.search(r"unknown command .*wait", str(e).lower()): logging.warning(messages.SNAPD_DOES_NOT_HAVE_WAIT_CMD) else: raise http_proxy = util.validate_proxy( "http", self.cfg.http_proxy, util.PROXY_VALIDATION_SNAP_HTTP_URL ) https_proxy = util.validate_proxy( "https", self.cfg.https_proxy, util.PROXY_VALIDATION_SNAP_HTTPS_URL ) snap.configure_snap_proxy( http_proxy=http_proxy, https_proxy=https_proxy, retry_sleeps=snap.SNAP_INSTALL_RETRIES, ) if not util.which(LIVEPATCH_CMD): event.info("Installing canonical-livepatch snap") try: util.subp( [snap.SNAP_CMD, "install", "canonical-livepatch"], capture=True, retry_sleeps=snap.SNAP_INSTALL_RETRIES, ) except exceptions.ProcessExecutionError as e: raise exceptions.ErrorInstallingLivepatch(error_msg=str(e)) configure_livepatch_proxy(http_proxy, https_proxy) return self.setup_livepatch_config( process_directives=True, process_token=True )