Index: branches/fc17-dev/locker/sbin/delete-user
===================================================================
--- branches/fc17-dev/locker/sbin/delete-user	(revision 2195)
+++ branches/fc17-dev/locker/sbin/delete-user	(revision 2195)
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+import ldap
+import ldap.filter
+import pwd
+import sys
+
+actuallyRun = False
+
+def delete_record(l, full_name):
+    if actuallyRun:
+        print "Deleting %s..." % (full_name,)
+        l.delete_s(full_name)
+    else:
+        print "Would have deleted %s" % (full_name,)
+
+def findUser(l, username):
+    # Try to delete the 
+    user_record, = ll.search_s(
+        "ou=People,dc=scripts,dc=mit,dc=edu",
+        ldap.SCOPE_SUBTREE,
+        ldap.filter.filter_format(
+            "(&(objectClass=posixAccount)" +
+            "(uid=%s))",
+            [username]))
+
+    return user_record
+
+def findGroup(l, username):
+    group_record, = ll.search_s(
+        "ou=Groups,dc=scripts,dc=mit,dc=edu",
+        ldap.SCOPE_SUBTREE,
+        ldap.filter.filter_format(
+            "(&(objectClass=posixGroup)" +
+            "(cn=%s))",
+            [username]))
+
+    return group_record
+
+def findApacheConfig(l, uid):
+    host_records = ll.search_s(
+        "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu",
+        ldap.SCOPE_SUBTREE,
+        ldap.filter.filter_format(
+            "(&(objectClass=apacheConfig)" +
+            "(apacheSuexecUid=%s))",
+            [uid]))
+
+    return host_records
+
+def findVhost(l, full_name):
+    host_records = ll.search_s(
+        "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu",
+        ldap.SCOPE_SUBTREE,
+        ldap.filter.filter_format(
+            "(&(objectClass=scriptsVhost)" +
+            "(scriptsVhostAccount=%s))",
+            [full_name]))
+
+    return host_records
+
+if __name__ == '__main__':
+    (self, user) = sys.argv
+
+    print "Binding to ldap..."
+
+    ll = ldap.initialize("ldapi://%2fvar%2frun%2fslapd-scripts.socket/")
+    ll.simple_bind_s("cn=Directory Manager", open('/etc/signup-ldap-pw').read())
+
+    print "Finding user '%s'..." % (user,)
+    user_record = findUser(ll, user)
+
+    print "Finding group '%s'..." % (user,)
+    group_record = findGroup(ll, user)
+
+    print "Searching for apache configurations..."
+    apache_configs = findApacheConfig(ll, user_record[1]['uidNumber'][0])
+
+    print "Searching for vhost configurations..."
+    vhost_configs = findVhost(ll, user_record[0])
+
+    print "Deleting..."
+    delete_record(ll, user_record[0])
+    delete_record(ll, group_record[0])
+
+    for config in apache_configs:
+        delete_record(ll, config[0])
+
+    for vhost in vhost_configs:
+        delete_record(ll, vhost[0])
Index: branches/fc17-dev/locker/sbin/scripts-createrepo
===================================================================
--- branches/fc17-dev/locker/sbin/scripts-createrepo	(revision 2195)
+++ branches/fc17-dev/locker/sbin/scripts-createrepo	(revision 2195)
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# Runs createrepo on the primary scripts server and copies the resulting
+# metadata to the live yum repository.
+
+set -eux
+
+ssh='ssh -o GSSAPIAuthentication=yes -o GSSAPIDelegateCredentials=no'
+
+yum=/afs/athena.mit.edu/contrib/scripts/yum-repos/rpm-fc$($ssh root@scripts.mit.edu 'lsb_release -rs')
+[ -d "$yum" ]
+
+tmp=$($ssh root@scripts.mit.edu "\
+set -eux
+tmp=\$(mktemp -dt createrepo.XXXXXX)
+createrepo -d -o \"\$tmp\" -- '$yum' >&2
+printf '%s' \"\$tmp\"
+")
+[ "$tmp" ]
+
+new=$(mktemp -d -- "$yum/repodata.XXXXXX")
+rsync -avz -e "$ssh" -- "root@scripts.mit.edu:$tmp/repodata/" "$new"
+mv -b -T -- "$new" "$yum/repodata"
+rm -rf -- "$yum/repodata~"
+
+$ssh root@scripts.mit.edu "\
+set -eux
+rm -rf -- '$tmp'
+"
