]> scripts.mit.edu Git - wizard.git/blobdiff - plugins/scripts/wizard_scripts.py
Move Scripts applications to plugins, fix broken phpBB test.
[wizard.git] / plugins / scripts / wizard_scripts.py
index 8833989bd960b339630cbedcd01225844e59d097..a3c5a41d704b3f196b3cc918efd2a50c4c22a37e 100644 (file)
@@ -9,15 +9,26 @@ 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 dummy_apps():
+    return [
+        "joomla", "e107", "gallery2", "advancedbook", "phpical",
+        "trac", "turbogears", "django", "rails",
+        # these are technically deprecated
+        "advancedpoll", "gallery",
+    ]
 
 def deploy_web(dir):
     # try the directory
     homedir, _, web_path = dir.partition("/web_scripts")
     if web_path:
-        name = user.passwd(dir).name
+        # XXX: To be truly correct, we should emulate the logic of suexec; but
+        # looking at the home directory is a pretty good stopgap for now
+        name = homedir.rpartition("/")[2]
         yield urlparse.ParseResult(
                 "http",
                 name + ".scripts.mit.edu",
@@ -113,7 +124,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():
@@ -144,9 +155,63 @@ 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, console = result.split(":")
     realname = gecos.split(",")[0]
     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"""
+        logging.info("Attempting wizard_scripts MySQL strategy")
+        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)
+        if not database:
+            raise CreateDatabaseError
+        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"
+
+class CreateDatabaseError(wizard.Error):
+    """Could not create a database with the create-database script."""
+    def __str__(self):
+        return """
+
+ERROR: We were unable to create a database for you: this may indicate
+that you have exceeded your quota of databases or indicate a problem
+with the sql.mit.edu service.  Please mail scripts@mit.edu with this
+error message."""