X-Git-Url: https://scripts.mit.edu/gitweb/wizard.git/blobdiff_plain/a8b52be70700da2453a925a8f4cf7523e713aa92..769b3ff3da08e6c00b155d08da475807ad13dbae:/plugins/scripts/wizard_scripts.py diff --git a/plugins/scripts/wizard_scripts.py b/plugins/scripts/wizard_scripts.py index 23fb1ee..10118c8 100644 --- a/plugins/scripts/wizard_scripts.py +++ b/plugins/scripts/wizard_scripts.py @@ -9,23 +9,25 @@ import logging import urlparse import time import errno +import sqlalchemy import wizard -from wizard import shell, util, user +from wizard import deploy, shell, install, util, user def deploy_web(dir): # try the directory homedir, _, web_path = dir.partition("/web_scripts") if web_path: + name = user.passwd(dir).name yield urlparse.ParseResult( "http", - util.get_dir_owner(homedir) + ".scripts.mit.edu", + name + ".scripts.mit.edu", web_path.rstrip('/'), "", "", "") yield urlparse.ParseResult( "http", "scripts.mit.edu", - "/~" + util.get_dir_owner(homedir) + web_path.rstrip('/'), + "/~" + name + web_path.rstrip('/'), "", "", "") else: logging.info("Directory location did not contain web_scripts: %s", dir) @@ -112,7 +114,7 @@ def sql_auth(url): return None def user_email(name): - # XXX: simplistic strategy which doesn't work most of the time + # XXX: simplistic install which doesn't work most of the time return "%s@scripts.mit.edu" % name def user_operator(): @@ -143,9 +145,50 @@ def user_passwd(dir, uid): if not dir.startswith("/afs/"): return None try: - result = shell.eval("hesinfo %d uid", uid) + result = shell.eval("hesinfo", str(uid), "uid") except shell.CallError: return None - name, password, uid, gid, gecos, homedir, shell = result.split(":") + name, password, uid, gid, gecos, homedir, console = result.split(":") realname = gecos.split(",")[0] - return user.Info(name, uid, gid, realname, homedir, shell) + return user.Info(name, uid, gid, realname, homedir, console) + +class MysqlStrategy(install.Strategy): + """ + Performs scripts specific guesses for MySQL variables. This + may create an appropriate database for the user. + """ + side_effects = True + provides = frozenset(["dsn"]) + def prepare(self): + """Uses the SQL programs in the scripts locker""" + if self.application.database != "mysql": + raise install.StrategyFailed + try: + self._triplet = shell.eval("/mit/scripts/sql/bin/get-password").split() + except shell.CallError: + raise install.StrategyFailed + if len(self._triplet) != 3: + raise install.StrategyFailed + self._username = os.getenv('USER') + if self._username is None: + raise install.StrategyFailed + def execute(self, options): + """Creates a new database for the user using ``get-next-database`` and ``create-database``.""" + host, username, password = self._triplet + # race condition + name = shell.eval("/mit/scripts/sql/bin/get-next-database", os.path.basename(self.dir)) + database = shell.eval("/mit/scripts/sql/bin/create-database", name) + options.dsn = sqlalchemy.engine.url.URL("mysql", username=username, password=password, host=host, database=database) + +class EmailStrategy(install.Strategy): + """Performs script specific guess for email.""" + provides = frozenset(["email"]) + def prepare(self): + """Uses :envvar:`USER` and assumes you are an MIT affiliate.""" + # XXX: This might be buggy, because locker might be set to USER + self._user = os.getenv("USER") + if self._user is None: + raise install.StrategyFailed + def execute(self, options): + """No-op.""" + options.email = self._user + "@mit.edu"