import os.path import os import subprocess import pwd import sys import wizard class ChangeDirectory(object): """Context for temporarily changing directory""" def __init__(self, dir): self.dir = dir self.olddir = None def __enter__(self): self.olddir = os.getcwd() os.chdir(self.dir) def __exit__(self, *args): os.chdir(self.olddir) def get_exception_name(output): """Reads the stderr output of another Python command and grabs the fully qualified exception name""" lines = output.split("\n") for line in lines[1:]: # skip the "traceback" line line = line.rstrip() if line[0] == ' ': continue if line[-1] == ":": return line[:-1] else: return line def get_dir_uid(dir): """Finds the uid of the person who owns this directory.""" return os.stat(dir).st_uid def get_dir_owner(dir): """Finds the name of the locker this directory is in.""" return pwd.getpwuid(get_dir_uid(dir)).pw_name def get_revision(): """Returns the commit ID of the current Wizard install.""" wizard_git = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), ".git") return subprocess.Popen(["git", "--git-dir=" + wizard_git, "rev-parse", "HEAD"], stdout=subprocess.PIPE).communicate()[0].rstrip() def get_operator_info(): """Returns tuple of (realname, email) of person who is operating this script, as told to use by the Kerberos principal name. Useful for commit messages.""" username = get_operator_name() hesinfo = subprocess.Popen(["hesinfo", username, "passwd"],stdout=subprocess.PIPE).communicate()[0] fields = hesinfo.partition(",")[0] realname = fields.rpartition(":")[2] return realname, username + "@mit.edu" def get_operator_git(): """Returns Real Name suitable for use in Git Something-by: string.""" return "%s <%s>" % get_operator_info() def get_operator_name(): """Returns username of the person operating this script.""" principal = os.getenv("SSH_GSSAPI_NAME") if not principal: raise NoOperatorInfo() instance, _, _ = principal.partition("@") if instance.endswith("/root"): username, _, _ = principal.partition("/") else: username = instance return username def set_operator_env(): try: op_realname, op_email = get_operator_info() os.putenv("GIT_COMMITTER_NAME", op_realname) os.putenv("GIT_COMMITTER_EMAIL", op_email) except NoOperatorInfo: pass def set_author_env(): try: lockername = get_dir_owner(".") os.putenv("GIT_AUTHOR_NAME", "%s locker" % lockername) os.putenv("GIT_AUTHOR_EMAIL", "%s@scripts.mit.edu" % lockername) except KeyError: pass def set_git_env(): set_operator_env() set_author_env() def get_git_footer(): return "\n".join(["Wizard-revision: %s" % get_revision() ,"Wizard-args: %s" % " ".join(sys.argv) ]) class Error(wizard.Error): pass class NoOperatorInfo(Error): pass