chiark / gitweb /
service.py: Fix commentary, and default remote command.
[chopwood] / cmd-admin.py
index dc5246198b82e09735ba5f58b08fc839e260103c..fb7249767375a6fd86d6764c555bd1c274761750 100644 (file)
 from __future__ import with_statement
 
 import agpl as AGPL
+import backend as BE
 import cmdutil as CU
+import config as CONF; CFG = CONF.CFG
 import dbmaint as D
+import operation as OP
 from output import OUT, PRINT
+import service as S
 import subcommand as SC
 import util as U
 
@@ -64,6 +68,19 @@ def cmd_adduser(user, email = None):
 def cmd_deluser(user, email = None):
   with D.DB:
     CU.check_user(user)
+    for service, alias in D.DB.execute(
+      "SELECT service, alias FROM services WHERE user = $user",
+      user = user):
+      if service == 'master': continue
+      try:
+        svc = S.SERVICES[service]
+      except KeyError:
+        OUT.warn("User `%s' has account for unknown service `%s'" %
+                 (user, service))
+      else:
+        if svc.manage_pwent_p:
+          if alias is None: alias = user
+          svc.rmpwent(alias)
     D.DB.execute("DELETE FROM users WHERE user = $user", user = user)
 
 @SC.subcommand(
@@ -118,33 +135,48 @@ def cmd_editsvc(service, rename = None):
   opts = [SC.Opt('alias', '-a', '--alias',
                  "alias by which USER is known to SERVICE",
                  argname = 'ALIAS')],
-  params = [SC.Arg('user'), SC.Arg('service')])
-def cmd_addacct(user, service, alias = None):
+  params = [SC.Arg('user'), SC.Arg('service')],
+  rparam = SC.Arg('fields'))
+def cmd_addacct(user, service, fields, alias = None):
   with D.DB:
     CU.check_user(user)
-    CU.check_service(service)
+    svc = CU.check_service(service)
     D.DB.execute("""SELECT 1 FROM services
                     WHERE user = $user AND service = $service""",
                  user = user, service = service)
     if D.DB.fetchone() is not None:
       raise U.ExpectedError, (
-        400, "User `%s' already has `%s' account" % (user, service))
+        400, "User `%s' already has `%s' account" % (user, service))
     D.DB.execute("""INSERT INTO services (service, user, alias)
                     VALUES ($service, $user, $alias)""",
                  service = service, user = user, alias = alias)
 
+    if svc.manage_pwent_p:
+      if alias is None: alias = user
+      passwd = CFG.RQCLASS.reset([OP.acct(svc, alias)]).pwgen()
+      svc.mkpwent(alias, passwd, fields)
+    elif fields:
+      raise U.ExpectedError, (
+        400, "Password entry fields supplied, "
+        "but `%s' entries must be created manually" % service)
+
 @SC.subcommand(
   'delacct', ['admin'], "Remove USER's SERVICE account.",
   params = [SC.Arg('user'), SC.Arg('service')])
 def cmd_delacct(user, service):
   with D.DB:
-    CU.resolve_account(service, user)
+    svc, alias = CU.resolve_account(service, user)
     if service == 'master':
       raise U.ExpectedError, \
           (400, "Can't delete master accounts: use `deluser'")
     D.DB.execute("""DELETE FROM services
                     WHERE service = $service AND user = $user""",
                  service = service, user = user)
+    if svc.manage_pwent_p:
+      svc.rmpwent(alias)
+    else:
+      OUT.warn("You must remove the `%s' password entry for `%s' by hand" %
+               (service, user))
 
 @SC.subcommand(
   'editacct', ['admin'], "Modify USER's SERVICE account record.",
@@ -164,7 +196,7 @@ def cmd_editacct(user, service, alias = None, noalias = False):
                     user = user, service = service)
 
 @SC.subcommand(
-  'source', ['admin', 'userv'], """\
+  'source', ['admin', 'userv', 'remote'], """\
 Write source code (in `.tar.gz' format) to standard output.""")
 def cmd_source_admin():
   AGPL.source(OUT)