def unlock(self): """ Set GPG_TTY and run GPG unlock command. If gpg-keepalive is set, start keepalive thread. """ if self.GPG_unlock_command and ( self.settings.get("BINPKG_FORMAT", SUPPORTED_GENTOO_BINPKG_FORMATS[0]) == "gpkg" ): try: os.environ["GPG_TTY"] = os.ttyname(sys.stdout.fileno()) except OSError as e: # When run with no input/output tty, this will fail. # However, if the password is given by command, # GPG does not need to ask password, so can be ignored. writemsg(colorize("WARN", str(e)) + "\n") cmd = shlex_split(varexpand(self.GPG_unlock_command, mydict=self.settings)) return_code = subprocess.Popen(cmd).wait() if return_code == os.EX_OK: writemsg_stdout(colorize("GOOD", "unlocked") + "\n") sys.stdout.flush() else: raise GPGException("GPG unlock failed") if self.keepalive: self.GPG_unlock_command = shlex_split( varexpand(self.GPG_unlock_command, mydict=self.settings) ) self.thread = threading.Thread(target=self.gpg_keepalive, daemon=True) self.thread.start()
def _vcs_gpg_git(self): # NOTE: It's possible to use --gpg-sign=key_id to specify the key in # the commit arguments. If key_id is unspecified, then it must be # configured by `git config user.signingkey key_id`. self.vcs_settings.vcs_local_opts.append("--gpg-sign") if self.repoman_settings.get("PORTAGE_GPG_DIR"): # Pass GNUPGHOME to git for bug #462362. self.commit_env["GNUPGHOME"] = self.repoman_settings["PORTAGE_GPG_DIR"] # Pass GPG_TTY to git for bug #477728. try: self.commit_env["GPG_TTY"] = os.ttyname(sys.stdin.fileno()) except OSError: pass