import os import shlex from wizard import shell, util def get_sql_credentials(vars=None): """ Attempts to determine a user's MySQL credentials. They are returned as a three-tuple (host, user, password). """ sh = shell.Shell() host = os.getenv("WIZARD_MYSQL_HOST") user = os.getenv("WIZARD_MYSQL_USER") password = os.getenv("WIZARD_MYSQL_PASSWORD") if host is not None and user is not None and password is not None: return (host, user, password) # XXX: this is very fragile elif vars and "WIZARD_DBSERVER" in vars and "WIZARD_DBUSER" in vars and "WIZARD_DBPASSWORD" in vars: return (shlex.split(vars[x])[0] for x in ("WIZARD_DBSERVER", "WIZARD_DBUSER", "WIZARD_DBPASSWORD")) try: tuple = sh.eval("/mit/scripts/sql/bin/get-password").split() if len(tuple) == 3: return tuple return None except CallError: return None def get_web_host_and_path(dir=None): """ Attempts to determine webhost and path for the current directory as it would be accessible from the web. Works only for scripts servers. Returns a tuple web_host, web_path, or None if it failed. """ # XXX: THIS CODE SUCKS host = os.getenv("WIZARD_WEB_HOST") path = os.getenv("WIZARD_WEB_PATH") if host is not None and path is not None: return (host, path) if not dir: dir = os.getcwd() _, _, web_path = dir.partition("/web_scripts") if not web_path: return None return (util.get_dir_owner(dir) + ".scripts.mit.edu", web_path) def get_quota_usage_and_limit(dir=None): """ Returns a tuple (quota usage, quota limit). Works only for scripts servers. Values are in KiB. Returns ``(0, None)`` if we couldn't figure it out. """ # XXX: The correct way is to implement Python modules implementing # bindings for all the appropriate interfaces def parse_last_quote(ret): return ret.rstrip('\'').rpartition('\'')[2] if dir is None: dir = os.getcwd() sh = shell.Shell() try: cell = parse_last_quote(sh.eval("fs", "whichcell", "-path", dir)) except shell.CallError: return (0, None) mount = None while dir: try: volume = parse_last_quote(sh.eval("fs", "lsmount", dir))[1:] break except shell.CallError: dir = os.path.dirname(dir) if not volume: return (0, None) try: result = sh.eval("vos", "examine", "-id", volume, "-cell", cell).splitlines() except shell.CallError: return (0, None) usage = int(result[0].split()[3]) limit = int(result[3].split()[1]) # XXX: FRAGILE return (usage, limit) # XXX: Possibly in the wrong module def get_disk_usage(dir=None): """ Recursively determines the disk usage of a directory, excluding .git directories. Value is in bytes. """ if dir is None: dir = os.getcwd() return int(shell.Shell().eval("du", "--exclude=.git", "-s", dir).split()[0])