Index: /server/common/oursrc/accountadm/Makefile.in
===================================================================
--- /server/common/oursrc/accountadm/Makefile.in	(revision 764)
+++ /server/common/oursrc/accountadm/Makefile.in	(revision 765)
@@ -20,4 +20,7 @@
 	install -p -m755 -D signup-scripts-frontend $(DESTDIR)$(sbindir)/signup-scripts-frontend
 	install -p -m755 -D signup-scripts-backend $(DESTDIR)$(sbindir)/signup-scripts-backend
+	install -p -m755 -D cronload $(DESTDIR)$(bindir)/cronload
+	install -p -m755 -D vhostadd $(DESTDIR)$(sbindir)/vhostadd
+	install -p -m755 -D vhostedit $(DESTDIR)$(sbindir)/vhostedit
 
 clean:
Index: /server/common/oursrc/accountadm/cronload
===================================================================
--- /server/common/oursrc/accountadm/cronload	(revision 765)
+++ /server/common/oursrc/accountadm/cronload	(revision 765)
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+if [ -n "$2" ]; then
+  cd "$2"
+fi
+
+/bin/cat "$1" | /usr/bin/crontab -
+
+echo "New crontab for $USER:"
+echo ""
+/usr/bin/crontab -l
Index: /server/common/oursrc/accountadm/vhostadd
===================================================================
--- /server/common/oursrc/accountadm/vhostadd	(revision 765)
+++ /server/common/oursrc/accountadm/vhostadd	(revision 765)
@@ -0,0 +1,54 @@
+#!/bin/bash
+set -e
+
+printf "Host name: " >&2
+if [ "$1" ]; then
+    host="$1"; shift
+    echo "$host"
+else
+    read host
+fi
+
+if ! grep -Fq "." <<< "$host"; then host=$host.mit.edu; fi
+
+printf "User: " >&2
+if [ "$1" ]; then
+    user="$1"; shift
+    echo "$user"
+else
+    read user
+fi
+
+pw=$(getent passwd "$user")
+if [ $? -ne 0 ]; then
+    echo "User not found." >&2
+    exit $?
+fi
+IFS=: read user x uid gid x home x <<< "$pw"
+
+printf "Docroot: $home/web_scripts" >&2
+read subdir
+
+tmpfile=$(mktemp -t vhostadd.XXXXXX) || exit $?
+trap 'rm -f "$tmpfile"' EXIT
+
+cat <<EOF > "$tmpfile"
+dn: apacheServerName=$host,ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+objectClass: apacheConfig
+objectClass: top
+apacheServerName: $host
+EOF
+
+if [ "${host%mit.edu}" != "$host" ]; then
+    cat <<EOF >> "$tmpfile"
+apacheServerAlias: ${host%.mit.edu}
+EOF
+fi
+
+cat <<EOF >> "$tmpfile"
+apacheDocumentRoot: $home/web_scripts$subdir
+apacheSuexecUid: $uid
+apacheSuexecGid: $gid
+EOF
+
+exec ldapvi --add --in "$tmpfile"
Index: /server/common/oursrc/accountadm/vhostedit
===================================================================
--- /server/common/oursrc/accountadm/vhostedit	(revision 765)
+++ /server/common/oursrc/accountadm/vhostedit	(revision 765)
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+if [ ! "$1" ]; then
+    echo "Usage: $0 <vhost>"
+    exit 2
+fi
+
+exec ldapvi "(&(objectClass=apacheConfig)(|(apacheServerName=$1)(apacheServerAlias=$1)))"
Index: /server/fedora/specs/accountadm.spec
===================================================================
--- /server/fedora/specs/accountadm.spec	(revision 764)
+++ /server/fedora/specs/accountadm.spec	(revision 765)
@@ -20,4 +20,6 @@
  - setuid C program used to start a signup request <signup-scripts-frontend>
  - Perl script that handles signup requests <signup-scripts-backend>
+ - vhostadd,vhostedit: admin tools for adding and editing virtualhosts
+ - cronload: userspace tool for setting crontab from Athena
 See http://scripts.mit.edu/wiki for more information.
 
@@ -42,6 +44,9 @@
 /usr/local/bin/mbash
 /usr/local/bin/admof
+/usr/local/bin/cronload
 /usr/local/sbin/ssh-admof
 /usr/local/sbin/signup-scripts-backend
+/usr/local/sbin/vhostadd
+/usr/local/sbin/vhostedit
 %defattr(4755, signup, signup)
 /usr/local/sbin/signup-scripts-frontend
