Index: branches/fc15-dev/COPYRIGHT
===================================================================
--- branches/fc15-dev/COPYRIGHT	(revision 1803)
+++ branches/fc15-dev/COPYRIGHT	(revision 1803)
@@ -0,0 +1,358 @@
+scripts.mit.edu repository
+Copyright (C) 2006  Jeff Arnold and Joe Presbrey,
+                    unless noted otherwise
+
+These programs are free software; you can redistribute them and/or
+modify them under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+These programs are distributed in the hope that they will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
Index: branches/fc15-dev/README
===================================================================
--- branches/fc15-dev/README	(revision 1803)
+++ branches/fc15-dev/README	(revision 1803)
@@ -0,0 +1,11 @@
+locker:
+  files associated with the scripts Athena locker
+
+noc:
+  configuration for a scripts monitoring NOC
+
+selinux:
+  selinux strict policy modules for a scripts.mit.edu server
+
+server:
+  files needed to run a scripts.mit.edu server
Index: branches/fc15-dev/locker/bin/cronload
===================================================================
--- branches/fc15-dev/locker/bin/cronload	(revision 1803)
+++ branches/fc15-dev/locker/bin/cronload	(revision 1803)
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+echo "This program should print your new crontab below."
+echo "If it does not do so, something is wrong."
+echo "Feel free to contact scripts@mit.edu for assistance."
+echo
+
+cwd=`pwd`
+lname=`perl -e "\\\$temp = \"$cwd\"; \\\$temp =~ /\\\/([^\\\/]+)\\\/cron_scripts/; print \\\$1"`
+athrun scripts scripts-ssh "$lname" /usr/local/bin/cronload "$1" "$cwd" 2>/dev/null
Index: branches/fc15-dev/locker/bin/crontab
===================================================================
--- branches/fc15-dev/locker/bin/crontab	(revision 1803)
+++ branches/fc15-dev/locker/bin/crontab	(revision 1803)
@@ -0,0 +1,35 @@
+# scripts.mit.edu sample crontab as of SCRIPTS_DATE
+# To load this crontab, run "cronload crontab" in your cron_scripts directory
+# (On athena, you must run "add scripts" before cronload)
+
+# This line sets a reasonable default path
+PATH=/mit/SCRIPTS_USER/cron_scripts:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
+
+# This line mails the STDOUT and STDERR of every cron script to a person
+# (can be useful for debugging)
+# You can always redirect the output of individual commands to /dev/null
+MAILTO="SCRIPTS_USER@mit.edu"
+# If you do not want to receive any mail from cron, use the line below instead
+#MAILTO=""
+
+# Add your cron lines here:
+
+
+# Here's a reminder of the cron line format:
+
+#  * * * * * command to be executed
+#  - - - - -
+#  | | | | |
+#  | | | | ----- day of week (0 - 6) (Sunday=0)
+#  | |  | ------- month (1 - 12)
+#  | | --------- day of month (1 - 31)
+#  | ----------- hour (0 - 23)
+#  ------------- min (0 - 59)
+
+# For example, the following cron line would write "Work harder!" to STDOUT
+# every 20 minutes from 8am - 5pm on weekdays
+# (and this message would thus be e-mailed to the address above on each run) 
+
+# 0,20,40 8-17 * * 1-5 echo "Work harder!"
+
+# See http://en.wikipedia.org/wiki/Cron (or google for crontab) for more info
Index: branches/fc15-dev/locker/bin/disable-scripts-test
===================================================================
--- branches/fc15-dev/locker/bin/disable-scripts-test	(revision 1803)
+++ branches/fc15-dev/locker/bin/disable-scripts-test	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo Removing iptables rules.
+iptables -t nat -D OUTPUT -d 18.181.0.46 -j DNAT --to-destination 18.181.0.229
+iptables -t nat -D OUTPUT -d 18.181.0.43 -j DNAT --to-destination 18.181.0.229
+iptables -t nat -D OUTPUT -d 18.181.0.50 -j DNAT --to-destination 18.181.0.229
Index: branches/fc15-dev/locker/bin/enable-scripts-test
===================================================================
--- branches/fc15-dev/locker/bin/enable-scripts-test	(revision 1803)
+++ branches/fc15-dev/locker/bin/enable-scripts-test	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo Adding iptables rules.
+iptables -t nat -A OUTPUT -d 18.181.0.46 -j DNAT --to-destination 18.181.0.229
+iptables -t nat -A OUTPUT -d 18.181.0.43 -j DNAT --to-destination 18.181.0.229
+iptables -t nat -A OUTPUT -d 18.181.0.50 -j DNAT --to-destination 18.181.0.229
Index: branches/fc15-dev/locker/bin/firefox-test
===================================================================
--- branches/fc15-dev/locker/bin/firefox-test	(revision 1803)
+++ branches/fc15-dev/locker/bin/firefox-test	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+attach -q scripts
+LD_PRELOAD=/mit/scripts/scripts-test/@sys/scripts-test-preload.so
+export LD_PRELOAD
+exec firefox
Index: branches/fc15-dev/locker/bin/fix-php-ini
===================================================================
--- branches/fc15-dev/locker/bin/fix-php-ini	(revision 1803)
+++ branches/fc15-dev/locker/bin/fix-php-ini	(revision 1803)
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# This script is meant to help people who have somehow lost their
+# php.ini files.  It is meant to be run in the top level directory
+# of an application once a reasonable php.ini file has been placed
+# there, and will make the symlinks to it in all child directories.
+
+if [ -f php.ini ]; then
+	echo "Creating php.ini symlinks in child directories..."
+	athrun scripts gfind . -mindepth 1 -type d \( -not -name .svn -not -name .git -or -not -prune \) -exec sh -c 'ln -sf "`echo "$1" | sed '\''s,[^/],,g; s,/,../,g'\''`php.ini" "$1/"' -- {} \;
+	echo "Done!"
+else
+	echo "There is no php.ini file in this directory.  You should first"
+	echo "put a valid php.ini file in the top level directory of your"
+	echo "application, then change to that directory, and then run this"
+	echo "script to make the symlinks to your php.ini file from all the"
+	echo "child directories."
+	exit 1
+fi
+
Index: branches/fc15-dev/locker/bin/fix-php-ini-scripts
===================================================================
--- branches/fc15-dev/locker/bin/fix-php-ini-scripts	(revision 1803)
+++ branches/fc15-dev/locker/bin/fix-php-ini-scripts	(revision 1803)
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# This script is meant to help people who have somehow lost their
+# php.ini files.  It is meant to be run in the top level directory
+# of an application once a reasonable php.ini file has been placed
+# there, and will make the symlinks to it in all child directories.
+
+if [ -f php.ini ]; then
+	echo "Creating php.ini symlinks in child directories..."
+	find . -mindepth 1 -type d -exec sh -c 'ln -sf "`echo "$1" | sed '\''s,[^/],,g; s,/,../,g'\''`php.ini" "$1/"' -- {} \;
+	echo "Done!"
+else
+	echo "There is no php.ini file in this directory.  You should first"
+	echo "put a valid php.ini file in the top level directory of your"
+	echo "application, then change to that directory, and then run this"
+	echo "script to make the symlinks to your php.ini file from all the"
+	echo "child directories."
+	exit 1
+fi
+
Index: branches/fc15-dev/locker/bin/for-each-server
===================================================================
--- branches/fc15-dev/locker/bin/for-each-server	(revision 1803)
+++ branches/fc15-dev/locker/bin/for-each-server	(revision 1803)
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+case `machtype` in
+    linux|darwin)
+        TAIL_ARG="-n"
+	;;
+    *)
+        TAIL_ARG=""
+	;;
+esac
+
+for server in `finger @scripts.mit.edu | tail ${TAIL_ARG} +5 | sed -n "s/  -> \([^:]*\):.*/\1/p" | sort -u`; do
+    ssh "$server" "$@"
+done
Index: branches/fc15-dev/locker/bin/fssar
===================================================================
--- branches/fc15-dev/locker/bin/fssar	(revision 1803)
+++ branches/fc15-dev/locker/bin/fssar	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec athrun consult fsr sa . "$@"
Index: branches/fc15-dev/locker/bin/gfind
===================================================================
--- branches/fc15-dev/locker/bin/gfind	(revision 1803)
+++ branches/fc15-dev/locker/bin/gfind	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+if find / -maxdepth 0 >/dev/null >&2; then
+	exec find "$@"
+else
+	exec athrun gnu gfind "$@"
+fi
Index: branches/fc15-dev/locker/bin/gtar
===================================================================
--- branches/fc15-dev/locker/bin/gtar	(revision 1803)
+++ branches/fc15-dev/locker/bin/gtar	(revision 1803)
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+gnu=`tar --version 2>/dev/null | grep -i gnu`
+if [ "$gnu" != "" ]; then
+	exec tar "$@"
+else
+	exec athrun gnu gtar "$@"
+fi
Index: branches/fc15-dev/locker/bin/procmailrc
===================================================================
--- branches/fc15-dev/locker/bin/procmailrc	(revision 1803)
+++ branches/fc15-dev/locker/bin/procmailrc	(revision 1803)
@@ -0,0 +1,3 @@
+:0
+*
+! SCRIPTS_USER@mit.edu
Index: branches/fc15-dev/locker/bin/scripts
===================================================================
--- branches/fc15-dev/locker/bin/scripts	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts	(revision 1803)
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+choices () {
+    echo 'scripts-start Begin a Quick-Start autoinstall (wikis, blogs, etc.)'
+    echo 'signup-web Enable the web scripts service'
+    echo 'signup-cron Enable the cron scripts service'
+    echo 'signup-mail Enable the mail scripts service'
+    echo 'signup-sql Sign up for a sql.mit.edu account'
+}
+
+nchoices=`choices | wc -l`
+
+echo
+echo "Welcome to scripts.mit.edu. Which service would you like to use?"
+echo
+choices | sed 's/^[^ ]* //' | cat -n
+echo
+printf "Please enter a number 1-%d: " "$nchoices"
+read num
+echo
+
+attach scripts 2>/dev/null
+choice=`choices | sed -n "$num { s/ .*$//; p; }"`
+if [ -n "$choice" ]; then
+  . "/mit/scripts/bin$scriptsdev/$choice"
+else
+  echo "ERROR:"
+  echo "You must enter a number 1 through $nchoices."
+  exit 1
+fi
Index: branches/fc15-dev/locker/bin/scripts-advancedbook
===================================================================
--- branches/fc15-dev/locker/bin/scripts-advancedbook	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-advancedbook	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="Advanced Guestbook"
+deploy="advancedbook"
+prompt_username=1
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-advancedpoll
===================================================================
--- branches/fc15-dev/locker/bin/scripts-advancedpoll	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-advancedpoll	(revision 1803)
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# This automatic installer is no longer advertised.
+# Here is our old description of it:
+# * "Advanced Poll":http://proxy2.de/scripts.php ~["demo":http://proxy2.de/poll/]~ - polling software featuring multiple polls, templates, unlimited options, multi-language support, IP-Logging, IP-Locking, cookie support, comment feature, vote expire feature, and random poll support.
+
+sname="Advanced Poll"
+deploy="advancedpoll"
+prompt_username=1
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-django
===================================================================
--- branches/fc15-dev/locker/bin/scripts-django	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-django	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+sname="Django"
+deploy="django"
+prompt_username=1
+create_scripts_dir=1
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-e107
===================================================================
--- branches/fc15-dev/locker/bin/scripts-e107	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-e107	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="e107"
+deploy="e107"
+prompt_username=1
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-gallery2
===================================================================
--- branches/fc15-dev/locker/bin/scripts-gallery2	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-gallery2	(revision 1803)
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+sname="Gallery2"
+deploy="gallery2"
+prompt_username=1
+create_dir=1
+
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-joomla
===================================================================
--- branches/fc15-dev/locker/bin/scripts-joomla	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-joomla	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+sname="Joomla"
+deploy="joomla"
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-mediawiki
===================================================================
--- branches/fc15-dev/locker/bin/scripts-mediawiki	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-mediawiki	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+sname="MediaWiki"
+deploy="mediawiki$scriptsstar"
+prompt_username=1
+wizard="mediawiki"
+. /mit/scripts/deploy$scriptsdev/bin/onathena$scriptsstar
Index: branches/fc15-dev/locker/bin/scripts-phpbb
===================================================================
--- branches/fc15-dev/locker/bin/scripts-phpbb	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-phpbb	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+sname="phpBB"
+deploy="phpbb"
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-phpical
===================================================================
--- branches/fc15-dev/locker/bin/scripts-phpical	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-phpical	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="PHP iCalendar"
+deploy="phpical"
+requires_sql=0
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-rails
===================================================================
--- branches/fc15-dev/locker/bin/scripts-rails	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-rails	(revision 1803)
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+sname="Ruby on Rails"
+deploy="rails"
+prompt_password=0
+# The following is sort of a lie.  Rails wants three databases (dev/test/prod),
+# so the rails script will handle it manually.
+requires_sql=0
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-remove
===================================================================
--- branches/fc15-dev/locker/bin/scripts-remove	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-remove	(revision 1803)
@@ -0,0 +1,162 @@
+#!/bin/bash
+
+if [ "$scriptsdev" != "" -a "$scriptsdev" != "dev" ]; then 
+    echo "ERROR:"
+    echo "The \$scriptsdev variable is set to an invalid value."
+    echo "(The variable should not be set.)"
+    echo "Please contact scripts@mit.edu."
+fi
+
+sshrun() {
+    athrun scripts scripts-ssh "$lname" "/mit/scripts/$@" 2>/dev/null
+}
+
+checksqlpass() {
+    errors=`sshrun "sql/bin$scriptsdev/test-password"`
+    if [ "$errors" != "" ]; then
+        if [ "$1" -eq 1 ]; then
+          rm -f "$lroot/.sql/my.cnf"
+        fi
+        echo
+        echo "ERROR:"
+        printf "$2"
+        exit 1
+    fi
+}
+attach scripts sql 2>/dev/null
+
+echo "Welcome to the scripts.mit.edu uninstaller. This program will"
+echo "help you cleanly remove software that you have auto-installed."
+echo
+echo "Are you removing an installation from:"
+echo "1. Your personal Athena account"
+echo "2. A locker that you control (a club, a course, etc.)"
+echo "If you do not understand this question, you should answer 1."
+printf "Please enter either 1 or 2: "
+read whofor
+if [ "$whofor" = 1 ]; then
+    lname=$USER
+    lroot=$HOME
+elif [ "$whofor" = 2 ]; then
+    echo
+    echo "Please enter the name of the selected locker below."
+    echo "(For the locker /mit/sipb, you would enter sipb.)"
+    read lname
+    lroot="/mit/$lname"
+else
+    echo
+    echo "ERROR:"
+    echo "You must select either 1 or 2."
+    exit 1
+fi
+attach "$lname" 2>/dev/null
+
+echo 
+echo "When you installed the software, you chose a URL"
+echo "that starts with http://$lname.scripts.mit.edu/"
+echo "(for software installed after March 2009) or"
+echo "http://scripts.mit.edu/~$lname/ (for software"
+echo "installed before then)."
+echo "Please enter the new-style full URL where this"
+echo "software was installed.  (This should correspond"
+echo "to a directory in /mit/$lname/web_scripts/.)"
+printf "%s" "URL: http://$lname.scripts.mit.edu/"
+read addrend
+
+addrend=`perl -0e 'print $ARGV[0] =~ /^([\w\/-]*[\w-])\/*$/' -- "$addrend"`
+if [ "$addrend" = "" ]; then
+    echo
+    echo "ERROR:"
+    echo "You must enter one or more characters after mit.edu/"
+    echo "The completed address must only contain a-z, 0-9, and /."
+    exit 1
+fi
+
+if [ ! -d "$lroot/web_scripts/$addrend" ]; then
+    echo
+    echo "ERROR:"
+    echo "The directory $lroot/web_scripts/$addrend"
+    echo "does not exist. Please make sure that this is the"
+    echo "correct installation directory, and try again, or"
+    echo "contact scripts@mit.edu for assistance."
+    exit 1
+fi
+
+echo
+
+sqlinfo=`sshrun "sql/bin$scriptsdev/get-password"`
+if [ "$sqlinfo" = "" ]; then
+    echo 
+    echo "You have a MySQL account but you do not have a .my.cnf file."
+    echo "If you do not remember your MySQL account password, you can change it"
+    echo "at http://sql.mit.edu using MIT certificates."
+    printf "Please type your MySQL password and press [enter]: "
+    stty -echo
+    read sqlpass
+    stty echo
+    echo
+    sqlhost="sql.mit.edu"
+    sqluser=$lname
+    . "/mit/scripts/sql/bin$scriptsdev/save-password"
+    checksqlpass 1 'The MySQL password that you typed appears to be incorrect.\n'
+    echo
+    echo "OK.  Continuing with the uninstaller..."
+else
+    checksqlpass 0 'The MySQL login information in your .my.cnf file\nappears to be incorrect.\n'
+fi
+
+sqldb=`sshrun "sql/bin$scriptsdev/get-next-database" "$addrend"`
+if [ "$sqldb" != "${addrend}1" -a "$sqldb" != "$addrend" ]; then
+    echo
+    echo "ERROR:"
+    echo "The auto-uninstaller was unable to find the appropriate"
+    echo "database to drop. Please examine the installation to"
+    echo "find the database it uses, drop the database from"
+    echo "http://sql.mit.edu/, and manually remove the $addrend"
+    echo "directory (or re-run the auto-installer). Contact"
+    echo "scripts@mit.edu if you need assistance."
+    exit 1
+fi
+
+echo "Removing files. Please wait..."
+echo "(This may take several seconds for large software.)"
+if rm -rf "$lroot/web_scripts/$addrend"; then
+    echo "The directory $lroot/web_scripts/$addrend"
+    echo "was successfully removed."
+    if [ -d "$lroot/OldFiles/web_scripts/$addrend" ]; then
+        echo "A one-day-old backup of the installation is"
+        echo "available from $lroot/OldFiles/web_scripts/$addrend".
+    fi
+else
+    echo "ERROR:"
+    echo "The directory $lroot/web_scripts/$addrend"
+    echo "could not be removed. Please ensure that you have"
+    echo "access to this directory and try again, or"
+    echo "contact scripts@mit.edu for assistance."
+    exit 1
+fi
+
+echo 
+if [ "$sqldb" = "${addrend}1" ]; then
+    sqldb="$lname+$addrend"
+    dropped=`sshrun "sql/bin$scriptsdev/drop-database" "$sqldb"`
+    if [ "$dropped" ]; then
+        echo "The database $sqldb"
+        echo "was successfully removed."
+        attach sql 2>/dev/null
+	if [ -f "/mit/sql/backup/$lname/$sqldb.sql.gz" ]; then
+            echo "A one-day-old backup of your SQL database is"
+            echo "available in /mit/sql/backup/$lname".
+        fi
+    else
+        echo "ERROR:"
+        echo "The database $lname+$addrend"
+        echo "could not be automatically removed. You can"
+        echo "try removing it from http://sql.mit.edu/,"
+        echo "or you can contact sql@mit.edu for assistance."
+        exit 1
+    fi
+fi
+echo
+echo "The installation in http://$lname.scripts.mit.edu/$addrend"
+echo "has been successfully uninstalled."
Index: branches/fc15-dev/locker/bin/scripts-ssh
===================================================================
--- branches/fc15-dev/locker/bin/scripts-ssh	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-ssh	(revision 1803)
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+lname=$1
+shift
+
+exec ssh \
+	-o GSSAPIAuthentication=yes \
+	-o GSSAPIDelegateCredentials=no \
+	-o PreferredAuthentications=gssapi-with-mic \
+	-o ForwardX11=no \
+	-o GlobalKnownHostsFile=/afs/athena.mit.edu/contrib/scripts/ssh/known_hosts \
+	-o UserKnownHostsFile=/dev/null \
+	-t \
+	scripts.mit.edu -l "$lname" "$(printf "''%q " "$@")"
+
+# ssh gets quoting wrong, so we do it ourself with printf "%q ".
+# Except bash 2 gets printf "%q " wrong for empty arguments, so we use
+# printf "''%q " instead.
+# Isn't software fun?
Index: branches/fc15-dev/locker/bin/scripts-start
===================================================================
--- branches/fc15-dev/locker/bin/scripts-start	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-start	(revision 1803)
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+choices () {
+    echo 'mediawiki MediaWiki'
+    echo 'wordpress WordPress'
+    echo 'gallery2 Gallery2'
+    echo 'phpbb phpBB'
+    echo 'phpical PHP iCalendar'
+    echo 'trac Trac'
+    echo 'joomla Joomla'
+    echo 'turbogears TurboGears'
+    echo 'django Django'
+    echo 'rails Ruby on Rails'
+}
+
+nchoices=`choices | wc -l`
+
+echo
+echo "What piece of software would you like to install?"
+echo
+choices | sed 's/^[^ ]* //' | cat -n
+echo
+printf "Please enter a number 1-%d: " "$nchoices"
+read num
+echo
+
+attach scripts 2>/dev/null
+choice=`choices | sed -n "$num { s/ .*$//; p; }"`
+if [ -n "$choice" ]; then
+  . "/mit/scripts/bin$scriptsdev/scripts-$choice"
+else
+  echo "ERROR:"
+  echo "You must enter a number 1 through $nchoices."
+  exit 1
+fi
Index: branches/fc15-dev/locker/bin/scripts-trac
===================================================================
--- branches/fc15-dev/locker/bin/scripts-trac	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-trac	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="Trac"
+deploy="trac"
+prompt_password=0
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-turbogears
===================================================================
--- branches/fc15-dev/locker/bin/scripts-turbogears	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-turbogears	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+sname="TurboGears"
+deploy="turbogears"
+prompt_password=0
+create_scripts_dir=1
+. /mit/scripts/deploy$scriptsdev/bin/onathena
Index: branches/fc15-dev/locker/bin/scripts-wordpress
===================================================================
--- branches/fc15-dev/locker/bin/scripts-wordpress	(revision 1803)
+++ branches/fc15-dev/locker/bin/scripts-wordpress	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+sname="WordPress"
+deploy="wordpress$scriptsstar"
+prompt_password=0
+wizard="wordpress"
+. /mit/scripts/deploy$scriptsdev/bin/onathena$scriptsstar
Index: branches/fc15-dev/locker/bin/signup
===================================================================
--- branches/fc15-dev/locker/bin/signup	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup	(revision 1803)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ "$1" = "web" ]; then
+    athrun scripts signup-web
+elif [ "$1" = "cron" ]; then
+    athrun scripts signup-cron
+elif [ "$1" = "mail" ]; then
+    athrun scripts signup-mail
+elif [ "$1" = "sql" ]; then
+    athrun scripts signup-sql
+else
+    echo "Scripts has multiple services you can sign up for:"
+    echo "    signup-web    Web script hosting"
+    echo "    signup-cron   Scheduled jobs"
+    echo "    signup-mail   Mail scripts"
+    echo "    signup-sql    MySQL hosting"
+    exit 1
+fi
Index: branches/fc15-dev/locker/bin/signup-cron
===================================================================
--- branches/fc15-dev/locker/bin/signup-cron	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup-cron	(revision 1803)
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+attach -q scripts
+. /mit/scripts/bin$scriptsdev/signup-minimal
+
+if [ ! -d "/mit/$lname/cron_scripts/" ]; then
+  mkdir -p /mit/$lname/cron_scripts
+  fs sa /mit/$lname/cron_scripts system:anyuser l
+  fs sa /mit/$lname/cron_scripts system:authuser none
+  fs sa /mit/$lname/cron_scripts daemon.scripts write
+  DATE=`date`
+  sed '/SCRIPTS_USER/s//'"$lname"'/g' /mit/scripts/deploy/crontab | sed '/SCRIPTS_DATE/s//'"$DATE"'/g' > /mit/$lname/cron_scripts/crontab
+  success "the cron script service" "The directory /mit/$lname/cron_scripts has been created."
+else
+  success "the cron script service" "The directory /mit/$lname/cron_scripts already exists." 
+fi
Index: branches/fc15-dev/locker/bin/signup-mail
===================================================================
--- branches/fc15-dev/locker/bin/signup-mail	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup-mail	(revision 1803)
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+attach -q scripts
+. /mit/scripts/bin$scriptsdev/signup-minimal
+
+if [ ! -d "/mit/$lname/mail_scripts/" ]; then
+  mkdir -p /mit/$lname/mail_scripts
+  fs sa /mit/$lname/mail_scripts system:anyuser l
+  fs sa /mit/$lname/mail_scripts system:authuser none
+  fs sa /mit/$lname/mail_scripts daemon.scripts read
+  signupuser=`echo "$principal" | sed 's/@.*$//'`
+  sed /SCRIPTS_USER/s//$signupuser/ /mit/scripts/bin/procmailrc > /mit/$lname/mail_scripts/procmailrc
+  echo "By default, mail sent to $lname@scripts.mit.edu will be forwarded to"
+  echo "$signupuser@mit.edu.  You should edit /mit/$lname/mail_scripts/procmailrc"
+  echo "to change this and customize your procmail configuration."
+  success "the mail script service" "The directory /mit/$lname/mail_scripts has been created."
+else
+  success "the mail script service" "The directory /mit/$lname/mail_scripts already exists."
+fi
Index: branches/fc15-dev/locker/bin/signup-minimal
===================================================================
--- branches/fc15-dev/locker/bin/signup-minimal	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup-minimal	(revision 1803)
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+if [ "$initlname" = "" ]; then
+  if [ "$lname" = "" ]; then
+    initlname=0
+  else
+    initlname=1
+  fi
+fi
+
+if type wget >/dev/null 2>/dev/null; then
+  WGET=wget
+else
+  WGET="athrun gnu wget"
+fi
+
+if [ "$lname" = "" ]; then
+  if [ "$1" = "" ]; then
+    echo
+    echo "Would you like to sign up:"
+    echo "1. Your personal Athena account"
+    echo "2. A locker that you control (a club, a course, etc)"
+    echo "If you do not understand this question, you should answer '1'."
+    printf "Please enter either '1' or '2' (without quotes): "
+    read whofor
+    if [ "$whofor" = 1 ]; then
+        lname="${ATHENA_USER:-$USER}"
+    elif [ "$whofor" = 2 ]; then
+        echo
+        echo "OK.  A locker of your choice that you control will be signed up."
+        echo "Please enter the name of the selected locker below."
+        echo "(For the locker /mit/sipb, you would enter sipb)."
+        printf "Locker name: "
+        read lname
+    else
+        echo
+        echo "ERROR:"
+        echo "You must select either '1' or '2'."
+        exit 1
+    fi
+    while true; do
+        if attach "$lname"; then
+            break
+        fi
+        echo "$lname is not a valid locker name."
+        printf "Locker name: "
+        read lname
+    done
+  else
+    lname="$1"
+  fi
+fi
+lroot="/mit/$lname" 
+
+attach "$lname" 2>/dev/null
+
+ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/fsla.php/mit/$lname"`
+if [ "$ans" != "0" ]; then
+  echo
+  echo "ERROR:"
+  echo "The scripts servers cannot verify the permissions of the locker <$lname>."
+  echo "This is probably because your locker is not publicly listable."
+  echo "You can remedy this signup problem and make your locker publicly"
+  echo "listable by running \"fs setacl /mit/$lname system:anyuser l\""
+  echo "(that's a lowercase L at the end)."
+  echo ""
+  echo "NOTE: This will make it possible for the public (including anyone"
+  echo "viewing http://web.mit.edu/$lname) to see the names of your files"
+  echo "and the list of people who have access to them, though it will not"
+  echo "cause the contents of your files to be publicly readable.  If you"
+  echo "are unwilling to have your locker listable by the public, please"
+  echo "contact scripts@mit.edu for information about other ways to work"
+  echo "around the problem, or see http://scripts.mit.edu/faq/122 for more"
+  echo "detailed information."
+  exit 1
+fi
+
+principal=`klist -5 | sed -n 's/^Default principal: // p'`
+ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/admof.php/$lname/$principal"`
+if [ "$ans" != "yes" ]; then
+  afsuser=`echo "$principal" | sed 's/@ATHENA.MIT.EDU$//'`
+  echo
+  echo "ERROR:"
+  echo "It appears as though you are not an administrator of the locker <$lname>."
+  echo "Try running \"fs setacl /mit/$lname $afsuser all\" and starting over."
+  echo "Contact scripts@mit.edu if you are unable to solve the problem."
+  exit 1
+fi
+
+mkdir -p "/mit/$lname/.scripts-signup"
+
+if [ ! -d "/mit/$lname/.scripts-signup" ]; then
+  echo
+  echo "ERROR:"
+  echo "It appears as though you do not have write access to the locker <$lname>."
+  echo "Contact scripts@mit.edu if you are unable to solve the problem."
+  exit 1
+fi
+
+ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/$lname"`
+rmdir "/mit/$lname/.scripts-signup"
+
+if [ "$ans" = "done" ]; then
+  # nscd caches account nonexistence with a 5-second TTL.
+  # (LDAP updates are more or less instant.)
+  # Somehow, the server can wait up to 10 seconds...
+  echo "Creating scripts.mit.edu account for $lname..."
+  sleep 10
+fi
+
+if [ "$ans" != "done" ] && [ "$ans" != "username already taken" ]; then
+  echo "ERROR:"
+  echo "Signup reported the following error: \"$ans\"."
+  echo "Contact scripts@mit.edu for assistance."
+  exit 1
+fi
+
+success() {
+  if [ "$initlname" -eq 0 ]; then
+    echo
+    echo "== SUCCESS =="
+    echo "$lname is now signed up for $1."
+    echo "$2"
+    echo
+  fi
+}
Index: branches/fc15-dev/locker/bin/signup-sql
===================================================================
--- branches/fc15-dev/locker/bin/signup-sql	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup-sql	(revision 1803)
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+checkfailed() {
+  if [ -f "$lroot/web_scripts/$addrend/.failed" ]; then
+    rm -f $lroot/web_scripts/$addrend/.failed
+    exit 1
+  fi
+}
+
+sshrun() {
+  athrun scripts scripts-ssh "$lname" "/mit/scripts/$@" 2>/dev/null
+}
+
+vsshrun() {
+  athrun scripts scripts-ssh "$lname" "/mit/scripts/$@"
+}
+
+checksqlpass() {
+    errors=`sshrun "sql/bin$scriptsdev/test-password"`
+    if [ "$errors" != "" ]; then
+        if [ "$1" -eq 1 ]; then
+          rm -f $lroot/.sql/my.cnf
+        fi
+        echo
+        echo ERROR:
+        printf "$2"
+        printf "$3"
+        exit
+    fi
+}
+
+echo 
+echo == Welcome to the sql.mit.edu signup process ==
+echo
+
+echo "For documentation, including a link to the Athena rules of use,"
+echo "see <http://sql.mit.edu>."
+echo
+echo Please report problems with this signup process to sql@mit.edu.
+echo
+echo Are you performing this signup for:
+echo 1. Your personal Athena account
+echo 2. A locker that you control \(a club, a course, etc\)
+echo "If you do not understand this question, you should answer '1'".
+printf "Please enter either '1' or '2' (without quotes): "
+read whofor
+if [ "$whofor" -eq 1 ]; then
+    lname=$USER
+    lroot=$HOME 
+elif [ "$whofor" -eq 2 ]; then
+    echo
+    echo OK.  A MySQL account will be created for a locker of your choice that
+    echo you control.  Please enter the name of the selected locker below.
+    echo "(For the locker /mit/sipb, you would enter sipb)."
+    while true; do
+        printf "Locker name: "
+        read lname
+        if attach "$lname"; then
+            break
+        fi
+        echo "$lname is not a valid locker name."
+    done
+    lroot="/mit/$lname"
+else
+    echo
+    echo ERROR:
+    echo You must select either '1' or '2'.
+    exit 1
+fi
+
+# Users need to sign up for scripts.mit.edu so that they can
+# authenticate themselves to sql.mit.edu
+attach scripts
+. /mit/scripts/bin$scriptsdev/signup-web
+
+if [ "$requires_sql" = "" ]; then
+  requires_sql=1
+fi
+
+if [ ! -f "$lroot/.my.cnf" ]; then
+  mkdir -p $lroot/.sql
+  fs sa $lroot/.sql system:anyuser none
+  fs sa $lroot/.sql system:authuser none
+  fs sa $lroot/.sql daemon.scripts write
+  fs sa $lroot/.sql daemon.sql write
+  ln -nfs .sql/my.cnf $lroot/.my.cnf
+fi
+
+if [ "$requires_sql" -eq 1 ]; then
+  sqlinfo=`sshrun "sql/bin$scriptsdev/get-password"`
+  if [ "$sqlinfo" = "" ]; then
+      echo 
+      echo You already have a MySQL account but you do not have a .my.cnf file.
+      echo If you do not remember your MySQL account password, you can change it
+      echo at http://sql.mit.edu using MIT certificates. 
+      printf "Please type your MySQL password and press [enter]: "
+      stty -echo
+      read sqlpass
+      stty echo
+      echo
+      sqlhost="sql.mit.edu"
+      sqluser=$lname
+      . /mit/scripts/sql/bin$scriptsdev/save-password
+      checksqlpass 1 'The MySQL password that you typed appears to be incorrect.\n' ''
+      echo
+      echo OK.  Continuing with the install...
+  else
+      checksqlpass 0 'The MySQL login information in your .my.cnf file\n' 'appears to be incorrect.\n'
+  fi
+fi
+
+echo
+echo == Setup complete! ==
+echo Your MySQL login information has been written to the file
+echo "</mit/$lname/.sql/my.cnf>."
+echo You must use the sql.mit.edu web interface to add or drop databases.
+echo If you have trouble with your MySQL account, feel free to contact
+echo the sql.mit.edu team by e-mailing sql@mit.edu
+exit 0
Index: branches/fc15-dev/locker/bin/signup-web
===================================================================
--- branches/fc15-dev/locker/bin/signup-web	(revision 1803)
+++ branches/fc15-dev/locker/bin/signup-web	(revision 1803)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+attach -q scripts
+. "/mit/scripts/bin$scriptsdev/signup-minimal"
+
+if [ ! -d "/mit/$lname/web_scripts/" ]; then
+    mkdir -p "/mit/$lname/web_scripts"
+    fs sa "/mit/$lname/web_scripts" system:anyuser l
+    fs sa "/mit/$lname/web_scripts" system:authuser none
+    fs sa "/mit/$lname/web_scripts" system:scripts-security-upd rl
+    fs sa "/mit/$lname/web_scripts" daemon.scripts write
+    success "the web script service" "The directory /mit/$lname/web_scripts has been created."
+else 
+    success "the web script service" "The directory /mit/$lname/web_scripts already exists."
+fi
+if [ ! -f "/mit/$lname/web_scripts/.htaccess.mit" ]; then
+    ln -ns /afs/athena.mit.edu/contrib/scripts/www/web_scripts-.htaccess.mit /mit/$lname/web_scripts/.htaccess.mit
+fi
Index: branches/fc15-dev/locker/bin/ssh
===================================================================
--- branches/fc15-dev/locker/bin/ssh	(revision 1803)
+++ branches/fc15-dev/locker/bin/ssh	(revision 1803)
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# add -r scripts
+if [ -x /bin/athena/attach ]; then
+  eval $(/bin/athena/attach -Padd -b -r scripts)
+fi
+
+exec ssh \
+	-o GSSAPIAuthentication=yes \
+	-o GSSAPIDelegateCredentials=no \
+	-o PreferredAuthentications=gssapi-with-mic \
+	-o ForwardX11=no \
+	-o GlobalKnownHostsFile=/afs/athena.mit.edu/contrib/scripts/ssh/known_hosts \
+	-o UserKnownHostsFile=/dev/null \
+	"$@"
Index: branches/fc15-dev/locker/bin/sshmic
===================================================================
--- branches/fc15-dev/locker/bin/sshmic	(revision 1803)
+++ branches/fc15-dev/locker/bin/sshmic	(revision 1803)
@@ -0,0 +1,1 @@
+link ssh
Index: branches/fc15-dev/locker/bin/webaccess
===================================================================
--- branches/fc15-dev/locker/bin/webaccess	(revision 1803)
+++ branches/fc15-dev/locker/bin/webaccess	(revision 1803)
@@ -0,0 +1,223 @@
+#!/bin/bash
+
+# webaccess
+# Manage access control for scripts.mit.edu in .htaccess and .htpasswd files.
+# Anders Kaseorg <andersk@mit.edu>
+
+set -e
+
+on_exit=
+trap 'eval "$on_exit"' EXIT
+
+dir="$(pwd)"
+htaccess=$dir/.htaccess
+authuserfile=$dir/.htpasswd
+
+add_users=
+del_users=
+enable_auth=1
+def_authname=\"Private\"
+
+begin_section="### BEGIN webaccess directives"
+end_section="### END webaccess directives"
+
+usage () {
+    cat <<EOF >&2
+usage:
+  webaccess -a <user>   Allow access from <user> and set password.
+  webaccess -d <user>   Deny access from <user>.
+  webaccess -r          Reset default access control.
+EOF
+    exit 1
+}
+
+getpass () {
+    user=$1
+    (
+	echo -n "New password for $user: " >/dev/tty
+	trap 'stty echo; echo >/dev/tty' EXIT
+	stty -echo
+	perl -e 'chop($_ = <>); print crypt($_, "\$1\$" . join "", (".", "/", "0".."9", "A".."Z", "a".."z") [rand 64, rand 64, rand 64, rand 64, rand 64, rand 64, rand 64, rand 64])' </dev/tty
+    )
+}
+
+if [ $# -eq 0 ]; then usage; fi
+
+while [ $# -gt 0 ]; do
+    arg="$1"; shift
+    case "$arg" in
+	-a*)
+	    user="${arg#-a}"
+	    if [ -z "$user" ]; then user=$1; shift; fi
+	    if [ -z "$user" ]; then usage; fi
+	    add_users=$add_users\ $user
+	    ;;
+	allow)
+	    user="$1"; shift
+	    if [ -z "$user" ]; then usage; fi
+	    add_users=$add_users\ $user
+	    ;;
+	-d*)
+	    user="${arg#-d}"
+	    if [ -z "$user" ]; then user=$1; shift; fi
+	    if [ -z "$user" ]; then usage; fi
+	    del_users=$del_users\ $user
+	    ;;
+	remove)
+	    user="$1"; shift
+	    if [ -z "$user" ]; then usage; fi
+	    del_users=$del_users\ $user
+	    ;;
+	-r|reset)
+	    enable_auth=0
+	    ;;
+	-n*)
+	    authname="${arg#-n}"
+	    if [ -z "$authname" ]; then authname=\"$1\"; shift; fi
+	    if [ -z "$authname" ]; then usage; fi
+	    ;;
+	*)
+	    usage
+	    ;;
+    esac
+done
+
+tmp_htaccess=$htaccess.webaccess-new
+trap 'rm -f "$tmp_htaccess"' EXIT
+exec 3>"$tmp_htaccess"
+
+config_written=0
+write_config () {
+    if [ $config_written -eq 1 ]; then return 0; fi
+    config_written=1
+    if [ $enable_auth -eq 1 ]; then
+	echo "$begin_section" >&3
+	echo "# See http://scripts.mit.edu/faq/23" >&3
+	echo "AuthUserFile $authuserfile" >&3
+	echo "AuthName ${authname:-$def_authname}" >&3
+	echo "AuthType Basic" >&3
+	echo "Require valid-user" >&3
+	echo "$end_section" >&3
+    fi
+}
+
+if [ -e "$htaccess" ]; then
+    exec 4<"$htaccess"
+    
+    oldconfig_state=0
+    oldconfig_buffer=__END__
+    
+    while read -r line <&4; do
+	oldconfig_newstate=0
+	case "$line" in
+	    "AuthUserFile "*)     oldconfig_newstate=1 ;;
+	    "AuthName "*)         oldconfig_newstate=2; oldconfig_authname=${line#AuthName } ;;
+	    "AuthType Basic")     oldconfig_newstate=3 ;;
+	    "<Limit GET>")        oldconfig_newstate=4 ;;
+	    "require valid-user") oldconfig_newstate=5 ;;
+	    "</Limit>")           oldconfig_newstate=6 ;;
+	esac
+	
+	if [ $oldconfig_newstate -ne $(($oldconfig_state + 1)) ]; then
+	    if [ $oldconfig_state -ne 0 ]; then
+		echo "${oldconfig_buffer%
+__END__}" >&3
+		oldconfig_state=0
+		oldconfig_buffer=__END__
+	    fi
+	fi
+	
+	if [ "$line" = "$begin_section" ]; then
+	    while read -r line <&4 && [ "$line" != "$end_section" ]; do
+		case "$line" in
+		    "AuthName "*)
+			def_authname=${line#AuthName }
+			;;
+		esac
+	    done
+	    write_config
+	elif [ $oldconfig_newstate -eq $(($oldconfig_state + 1)) ]; then
+	    oldconfig_buffer=$(echo "${oldconfig_buffer%__END__}$line"; echo __END__)
+	    oldconfig_state=$oldconfig_newstate
+	    if [ $oldconfig_state -eq 6 ]; then
+		echo "Replacing obsolete webaccess configuration." >&2
+		oldconfig_state=0
+		oldconfig_buffer=__END__
+		def_authname=$oldconfig_authname
+	    fi
+	else
+	    echo "$line" >&3
+	fi
+    done
+    
+    if [ $oldconfig_state -ne 0 ]; then
+	echo "${oldconfig_buffer%
+__END__}"
+	oldconfig_state=0
+	oldconfig_buffer=__END__
+    fi
+    
+    exec 4<&-
+fi
+
+write_config
+
+exec 3>&-
+if ! cmp -s "$htaccess" "$tmp_htaccess"; then
+    if [ -s "$tmp_htaccess" ]; then
+	echo "Updating $htaccess" >&2
+	mv -f "$tmp_htaccess" "$htaccess"
+    else
+	if [ -e "$htaccess" ]; then
+	    echo "Deleting $htaccess" >&2
+	    rm -f "$htaccess"
+	fi
+	rm -f "$tmp_htaccess"
+    fi
+fi
+trap - EXIT
+
+if [ $enable_auth -eq 1 ]; then
+    if [ ! -e "$authuserfile" ]; then touch "$authuserfile"; fi
+    
+    tmp_authuserfile=$authuserfile.webaccess-new
+    trap 'rm -f "$tmp_authuserfile"' EXIT
+    exec 3>"$tmp_authuserfile"
+
+    exec 4<"$authuserfile"
+    while IFS=: read user pass <&4; do
+	for del_user in $del_users; do
+	    if [ "$del_user" = "$user" ]; then
+		echo "Deleting user $del_user:" >&2
+		pass=
+	    fi
+	done
+	new_add_users=
+	for add_user in $add_users; do
+	    if [ "$add_user" = "$user" ]; then
+		pass=$(getpass "$user")
+	    else
+		new_add_users=$new_add_users\ $add_user
+	    fi
+	done
+	add_users=$new_add_users
+	if [ -n "$pass" ]; then
+	    echo "$user:$pass" >&3
+	fi
+    done
+    exec 4<&-
+    
+    for add_user in $add_users; do
+	pass=$(getpass "$add_user")
+	echo "$add_user:$pass" >&3
+    done
+    
+    exec 3>&-
+    mv -f "$tmp_authuserfile" "$authuserfile"
+    trap - EXIT
+    
+    echo "Done.  New list of valid users:" >&2
+    sed -n 's/^\([^:]*\):.*$/  \1/ p' "$authuserfile"
+else
+    rm -f "$authuserfile"
+fi
Index: branches/fc15-dev/locker/cron/bin/cronload
===================================================================
--- branches/fc15-dev/locker/cron/bin/cronload	(revision 1803)
+++ branches/fc15-dev/locker/cron/bin/cronload	(revision 1803)
@@ -0,0 +1,135 @@
+#!/usr/bin/perl
+
+# Author: <quentin@mit.edu>
+
+use strict;
+use warnings;
+
+use File::Spec::Functions;
+use Getopt::Long;
+
+use constant {
+    CRON_DIR => "cron_scripts",
+    CRONTAB_FILE => "crontab",
+    AUTO_DIR => "AUTO",
+    SPOOL_DIR => "/mit/scripts/cron/crontabs",
+};
+
+my $force = 0;
+my $list = 0;
+my $pretend = 0;
+
+sub get_crontabs() {
+    my $crontab = catfile($ENV{"HOME"}, CRON_DIR, CRONTAB_FILE);
+    my $crontabdir = catdir($ENV{"HOME"}, CRON_DIR, AUTO_DIR);
+    
+    my @crontabs;
+    
+    opendir(CRONTABS, $crontabdir) or print "You don't have a ".CRON_DIR."/".AUTO_DIR."/ directory\n";
+    push(@crontabs, grep { -r $_ } map { catfile($crontabdir, $_) } grep { !/^[\.#]/ } readdir(CRONTABS));
+    closedir(CRONTABS);
+    
+    push (@crontabs, $crontab) if (-r $crontab);
+    return @crontabs;
+}
+
+sub read_crontab($) {
+    my ($file) = @_;
+    # local $/;
+    
+    open(CRONTAB, $file) or die "Couldn't read crontab $file!";
+    my @lines = <CRONTAB>;
+    close(CRONTAB);
+    
+    return @lines;
+}
+
+sub check_crontab(@) {
+    my (@lines) = @_;
+    
+    my @errors;
+    
+    foreach my $line (@lines) {
+        $line =~ s|#.*$||; # Remove comments
+        $line =~ s|^\s*(.*?)\s*$|$1|; # Remove whitespace
+        
+        if ($line =~ m|^\w[\w\d]*=|) {
+            # Comment
+            next;
+        } elsif ($line =~ m|^(?:(\S+)\s+){5}(.*)|) {
+            # Crontab line
+            my ($minute, $hour, $day, $month, $dow) = ($1,$2,$3,$4,$5);
+            # FIXME: Validate the time fields.
+            next;
+        } elsif ($line =~ m|^\s*$|) {
+            # Whitespace
+            next;
+        } else {
+            push(@errors, "Unrecognized crontab line:\n$line\n");
+        }
+    }
+    return @errors;
+}
+
+
+
+GetOptions("force|f+" => \$force,
+	   "list|l" => \$list,
+	   "pretend|p" => \$pretend);
+
+if ($list) {
+    my $file = catfile(SPOOL_DIR, $ENV{"USER"});
+    local $/;
+    open (CRONTAB, $file) or die "No crontab installed.\n";
+    print <CRONTAB>;
+    close (CRONTAB);
+    exit;
+}
+
+my @crontabs = get_crontabs();
+my @all_errors;
+my @final_crontab;
+my ($numvalid, $numinvalid) = (0,0);
+
+foreach my $crontab (@crontabs) {
+    push(@final_crontab, "### $crontab\n");
+    my @crontab = read_crontab($crontab);
+    my @errors = check_crontab(@crontab);
+    if (@errors == 0) {
+        print "$crontab is a valid crontab\n";
+        push(@final_crontab, @crontab);
+        $numvalid++;
+    } else {
+        print "$crontab has errors:\n";
+        push(@all_errors, scalar(@errors)." errors in $crontab:\n", @errors);
+        print join("\n", @errors);
+        $numinvalid++;
+        if ($force >= 2) {
+            push(@final_crontab, @crontab);
+        } else {
+            my $errors = join("\n", @errors);
+            $errors =~ s|^|# |mg;
+            push(@final_crontab, "## $crontab was not installed due to errors:\n", $errors);
+        }
+    }
+}
+if ($pretend) {
+    print "Would install this crontab:\n";
+    print @final_crontab;
+    exit;
+}
+
+if ($force < 1 && @all_errors) {
+    print "Not loading new crontab. Use -f to force.\n";
+    exit;
+}
+if ($force >= 2 && @all_errors) {
+    print "Loading $numvalid crontab ($numinvalid BROKEN!) files...\n";
+} else {
+    print "Loading $numvalid crontab files...\n";
+}
+
+# FIXME
+# Load @final_crontab somehow
+
+print "done.\n";
Index: branches/fc15-dev/locker/cron/bin/crontab
===================================================================
--- branches/fc15-dev/locker/cron/bin/crontab	(revision 1803)
+++ branches/fc15-dev/locker/cron/bin/crontab	(revision 1803)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Author: <quentin@mit.edu>
+
+if [[ "$1" = "-l" ]]; then
+	`dirname $0`/cronload -l;
+else
+	cat <<EOF;
+To edit your user-specific crontab, edit ~/cron_scripts/crontab and run
+cronload. cronload will concatenate ~/cron_scripts/crontab with the
+contents of ~/cron_scripts/AUTO/ and load them into the cron
+system. To see the full contents of your crontab on the server, use
+crontab -l
+EOF
+fi
Index: branches/fc15-dev/locker/cron/bin/heartbeat
===================================================================
--- branches/fc15-dev/locker/cron/bin/heartbeat	(revision 1803)
+++ branches/fc15-dev/locker/cron/bin/heartbeat	(revision 1803)
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+CRONROOT=/afs/athena.mit.edu/contrib/scripts/cron
+
+# Find our real hostname
+
+# This big long mess just results in a list of ip/name.
+for i in `/sbin/ip addr show dev eth0 | grep ' inet ' | cut -f 6 -d ' ' | cut -f 1 -d '/' | xargs -n 1 host | cut -f 1,5 -d ' ' | sed 'y/ /\//'`; do 
+	hostip=`echo $i | cut -f 1 -d '.'`
+	name=`echo $i | cut -f 2 -d '/'`
+	case $name in
+		SCRIPTS*) echo "$name";;
+		*) echo "Heartbeat for $name ($hostip)"; HOSTNAME=$name; HOSTIP=$hostip;;
+	esac;
+done
+
+# Tell everyone who's watching that we're alive
+touch $CRONROOT/servers/$HOSTNAME
+
+# Sleep based on our IP, in an attempt to not collide with another server also trying to gain control of the mirroring
+sleep $(($HOSTIP - 50))
+
+# Find the current master
+MASTER="DOES-NOT-EXIST"
+current_server () {
+	for i in $CRONROOT/server-crontabs/*; do
+		if [ -h $i ]; then
+			MASTER=`basename $i`
+			echo "Current master $MASTER"
+		fi
+	done
+}
+if lockfile -1 -r10 -l90 $CRONROOT/lock/heartbeat.lock; then
+    current_server
+
+	# The only way to compare times in bash is to compare the modtimes of two files.
+	compare=`mktemp /tmp/heartbeat-compare.XXXXXXXXXX`
+	touch -d '2 minutes ago' $compare
+	
+	if [[ $CRONROOT/servers/$MASTER -ot $compare ]]; then
+		# Master died! Take over.
+		echo "Master '$MASTER' died! Taking over."
+		for i in $CRONROOT/server-crontabs/*; do
+			if [ -h $i ]; then
+				echo rm $i
+				rm $i
+			else
+				echo rmdir $i
+				rmdir $i
+			fi
+		done
+		for i in $CRONROOT/servers/*; do
+			server=`basename $i`
+			case $server in
+				$HOSTNAME)
+					echo ln -s ../crontabs/ $CRONROOT/server-crontabs/$HOSTNAME
+					ln -s ../crontabs/ $CRONROOT/server-crontabs/$HOSTNAME;;
+				*)
+					echo mkdir $CRONROOT/server-crontabs/$server
+					mkdir $CRONROOT/server-crontabs/$server;;
+			esac;
+		done;
+	fi
+
+	rm $compare
+    rm -f $CRONROOT/lock/heartbeat.lock
+fi
Index: branches/fc15-dev/locker/cron/doc/cron-commands.txt
===================================================================
--- branches/fc15-dev/locker/cron/doc/cron-commands.txt	(revision 1803)
+++ branches/fc15-dev/locker/cron/doc/cron-commands.txt	(revision 1803)
@@ -0,0 +1,74 @@
+$ crontab *
+
+To edit your user-specific crontab, edit ~/cron_scripts/crontab and run
+cronload. cronload will concatenate ~/cron_scripts/crontab with the
+contents of ~/cron_scripts/AUTO/ and load them into the cron
+system. To see the full contents of your crontab on the server, use
+crontab -l
+
+$ crontab -l
+$ cronload -l
+
+#### Generated by cronload. See crontab -h.
+### ~/cron_scripts/AUTO/cacti
+foo
+### ~/cron_scripts/AUTO/gallery
+bar
+### ~/cron_scripts/crontab
+baz
+
+$ cronload
+
+~/cron_scripts/AUTO/cacti is a valid crontab
+~/cron_scripts/AUTO/gallery is a valid crontab
+~/cron_scripts/crontab has errors:
+Invalid month "foo".
+
+Not loading new crontab. Use -f to force.
+
+$ cronload -f
+
+~/cron_scripts...
+...
+
+Loading 2 crontab files... done.
+
+$ cronload -f -f
+
+~/cron_scripts...
+...
+
+Loading 3 crontab (1 BROKEN!) files... done.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: branches/fc15-dev/locker/cron/src/Makefile
===================================================================
--- branches/fc15-dev/locker/cron/src/Makefile	(revision 1803)
+++ branches/fc15-dev/locker/cron/src/Makefile	(revision 1803)
@@ -0,0 +1,27 @@
+# Makefile for dillon's cron and crontab
+#
+
+DESTDIR ?= /usr/local
+CC  = gcc
+CFLAGS = -O2 -Wall -Wstrict-prototypes
+LIB = 
+D_SRCS = cronload.real.c subs.c
+D_OBJS = cronload.real.o subs.o
+
+all:	cronload.real
+
+cronload.real:  ${D_OBJS}
+	${CC} ${CFLAGS} -o cronload.real ${D_OBJS}
+	strip cronload.real
+
+clean:  cleano
+	rm -f cronload.real
+
+cleano:
+	rm -f *.o
+
+install:
+	install -o root -g wheel -m 4755 cronload.real ${DESTDIR}/bin/cronload.real
+#	install -o root -g wheel -m 0644 crontab.1 ${DESTDIR}/man/man1/crontab.1
+
+
Index: branches/fc15-dev/locker/cron/src/cronload.real.c
===================================================================
--- branches/fc15-dev/locker/cron/src/cronload.real.c	(revision 1803)
+++ branches/fc15-dev/locker/cron/src/cronload.real.c	(revision 1803)
@@ -0,0 +1,262 @@
+
+/*
+ * cronload.real.c
+ *
+ * CRONTAB
+ *
+ * usually setuid root, -c option only works if getuid() == geteuid()
+ *
+ * Copyright 1994 Matthew Dillon (dillon@apollo.backplane.com)
+ * May be distributed under the GNU General Public License
+ */
+
+#include "defs.h"
+
+#define VERSION	"$Revision$"
+
+const char *CDir = SCRIPTS_CRONTABS;
+int   UserId;
+short LogLevel = 9;
+
+int GetReplaceStream(const char *user, const char *file);
+extern int ChangeUser(const char *user, short dochdir);
+
+int
+main(int ac, char **av)
+{
+    enum { NONE, LIST, REPLACE, DELETE } option = NONE;
+    struct passwd *pas;
+    char *repFile = NULL;
+    int repFd = 0;
+    int i;
+    char caller[256];		/* user that ran program */
+
+    UserId = getuid();
+    if ((pas = getpwuid(UserId)) == NULL) {
+        perror("getpwuid");
+        exit(1);
+    }
+    snprintf(caller, sizeof(caller), "%s", pas->pw_name);
+
+    i = 1;
+    if (ac > 1) {
+        if (av[1][0] == '-' && av[1][1] == 0) {
+            option = REPLACE;
+            ++i;
+	} else if (av[1][0] != '-') {
+            option = REPLACE;
+            ++i;
+            repFile = av[1];
+	}
+    }
+
+    for (; i < ac; ++i) {
+        char *ptr = av[i];
+
+        if (*ptr != '-')
+            break;
+	ptr += 2;
+
+	switch(ptr[-1]) {
+	case 'l':
+	    if (ptr[-1] == 'l')
+		option = LIST;
+	    /* fall through */
+	case 'd':
+	    if (ptr[-1] == 'd')
+		option = DELETE;
+	    /* fall through */
+	case 'u':
+	    if (i + 1 < ac && av[i+1][0] != '-') {
+	        ++i;
+	        if (getuid() == geteuid()) {
+		    pas = getpwnam(av[i]);
+		    if (pas) {
+			UserId = pas->pw_uid;
+		    } else {
+			errx(1, "user %s unknown\n", av[i]);
+		    }
+		} else {
+		    errx(1, "only the superuser may specify a user\n");
+		}
+	    }
+	    break;
+	case 'c':
+	    if ((getuid() == geteuid()) && (0 == getuid())) {
+		CDir = (*ptr) ? ptr : av[++i];
+	    } else {
+	        errx(1, "-c option: superuser only\n");
+	    }
+	    break;
+	default:
+	    i = ac;
+	    break;
+	}
+    }
+    if (i != ac || option == NONE) {
+	printf("cronload.real " VERSION "\n");
+	printf("cronload.real file <opts>  replace crontab from file\n");
+	printf("cronload.real -    <opts>  replace crontab from stdin\n");
+	printf("cronload.real -u user      specify user\n");
+	printf("cronload.real -l [user]    list crontab for user\n");
+	printf("cronload.real -d [user]    delete crontab for user\n");
+	printf("cronload.real -c dir       specify crontab directory\n");
+	exit(0);
+    }
+
+    /*
+     * Get password entry
+     */
+
+    if ((pas = getpwuid(UserId)) == NULL) {
+        perror("getpwuid");
+        exit(1);
+    }
+
+    /*
+     * If there is a replacement file, obtain a secure descriptor to it.
+     */
+
+    if (repFile) {
+        repFd = GetReplaceStream(caller, repFile);
+        if (repFd < 0) {
+            errx(1, "unable to read replacement file\n");
+        }
+    }
+
+    /*
+     * Change directory to our crontab directory
+     */
+
+    if (chdir(CDir) < 0) {
+        errx(1, "cannot change dir to %s: %s\n", CDir, strerror(errno));
+    }
+
+    /*
+     * Handle options as appropriate
+     */
+
+    switch(option) {
+    case LIST:
+	{
+	    FILE *fi;
+	    char buf[1024];
+
+	    if ((fi = fopen(pas->pw_name, "r"))) {
+		while (fgets(buf, sizeof(buf), fi) != NULL)
+		    fputs(buf, stdout);
+		fclose(fi);
+	    } else {
+		fprintf(stderr, "no crontab for %s\n", pas->pw_name);
+	    }
+	}
+	break;
+    case REPLACE:
+	{
+	    char buf[1024];
+	    char path[1024];
+	    int fd;
+	    int n;
+
+	    snprintf(path, sizeof(path), "%s.new", pas->pw_name);
+	    if ((fd = open(path, O_CREAT|O_TRUNC|O_EXCL|O_APPEND|O_WRONLY, 0600)) >= 0) {
+		while ((n = read(repFd, buf, sizeof(buf))) > 0) {
+		    write(fd, buf, n);
+		}
+		close(fd);
+		rename(path, pas->pw_name);
+	    } else {
+		fprintf(stderr, "unable to create %s/%s: %s\n", 
+		    CDir,
+		    path,
+		    strerror(errno)
+		);
+	    }
+	    close(repFd);
+	}
+	break;
+    case DELETE:
+        remove(pas->pw_name);
+        break;
+    case NONE:
+    default: 
+        break;
+    }
+
+    /*
+     *  Bump notification file.  Handle window where crond picks file up
+     *  before we can write our entry out.
+     */
+	/* // only applicable to dcron
+    if (option == REPLACE || option == DELETE) {
+        FILE *fo;
+        struct stat st;
+
+        while ((fo = fopen(CRONUPDATE, "a"))) {
+			fprintf(fo, "%s\n", pas->pw_name);
+			fflush(fo);
+			if (fstat(fileno(fo), &st) != 0 || st.st_nlink != 0) {
+			fclose(fo);
+			break;
+			}
+			fclose(fo);
+			// * loop * /
+		}
+		if (fo == NULL) {
+			fprintf(stderr, "unable to append to %s/%s\n", CDir, CRONUPDATE);
+		}
+    }
+    */
+    (volatile void)exit(0);
+    /* not reached */
+}
+
+int
+GetReplaceStream(const char *user, const char *file)
+{
+    int filedes[2];
+    int pid;
+    int fd;
+    int n;
+    char buf[1024];
+
+    if (pipe(filedes) < 0) {
+        perror("pipe");
+        return(-1);
+    }
+    if ((pid = fork()) < 0) {
+        perror("fork");
+        return(-1);
+    }
+    if (pid > 0) {
+        /*
+         * PARENT
+         */
+
+	close(filedes[1]);
+	if (read(filedes[0], buf, 1) != 1) {
+	    close(filedes[0]);
+	    filedes[0] = -1;
+	}
+	return(filedes[0]);
+    }
+
+    /*
+     * CHILD
+     */
+
+    close(filedes[0]);
+
+    if (ChangeUser(user, 0) < 0)
+        exit(0);
+
+    fd = open(file, O_RDONLY);
+    if (fd < 0)
+        errx(0, "unable to open %s\n", file);
+    buf[0] = 0;
+    write(filedes[1], buf, 1);
+    while ((n = read(fd, buf, sizeof(buf))) > 0) {
+        write(filedes[1], buf, n);
+    }
+    exit(0);
+}
Index: branches/fc15-dev/locker/cron/src/defs.h
===================================================================
--- branches/fc15-dev/locker/cron/src/defs.h	(revision 1803)
+++ branches/fc15-dev/locker/cron/src/defs.h	(revision 1803)
@@ -0,0 +1,46 @@
+
+/*
+ * DEFS.H
+ *
+ * Copyright 1994-1998 Matthew Dillon (dillon@backplane.com)
+ * May be distributed under the GNU General Public License
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <grp.h>
+#include <err.h>
+
+#define Prototype extern
+#define arysize(ary)	(sizeof(ary)/sizeof((ary)[0]))
+
+#ifndef SCRIPTS_CRONTABS
+#define SCRIPTS_CRONTABS	"/mit/scripts/cron/crontabs"
+#endif
+#ifndef TMPDIR
+#define TMPDIR		"/tmp"
+#endif
+#ifndef OPEN_MAX
+#define OPEN_MAX	256
+#endif
+
+#ifndef CRONUPDATE
+#define CRONUPDATE	"cron.update"
+#endif
+
+#ifndef MAXLINES
+#define MAXLINES	256		/* max lines in non-root crontabs */
+#endif
Index: branches/fc15-dev/locker/cron/src/subs.c
===================================================================
--- branches/fc15-dev/locker/cron/src/subs.c	(revision 1803)
+++ branches/fc15-dev/locker/cron/src/subs.c	(revision 1803)
@@ -0,0 +1,147 @@
+
+/*
+ * SUBS.C
+ *
+ * Copyright 1994 Matthew Dillon (dillon@apollo.backplane.com)
+ * May be distributed under the GNU General Public License
+ */
+
+#include "defs.h"
+
+Prototype void logn(int level, const char *ctl, ...);
+Prototype void log9(const char *ctl, ...);
+Prototype void logfd(int fd, const char *ctl, ...);
+Prototype void fdprintf(int fd, const char *ctl, ...);
+Prototype int ChangeUser(const char *user, short dochdir);
+Prototype void vlog(int level, int fd, const char *ctl, va_list va);
+Prototype int slog(char *buf, const char *ctl, int nmax, va_list va, short useDate);
+
+extern short LogLevel;
+
+void 
+log9(const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    vlog(9, 2, ctl, va);
+    va_end(va);
+}
+
+void 
+logn(int level, const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    vlog(level, 2, ctl, va);
+    va_end(va);
+}
+
+void 
+logfd(int fd, const char *ctl, ...)
+{
+    va_list va;
+
+    va_start(va, ctl);
+    vlog(9, fd, ctl, va);
+    va_end(va);
+}
+
+void 
+fdprintf(int fd, const char *ctl, ...)
+{
+    va_list va;
+    char buf[2048];
+
+    va_start(va, ctl);
+    vsnprintf(buf, sizeof(buf), ctl, va);
+    write(fd, buf, strlen(buf));
+    va_end(va);
+}
+
+void
+vlog(int level, int fd, const char *ctl, va_list va)
+{
+    char buf[2048];
+    short n;
+    static short useDate = 1;
+
+    if (level >= LogLevel) {
+        write(fd, buf, n = slog(buf, ctl, sizeof(buf), va, useDate));
+	useDate = (n && buf[n-1] == '\n');
+    }
+}
+
+int
+slog(char *buf, const char *ctl, int nmax, va_list va, short useDate)
+{
+    time_t t = time(NULL);
+    struct tm *tp = localtime(&t);
+
+    buf[0] = 0;
+    if (useDate)
+	strftime(buf, 128, "%d-%b-%y %H:%M  ", tp);
+    vsnprintf(buf + strlen(buf), nmax, ctl, va);
+    return(strlen(buf));
+}
+
+int
+ChangeUser(const char *user, short dochdir)
+{
+    struct passwd *pas;
+
+    /*
+     * Obtain password entry and change privilages
+     */
+
+    if ((pas = getpwnam(user)) == 0) {
+        logn(9, "failed to get uid for %s", user);
+        return(-1);
+    }
+    setenv("USER", pas->pw_name, 1);
+    setenv("HOME", pas->pw_dir, 1);
+    setenv("SHELL", "/bin/sh", 1);
+
+    /*
+     * Change running state to the user in question
+     */
+
+    if (initgroups(user, pas->pw_gid) < 0) {
+	logn(9, "initgroups failed: %s %s", user, strerror(errno));
+	return(-1);
+    }
+    if (setregid(pas->pw_gid, pas->pw_gid) < 0) {
+	logn(9, "setregid failed: %s %d", user, pas->pw_gid);
+	return(-1);
+    }
+    if (setreuid(pas->pw_uid, pas->pw_uid) < 0) {
+	logn(9, "setreuid failed: %s %d", user, pas->pw_uid);
+	return(-1);
+    }
+    if (dochdir) {
+	if (chdir(pas->pw_dir) < 0) {
+	    logn(8, "chdir failed: %s %s", user, pas->pw_dir);
+	    if (chdir(TMPDIR) < 0) {
+		logn(9, "chdir failed: %s %s", user, pas->pw_dir);
+		logn(9, "chdir failed: %s " TMPDIR, user);
+		return(-1);
+	    }
+	}
+    }
+    return(pas->pw_uid);
+}
+
+#if 0
+
+char *
+strdup(const char *str)
+{
+    char *ptr = malloc(strlen(str) + 1);
+
+    if (ptr)
+        strcpy(ptr, str);
+    return(ptr);
+}
+
+#endif
Index: branches/fc15-dev/locker/deploy/bin/advancedbook
===================================================================
--- branches/fc15-dev/locker/deploy/bin/advancedbook	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/advancedbook	(revision 1803)
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+undef $/;
+
+open(FILE, "admin/contemp.php");
+my $a = <FILE>;
+close(FILE);
+$a =~ s/localhost/$sqlhost/g;
+$a =~ s/dbuser/$sqluser/g;
+$a =~ s/dbpass/$sqlpass/g;
+$a =~ s/guestbookdb/$sqldb/g;
+$a =~ s/useremail/$email/g;
+open(FILE, ">admin/config.inc.php");
+print FILE $a;
+close(FILE);
+
+open(FILE, "instemp.php");
+$a = <FILE>;
+close(FILE);
+$a =~ s/gbuser/$admin_username/g;
+$a =~ s/gbpass/$admin_password/g;
+open(FILE, ">install.php");
+print FILE $a;
+close(FILE);
+
+fetch_uri(
+    'install.php',
+    {},
+    {action => 'Create table',
+     db => $sqldb,
+     host => $sqlhost,
+     name => $sqluser,
+     pass => $sqlpass});
Index: branches/fc15-dev/locker/deploy/bin/advancedpoll
===================================================================
--- branches/fc15-dev/locker/deploy/bin/advancedpoll	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/advancedpoll	(revision 1803)
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+undef $/;
+open(FILE, "include/contemp.php");
+my $a = <FILE>;
+close(FILE);
+$a =~ s/localhost/$sqlhost/g;
+$a =~ s/dbuser/$sqluser/g;
+$a =~ s/dbpass/$sqlpass/g;
+$a =~ s/polldb/$sqldb/g;
+open(FILE, ">include/config.inc.php");
+print FILE $a;
+close(FILE);
+
+fetch_uri('install.php', {action => 'step_2'});
+fetch_uri('install.php', {action => 'step_3'});
+fetch_uri('install.php', {action => 'step_4'});
+
+fetch_uri(
+    'install.php',
+    {action => 'step_6'},
+    {action => 'step_6',
+     username => $admin_username,
+     password => $admin_password});
+
+unlink('include/contemp.php');
+
+print <<END;
+Your $sname Admin Panel is at
+http://$server/~$USER/$addrend/admin
+You can use this admin panel to create your first poll.
+END
+press_enter();
Index: branches/fc15-dev/locker/deploy/bin/django
===================================================================
--- branches/fc15-dev/locker/deploy/bin/django	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/django	(revision 1803)
@@ -0,0 +1,127 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+print "\nEnter the code name for your project (a valid Python package name).\n";
+print "Do not use 'django' or the name of any other Python library.\n";
+print "Project name: ";
+my $name = <STDIN>;
+chomp $name;
+
+open FASTCGI, ">index.fcgi";
+print FASTCGI <<EOF;
+#!/usr/bin/env python
+import sys, os, time, threading, django.utils.autoreload
+sys.path.insert(0, "/mit/$USER/Scripts/django")
+os.chdir("/mit/$USER/Scripts/django/$name")
+os.environ['DJANGO_SETTINGS_MODULE'] = "$name.settings"
+
+def reloader_thread():
+  while True:
+    if django.utils.autoreload.code_changed():
+      os._exit(3)
+    time.sleep(1)
+t = threading.Thread(target=reloader_thread)
+t.daemon = True
+t.start()
+
+from django.core.servers.fastcgi import runfastcgi
+runfastcgi(method="threaded", daemonize="false")
+EOF
+close FASTCGI;
+chmod 0755, "index.fcgi";
+
+open HTACCESS, ">.htaccess";
+print HTACCESS <<EOF;
+RewriteEngine On
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteRule ^(.*)\$ index.fcgi/\$1 [QSA,L]
+EOF
+close HTACCESS;
+chmod 0777, ".htaccess";
+
+chdir "/mit/$USER/Scripts/django/";
+system qw{django-admin startproject}, $name;
+chdir "$name";
+
+open SETTINGS, "settings.py";
+open NEWSETTINGS, ">settings.py.new";
+while (<SETTINGS>) {
+  chomp;
+  if (/Your Name/) {
+    $_ = "    ('$USER', '$email'),";
+  } elsif (/'ENGINE'/) {
+    $_ = "        'ENGINE': 'django.db.backends.mysql',";
+  } elsif  (/'NAME'/) {
+    $_ = "        'NAME': '$sqldb',";
+  } elsif (/'USER'/) {
+    $_ = "        'USER': '$sqluser',";
+  } elsif (/'PASSWORD'/) {
+    $_ = "        'PASSWORD': '$sqlpass',";
+  } elsif (/'HOST'/) {
+    $_ = "        'HOST': '$sqlhost',";
+  } elsif (/Chicago/) {
+    $_ =~ s/Chicago/New_York/;
+  } elsif (/^ADMIN_MEDIA_PREFIX/) {
+    $_ = "ADMIN_MEDIA_PREFIX = '/__scripts/django/media/'";
+  } elsif (/^INSTALLED_APPS/) {
+    print NEWSETTINGS "$_\n";
+    while (<SETTINGS>) {
+      if (/^\)/) {
+        print NEWSETTINGS "    'django.contrib.admin',\n";
+        print NEWSETTINGS "    'django.contrib.admindocs',\n";
+      }
+      print NEWSETTINGS $_;
+    }
+  }
+  print NEWSETTINGS "$_\n";
+}
+close NEWSETTINGS;
+close SETTNGS;
+rename "settings.py.new", "settings.py";
+
+open URLS, "urls.py";
+open NEWURLS, ">urls.py.new";
+while (<URLS>) {
+  chomp;
+  if (/^#.*from django\.contrib import admin/) {
+    $_ =~ s/^# *//;
+  } elsif (/^#.*admin.autodiscover/) {
+    $_ =~ s/^# *//;
+  } elsif (/^ *# *\(r\'\^admin\//) {
+    $_ =~ s/# *//;
+  }
+  print NEWURLS "$_\n";
+}
+close NEWURLS;
+close URLS;
+rename "urls.py.new", "urls.py";
+
+print "Initializing your project's SQL database schema...\n";
+system qw{./manage.py syncdb --noinput};
+print "...done\n";
+
+print "Creating your superuser account... ";
+system qw{./manage.py createsuperuser --username}, $admin_username, "--email", $email, "--noinput";
+print "done\n";
+print "Setting your superuser password... ";
+system qw{mysql -D}, "$USER+$addrlast", "-e", "UPDATE auth_user SET password=MD5(\'$admin_password\') WHERE username=\'$admin_username\'";
+print "done\n";
+
+print "\nDjango has been installed. The setup is roughly what's described\n";
+print "in the shared-hosting section of\n";
+print "  http://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/\n";
+print "We've also enabled the admin app. You can start from the 'Creating\n";
+print "models' step of the Django tutorial:\n";
+print "  http://docs.djangoproject.com/en/dev/intro/tutorial01/#id3\n\n";
+print "Your project is located in:\n";
+print "  /mit/$USER/Scripts/django/$name/\n";
+print "To access manage.py, run 'ssh -k $USER\@scripts' and cd to the above directory.\n\n";
+press_enter;
+
+exit 0;
Index: branches/fc15-dev/locker/deploy/bin/e107
===================================================================
--- branches/fc15-dev/locker/deploy/bin/e107	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/e107	(revision 1803)
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+my ($preva) = fetch_uri(
+    'install.php',
+    {},
+    {server => $sqlhost,
+     name => $sqluser,
+     password => $sqlpass,
+     db => $sqldb,
+     prefix => 'e107_',
+     stage => 3}) =~ /name='previous_steps' value='(.*)'/;
+
+my ($prevb) = fetch_uri(
+    'install.php',
+    {},
+    {stage => 4,
+     previous_steps => $preva}) =~ /name='previous_steps' value='(.*)'/;
+
+my ($prevc) = fetch_uri(
+    'install.php',
+    {},
+    {u_name => $admin_username,
+     d_name => $admin_username,
+     pass1 => $admin_password,
+     pass2 => $admin_password,
+     email => $email,
+     stage => 6,
+     previous_steps => $prevb}) =~ /name='previous_steps' value='(.*)'/;
+
+fetch_uri(
+    'install.php',
+    {},
+    {stage => "7",
+     previous_steps => $prevc});
+
+unlink 'install.php';
Index: branches/fc15-dev/locker/deploy/bin/gallery2
===================================================================
--- branches/fc15-dev/locker/deploy/bin/gallery2	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/gallery2	(revision 1803)
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver_star;
+use File::Path
+
+setup();
+
+my $dir = "/mit/$USER/scripts-gallery2/$sqldb";
+if (-e $dir) {
+    print STDERR "ERROR: The directory $dir already exists.\nTry selecting a different name.";
+    exit 1;
+}
+mkpath($dir);
+
+system("patch", "install/steps/AuthenticateStep.class",
+       "/mit/scripts/deploy$scriptsdev/gallery2.patch");
+
+$ua->cookie_jar({file => '.cookies'});
+
+fetch_uri('install/index.php');
+fetch_uri('install/index.php', {step => 1},
+	  {language => 'en_US'});
+fetch_uri('install/index.php', {step => 2}, {});
+fetch_uri('install/index.php', {step => 3}, {});
+
+my $post4 = {isMultisite => 0,
+	    dir => $dir,
+	    action => 'save'};
+fetch_uri('install/index.php', {step => 4}, $post4);
+fetch_uri('install/index.php', {step => 4}, $post4);
+
+my $post5 = {type => 'mysql',
+	     hostname => $sqlhost,
+	     action => 'save',
+	     confirmReuseTables => '',
+	     confirmCleanInstall => '',
+	     username => $sqluser,
+	     password => $sqlpass,
+	     database => $sqldb,
+	     tablePrefix => 'g2_',
+	     columnPrefix => 'g_'};
+fetch_uri('install/index.php', {step => 5}, $post5);
+fetch_uri('install/index.php', {step => 5}, $post5);
+
+fetch_uri('install/index.php', {step => 6},
+	  {adminName => $admin_username,
+	   passwordA => $admin_password,
+	   action => 'create',
+	   passwordB => $admin_password,
+	   email => $email,
+	   fullName => $USER});
+fetch_uri('install/index.php', {step => 7}, {});
+fetch_uri('install/index.php', {step => 8}, {});
+fetch_uri('install/index.php', {step => 9},
+	  {'module[imagemagick]' => 'on',
+	   activate => 1});
+fetch_uri('install/index.php', {step => 10}, {});
+fetch_uri('install/index.php', {step => 11}, {});
+
+unlink '.cookies';
Index: branches/fc15-dev/locker/deploy/bin/joomla
===================================================================
--- branches/fc15-dev/locker/deploy/bin/joomla	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/joomla	(revision 1803)
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+use File::Path;
+
+setup();
+
+print "\nPlease decide upon a title for your site and enter it below.\n";
+print "Desired title: ";
+my $title = <STDIN>;
+chomp($title);
+
+print "\nSetting up your configuration file...\n";
+open CONFIGTEMPLATE, "configuration.php-dist";
+open CONFIGURATION, ">configuration.php";
+while (<CONFIGTEMPLATE>) {
+  chomp;
+  if (/var \$sitename /) {
+    $_ = "	var \$sitename = '$title';";
+  } elsif (/var \$dbtype /) {
+    $_ = "	var \$dbtype = 'mysql';";
+  } elsif (/var \$host /) {
+    $_ = "	var \$host = '$sqlhost';";
+  } elsif (/var \$user /) {
+    $_ = "	var \$user = '$sqluser';";
+  } elsif (/var \$password /) {
+    $_ = "	var \$password = '$sqlpass';";
+  } elsif (/var \$db /) {
+    $_ = "	var \$db = '$sqldb';";
+  } elsif (/var \$dbprefix /) {
+    $_ = "	var \$dbprefix = 'jos_';";
+  } elsif (/var \$secret /) {
+    my $random = `dd if=/dev/urandom bs=1k count=1 | md5sum | cut -c1-32`;
+    $random =~ s/\n//;
+    $_ = "	var \$secret = '$random';";
+  } elsif (/var \$mailfrom /) {
+    $_ = "	var \$mailfrom = '$email';";
+  } elsif (/var \$fromname /) {
+    $_ = "	var \$fromname = '$title';";
+  }
+  print CONFIGURATION "$_\n";
+}
+close CONFIGURATION;
+close CONFIGTEMPLATE;
+
+print "\nInitializing database schema...\n";
+my $schemafile = "installation/sql/mysql/joomla-real.sql";
+open SCHEMATEMPLATE, "installation/sql/mysql/joomla.sql";
+open SCHEMA, ">$schemafile";
+while (<SCHEMATEMPLATE>) {
+  if (/#__/) {
+    $_ =~ s/#__/jos_/g;
+  }
+  print SCHEMA "$_";
+}
+close SCHEMA;
+close SCHEMATEMPLATE;
+system("cat $schemafile | mysql $sqldb");
+
+print "\nLoading sample data...\n";
+my $sampledatafile = "installation/sql/mysql/sample_data-real.sql";
+open SAMPLETEMPLATE, "installation/sql/mysql/sample_data.sql";
+open SAMPLE, ">$sampledatafile";
+while (<SAMPLETEMPLATE>) {
+  if (/#__/) {
+    $_ =~ s/#__/jos_/g;
+  }
+  print SAMPLE "$_";
+}
+close SAMPLE;
+close SAMPLETEMPLATE;
+system("cat $sampledatafile | mysql $sqldb");
+
+print "\nCreating your admin account...\n";
+system("mysql -e \"INSERT INTO jos_users VALUES (62, 'Administrator', '$admin_username', '$email', MD5('$admin_password'), 'Super Administrator', 0, 1, 25, NOW(), NOW(), '', '')\" $sqldb");
+system("mysql -e \"INSERT INTO jos_core_acl_aro VALUES (10, 'users', '62', 0, 'Administrator', 0)\" $sqldb");
+system("mysql -e \"INSERT INTO jos_core_acl_groups_aro_map VALUES (25, '', 10)\" $sqldb");
+
+print "\nCleaning up installation tree...\n";
+rmtree('installation');
+
+print "\nDone!\n";
+exit 0;
+
Index: branches/fc15-dev/locker/deploy/bin/mediawiki
===================================================================
--- branches/fc15-dev/locker/deploy/bin/mediawiki	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/mediawiki	(revision 1803)
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+`cp skins/common/images/mediawiki.png skins/common/images/wiki.png`;
+`patch -s -p1 < /mit/scripts/deploy/mediawiki.patch`;
+
+print "\nPlease decide upon a title for your wiki and enter it below.\n";
+print "Desired title: ";
+my $title=<STDIN>;
+chomp($title);
+
+my $html = fetch_uri(
+    'config/index.php',
+    {},
+    {Sitename => $title,
+     EmergencyContact => $email,
+     LanguageCode => 'en',
+     DBserver => $sqlhost,
+     DBname => $sqldb,
+     DBuser => $sqluser,
+     DBpassword => $sqlpass,
+     DBpassword2 => $sqlpass,
+     defaultEmail => $email,
+     SysopName => $admin_username,
+     SysopPass => $admin_password,
+     SysopPass2 => $admin_password});
+unless ($html =~ /Installation successful/) {
+    print STDERR "ERROR: Automatic MediaWiki configuration failed.  You will need to configure\nyour MediaWiki manually, or email scripts\@mit.edu for help.\n";
+    exit;
+}
+`cp config/LocalSettings.php .`;
Index: branches/fc15-dev/locker/deploy/bin/onathena
===================================================================
--- branches/fc15-dev/locker/deploy/bin/onathena	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/onathena	(revision 1803)
@@ -0,0 +1,276 @@
+#!/bin/sh
+
+: ${aicontact:=scripts@mit.edu}
+: ${aimaintainer:=scripts.mit.edu}
+: ${ailocker:=scripts}
+
+
+checkfailed() {
+  if [ -f "$lroot/web_scripts/$addrend/.failed" ]; then
+    rm -f "$lroot/web_scripts/$addrend/.failed"
+    exit 1
+  fi
+}
+
+die() {
+  echo "== INSTALLATION FAILED =="
+  echo "Sorry, the installation failed:"
+  echo "$@"
+  echo "Please contact $aicontact and provide a copy of the output of this installer."
+  exit 1
+}
+
+attach scripts
+[ "$ailocker" != "scripts" ] && attach "$ailocker"
+
+sshrun() {
+  /afs/athena.mit.edu/contrib/scripts/bin$scriptsdev/scripts-ssh "$lname" "$@" 2>/dev/null
+}
+
+vsshrun() {
+  /afs/athena.mit.edu/contrib/scripts/bin$scriptsdev/scripts-ssh "$lname" "$@"
+}
+
+checksqlpass() {
+    errors=`sshrun "/mit/scripts/sql/bin$scriptsdev/test-password"`
+    if [ "$errors" != "" ]; then
+        if [ "$1" -eq 1 ]; then
+          rm -f "$lroot/.sql/my.cnf"
+        fi
+        echo
+        echo "ERROR:"
+        printf "$2"
+        exit
+    fi
+}
+
+override=1
+if [ "$override" = "" ]; then
+echo "The $aimaintainer automatic installers are currently unavailable."
+echo "We hope to make them available again soon."
+echo "If you would like us to notify you as soon as they are available again,"
+echo "let us know by sending us an e-mail at $aicontact"
+exit 
+fi
+
+echo 
+echo "== Welcome to the $aimaintainer installer for $sname =="
+echo
+
+echo "For documentation, including a link to the Athena rules of use,"
+echo "see <http://scripts.mit.edu/start>."
+echo
+echo "Please report problems with this installer to $aicontact."
+echo
+echo "Are you performing this install for:"
+echo "1. Your personal Athena account"
+echo "2. A locker that you control (a club, a course, etc)"
+echo "If you do not understand this question, you should answer '1'."
+printf "Please enter either '1' or '2' (without quotes): "
+read whofor
+if [ "$whofor" = 1 ]; then
+    lname="${ATHENA_USER:-$USER}"
+elif [ "$whofor" = 2 ]; then
+    echo
+    echo "OK.  $sname will be installed into a locker of your choice that"
+    echo "you control.  Please enter the name of the selected locker below."
+    echo "(For the locker /mit/lsc -- which has a full path of"
+    echo "/afs/athena.mit.edu/activity/l/lsc -- you would simply enter lsc)."
+    printf "Locker name: "
+    read lname
+else
+    echo
+    echo "ERROR:"
+    echo "You must select either '1' or '2'."
+    exit 1
+fi
+while true; do
+    if attach "$lname"; then
+        break
+    fi
+    echo "$lname is not a valid locker name."
+    printf "Locker name: "
+    read lname
+done
+lroot="/mit/$lname" 
+
+echo
+echo Checking the status of your scripts.mit.edu account...
+
+attach scripts 2>/dev/null
+. "/mit/scripts/bin$scriptsdev/signup-web"
+
+echo
+echo "Your new copy of $sname will appear on the web at a URL"
+echo "that starts with http://$lname.scripts.mit.edu/"
+echo "Please decide upon a complete URL and enter it below."
+echo "You must enter one or more characters after mit.edu/"
+echo "The completed address must only contain a-z, 0-9, and /."
+printf "Desired address: http://$lname.scripts.mit.edu/"
+read addrend
+
+addrend=`perl -0e 'print $ARGV[0] =~ /^([\w\/-]*[\w-])\/*$/' -- "$addrend"`
+if [ "$addrend" = "" ]; then
+	echo
+	echo "ERROR:"
+	echo "You must enter one or more characters after mit.edu/"
+	echo "The completed address must only contain a-z, 0-9, and /."
+	exit 1
+fi
+
+if [ -d "$lroot/web_scripts/$addrend" ]; then
+    echo
+    echo "ERROR:"
+    echo "You already have a directory corresponding to that web address."
+    echo "Please remove that directory, choose a different address, or"
+    echo "contact $aicontact for assistance."
+    exit 1
+fi
+
+if [ "$requires_sql" = "" ]; then
+  requires_sql=1
+fi
+
+if [ ! -f "$lroot/.my.cnf" ]; then
+  mkdir "$lroot/.sql" 2>/dev/null
+  fs sa "$lroot/.sql" daemon.scripts write
+  fs sa "$lroot/.sql" daemon.sql write
+  ln -nfs "$lroot/.sql/my.cnf" "$lroot/.my.cnf" 2>/dev/null
+fi
+
+fs sa "$lroot/.sql" system:anyuser none
+fs sa "$lroot/.sql" system:authuser none
+
+if [ "$requires_sql" -eq 1 ]; then
+  sqlinfo=`sshrun "/mit/scripts/sql/bin$scriptsdev/get-password"`
+  if [ "$sqlinfo" = "" ]; then
+      echo 
+      echo "You already have a MySQL account but you do not have a .my.cnf file."
+      echo "If you do not remember your MySQL account password, you can change it"
+      echo "at http://sql.mit.edu using MIT certificates."
+      printf "Please type your MySQL password and press [enter]: "
+      stty -echo
+      read sqlpass
+      stty echo
+      echo
+      sqlhost="sql.mit.edu"
+      sqluser=$lname
+      . "/mit/scripts/sql/bin$scriptsdev/save-password"
+      checksqlpass 1 'The MySQL password that you typed appears to be incorrect.\n'
+      echo
+      echo "OK.  Continuing with the install..."
+  else
+      checksqlpass 0 'The MySQL login information in your .my.cnf file\nappears to be incorrect.\n'
+  fi
+fi
+
+origdir=`pwd`
+mkdir -p "$lroot/web_scripts_tmp"
+cd "$lroot/web_scripts_tmp"
+fs sa . system:anyuser none
+fs sa . system:authuser none
+fs sa . daemon.scripts write
+fs sa . system:scripts-security-upd write
+echo "This directory is necessary to store login sessions and other transient files for auto-installed packages from scripts.mit.edu." > DO_NOT_DELETE.txt
+mkdir -p "$lroot/web_scripts/$addrend"
+cd "$lroot/web_scripts/$addrend"
+fs sa . system:anyuser none
+fs sa . system:authuser none
+fs sa . daemon.scripts write
+fs sa . system:scripts-security-upd write
+
+# This version is deprecated, use create_scripts_dir instead
+
+if [ "$create_dir" = "" ]; then
+  create_dir=0
+fi
+
+if [ "$create_dir" -eq 1 ]; then
+  mkdir -p "$lroot/scripts-$deploy"
+  fs sa "$lroot/scripts-$deploy" system:anyuser none
+  fs sa "$lroot/scripts-$deploy" system:authuser none
+  fs sa "$lroot/scripts-$deploy" daemon.scripts write
+  fs sa "$lroot/scripts-$deploy" system:scripts-security-upd write
+fi
+
+# This is the better version
+
+if [ "$create_scripts_dir" = "" ]; then
+  create_scripts_dir=0
+fi
+
+if [ "$create_scripts_dir" -eq 1 ]; then
+  mkdir -p "$lroot/Scripts/$deploy"
+  fs sa "$lroot/Scripts/$deploy" system:anyuser none
+  fs sa "$lroot/Scripts/$deploy" system:authuser none
+  fs sa "$lroot/Scripts/$deploy" daemon.scripts write
+  fs sa "$lroot/Scripts/$deploy" system:scripts-security-upd write
+fi
+
+if [ "$wizard" != "" ]; then
+  vsshrun "/mit/$ailocker/wizard/bin/wizard" "install" "$@" "$wizard" "$lroot/web_scripts/$addrend"
+  exit 0
+fi
+
+if [ "$prompt_username" = "" ]; then
+  admin_username="admin"
+  prompt_username=0
+fi
+if [ "$prompt_password" = "" ]; then
+  prompt_password=1
+fi
+
+if [ "$prompt_username" -eq 1 ]; then
+    echo
+    echo "You will be able to log in to $sname using a username of your choice."
+    echo "Please decide upon a username and enter it below."
+    echo "Your username must contain only alphanumeric characters (a-z, 0-9)."
+    printf "Desired username: "
+    read admin_username
+    admin_username=`perl -0e 'print $ARGV[0] =~ /^([[:alnum:]]+)$/' -- "$admin_username"`
+    if [ "$admin_username" = "" ]; then
+        echo
+        echo ERROR:
+        echo "Your username must contain only alphanumeric characters (a-z, 0-9)."
+        echo "You will need to run the installer again and choose a different username."
+        exit 1
+    fi
+fi
+
+if [ "$prompt_password" -eq 1 ]; then
+    stty -echo
+    sshrun "/mit/$ailocker/deploy$scriptsdev/bin/prompt-password" "$sname" "$deploy" "$addrend" "$admin_username"
+    stty echo
+fi
+
+echo
+echo "Unpacking $sname... (this step might take several minutes)"
+# xavid: use p to keep the same permissions as in the file
+athrun scripts gtar zxpf "/mit/$ailocker/deploy$scriptsdev/$deploy.tar.gz"
+files=`athrun scripts gfind . -mindepth 1 -maxdepth 1 | grep -v .admin`
+numfiles=`echo "$files" | wc -l`
+if [ ! -z "$files" ]; then
+    if [ "$numfiles" -eq 1 ]; then
+        athrun scripts gfind . -mindepth 2 -maxdepth 2 | xargs -i mv \{} .
+        rmdir "$files"
+    fi
+fi
+if [ -f "/mit/$ailocker/deploy$scriptsdev/php.ini/$deploy" ]; then
+        nodot=`echo "$lname" | sed "/\./s///"`;
+        sed -e "/SCRIPTS_USER/ s//$lname/" -e "/SCRIPTS_NODOT/ s//$nodot/" "/mit/$ailocker/deploy$scriptsdev/php.ini/$deploy" > php.ini
+        athrun scripts gfind . -mindepth 1 -type d -exec sh -c 'ln -sf "`echo "$1" | sed '\''s,[^/],,g; s,/,../,g'\''`php.ini" "$1/"' -- {} \;
+fi
+cd "$origdir"
+
+vsshrun "/mit/$ailocker/deploy$scriptsdev/bin/$deploy" "$sname" "$deploy" "$addrend" "$admin_username" "$requires_sql" "$scriptsdev" "${ATHENA_USER:-$USER}" || die "Unknown failure during configuration"
+rm -f "$lroot/web_scripts/$addrend/.scripts-tmp"
+checkfailed
+
+echo
+echo "== Installation complete! =="
+echo "You should now be able to access your new copy of $sname at"
+echo "http://$lname.scripts.mit.edu/$addrend/"
+echo "(You can replace the http with https if you want to use encryption)"
+echo "If you have trouble accessing it, feel free to contact"
+echo "the $aimaintainer team by e-mailing $aicontact"
+exit 0
Index: branches/fc15-dev/locker/deploy/bin/onserver.pm
===================================================================
--- branches/fc15-dev/locker/deploy/bin/onserver.pm	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/onserver.pm	(revision 1803)
@@ -0,0 +1,142 @@
+package onserver;
+use strict;
+use Exporter;
+use Sys::Hostname;
+use File::Spec::Functions;
+use File::Basename;
+use Socket;
+use Cwd qw(abs_path);
+use POSIX qw(strftime);
+use LWP::UserAgent;
+use URI;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(setup totmp fetch_uri print_login_info press_enter $server $tmp $USER $HOME $sname $deploy $addrend $base_uri $ua $admin_username $requires_sql $addrlast $sqlhost $sqluser $sqlpass $sqldb $admin_password $scriptsdev $human $email);
+
+our $server = "scripts.mit.edu";
+
+our ($tmp, $USER, $HOME, $sname, $deploy, $addrend, $base_uri, $ua, $admin_username, $requires_sql, $addrlast, $sqlhost, $sqluser, $sqlpass, $sqldb, $admin_password, $scriptsdev, $human, $email);
+
+$tmp = ".scripts-tmp";
+sub totmp {
+  open(FILE, ">$tmp");
+  print FILE $_[0];
+  close(FILE);
+}
+
+$ua = LWP::UserAgent->new;
+push @{$ua->requests_redirectable}, 'POST';
+
+sub fetch_uri {
+    my ($uri, $get, $post) = @_;
+    my $u = URI->new($uri);
+    my $req;
+    if (defined $post) {
+	$u->query_form($post);
+	my $content = $u->query;
+	$u->query_form($get);
+	$req = HTTP::Request->new(POST => $u->abs($base_uri));
+	$req->content_type('application/x-www-form-urlencoded');
+	$req->content($content);
+    } else {
+	$u->query_form($get) if (defined $get);
+	$req = HTTP::Request->new(GET => $u->abs($base_uri));
+    }
+    my $res = $ua->request($req);
+    if ($res->is_success) {
+	return $res->content;
+    } else {
+	print STDERR "Error fetching configuration page: ", $res->status_line, "\n";
+	return undef;
+    }
+}
+
+sub print_login_info {
+  print "\nYou will be able to log in to $sname using the following:\n";
+  print "  username: $admin_username\n";
+  print "  password: $admin_password\n";
+}
+
+sub getclienthostname {
+    if (my $sshclient = $ENV{"SSH_CLIENT"}) {
+	my ($clientip) = split(' ', $sshclient);
+	my $hostname = gethostbyaddr(inet_aton($clientip), AF_INET);
+	return $hostname || $clientip;
+    } else {
+	return hostname();
+    }
+}
+
+sub press_enter {
+  local $/ = "\n";
+  print "Press [enter] to continue with the install.";
+  my $enter = <STDIN>; 
+}
+
+sub setup {
+  $ENV{PATH} = '/bin:/usr/bin';
+  $USER = $ENV{USER};
+  $HOME = $ENV{HOME};
+  
+  ($sname, $deploy, $addrend, $admin_username, $requires_sql, $scriptsdev, $human) = @ARGV;
+  chdir "$HOME/web_scripts/$addrend";
+  $email = "$human\@mit.edu";
+  
+  if($addrend =~ /^(.*)\/$/) {
+    $addrend = $1;
+  }
+  ($addrlast) = ($addrend =~ /([^\/]*)$/);
+  
+  $base_uri = "http://$server/~$USER/$addrend/";
+  
+  if($requires_sql) {
+    print "\nCreating SQL database for $sname...\n";
+   
+    open GETPWD, '-|', "/mit/scripts/sql/bin$scriptsdev/get-password";
+    ($sqlhost, $sqluser, $sqlpass) = split(/\s/, <GETPWD>);
+    close GETPWD;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/get-next-database", $addrlast;
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/create-database", $sqldb;
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    if($sqldb eq "") {
+      print "\nERROR:\n";
+      print "Your SQL account failed to create a SQL database.\n";
+      print "You should log in at http://sql.mit.edu to check whether\n";
+      print "your SQL account is at its database limit or its storage limit.\n";
+      print "If you cannot determine the cause of the problem, please\n";
+      print "feel free to contact sql\@mit.edu for assistance.\n";
+      open FAILED, ">.failed";
+      close FAILED;
+      exit 1;
+    }
+  }
+ 
+  if(-e "$HOME/web_scripts/$addrend/.admin") { 
+    open ADMIN, "<$HOME/web_scripts/$addrend/.admin";
+    $admin_password=<ADMIN>;
+    chomp($admin_password);
+    close ADMIN;
+    unlink "$HOME/web_scripts/$addrend/.admin";
+  } 
+
+  print "\nConfiguring $sname...\n";
+  if($requires_sql) {
+    print "A copy of ${USER}'s SQL login info will be placed in\n/mit/$USER/web_scripts/$addrend.\n";
+  }
+  
+  open(VERSION, ">.scripts-version") or die "Can't write scripts-version file: $!\n";
+  print VERSION strftime("%F %T %z\n", localtime);
+  print VERSION $ENV{'USER'}, '@', getclienthostname(), "\n";
+  my $tarball = abs_path("/mit/scripts/deploy$scriptsdev/$deploy.tar.gz");
+  print VERSION $tarball, "\n";
+  $tarball =~ s|/deploydev/|/deploy/|;
+  print VERSION dirname($tarball), "\n";
+  close(VERSION);
+
+  select STDOUT;
+  $| = 1; # STDOUT is *hot*!
+}
+
+1;
Index: branches/fc15-dev/locker/deploy/bin/onserver_star.pm
===================================================================
--- branches/fc15-dev/locker/deploy/bin/onserver_star.pm	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/onserver_star.pm	(revision 1803)
@@ -0,0 +1,142 @@
+package onserver_star;
+use strict;
+use Exporter;
+use Sys::Hostname;
+use File::Spec::Functions;
+use File::Basename;
+use Socket;
+use Cwd qw(abs_path);
+use POSIX qw(strftime);
+use LWP::UserAgent;
+use URI;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(setup totmp fetch_uri print_login_info press_enter $server $tmp $USER $HOME $sname $deploy $addrend $base_uri $ua $admin_username $requires_sql $addrlast $sqlhost $sqluser $sqlpass $sqldb $admin_password $scriptsdev $human $email);
+
+our $server = "scripts.mit.edu";
+
+our ($tmp, $USER, $HOME, $sname, $deploy, $addrend, $base_uri, $ua, $admin_username, $requires_sql, $addrlast, $sqlhost, $sqluser, $sqlpass, $sqldb, $admin_password, $scriptsdev, $human, $email);
+
+$tmp = ".scripts-tmp";
+sub totmp {
+  open(FILE, ">$tmp");
+  print FILE $_[0];
+  close(FILE);
+}
+
+$ua = LWP::UserAgent->new;
+push @{$ua->requests_redirectable}, 'POST';
+
+sub fetch_uri {
+    my ($uri, $get, $post) = @_;
+    my $u = URI->new($uri);
+    my $req;
+    if (defined $post) {
+	$u->query_form($post);
+	my $content = $u->query;
+	$u->query_form($get);
+	$req = HTTP::Request->new(POST => $u->abs($base_uri));
+	$req->content_type('application/x-www-form-urlencoded');
+	$req->content($content);
+    } else {
+	$u->query_form($get) if (defined $get);
+	$req = HTTP::Request->new(GET => $u->abs($base_uri));
+    }
+    my $res = $ua->request($req);
+    if ($res->is_success) {
+	return $res->content;
+    } else {
+	print STDERR "Error fetching configuration page: ", $res->status_line, "\n";
+	return undef;
+    }
+}
+
+sub print_login_info {
+  print "\nYou will be able to log in to $sname using the following:\n";
+  print "  username: $admin_username\n";
+  print "  password: $admin_password\n";
+}
+
+sub getclienthostname {
+    if (my $sshclient = $ENV{"SSH_CLIENT"}) {
+	my ($clientip) = split(' ', $sshclient);
+	my $hostname = gethostbyaddr(inet_aton($clientip), AF_INET);
+	return $hostname || $clientip;
+    } else {
+	return hostname();
+    }
+}
+
+sub press_enter {
+  local $/ = "\n";
+  print "Press [enter] to continue with the install.";
+  my $enter = <STDIN>; 
+}
+
+sub setup {
+  $ENV{PATH} = '/bin:/usr/bin';
+  $USER = $ENV{USER};
+  $HOME = $ENV{HOME};
+  
+  ($sname, $deploy, $addrend, $admin_username, $requires_sql, $scriptsdev, $human) = @ARGV;
+  chdir "$HOME/web_scripts/$addrend";
+  $email = "$human\@mit.edu";
+  
+  if($addrend =~ /^(.*)\/$/) {
+    $addrend = $1;
+  }
+  ($addrlast) = ($addrend =~ /([^\/]*)$/);
+  
+  $base_uri = "http://$USER.$server/$addrend/";
+  
+  if($requires_sql) {
+    print "\nCreating SQL database for $sname...\n";
+   
+    open GETPWD, '-|', "/mit/scripts/sql/bin$scriptsdev/get-password";
+    ($sqlhost, $sqluser, $sqlpass) = split(/\s/, <GETPWD>);
+    close GETPWD;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/get-next-database", $addrlast;
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/create-database", $sqldb;
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    if($sqldb eq "") {
+      print "\nERROR:\n";
+      print "Your SQL account failed to create a SQL database.\n";
+      print "You should log in at http://sql.mit.edu to check whether\n";
+      print "your SQL account is at its database limit or its storage limit.\n";
+      print "If you cannot determine the cause of the problem, please\n";
+      print "feel free to contact sql\@mit.edu for assistance.\n";
+      open FAILED, ">.failed";
+      close FAILED;
+      exit 1;
+    }
+  }
+ 
+  if(-e "$HOME/web_scripts/$addrend/.admin") { 
+    open ADMIN, "<$HOME/web_scripts/$addrend/.admin";
+    $admin_password=<ADMIN>;
+    chomp($admin_password);
+    close ADMIN;
+    unlink "$HOME/web_scripts/$addrend/.admin";
+  } 
+
+  print "\nConfiguring $sname...\n";
+  if($requires_sql) {
+    print "A copy of ${USER}'s SQL login info will be placed in\n/mit/$USER/web_scripts/$addrend.\n";
+  }
+  
+  open(VERSION, ">.scripts-version") or die "Can't write scripts-version file: $!\n";
+  print VERSION strftime("%F %T %z\n", localtime);
+  print VERSION $ENV{'USER'}, '@', getclienthostname(), "\n";
+  my $tarball = abs_path("/mit/scripts/deploy$scriptsdev/$deploy.tar.gz");
+  print VERSION $tarball, "\n";
+  $tarball =~ s|/deploydev/|/deploy/|;
+  print VERSION dirname($tarball), "\n";
+  close(VERSION);
+
+  select STDOUT;
+  $| = 1; # STDOUT is *hot*!
+}
+
+1;
Index: branches/fc15-dev/locker/deploy/bin/phpbb
===================================================================
--- branches/fc15-dev/locker/deploy/bin/phpbb	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/phpbb	(revision 1803)
@@ -0,0 +1,203 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver_star;
+use File::Path;
+
+setup();
+
+# Initial installation page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     language => 'en'},
+    {});
+print "Loaded initial installation page\n";
+
+# Requirements page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'requirements',
+     language => 'en'},
+    {});
+print "Loaded requirements page\n";
+
+# Database page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'database',
+     language => 'en'},
+    {img_imagick => '/usr/bin/'});
+print "Loaded database page\n";
+
+# Database again
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'database'},
+    {dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => '',
+     img_imagick => '/usr/bin/',
+     language => 'en',
+     testdb => 'true'});
+print "Loaded database page (part 2)\n";
+
+# Administrator page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'administrator'},
+    {img_imagick => '/usr/bin/',
+     language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => ''});
+print "Loaded administrator page\n";
+
+# Administrator page again
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'administrator'},
+    {default_lang => 'en',
+     admin_name => $admin_username,
+     admin_pass1 => $admin_password,
+     admin_pass2 => $admin_password,
+     board_email1 => $email,
+     board_email2 => $email,
+     img_imagick => '/usr/bin/',
+     language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => '',
+     check => 'true'});
+print "Loaded administrator page (part 2)\n";
+
+# Config file page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'config_file'},
+    {img_imagick => '/usr/bin/',
+     default_lang => 'en',
+     admin_name => $admin_username,
+     admin_pass1 => $admin_password,
+     admin_pass2 => $admin_password,
+     board_email1 => $email,
+     board_email2 => $email,
+     language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => ''});
+print "Loaded config file page\n";
+
+# Advanced page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'advanced'},
+    {img_imagick => '/usr/bin/',
+     language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => '',
+     default_lang => 'en',
+     admin_name => $admin_username,
+     admin_pass1 => $admin_password,
+     admin_pass2 => $admin_password,
+     board_email1 => $email,
+     board_email2 => $email});
+print "Loaded advanced setup page\n";
+
+# Create database tables
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'create_table'},
+    {email_enable => '1',
+     smtp_delivery => '0',
+     smtp_auth => 'PLAIN',
+     cookie_secure => '0',
+     force_server_vars => '0',
+     server_protocol => 'http://',
+     server_name => "$USER.scripts.mit.edu",
+     server_port => '80',
+     script_path => "/$addrend",
+     img_imagick => '/usr/bin/',
+     language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbname => $sqldb,
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     table_prefix => '',
+     default_lang => 'en',
+     admin_name => $admin_username,
+     admin_pass1 => $admin_password,
+     admin_pass2 => $admin_password,
+     board_email1 => $email,
+     board_email2 => $email});
+print "Loaded database table creation page\n";
+
+# Final page
+fetch_uri(
+    'install/index.php',
+    {mode => 'install',
+     sub => 'final'},
+    {language => 'en',
+     dbms => 'mysql',
+     dbhost => $sqlhost,
+     dbport => '',
+     dbuser => $sqluser,
+     dbpasswd => $sqlpass,
+     dbname => $sqldb,
+     table_prefix => '',
+     default_lang => 'en',
+     admin_name => $admin_username,
+     admin_pass1 => $admin_password,
+     admin_pass2 => $admin_password,
+     board_email1 => $email,
+     board_email2 => $email,
+     img_imagick => '/usr/bin/',
+     ftp_path => '',
+     ftp_user => '',
+     ftp_pass => '',
+     email_enable => '1',
+     smtp_delivery => '0',
+     smtp_host => '',
+     smtp_auth => 'PLAIN',
+     smtp_user => '',
+     smtp_pass => '',
+     cookie_secure => '0',
+     force_server_vars => '0',
+     server_protocol => 'http://',
+     server_name => "$USER.scripts.mit.edu",
+     server_port => '80',
+     script_path => "/$addrend"});
+print "Loaded installation finalization page\n";
+
+rmtree(['install']);
Index: branches/fc15-dev/locker/deploy/bin/phpical
===================================================================
--- branches/fc15-dev/locker/deploy/bin/phpical	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/phpical	(revision 1803)
@@ -0,0 +1,30 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+
+setup();
+
+undef $/;
+open(FILE, "contemp.php");
+my $a = <FILE>;
+close(FILE);
+$a =~ s/adminpass/$admin_password/g;
+$a =~ s|\$timezone\s*= '';|\$timezone = 'US/Eastern';|g;
+$a =~ s/\$phpicalendar_publishing/\/\/ WARNING: The scripts.mit.edu maintainers have had to disable this feature on scripts.mit.edu because it contains a serious security vulnerability that has not been addressed by the software\'s authors.  Please do not try to enable this feature\n\$phpicalendar_publishing/;
+open(FILE, ">config.inc.php");
+print FILE $a;
+close(FILE);
+
+#system('cp', '/mit/scripts/deploy/phpical/MIT Academic Calendar.ics', 'calendars/');
+
+unlink('contemp.php');
+unlink('calendars/publish.ical.php');
+
+print <<END;
+Your $sname Admin Panel is at
+http://$server/~$USER/$addrend/admin
+You can use this admin panel to upload calendars for display.
+END
+press_enter();
Index: branches/fc15-dev/locker/deploy/bin/prompt-password
===================================================================
--- branches/fc15-dev/locker/deploy/bin/prompt-password	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/prompt-password	(revision 1803)
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+name=$1
+deploy=$2
+addrend=$3
+admin_username=$4
+cd $HOME/web_scripts/$addrend
+
+echo
+echo You will be able to control your copy of $name by logging in to
+echo $name using username \"$admin_username\".  This account will have a
+echo password of your choice.  You should not use your Athena account password.
+
+done="0"
+while [ "$done" = "0" ]
+do
+  echo "Please decide upon an admin password, type it, and press [enter]."
+  echo "This password may only contain a-z, A-Z, and 0-9."
+  printf "As you type your password, the cursor will not move: "
+  read admin_pass1
+  echo
+  echo
+  echo "Now please type the same password again and press [enter]."
+  printf "As you type your password, the cursor will not move: "
+  read admin_pass2
+  echo
+
+  if [ "$admin_pass1" = "$admin_pass2" ]; then
+    done="1"
+  else
+    echo
+    echo == Sorry, those passwords do not match.  Please try again. ==
+  fi
+done
+
+echo
+echo OK.  Continuing with the install...
+cat <<EOF > $HOME/web_scripts/$addrend/.admin
+$admin_pass1
+EOF
Index: branches/fc15-dev/locker/deploy/bin/rails
===================================================================
--- branches/fc15-dev/locker/deploy/bin/rails	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/rails	(revision 1803)
@@ -0,0 +1,204 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+use Tie::File;
+
+setup();
+
+sub make_db {
+    my($type) = @_;
+    print "\nCreating $type SQL database for $sname...\n";
+    open GETPWD, '-|', "/mit/scripts/sql/bin$scriptsdev/get-password";
+    ($sqlhost, $sqluser, $sqlpass) = split(/\s/, <GETPWD>);
+    close GETPWD;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/get-next-database", "${addrlast}_${type}";
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/create-database", $sqldb;
+    $sqldb = <SQLDB>;
+    close SQLDB;
+    if($sqldb eq "") {
+        print "\nERROR:\n";
+        print "Your SQL account failed to create a SQL database.\n";
+        print "You should log in at http://sql.mit.edu to check whether\n";
+        print "your SQL account is at its database limit or its storage limit.\n";
+        print "If you cannot determine the cause of the problem, please\n";
+        print "feel free to contact sql\@mit.edu for assistance.\n";
+        open FAILED, ">.failed";
+        close FAILED;
+        exit 1;
+    }
+    return $sqldb;
+}
+
+my $dev_db = make_db("development");
+my $test_db = make_db("test");
+my $prod_db = make_db("production");
+
+system qw{rails -D -d mysql .};
+
+open PUBLIC_HTACCESS, ">public/.htaccess";
+print PUBLIC_HTACCESS <<EOF;
+# General Apache options
+Options +FollowSymLinks +ExecCGI
+
+# If you don't want Rails to look in certain directories,
+# use the following rewrite rules so that Apache won't rewrite certain requests
+#
+# Example:
+#   RewriteCond %{REQUEST_URI} ^/notrails.*
+#   RewriteRule .* - [L]
+
+# Redirect all requests not available on the filesystem to Rails
+# By default the cgi dispatcher is used which is very slow
+#
+# For better performance replace the dispatcher with the fastcgi one
+#
+# Example:
+#   RewriteRule ^(.*)\$ dispatch.fcgi [QSA,L]
+RewriteEngine On
+
+# If your Rails application is accessed via an Alias directive,
+# then you MUST also set the RewriteBase in this htaccess file.
+#
+# Example:
+#   Alias /myrailsapp /path/to/myrailsapp/public
+#   RewriteBase /myrailsapp
+
+RewriteRule ^\$ index.html [QSA]
+RewriteRule ^([^.]+)\$ \$1.html [QSA]
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^(.*)\$ dispatch.fcgi [QSA,L]
+
+# In case Rails experiences terminal errors
+# Instead of displaying this message you can supply a file here which will be rendered instead
+#
+# Example:
+#   ErrorDocument 500 /500.html
+
+RewriteBase /$addrend/public/
+EOF
+
+open HTACCESS, ">.htaccess";
+print HTACCESS <<EOF;
+RewriteEngine On
+RewriteRule ^(.*)\$ public/\$1 [QSA,L]
+RewriteBase /$addrend/
+EOF
+
+tie my @railsenv, 'Tie::File', 'config/environment.rb';
+unshift @railsenv, "# ENV['RAILS_ENV'] ||= 'production'";
+unshift @railsenv, "# Uncomment below to put Rails into production mode";
+unshift @railsenv, "";
+unshift @railsenv, "ENV['RAILS_RELATIVE_URL_ROOT'] = \"/$addrend\"";
+untie @railsenv;
+
+tie my @railsdb, 'Tie::File', 'config/database.yml';
+for (@railsdb) {
+    s/username:.*$/username: $sqluser/;
+    s/password:.*$/password: $sqlpass/;
+    s/host:.*$/host: $sqlhost/;
+    s/database:.*_development.*/database: $dev_db/;
+    s/database:.*_test.*/database: $test_db/;
+    s/database:.*_production.*/database: $prod_db/;
+}
+untie @railsdb;
+
+tie my @railswelcome, 'Tie::File', 'public/index.html';
+for (@railswelcome) {
+    s/Create your database/Sync your database/;
+    s/to create your database\..*/to create tables in your database.<\/p>/;
+}
+untie @railswelcome;
+
+tie my @railsfcgi, 'Tie::File', 'public/dispatch.fcgi';
+for (@railsfcgi) {
+    s/^[^#]*RailsFCGIHandler/## Commented out by scripts.mit.edu autoinstaller\n## RailsFCGIHandler/;
+}
+untie @railsfcgi;
+open RAILSFCGI, ">>public/dispatch.fcgi";
+print RAILSFCGI <<EOF;
+
+## Added by scripts.mit.edu autoinstaller to reload when app code changes
+Thread.abort_on_exception = true
+
+t1 = Thread.new do
+   RailsFCGIHandler.process!
+end
+
+t2 = Thread.new do
+   # List of directories to watch for changes before reload.
+   # You may want to also watch public or vendor, depending on your needs.
+   Thread.current[:watched_dirs] = ['app', 'config', 'db', 'lib']
+
+   # List of specific files to watch for changes.
+   Thread.current[:watched_files] = ['public/dispatch.fcgi',
+				     'public/.htaccess']
+   # Sample filter: /(\.rb|\.erb)\$/.  Default filter: watch all files
+   Thread.current[:watched_extensions] = //
+   # Iterations since last reload
+   Thread.current[:iterations] = 0
+
+   def modified(file)
+     begin
+       mtime = File.stat(file).mtime
+     rescue
+       false
+     else
+       if Thread.current[:iterations] == 0
+         Thread.current[:modifications][file] = mtime
+       end
+       Thread.current[:modifications][file] != mtime
+     end
+   end
+
+   # Don't symlink yourself into a loop.  Please.  Things will still work
+   # (Linux limits your symlink depth) but you will be sad
+   def modified_dir(dir)
+     Dir.new(dir).each do |file|
+       absfile = File.join(dir, file)
+       if FileTest.directory? absfile
+         next if file == '.' or file == '..'
+         return true if modified_dir(absfile)
+       else
+         return true if Thread.current[:watched_extensions] =~ absfile &&
+	   modified(absfile)
+       end
+     end
+     false
+   end
+
+   def reload
+     Thread.current[:modifications] = {}
+     Thread.current[:iterations] = 0
+     # This is a kludge, but at the same time it works.
+     # Will kill the current FCGI process so that it is reloaded
+     # at next request.
+     raise RuntimeError
+   end
+
+   Thread.current[:modifications] = {}
+   # Wait until the modify time changes, then reload.
+   while true
+     dir_modified = Thread.current[:watched_dirs].inject(false) {|z, dir| z || modified_dir(File.join(File.dirname(__FILE__), '..', dir))}
+     file_modified = Thread.current[:watched_files].inject(false) {|z, file| z || modified(File.join(File.dirname(__FILE__), '..', file))}
+     reload if dir_modified || file_modified
+     Thread.current[:iterations] += 1
+     sleep 1
+   end
+end
+
+t1.join
+t2.join
+## End of scripts.mit.edu autoinstaller additions
+EOF
+
+print "Your application is located in:\n";
+print "  /mit/$USER/web_scripts/$addrend/\n";
+print "To run programs like rake or script/generate, run\n";
+print "  'ssh -k $USER\@scripts' and cd to the above directory.\n\n";
+press_enter;
+
+exit 0;
Index: branches/fc15-dev/locker/deploy/bin/scripts-chipmunkpoll
===================================================================
--- branches/fc15-dev/locker/deploy/bin/scripts-chipmunkpoll	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/scripts-chipmunkpoll	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="Chipmunk Poll"
+deploy="chipmunkpoll"
+prompt_username=1
+. /mit/scripts/deploy/bin$scriptsdev/install-onathena
Index: branches/fc15-dev/locker/deploy/bin/scripts-exponent
===================================================================
--- branches/fc15-dev/locker/deploy/bin/scripts-exponent	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/scripts-exponent	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+sname="Exponent"
+deploy="exponent"
+prompt_username=1
+. /mit/scripts/deploy/bin$scriptsdev/install-onathena
Index: branches/fc15-dev/locker/deploy/bin/trac
===================================================================
--- branches/fc15-dev/locker/deploy/bin/trac	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/trac	(revision 1803)
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+use Cwd;
+use File::Path;
+use URI::Escape;
+use DBI;
+use Config::IniFiles;
+
+setup();
+
+print "\nEnter the name of your project (the title of this Trac instance).\n";
+print "Project name: ";
+my $name=<STDIN>;
+chomp($name);
+
+my $dbh = DBI->connect("DBI:mysql:database=$sqldb;host=$sqlhost", $sqluser, $sqlpass, {RaiseError => 1});
+$dbh->do('alter database collate utf8_general_ci');
+
+my $dbstring = "mysql://" . uri_escape($sqluser) . ":" . uri_escape($sqlpass) . "\@$sqlhost/$sqldb";
+
+print "\nEnter the type of version-control repository this project uses.\n";
+print "You'll have to set up the repo yourself; feel free to ask scripts@ for help.\n";
+print "If you don't want version-control integration, take the default.\n";
+print "Repository type (default svn; also bzr, git, hg): ";
+my $repotype=<STDIN>;
+chomp($repotype);
+$repotype = $repotype ? $repotype : 'svn';
+
+print "\nEnter the path to the version-control repository.\n";
+print "If you don't want version-control integration, leave blank.\n";
+print "Path to repository: ";
+my $repopath=<STDIN>;
+chomp($repopath);
+
+print STDERR "running trac-admin:\n";
+system(qw(/usr/bin/trac-admin tracdata initenv),
+       $name, $dbstring, $repotype, $repopath);
+# XXX this exposes the SQL password on the command line
+
+#aka perl -pe 's/\@ADDREND\@/$addrend/g' <.htaccess.in >.htaccess
+open IN, '<.htaccess.in'; open OUT, '>.htaccess';
+while (<IN>) {
+    s/\@ADDREND\@/~$USER\/$addrend/g;
+    print OUT $_;
+}
+close IN; close OUT;
+
+my $cfg = Config::IniFiles->new(-file => 'tracdata/conf/trac.ini');
+$cfg->setval('trac', 'default_charset', 'utf-8');
+$cfg->AddSection('components');
+$cfg->newval('components', 'webadmin.*', 'enabled');
+$cfg->newval('components', 'tracext.git.*', 'enabled') if $repotype eq "git";
+$cfg->RewriteConfig();
+
+system(qw(/usr/bin/trac-admin tracdata permission add), $human, 'TRAC_ADMIN');
+
+chmod 0777, '.htaccess';
+unlink '.htaccess.in';
+
+open OUT, '>tracdata/.htaccess';
+print OUT "Deny from all\n";
+close OUT;
+chmod 0777, 'tracdata/.htaccess';
+
+exit 0;
Index: branches/fc15-dev/locker/deploy/bin/turbogears
===================================================================
--- branches/fc15-dev/locker/deploy/bin/turbogears	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/turbogears	(revision 1803)
@@ -0,0 +1,189 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+use Cwd;
+use File::Path;
+use URI::Escape;
+use DBI;
+use Config::IniFiles;
+use FileHandle;
+
+setup();
+
+print "\nEnter the name of your project (the title of this TurboGears instance).\n";
+my $name;
+while (1) {
+    print "Project name: ";
+    $name=<STDIN>;
+    chomp($name);
+    if ($name =~ /^[a-zA-Z][a-zA-Z0-9_ -]+$/) {
+	last;
+    }
+    print "Invalid project name; it should start with a letter and not contain\npunctuation other than dashes or underscores.\n";
+}	
+
+# quickstart turns spaces or underscores into dashes...
+$name =~ s/[ _-]+/-/g;
+
+my $defpack=lc($name);
+$defpack =~ s/[ -]/_/g;
+$defpack =~ s/[^a-z0-9_]//g;
+if (! ($defpack =~ /^[a-zA-Z]/)) {
+    $defpack = "p$defpack";
+}
+print "\nEnter the name for your project's python package.\n";
+my $pack;
+while (1) {
+    print "Package name [${defpack}]: ";
+    $pack=<STDIN>;
+    chomp($pack);
+    if (!($pack)) {
+	$pack=$defpack;
+	last;
+    } elsif ($pack =~ /^[a-zA-Z][a-zA-Z0-9_]+$/) {
+	last;
+    }
+    print "Invalid package name; it should start with a letter and contain only letters,\nnumbers, and underscores.\n";
+}
+
+print "\nWhat ORM (Object-Relational Mapper) do you want to use with this TurboGears\ninstance?  Select from the following list:\n";
+print "1. SQLAlchemy Elixir\n";
+print "2. SQLAlchemy\n";
+print "3. SQLObject\n";
+my $orm;
+while (1) {
+    print "ORM [1]: ";
+    my $ormnum=<STDIN>;
+    chomp($ormnum);
+    if ((!$ormnum) || $ormnum == 1) {
+	$orm = "elixir";
+	last;
+    } elsif ($ormnum == 2) {
+	$orm = "sqlalchemy";
+	last;
+    } elsif ($ormnum == 3) {
+	$orm = "sqlobject";
+	last;
+    }
+    print "Please choose 1, 2, or 3.\n";
+}
+
+print "\nWhat template do you want to use with this TurboGears instance?  Select from\nthe following list:\n";
+print "1. turbogears: normal template, recommended for most projects\n";
+print "2. tgbig:  a more complex directory structure for big projects\n";
+my $templ;
+while (1) {
+    print "Template [1]: ";
+    my $templnum=<STDIN>;
+    chomp($templnum);
+    if ((!$templnum) || $templnum == 1) {
+	$templ = "turbogears";
+	last;
+    } elsif ($templnum == 2) {
+	$templ = "tgbig";
+	last;
+    }
+    print "Please choose 1, 2, or 3.\n";
+}
+
+print "\nDo you want to use Identity (usernames/passwords) in this project?\n(These would be separate from Athena usernames/passwords.)\n";
+print "1. no identity: no logins, everyone sees the same pages\n";
+print "2. standard identity: users log in with site-specific usernames and passwords\n";
+#print "3. certificates: users are identified by their MIT certificates\n";
+my $ident;
+my $certpatch=0;
+while (1) {
+    print "Identity [1]: ";
+    my $identnum=<STDIN>;
+    chomp($identnum);
+    if ((!$identnum) || $identnum == 1) {
+	$ident = "no";
+	last;
+    } elsif ($identnum == 2) {
+	$ident = "yes";
+	last;
+    } elsif ($identnum == 3) {
+	$ident = "yes";
+	$certpatch = 1;
+	last;
+    }
+}
+
+open (FLUPCONF, ">flupconfig.py");
+print FLUPCONF <<EOF;
+code_dir = "/mit/$USER/Scripts/turbogears/$name/"
+project_name = "$name"
+package_name = "$pack"
+EOF
+close (FLUPCONF);
+
+system("ln","-s","/mit/$USER/Scripts/turbogears/$name/$pack","./$pack");
+system("ln","-s","/mit/$USER/Scripts/turbogears/$name/$pack/static",
+    "./static");
+
+chdir("/mit/$USER/Scripts/turbogears/");
+print "\nRunning tg-admin quickstart...\n";
+open(QS, "|/usr/bin/tg-admin quickstart $name --package=$pack --$orm --templates=$templ")
+    or die("tg-admin quickstart failed open!");
+QS->autoflush(1);
+print QS "$ident\n" or die("tg-admin quickstart failed specify ident!");
+close(QS) or die("tg-admin quickstart failed close!");
+
+# Put in the sqldb
+if ($orm eq "sqlobject") {
+    my $uriuser = uri_escape($sqluser);
+    my $uripass = uri_escape($sqlpass);
+    foreach my $fil (("$name/dev.cfg", "$name/sample-prod.cfg"))
+    {
+	open my $in, '<', $fil or die "Can't read old file: $!";
+	open my $out, '>', "$fil.new" or die "Can't write new file: $!";
+
+	while (<$in>) {
+	    s/^sqlobject\.dburi(.*)$/#sqlobject.dburi\2\nsqlobject.dburi="mysql:\/\/$uriuser:$uripass\@$sqlhost\/$sqldb"/;
+	    print $out $_;
+	}
+	close $out;
+	rename "$fil.new", $fil
+	    or die "Cannot rename: $!";
+    }
+} else {
+    system(qw(sed -ri),"s&^sql(alchemy|object)\.dburi(.*)\$&#sql\\1.dburi\\2\\nsql\\1.dburi=\"mysql://$sqlhost/$sqldb?read_default_file=~/.my.cnf\"&","$name/dev.cfg", "$name/sample-prod.cfg") == 0 or die "sed db failed!";
+}
+system(qw(sed -ri),'s/^#? *autoreload\.on.*$/autoreload.on = False # breaks the scripts flup setup/',"$name/dev.cfg") == 0 or die "sed autoreload failed!";
+my $addrendescsl = $addrend;
+$addrendescsl =~ s|/|\\/|g;
+# Obviated by a TurboGears upgrade
+#system(qw(sed -ri),'s/^(\[global\] *)$/\1\nserver.webpath = "\/'."$addrendescsl".'"/',"$name/dev.cfg") == 0 or die "sed webpath failed!";
+if ($orm eq "elixir" or $orm eq "sqlalchemy") {
+    system(qw(sed -ri),'s/^(\[global\] *)$/\1\nsqlalchemy.pool_recycle = 30 # Need a short timeout for sql.mit.edu/',"$name/$pack/config/app.cfg") == 0 or die "sed pool_recycle failed!";
+}
+
+# Make logdir
+system('mkdir','-p',"$name/log");
+
+# Cert patch
+if ($certpatch) {
+    # comment out the password = line in model
+    system(qw(sed -ri),
+	   's/^(.*password.*)$/#\1 -- we use certs, not passwords/',
+	   "$name/$pack/model.py") == 0 or die "sed model for certs failed!";
+    
+    # Stick cert.py in
+    system('cp',"/mit/scripts/deploy$scriptsdev/turbogears-certs/certs.py",
+	   "$name/$pack/") == 0 or die "cp certs.py failed!";
+    
+    # Add the certness to controllers.py
+    system(qw(sed -ri),
+	   's/^(from cherrypy.*)$/\1\nfrom '."$pack".'.certs import with_mit_certs/',
+	   "$name/$pack/controllers.py") == 0 or die "sed controllers import for certs failed!";
+    system(qw(sed -ri),
+	   's/^(\s+)(def login.*)$/\1@with_mit_certs\n\1\2',
+	   "$name/$pack/model.py") == 0 or die "sed model for certs failed!";
+    #-! replace login body
+    #-! replace logout body
+    #-! replace login.kid
+}
+
+exit 0;
Index: branches/fc15-dev/locker/deploy/bin/wordpress
===================================================================
--- branches/fc15-dev/locker/deploy/bin/wordpress	(revision 1803)
+++ branches/fc15-dev/locker/deploy/bin/wordpress	(revision 1803)
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+use strict;
+use FindBin qw($Bin);
+use lib $Bin;
+use onserver;
+use DBI;
+
+setup();
+
+fetch_uri(
+    'wp-admin/setup-config.php',
+    {step => 2},
+    {dbhost => $sqlhost,
+     uname => $sqluser,
+     dbname => $sqldb,
+     pwd => $sqlpass,
+     prefix => '',
+     submit => 'Submit',
+     step => 2});
+
+my $html = fetch_uri(
+    'wp-admin/install.php',
+    {step => 2},
+    {weblog_title => 'My Blog',
+     admin_email => $email,
+     submit => 'Continue',
+     step => 2});
+while ($html =~ /<code>(.*)<\/code>/g) {
+    $admin_username = $admin_password;
+    $admin_password = $1;
+}
+
+my $dbh = DBI->connect("dbi:mysql:database=$sqldb;host=$sqlhost", $sqluser, $sqlpass);
+$dbh->do("update wp_options set option_value = ? where option_name = 'siteurl'",
+         {}, "/~$USER/$addrend");
+$dbh->do("update wp_options set option_value = ? where option_name = 'home'",
+         {}, "http://$USER.$server/$addrend");
+$dbh->disconnect;
+
+print_login_info();
+print "You will also receive this login information at your MIT email address.\n";
+press_enter();
Index: branches/fc15-dev/locker/deploy/mediawiki-1.11.0/mediawiki-1.11.0.patch
===================================================================
--- branches/fc15-dev/locker/deploy/mediawiki-1.11.0/mediawiki-1.11.0.patch	(revision 1803)
+++ branches/fc15-dev/locker/deploy/mediawiki-1.11.0/mediawiki-1.11.0.patch	(revision 1803)
@@ -0,0 +1,24 @@
+diff -Nur mediawiki-1.11.0.old/AdminSettings.php mediawiki-1.11.0/AdminSettings.php
+--- mediawiki-1.11.0.old/AdminSettings.php	1969-12-31 19:00:00.000000000 -0500
++++ mediawiki-1.11.0/AdminSettings.php	2007-10-09 17:32:52.000000000 -0400
+@@ -0,0 +1,20 @@
++<?php
++/**
++ * On scripts.mit.edu, the user's sole account can be used
++ * both for regular operation of the wiki and for any
++ * maintenance.  Therefore, we just use the username and
++ * password already set in LocalSettings.php.
++ *
++ * @package MediaWiki
++ */
++          
++$wgDBadminuser      = $wgDBuser;
++$wgDBadminpassword  = $wgDBpassword;
++          
++/*
++ * Whether to enable the profileinfo.php script.
++ * (False is the default.)
++ */
++$wgEnableProfileInfo = false;
++          
++?>
Index: branches/fc15-dev/locker/deploy/mediawiki-1.5.6/mediawiki-1.5.6.patch
===================================================================
--- branches/fc15-dev/locker/deploy/mediawiki-1.5.6/mediawiki-1.5.6.patch	(revision 1803)
+++ branches/fc15-dev/locker/deploy/mediawiki-1.5.6/mediawiki-1.5.6.patch	(revision 1803)
@@ -0,0 +1,15 @@
+--- includes/Setup.php	Fri Aug 26 10:05:43 2005
++++ includes/Setup.php	Fri Sep 23 18:46:34 2005
+@@ -117,12 +117,6 @@
+ wfProfileOut( $fname.'-memcached' );
+ wfProfileIn( $fname.'-SetupSession' );
+ 
+-if ( $wgDBprefix ) {
+-	session_name( $wgDBname . '_' . $wgDBprefix . '_session' );
+-} else {
+-	session_name( $wgDBname . '_session' );
+-}
+-
+ if( !$wgCommandLineMode && ( isset( $_COOKIE[session_name()] ) || isset( $_COOKIE[$wgDBname.'Token'] ) ) ) {
+ 	User::SetupSession();
+ 	$wgSessionStarted = true;
Index: branches/fc15-dev/locker/deploy/mediawiki-1.5.8/mediawiki-1.5.8.patch
===================================================================
--- branches/fc15-dev/locker/deploy/mediawiki-1.5.8/mediawiki-1.5.8.patch	(revision 1803)
+++ branches/fc15-dev/locker/deploy/mediawiki-1.5.8/mediawiki-1.5.8.patch	(revision 1803)
@@ -0,0 +1,17 @@
+diff -uNr mediawiki-1.5.8/includes/Setup.php mw-scripts-158/includes/Setup.php
+--- includes/Setup.php	2006-02-11 02:26:47.000000000 -0500
++++ includes/Setup.php	2006-04-14 18:28:29.000000000 -0400
+@@ -118,11 +118,11 @@
+ wfProfileIn( $fname.'-SetupSession' );
+ 
+ if ( $wgDBprefix ) {
+-	$wgCookiePrefix = $wgDBname . '_' . $wgDBprefix;
++	$wgCookiePrefix = str_replace("+", "", $wgDBname . '_' . $wgDBprefix);
+ } elseif ( $wgSharedDB ) {
+ 	$wgCookiePrefix = $wgSharedDB;
+ } else {
+-	$wgCookiePrefix = $wgDBname;
++	$wgCookiePrefix = str_replace("+", "", $wgDBname);
+ }
+ 
+ session_name( $wgCookiePrefix . '_session' );
Index: branches/fc15-dev/locker/deploy/trac/Makefile
===================================================================
--- branches/fc15-dev/locker/deploy/trac/Makefile	(revision 1803)
+++ branches/fc15-dev/locker/deploy/trac/Makefile	(revision 1803)
@@ -0,0 +1,5 @@
+trac.tar.gz: trac
+	tar czf $@ trac
+
+install: trac.tar.gz
+	cp $^ ..
Index: branches/fc15-dev/locker/deploy/trac/trac.fcgi
===================================================================
--- branches/fc15-dev/locker/deploy/trac/trac.fcgi	(revision 1803)
+++ branches/fc15-dev/locker/deploy/trac/trac.fcgi	(revision 1803)
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+
+import os, os.path, sys
+from trac.web import fcgi_frontend
+import urlparse
+
+env_path = os.getcwd()+'/tracdata'
+os.environ['TRAC_ENV'] = env_path
+
+def send_upgrade_message(environ, start_response):
+    import pwd
+    start_response('500 Internal Server Error', [])
+    locker = pwd.getpwuid(os.getuid())[0]
+    return ['''This Trac instance needs to be upgraded.
+
+From an Athena machine, type
+  ssh %s@scripts trac-admin %s upgrade --no-backup
+  ssh %s@scripts trac-admin %s wiki upgrade
+to upgrade, and then
+  add scripts
+  for-each-server -l %s pkill trac.fcgi
+to get this message out of the way.
+
+Please ask the scripts.mit.edu maintainers for help
+if you have any trouble, at scripts@mit.edu.
+''' % (locker, env_path, locker, env_path, locker)]
+
+def setup_env():
+    '''Obtain the environment, handling the needs-upgrade check, and cache it.
+
+    This mimics open_environment in trac/env.py.'''
+    import trac.env
+    env = trac.env.Environment(env_path)
+    needs_upgrade = False
+    try:
+        needs_upgrade = env.needs_upgrade()
+    except Exception, e: # e.g. no database connection
+        env.log.exception(e)
+    if env.needs_upgrade():
+        fcgi_frontend._fcgi.WSGIServer(send_upgrade_message).run()
+        sys.exit(0)
+    if hasattr(trac.env, 'env_cache'):
+        trac.env.env_cache[env_path] = env
+setup_env()
+
+def my_dispatch_request(environ, start_response):
+    if ('REDIRECT_URL' in environ and 'PATH_INFO' in environ
+        and environ['REDIRECT_URL'].endswith(environ['PATH_INFO'])):
+        environ['SCRIPT_NAME'] = environ['REDIRECT_URL'][:-len(environ['PATH_INFO'])]
+
+    # If the referrer has our hostname and path, rewrite it to have
+    # the right protocol and port, too.  This lets the login link go
+    # to the right page.
+    if 'HTTP_REFERER' in environ:
+        referrer = urlparse.urlsplit(environ['HTTP_REFERER'])
+        base = urlparse.urlsplit(
+            ('https://' if environ.get('HTTPS') == 'on' else 'http://') +
+            environ['HTTP_HOST'] +
+            environ['SCRIPT_NAME'])
+        if referrer.hostname == base.hostname and \
+           (referrer.path == base.path or
+            referrer.path.startswith(base.path + '/')):
+            environ['HTTP_REFERER'] = urlparse.urlunsplit(
+                (base.scheme, base.netloc,
+                 referrer.path, referrer.query, referrer.fragment))
+
+    return fcgi_frontend.dispatch_request(environ, start_response)
+
+fcgi_frontend._fcgi.WSGIServer(my_dispatch_request).run()
Index: branches/fc15-dev/locker/deploy/trac/trac/.htaccess.in
===================================================================
--- branches/fc15-dev/locker/deploy/trac/trac/.htaccess.in	(revision 1803)
+++ branches/fc15-dev/locker/deploy/trac/trac/.htaccess.in	(revision 1803)
@@ -0,0 +1,19 @@
+AuthType SSLCert
+AuthSSLCertAuthoritative off
+AuthSSLCertVar SSL_CLIENT_S_DN_Email
+AuthSSLCertStripSuffix @MIT.EDU
+Require valid-user
+AuthOptional on
+
+RewriteEngine on
+
+RewriteCond %{HTTPS} =on
+RewriteRule ^logout http://%{SERVER_NAME}%{REQUEST_URI} [R,L]
+
+RewriteCond %{REQUEST_URI} !^/@ADDREND@/trac.fcgi
+RewriteRule ^(.*)$ /@ADDREND@/trac.fcgi/$1 [L]
+
+<Files login>
+AuthOptional off
+ErrorDocument 401 /__scripts/needcerts
+</Files>
Index: branches/fc15-dev/locker/deploy/trac/trac/trac.fcgi
===================================================================
--- branches/fc15-dev/locker/deploy/trac/trac/trac.fcgi	(revision 1803)
+++ branches/fc15-dev/locker/deploy/trac/trac/trac.fcgi	(revision 1803)
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /afs/athena.mit.edu/contrib/scripts/deploy/trac/trac.fcgi "$@"
Index: branches/fc15-dev/locker/doc/autoinstallers
===================================================================
--- branches/fc15-dev/locker/doc/autoinstallers	(revision 1803)
+++ branches/fc15-dev/locker/doc/autoinstallers	(revision 1803)
@@ -0,0 +1,63 @@
+-*- text -*-
+
+== How to update an autoinstaller to a new version of the upstream package ==
+
+Things to check beforehand:
+- Make sure /mit/scripts/deploydev is up to date from /mit/scripts/deploy (deploydev is not a svn checkout and is probably missing changes from deploy)
+
+Steps:
+# Example values
+PKG=wordpress
+NEWVERS=2.5.1
+OLDVERS=2.3.3
+URL=http://www.example.com/download/wordpress-2.5.1.tar.gz
+
+# Create a new directory in /mit/scripts/deploydev for the new version
+mkdir /mit/scripts/deploydev/$PKG-$NEWVERS
+
+# Copy any scripts patches to the new directory
+cp /mit/scripts/deploydev/$PKG-$OLDVERS/*.patch /mit/scripts/deploydev/$PKG-$NEWVERS/
+# Some scripts might have other files in here
+# Make sure the patch is still relevant for the current version of the package
+
+# Download the new package from the upstream site
+wget -O /mit/scripts/deploydev/$PKG-$NEWVERS/$PKG-$NEWVERS.tar.gz "$URL"
+
+# Update the symlink for the new package version
+cd /mit/scripts/deploydev && ln -nsf $PKG-$NEWVERS/$PKG-NEWVERS.tar.gz $PKG.tar.gz
+
+# Try an autoinstall
+ssh linerva -t env scriptsdev=dev athrun scripts
+
+# Fix any bugs that were introduced, probably in /mit/scripts/deploydev/bin/$PKG or /mit/scripts/bin/scripts-$PKG, or the patches
+
+# Commit your changes by moving them to /mit/scripts/deploy
+cp -a /mit/scripts/deploydev/$PKG-NEWVERS /mit/scripts/deploydev/$PKG.tar.gz /mit/scripts/deploy/
+
+# Test the new version from linerva and athena.dialup
+
+
+== How to generate an autoupdate ==
+
+cd /tmp
+# Use --dev if you haven't pushed to deploy yet
+/mit/scripts/sbin/propose-update --dev $PKG $OLDVERS $NEWVERS
+cd $PKG-$OLDVERS-to-$NEWVERS.proposal
+# If there is any custom setup that needs to be performed
+# (e.g. something in /mit/scripts/deploy/bin), do so to the
+# $PKG-$OLDVERS and $PKG-$NEWVERS directories, then do
+(cd .. && /mit/scripts/sbin/propose-update --redo-all --dev $PKG $OLDVERS $NEWVERS)
+# Look at the files that were generated to make sure they're sane
+# If necessary, add pre- and post- hooks, such as for a DB update script
+emacs extra/prepatch.sh
+emacs extra/postpatch.sh
+# Generate the patch
+cd ..
+# --dev here means to put the update in /mit/scripts/deploydev/updates
+/mit/scripts/sbin/build-update --dev $PKG $OLDVERS $NEWVERS
+# Test the update by running cd /mit/foo/web_scripts/bar && /mit/scripts/deploydev/updates/$PKG-#OLDVERS-to-$NEWVERS/update "foo"
+
+# If necessary, repeat this process. You can edit the files in the
+# $PKG-$OLDVERS and $PKG-$NEWVERS subdirectories of the proposal,
+# passing --redo-* options to propose-update as necessary to cause it
+# to regenerate the file lists from the subdirectories
Index: branches/fc15-dev/locker/doc/cluedump/AFS.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/AFS.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/AFS.tex	(revision 1803)
@@ -0,0 +1,65 @@
+\subsection{AFS}
+
+\begin{frame}
+  \frametitle{AFS access controls}
+  \begin{itemize}
+  \item AFS enforces server side access controls.
+  \item On Athena systems: user's password $\to$ Kerberos tickets
+    $\to$ AFS tokens, which authenticate the client to the AFS server.
+  \item On scripts, we don't have the user's password or tickets.
+  \item User's scripts are not publicly readable.
+  \item Access is controlled through a single {\tt daemon.scripts} AFS
+    user.
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{Isolating users on scripts}
+  \begin{itemize}
+  \item If all users share {\tt daemon.scripts} AFS tokens, how are
+    they prevented from accessing each other's {\tt web\_scripts}?
+  \item On scripts, we enforce additional restrictions in the AFS
+    kernel module.
+    \begin{itemize}
+    \item \texttt{afsAccessOK()} in
+      \texttt{openafs/src/afs/VNOPS/afs\_vnop\_access.c}
+      \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+  \only<1>{You can only use {\tt daemon.scripts} credentials to access
+    files in a volume with volume ID equal to your UID,}%
+  \only<2>{or the file is {\tt system:anyuser} readable
+    anyway,\vspace{\baselineskip}}%
+  \only<3>{or the {\tt apache} or {\tt postfix} users are doing a {\tt
+      stat()},\vspace{\baselineskip}}%
+  \only<4>{or the {\tt apache} user is trying to read a file with mode
+    {\tt 777},\vspace{\baselineskip}}%
+  \only<5>{or the {\tt root} or {\tt signup} users are accessing file
+    with the special {\tt D} or {\tt E} bits.}%
+
+\begin{footnotesize}
+\begin{semiverbatim}
+ int
+ afs_AccessOK(struct vcache *avc, afs_int32 arights,
+              struct vrequest *areq, afs_int32 check_mode_bits)
+ \{
+     \ldots
++    if (\alert<1>{!(areq->realuid == avc->fid.Fid.Volume)} &&
++        \alert<2>{!((avc->anyAccess | arights) == avc->anyAccess)} &&
++        \alert<3>{!(arights == PRSFS_LOOKUP && areq->realuid == HTTPD_UID) &&}
++        \alert<3>{!(arights == PRSFS_LOOKUP && areq->realuid == POSTFIX_UID)} &&
++        \alert<4>{!(arights == PRSFS_READ && areq->realuid == HTTPD_UID &&}
++        \alert<4>{  avc->m.Mode == 0100777)} &&
++        \alert<5>{!(PRSFS_USR3 == afs_GetAccessBits(avc, PRSFS_USR3, areq) &&}
++        \alert<5>{  areq->realuid == 0) &&}
++        \alert<5>{!(PRSFS_USR4 == afs_GetAccessBits(avc, PRSFS_USR4, areq) &&}
++        \alert<5>{  (areq->realuid == 0 || areq->realuid == SIGNUP_UID))}) \{
++       return 0;
++    \}
+     \ldots
+\end{semiverbatim}
+\end{footnotesize}
+\end{frame}
+
Index: branches/fc15-dev/locker/doc/cluedump/LDAP.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/LDAP.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/LDAP.tex	(revision 1803)
@@ -0,0 +1,17 @@
+\subsection{LDAP}
+
+\begin{frame}
+  \frametitle{LDAP data}
+
+  \begin{itemize}
+  \item All user-specific information is stored in LDAP records
+  \item Each scripts server runs a local LDAP daemon with multi-master
+    replication
+  \item Each user has a \texttt{posixAccount} and at least one
+    \texttt{apacheConfig} and \texttt{scriptsVhost}
+  \item Users can request additional virtual hosts
+  \item We hope to create a web interface (phase 1 of
+    ``scripts-pony'') for users to create virtual hosts in the
+    \texttt{*.user.scripts.mit.edu} namespace
+  \end{itemize}
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/LVS.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/LVS.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/LVS.tex	(revision 1803)
@@ -0,0 +1,22 @@
+\subsection{LVS}
+
+\begin{frame}
+  \frametitle{Linux Virtual Server}
+  \begin{itemize}
+    \item Provides high availability and load balancing
+    \item {\tt heartbeat} provides failover between LVS ``directors''
+    \item {\tt ldirectord} keeps track of online scripts servers and chooses destination server for each request
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{Load Balancing}
+  \begin{itemize}
+    \item Users are assigned to scripts servers based on IP
+    \item Works around bugs in scripts that assume a single web server
+  \end{itemize}
+  \begin{center}
+    \only<1>{\includegraphics[width=3in] {Aggregated-cps_www-year.png}}
+    \only<2>{\includegraphics[width=3in] {Aggregated-cps_www-year-clip.png}}
+  \end{center}
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/backend.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/backend.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/backend.tex	(revision 1803)
@@ -0,0 +1,1 @@
+\section{Backend}
Index: branches/fc15-dev/locker/doc/cluedump/closing.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/closing.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/closing.tex	(revision 1803)
@@ -0,0 +1,7 @@
+\section{Further Info}
+\begin{frame}
+  \frametitle{Further Info}
+  Subversion: {\tt svn://scripts.mit.edu/}
+  \\
+  Scripts Hackathon \\ Saturday, 2 PM, W20-557
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/contents.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/contents.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/contents.tex	(revision 1803)
@@ -0,0 +1,5 @@
+\begin{frame}
+  \frametitle{Outline}
+  \tableofcontents[pausesections]
+\end{frame}
+
Index: branches/fc15-dev/locker/doc/cluedump/httpdmods.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/httpdmods.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/httpdmods.tex	(revision 1803)
@@ -0,0 +1,50 @@
+\subsection{Apache modules}
+
+\begin{frame}[fragile]
+  \frametitle{Apache modules}
+  \begin{itemize}
+  \item We make it easy to do authentication against MIT certificates.
+  \item Both \texttt{https://scripts-cert.mit.edu}, and port
+    \texttt{444} on any scripts hostname, are configured to request
+    client certificates.
+  \item \texttt{mod\_ssl} provides the
+    \texttt{SSL\_CLIENT\_S\_DN\_Email} environment variable, but does
+    not integrate with the Apache authentication and authorization
+    framework.
+  \item Wrote a collection of Apache modules to make this cleaner.
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+  \frametitle{\texttt{mod\_auth\_sslcert}}
+  \begin{itemize}
+  \item \texttt{mod\_auth\_sslcert} passes the
+    \texttt{SSL\_CLIENT\_S\_DN\_Email} variable to the Apache
+    authorization handlers.
+  \end{itemize}
+\begin{semiverbatim}
+AuthType SSLCert
+AuthSSLCertVar SSL_CLIENT_S_DN_Email
+AuthSSLCertStripSuffix "@MIT.EDU"
+\end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+  \frametitle{\texttt{mod\_authz\_afsgroup}}
+  \begin{itemize}
+  \item \texttt{mod\_authz\_afsgroup} does Apache authorization based
+    on AFS groups.
+  \end{itemize}
+\begin{semiverbatim}
+Require afsgroup system:scripts-team
+\end{semiverbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+  \frametitle{\texttt{mod\_auth\_optional}}
+  \begin{itemize}
+  \item \texttt{mod\_auth\_optional} subverts the authorization
+    process to allow you to serve different pages to users with
+    certificates and users without certificates.
+  \end{itemize}
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/kerberos.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/kerberos.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/kerberos.tex	(revision 1803)
@@ -0,0 +1,47 @@
+\subsection{Kerberos}
+
+\begin{frame}
+  \frametitle{Group locker support}
+
+  \begin{itemize}
+  \item ``Users'' on scripts are actually lockers.
+  \item User IDs are actually locker volume IDs.
+    \pause
+  \item Kerberos is modified to let users SSH in as any locker they
+    administrate.
+    \begin{itemize}
+    \item Replaced the \texttt{.k5login} mechanism:
+      \texttt{krb5\_kuserok()} in
+      \texttt{krb5/src/lib/krb5/os/kuserok.c}
+    \item Calls a Perl script \texttt{/usr/local/sbin/admof} to do the
+      actual check.
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\begin{footnotesize}
+\begin{semiverbatim}
+ krb5_boolean KRB5_CALLCONV
+ krb5_kuserok(krb5_context context, krb5_principal principal,
+              const char *luser)
+ \{
+     \ldots
++    if ((pid = fork()) == -1) \{
++       free(princname);
++       return(FALSE);
++    \}
++    if (pid == 0) \{
++#define ADMOF_PATH "/usr/local/sbin/ssh-admof"
++        exec(ADMOF_PATH, ADMOF_PATH, (char *) luser, princname, NULL);
++        exit(1);
++    \}
++    if (waitpid(pid, &status, 0) > 0 && WIFEXITED(status) &&
++        WEXITSTATUS(status) == 33) \{
++        isok = TRUE;
++    \}
+     \ldots
+ \}
+\end{semiverbatim}
+\end{footnotesize}
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/services.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/services.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/services.tex	(revision 1803)
@@ -0,0 +1,89 @@
+\section{Services}
+
+\subsection{Web}
+\begin{frame}
+  \frametitle{Apache}
+  \begin{itemize}
+      \item Everyone wants Apache
+      \item Apache's default configuration isn't safe for scripting
+      \item Scripting \emph{requires} code execution---mod\_php, mod\_perl, mod\_python
+      \item Apache normally runs everything as apache/nobody
+      \item How to secure?
+      \pause
+      \item suEXEC---allows Apache to spawn a process as the user\ldots
+      \item {\ldots}even for static content!
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{suEXEC}
+  \begin{itemize}
+    \item setuid program
+    \item Passed the request by Apache
+    \item Verifies that the script is in the {\tt web\_scripts} directory
+    \item Switches to the uid of the file and executes
+    \item Even for static files!
+  \end{itemize}
+\end{frame}
+
+\subsection{Mail}
+
+\begin{frame}[fragile]
+  \frametitle{Postfix}
+  \begin{itemize}
+    \item Standard Postfix server
+    \item No local mailboxes
+    \item All mail is passed to procmail
+  \end{itemize}
+  \begin{verbatim}mailbox_command = /usr/bin/procmail -t \
+-a "${EXTENSION}" ~/mail_scripts/procmailrc\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]
+  \frametitle{procmail}
+  \begin{itemize}
+    \item Reads \verb|~/mail_scripts/procmailrc| from user's home directory
+    \item Users can do whatever they want with messages
+    \item AFS causes problems---No way to know if failure is temporary (file server is down) or permanent (user isn't signed up for mail scripts)
+    \item All procmail failures are treated as temporary, so mail is queued
+  \end{itemize}
+\end{frame}
+
+\subsection{Cron (``Shortjobs'')}
+
+\begin{frame}[fragile]
+  \frametitle{Cron (cronie)}
+  \begin{itemize}
+    \item Crontabs are currently stored locally on scripts servers
+    \item {\tt cronload} command loads the crontabs from
+      \verb|~/cron_scripts/crontab| \pause
+    \item Needs improvement
+    \item Cron does not fail over with Web and Mail
+    \item Plan to move crontabs into AFS and do hot failover
+  \end{itemize}
+\end{frame}
+
+\subsection{SQL}
+
+\begin{frame}
+  \frametitle{sql.mit.edu}
+  Though scripts.mit.edu makes use of sql.mit.edu, it's a separate SIPB service with different maintainers.
+\begin{itemize}
+\item sql.mit.edu provides MySQL databases to scripts users and anyone else
+\item SQL data is stored locally, replicated across multiple servers
+\item Nightly backups go into AFS
+\end{itemize}
+\end{frame}
+
+\subsection{Version control}
+
+\begin{frame}
+  \frametitle{SVN and Git hosting}
+  \begin{itemize}
+    \item New service (September 2008), not well documented
+    \item svn://\textit{username}.scripts.mit.edu/ and git://\textit{username}.scripts.mit.edu/
+    \item Uses suEXEC to run a svnserve / git-daemon as the user
+    \item /mit/\textit{username}/Scripts/\{svn,git\}
+    \item git:// is read-only, so future plans for svn+ssh:// and git+ssh://
+  \end{itemize}
+\end{frame}
Index: branches/fc15-dev/locker/doc/cluedump/slides.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/slides.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/slides.tex	(revision 1803)
@@ -0,0 +1,42 @@
+\documentclass{beamer}
+
+\mode<presentation>
+{ \usetheme{Copenhagen} }
+
+\AtBeginSection[]
+{
+   \begin{frame}
+       \frametitle{Outline}
+       \tableofcontents[currentsection]
+   \end{frame}
+}
+
+\usepackage{graphicx}
+
+\title{scripts.mit.edu}
+\author{Quentin Smith \and Geoffrey Thomas \\ \texttt{scripts@mit.edu}}
+\institute{Student Information Processing Board}
+\date{October 28, 2008}
+
+\begin{document}
+
+% Title slide - do not change
+\begin{frame}
+    \titlepage
+\end{frame}
+
+\include{contents}
+\include{services}
+
+\include{backend}
+
+\include{AFS}
+\include{suexec}
+\include{kerberos}
+\include{LDAP}
+\include{httpdmods}
+\include{LVS}
+
+\include{closing}
+
+\end{document}
Index: branches/fc15-dev/locker/doc/cluedump/standard-slide-include.sty
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/standard-slide-include.sty	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/standard-slide-include.sty	(revision 1803)
@@ -0,0 +1,137 @@
+% \pagestyle{empty} % no page numbers
+
+\addtolength{\topmargin}{-1.25in}
+\addtolength{\textheight}{2in}
+\frenchspacing % uniform spacing
+\hyphenpenalty=10000 % no hyphenation
+\rightskip=0pt plus1.4in % add some stretchy glue to right side
+
+%%% Make LaTeX stuff easier to typeset
+
+\def\cmd#1{{\tt $\backslash$#1}}
+
+%\def\example#1{\begin{tabular}{p{0.5\textwidth}p{0.5\textwidth}} #1 &%
+%\begin{verbatim}
+%#1
+%\end{verbatim} \end{tabular}}
+
+%\def\example#1{\verb @#1@}
+
+%%% Set up handling of titles for slides
+
+\newlength{\titl@wd} %% Length of title
+\newlength{\titl@rulewidth} %% Thickness of underlining
+\setlength{\titl@rulewidth}{0.15ex}
+
+\def\titlesize{\large}
+\def\textsize{\normalsize}
+
+\def\mktitle{\slidetitle}
+
+\def\slidetitle{\@ifstar{\@nocontentstitle}{\@contentstitle}}
+
+\def\@contentstitle#1{%
+  \addcontentsline{toc}{slide}{#1}%
+  \@nocontentstitle{#1}}
+
+\def\@nocontentstitle#1{{%Makes the title of the slide
+ \def\th@title{{\titlesize \bf #1}}
+ \settowidth{\titl@wd}{\th@title}
+ \flushleft\th@title\hspace{-\titl@wd}%This comment necessary for spacing
+ \rule[-.3\baselineskip]{\textwidth}{\titl@rulewidth}\hfil\par
+}}
+
+%%% Set up figure and table environments
+
+%% Some required counters
+\newcounter{fig@re}
+\setcounter{fig@re}{0}
+
+\newcounter{t@ble}
+\setcounter{t@ble}{0}
+
+%% The environments themselves
+\newenvironment{figure}
+               {\@floatimitator{fig@re}}
+               {}
+
+\newenvironment{table}
+                {\@floatimitator{t@ble}}
+                {}
+
+%% A macro to detect [] stuff
+\def\@floatimitator#1{%
+  \@ifnextchar[%
+    {\@xfloatimitator{#1}}% [] stuff present
+    {\@regfloatimitator{#1}}} % call different things depending on whether location specifier is present
+
+\def\@regfloatimitator#1{%
+  \stepcounter{#1}%
+  \def\caption##1{%
+    {\def\@currentlabel{\csname the#1\endcsname}%
+    \m@kecaption{\csname #1num\endcsname}{##1}}}}
+
+\def\@xfloatimitator#1[#2]{\@regfloatimitator{#1}}  % just ignore the [] stuff
+
+%% Caption starter definitions
+\def\fig@renum{\fig@rename~\thefig@re}
+\def\t@blenum{\t@blename~\thet@ble}
+
+\def\fig@rename{Figure}
+\def\t@blename{Table}
+
+%% Macro to make caption itself
+\long\def\m@kecaption#1#2{%
+  \vskip\abovecaptionskip
+  \sbox\@tempboxa{#1: #2}%
+  \ifdim \wd\@tempboxa >\hsize
+    #1: #2\par
+  \else
+    \global \@minipagefalse
+    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+  \fi
+  \vskip\belowcaptionskip}
+
+%% Some more lengths to control caption positioning
+\newlength{\abovecaptionskip}
+\setlength{\abovecaptionskip}{0pt}
+
+\newlength{\belowcaptionskip}
+\setlength{\belowcaptionskip}{0pt}
+
+
+%%% Label handling
+
+%% Fix the way labels are handled...
+\def\label#1{\@bsphack
+  \protected@write\@auxout{}%
+         {\string\newlabel{#1}{{\@currentlabel}{\theslide}}}%
+  \@esphack}
+
+%% define the standard label to just be slide
+\def\@currentlabel{\theslide}
+
+
+%% table of contents stuff
+\def\addcontentsline#1#2#3{%
+  \addtocontents{#1}{\protect\contentsline{#2}{#3}{\theslide}}}
+
+\newcommand\tableofcontents{%
+    \thispagestyle{empty}%
+    \addtocounter{slide}{-1}%
+    \slidetitle*{\contentsname
+        \@mkboth{%
+           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
+    \begingroup
+      \tiny
+        \@starttoc{toc}%
+    \endgroup
+    }
+
+\newcommand*\l@slide{\@dottedtocline{0}{1.5em}{2.3em}}
+
+\newcommand\contentsname{Contents}
+\newcommand\@pnumwidth{1.55em}
+\newcommand\@tocrmarg{2.55em}
+\newcommand\@dotsep{4.5}
+\setcounter{tocdepth}{0}
Index: branches/fc15-dev/locker/doc/cluedump/suexec.tex
===================================================================
--- branches/fc15-dev/locker/doc/cluedump/suexec.tex	(revision 1803)
+++ branches/fc15-dev/locker/doc/cluedump/suexec.tex	(revision 1803)
@@ -0,0 +1,96 @@
+\subsection{suEXEC}
+
+\begin{frame}
+  \frametitle{Serving static content}
+  \begin{itemize}
+  \item The \texttt{apache} user does not have permission to read the
+    user's files directly.
+  \item Both static and dynamic content is served through suEXEC.
+  \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile,t]
+  \begin{enumerate}
+  \item \texttt{/etc/httpd/conf.d/execsys.conf} is configured to serve
+    static content with the \texttt{cgi-script} handler.
+  \end{enumerate}
+\begin{footnotesize}
+\begin{semiverbatim}
+<Files *.pl>
+        SetHandler cgi-script
+        Options +ExecCGI
+</Files>
+<Files *.php>
+        SetHandler cgi-script
+        Options +ExecCGI
+</Files>
+\ldots
+<Files *.html>
+        SetHandler cgi-script
+        Options +ExecCGI
+</Files>
+<Files *.css>
+        SetHandler cgi-script
+        Options +ExecCGI
+</Files>
+\ldots
+\end{semiverbatim}
+\end{footnotesize}
+\end{frame}
+
+\begin{frame}[fragile,t]
+  \begin{enumerate}
+    \addtocounter{enumi}{1}
+  \item \texttt{openafs/src/afs/VNOPS/afs\_vnop\_access.c} is modified
+    to mark \emph{all} files as executable (!).
+  \end{enumerate}
+\begin{footnotesize}
+\begin{semiverbatim}
+ int
+ afs_access(OSI_VC_DECL(avc), register afs_int32 amode,
+            struct AFS_UCRED *acred)
+ \{
+     register afs_int32 code;
+     struct vrequest treq;
+     struct afs_fakestat_state fakestate;
+     OSI_VC_CONVERT(avc);
+ 
+     AFS_STATCNT(afs_access);
++    amode = amode & ~VEXEC;
+     afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
+                ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
+                ICL_HANDLE_OFFSET(avc->m.Length));
+     \ldots
+ \}
+\end{semiverbatim}
+\end{footnotesize}
+\end{frame}
+
+\begin{frame}[fragile,t]
+  \begin{enumerate}
+    \addtocounter{enumi}{2}
+  \item \texttt{httpd/support/suexec.c} is modified to dispatch static
+    content to \texttt{/usr/local/bin/static-cat}.
+  \end{enumerate}
+\begin{footnotesize}
+\begin{semiverbatim}
++#define STATIC_CAT_PATH "/usr/local/bin/static-cat"
++static const char *static_extensions[] = \{
++    "html",
++    "css",
++    \ldots
++\}
++
+ int main(int argc, char *argv[])
+ \{
+     \ldots
++    if (is_static_extension(cmd)) \{
++        argv[2] = STATIC_CAT_PATH;
++        execv(STATIC_CAT_PATH, &argv[2]);
++        log_err("(%d)%s: static_cat exec failed (%s)\\n", errno,
++                strerror(errno), argv[2]);
++        exit(255);
++    \}
+\end{semiverbatim}
+\end{footnotesize}
+\end{frame}
Index: branches/fc15-dev/locker/doc/object-identifiers
===================================================================
--- branches/fc15-dev/locker/doc/object-identifiers	(revision 1803)
+++ branches/fc15-dev/locker/doc/object-identifiers	(revision 1803)
@@ -0,0 +1,1 @@
+link /afs/sipb.mit.edu/admin/text/object-identifiers
Index: branches/fc15-dev/locker/doc/scripts-admin-use-policy
===================================================================
--- branches/fc15-dev/locker/doc/scripts-admin-use-policy	(revision 1803)
+++ branches/fc15-dev/locker/doc/scripts-admin-use-policy	(revision 1803)
@@ -0,0 +1,49 @@
+                                                                      2008-03-15
+                                                              amended 2008-08-05
+Policy on the Use of scripts.mit.edu Administrative Rights
+
+Users of scripts.mit.edu have a reasonable expectation that the data
+and code they store on our servers, and in sections of their locker
+accessible only by our servers, will not be improperly accessed or
+modified by anyone else, including by scripts.mit.edu maintainers.  To
+fulfill this expectation, we define a policy governing the
+maintainers’ use of special permissions and credentials held by our
+servers.  This includes any administrative access to the scripts
+servers, any use of private keys stored on the servers, and any use of
+scripts-specific permissions granted on locker directories.
+
+Such use of administrative rights shall only be permitted under any of
+the following circumstances.
+
+* Maintenance of the scripts.mit.edu service itself that is unrelated
+  to private user data.
+
+* Any access that is explicitly authorized by the owners of the data
+  in question.
+
+* Handling a user support request that cannot be satisfactorily answered
+  without resorting to using administrative rights. This access should
+  be restricted to only those files and resources that are strictly
+  necessary to fully answer the request.
+
+* Performing upgrades to autoinstalled software, using permissions
+  granted to the system:scripts-security-upd group.  This group is
+  normally empty, but the root instances of scripts maintainers will
+  be added when needed to perform upgrades, at the discretion of the
+  architect.
+
+* Modifications that are necessary for server security or reliability.
+  In this case, any modifications should be clearly marked and the
+  user should be contacted.
+
+* Ensuring that updates or planned updates to the scripts.mit.edu
+  service do not break existing user deployments.  In this case, any
+  modifications should be clearly marked and the user should be
+  contacted.
+
+[The third clause formerly read
+* Handling a user support request that can reasonably be considered an
+  implicit authorization for that use.  In this case, whenever
+  possible, any modifications should be reverted and the user should
+  be told how to make these modifications themselves.
+and was changed in August 2008.]
Index: branches/fc15-dev/locker/doc/scripts-decision-policy
===================================================================
--- branches/fc15-dev/locker/doc/scripts-decision-policy	(revision 1803)
+++ branches/fc15-dev/locker/doc/scripts-decision-policy	(revision 1803)
@@ -0,0 +1,131 @@
+                                                                      2007-07-07
+The Decision-Making Policy of the scripts.mit.edu Project:
+
+We, the creators of the scripts.mit.edu infrastructure, wish to define a
+policy for how decisions of the scripts.mit.edu project will be reached in
+order to avoid confusion on this subject among future contributors to the
+project.  We particularly want to avoid a situation in which the
+leadership of the project is unclear after we leave MIT.
+
+In general, we believe that all contributors to the project should have a
+say in how the service is run in approximate proportion to their
+contributions.  We furthermore believe that strong agreement among the
+project's principal contributors is highly important to the project's
+future, and so, whenever possible, the project's principal contributors
+should reach near-unanimous agreement about how the project should
+proceed.  Ultimately, the decisions of a project of this nature need to be
+made by the people who are making the project happen.
+
+Unfortunately, reaching unanimous agreement among all of the contributors
+to the project might not always be possible.  This document establishes
+two leadership positions for the scripts.mit.edu project in order to
+entrust decision-making authority to specific individuals.  These leaders
+are ultimately entrusted with the project, although they are expected to
+take significant pause before using their authority to end a disagreement
+before consensus of the principal contributors has been reached.  These
+leadership positions are based in part on the roles of "producer" and
+"director" described in Frederick P. Brooks' _The Mythical Man-Month_.
+
+The "scripts team leader" is an MIT student who:
+- "assembles the team, divides the work, and establishes the schedule"
+- "acquires and keeps on acquiring the necessary resources"
+- "establishes the pattern of communication and reporting within the team"
+- "ensures that the schedule is met, shifting resources and organization
+  in order to respond to changing circumstances"
+
+The team leader is responsible for ensuring that the project continues to
+make regular progress.  The team leader is entrusted with arbitrating
+decisions regarding the organization of the scripts team and the focus of
+its ongoing development efforts.  For example, the team leader may remove
+individuals from the project who are deemed to be having an overall
+negative influence on the project.
+
+The "scripts architect" is an MIT student who:
+- "provides unity and conceptual integrity to the whole design"
+- "serves as a limit to system complexity"
+- "invents solutions for [large-scale technical problems] or shifts the
+  system design as required"
+
+The architect is responsible for ensuring the technical quality of the
+scripts.mit.edu service.  The architect is entrusted with arbitrating
+decisions regarding the scope, design, and operation of the service.  As
+the guardian of the technical integrity of the service, the architect may
+arbitrate all decisions regarding the project's production hardware and
+software.
+
+Both positions may select their own replacement, and, in the case of a
+vacancy, either position may select a replacement for the other position.
+Before an individual assumes either position as a replacement, that
+individual should be confirmed for that position by the SIPB Executive
+Committee.  A single individual may hold both positions simultaneously if
+every individual who has significantly contributed to the project within
+the last one calendar year agrees.  Any objections must occur before the
+Executive Committee has confirmed the appointment.
+
+The creator of the scripts.mit.edu project, Jeff Arnold, will serve as the
+first team leader and architect.
+
+Any part of the scripts.mit.edu decision-making policy may be modified as
+necessary by agreement between the scripts team leader and the scripts
+architect.  When changing the scripts.mit.edu decision-making policy, as
+with any major decision, near-unanimous agreement among the project's
+principal contributors should ideally be reached.
+
+The scripts.mit.edu project is affiliated with SIPB, and while the project
+remains affiliated with SIPB, the project will follow appropriate SIPB
+procedures for projects.
+
+This policy should be distributed to contributors to the project so that
+they may decide not to contribute if they are dissatisfied with it.
+
+
+
+
+
+
+					    ____________________________________
+									jbarnold
+
+
+
+
+
+
+					    ____________________________________
+								        presbrey
+
+
+
+
+
+
+					    ____________________________________
+ 			     					        hartmans
+
+
+As contributors to the scripts.mit.edu project, we have contributed to
+the creation of this written decision-making policy and we fully support it.
+
+
+
+
+
+
+					    ____________________________________
+			     					         tabbott
+
+
+
+
+
+
+					    ____________________________________
+			     					         andersk
+
+
+
+
+
+
+					    ____________________________________
+			    					          geofft
Index: branches/fc15-dev/locker/doc/tickets/cnames.txt
===================================================================
--- branches/fc15-dev/locker/doc/tickets/cnames.txt	(revision 1803)
+++ branches/fc15-dev/locker/doc/tickets/cnames.txt	(revision 1803)
@@ -0,0 +1,87 @@
+HANDLING CNAME REQUESTS
+
+When someone e-mails scripts.mit.edu asking for a foo.mit.edu hostname:
+
+1. Check that the hostname is not currently in use. The commands
+     stella foo.mit.edu
+     athrun ops qy ghal foo.mit.edu \*
+   should both say the name is not in use. (The latter checks for aliases of
+   deleted or otherwise inactive hostnames that stella ignores.)
+
+   If the name is currently an alias of a name they own, make sure to forward
+   to jweiss the permission to move that name around.
+
+   If the name is the primary name of a machine they own, ask them what they
+   would like to rename the machine to, and make it clear that they'll need to
+   have another name associated with that IP address. Or (especially if the
+   machine doesn't ping) ask them to confirm they're no longer using that IP
+   address. If they're totally confused and keep insisting they want scripts
+   to serve that name, go ahead and tell them you'll rename the current foo to
+   foo-old.
+
+   If the name belongs to a deleted host on a dorm network, e-mail rccsuper to
+   reap it; they should do so quickly. If it belongs to an FSILG, e-mail
+   ht-$ILG-acl (ht-et-acl, ht-pika-acl, etc.) and ask nicely. If it belongs
+   to an academic network, they're not getting even deleted names back unless
+   they can negotiate with the current owner of the name.
+
+2. Check that they're requesting a scripts.mit.edu path that they control
+   (preferably, they'll give you a locker.scripts.mit.edu/something URL). If
+   they want a web.mit.edu path, you'll need to tell them to set up a redirect
+   according to http://scripts.mit.edu/faq/63/ in a directory in their
+   web_scripts, and ask them to tell us the directory. This doesn't block
+   requesting the hostname.
+
+   If they want something more outlandish, make sure they're not confused
+   before proceeding.
+
+   Confirm that they're signed up for scripts. http://locker.scripts.mit.edu/
+   should give something that isn't the "Account unknown" page.
+
+3. E-mail jweiss.
+   * Open the ticket in RT
+   * Click 'Comment' to the right of the body of the e-mail they sent
+   * CC: jweiss@mit.edu (Don't use "To:", there's a bug)
+   * Write something nice, preferably including the stella command line.
+   I typically use
+   Subject: scripts CNAME request: foo.mit.edu
+
+   At your convenience, please make foo.mit.edu an alias of scripts-vhosts.mit.edu.
+
+   stella scripts-vhosts -a foo
+       (or)
+   At your convenience, please move the alias foo.mit.edu from bar.mit.edu to
+     scripts-vhosts.mit.edu.
+
+   stella bar -d foo
+   stella scripts-vhosts -a foo
+       (or)
+   At your convenience, please rename the current host foo.mit.edu to
+   foo-old.mit.edu and mark it as deleted, and make foo.mit.edu an
+   alias of scripts-vhosts.mit.edu.
+
+   stella foo -S 3 -R foo-old
+   stella scripts-vhosts -a foo
+       (or)
+   If the request below is sufficient authorization, please remove....
+
+   * Set Status => Waiting and Blocking On => Moira
+
+   Occasionally jweiss is on vacation; generally he sets an auto-responder,
+   so you can just try emailing him and hoping, or ask him if he's around. If
+   not, see if zacheiss or cfox or computing-help will handle the requests.
+   (zacheiss has been willing to do them in the past.)
+
+4. Reply to the requestor (from either RT or your e-mail client), with
+   something like "We've forwarded the hostname request to IS&T; it should take
+   effect in 2-3 business days."
+
+5. After the name updates (jweiss replies, and DNS updates - which you can
+   check on -i dns), ask someone with root access to run
+
+   vhostadd foo.mit.edu
+
+6. Reply to the requestor again, and help them with stuff like MediaWiki URLs
+   or RewriteRules if they're having trouble.
+
+--geofft with minor edits by adehnert, last updated 2009-12-01
Index: branches/fc15-dev/locker/doc/tickets/rt.txt
===================================================================
--- branches/fc15-dev/locker/doc/tickets/rt.txt	(revision 1803)
+++ branches/fc15-dev/locker/doc/tickets/rt.txt	(revision 1803)
@@ -0,0 +1,49 @@
+RT TRICKS
+
+To edit stuff like ticket status, click "Basic" in the left.
+
+Note the multiple ways to search for tickets: you can click "All
+{new,open,waiting} Scripts Tickets" on the home page in the center, or
+"Scripts" on the right in the list of queues.
+
+You should take a look in "Preferences" at the left. Make sure "Notify
+yourself of own updates" is on. You can also set the "Default Working Queue"
+to Scripts, and give yourself a signature referring to scripts@mit.edu.
+
+Another useful option here is to set an RT passwordfor your account, so you
+don't need certs to log in (though it sometimes will keep asking you for
+your password on each page load if you don't have certs) and so you can use
+the zephyrbot).  The zephyrbot will take commands to
+-c scripts -i [ticket number] of the form /set status=resolved or
+/set owner=geofft.  You need to drop a file in
+/mit/geofft/web_scripts/rt/rt-passwords by your username with the format:
+
+"username" "yourawesomepassword"
+
+And then ask geofft (zwrite geofft) to restart the RT bot.
+
+Note that in the event that Geoff's account is compromised, it is possible
+for an attacker to use this password do manipulate tickets in *any*
+queue you have bits on, not just the Scripts one.
+
+The RT bot will post ticket notifications as -c scripts -i nnn.  If you are
+responding to a ticket, it is conventional to post "lock" to the appropriate
+instance, so others know not to pre-empt you.  You should post "unlock" once
+you are done handling the ticket.
+
+You can also place these commands on a line by themselves inside e-mail; they
+will be acted upon and removed before the e-mail gets sent back out.
+
+If you're adding a *comment* (such as when you're forwarding a cname request
+on to IS&T), don't use the 'To:' field, because it'll be clobbered by our
+RT scrips and the mail won't actually go to the destination you added.
+Instead, you should use the 'Cc:' field.  Similarly, if you're adding
+*correspondence*, the 'Cc:' field will be clobbered and you need to use
+the 'To:' field.
+
+Don't CC other RT queues, it doesn't work. If you really need to, use your
+e-mail client to forward it and remove the [help.mit.edu #nnn] tag.
+
+E-mail to scripts-comment that carries a [help.mit.edu #nnn] tag will be
+included in the ticket history for the scripts team to see, but will not be
+sent to the user. You can use this for asking "Help, what do I do here?"
Index: branches/fc15-dev/locker/sbin/build-update
===================================================================
--- branches/fc15-dev/locker/sbin/build-update	(revision 1803)
+++ branches/fc15-dev/locker/sbin/build-update	(revision 1803)
@@ -0,0 +1,155 @@
+#!/usr/bin/env perl
+
+use File::Spec::Functions qw(:ALL);
+use File::Copy;
+use File::Path;
+use Data::Dumper;
+use Getopt::Long;
+use Archive::Tar;
+use Cwd;
+use strict;
+use warnings;
+
+my $scriptsdev = "";
+
+GetOptions(
+#"redo-delete" => \$redodelete,
+#	   "redo-add" => \$redoadd,
+#	   "redo-replace" => \$redoreplace,
+#	   "redo-diff" => \$redodiff,
+#	   "redo-all" => sub {$redodelete = $redoadd = $redoreplace = $redodiff = 1;},
+	   "dev" => sub {$scriptsdev = "dev";},
+		  );
+
+if (@ARGV < 3) {
+  print STDERR "Usage: $0 package oldversion newversion\n";
+  exit(1);
+}
+
+my ($package, $oldversion, $newversion) = @ARGV;
+my ($old, $new, $updatename) = ($package.'-'.$oldversion, $package.'-'.$newversion, $package.'-'.$oldversion.'-to-'.$newversion);
+
+my $proposaldir = $updatename.".proposal";
+my $outdir = catdir("/mit/scripts/deploy$scriptsdev/updates/", $updatename);
+
+(-d $proposaldir) or die "Can't find $proposaldir, did you run propose-update?\n";
+((! -e $outdir) && mkdir($outdir)) or die "mkdir($outdir) failed: $!";
+
+my $olddir = catdir($proposaldir,$old);
+my $newdir = catdir($proposaldir,$new);
+(-d $olddir && -d $newdir) or die "Packages not unpacked?\n";
+
+sub readFileList($) {
+  my ($list) = @_;
+  open(LIST, $list) or die "Can't read $list: $!\n";
+  my @files = map { chomp; s|$newdir\/?||g; [split(' ', $_, 2)] } <LIST>;
+  close(LIST);
+  return @files;
+}
+
+my @todelete = readFileList(catfile($proposaldir, "files.delete"));
+my @toadd = readFileList(catfile($proposaldir, "files.add"));
+my @toreplace = readFileList(catfile($proposaldir, "files.replace"));
+
+open(CHECKMD5, ">", catfile($outdir, "check.md5")) or die "Can't open check.md5: $!";
+print CHECKMD5 map { join("  ", @{$_})."\n" } @todelete, @toreplace;
+close(CHECKMD5);
+
+open(ABSENT, ">", catfile($outdir, "oldfiles.absent")) or die "Can't open oldfiles.absent: $!";
+print ABSENT map { $_->[1]."\n" } @toadd;
+close(ABSENT);
+
+open(DELETE, ">", catfile($outdir, "files.delete")) or die "Can't open files.delete: $!";
+print DELETE map { $_->[1]."\n" } @todelete, @toreplace;
+close(DELETE);
+
+my $outfiletarball = catfile($outdir, "newfiles.tar.gz");
+my $cwd = getcwd();
+
+chdir($newdir);
+my $tar = Archive::Tar->new;
+$tar->add_files(map { $_->[1] } @toadd, @toreplace);
+$tar->write($outfiletarball, 1);
+chdir($cwd) or die "Couldn't chdir back to $cwd: $!\n";
+
+if (0) {
+    my $outfiledir = catdir($outdir, "newfiles");
+    (-d $outfiledir || mkdir($outfiledir)) or die "Can't mkdir($outfiledir)\n";
+    
+    foreach my $file (@toadd, @toreplace) {
+	my $filename = $file->[1];
+	my $src = catfile($newdir, $filename);
+	my $dest = catfile($outfiledir, $filename);
+	my (undef, $dir, undef) = splitpath($dest);
+	mkpath($dir);
+	copy($src, $dest) or die "Couldn't copy $filename from $src to $dest: $!";
+    }
+}
+
+copy(catfile($proposaldir, "update.diff"), catfile($outdir, "update.diff")) or die "Couldn't copy update.diff: $!";
+if (-d catdir($proposaldir, "extra")) {
+    system('cp', '-r', catdir($proposaldir, "extra"), $outdir) && die "Couldn't copy extra: $!";
+}
+
+open (SCRIPT, ">", catfile($outdir, "update")) or die "Couldn't write update: $!";
+printf SCRIPT <<'EOF', catfile("/afs/athena.mit.edu/contrib/scripts/deploy/", $old), catfile("/afs/athena.mit.edu/contrib/scripts/deploy/", $new);
+#!/bin/bash
+set -e -o noclobber
+
+die () { echo "[$PWD] die: $1" >&2; rm .scripts-security-upd-lock; exit 1; }
+aiee () { echo "[$PWD] AIEE: $1" >&2; exit 2; }
+
+patchdir=$(dirname "$0")
+lockername="${1:-$USER}"
+
+>.scripts-security-upd-lock || die "error: Unable to obtain update lock."
+
+packages=$(tail -1 .scripts-version)
+
+echo "[$PWD] begin dry run"
+
+found=""
+newpackages=""
+for package in $packages; do
+    if [ "$package" = "%s" ]; then
+    found="yes"
+    newpackages="$newpackages%s "
+    else
+    newpackages="$newpackages$package "
+    fi
+done
+
+[ "$found" = "yes" ] || die "error: Correct version not found."
+
+if [ -e "$patchdir/extra/prepatch.sh" ]; then
+  . "$patchdir/extra/prepatch.sh" || die "error: prepatch failed"
+fi
+
+[ -s "$patchdir/oldfiles.absent" ] && (xargs -n1 test ! -e <"$patchdir/oldfiles.absent" || die "error: Conflicting files exist." )
+[ -s "$patchdir/check.md5" ] && (md5sum -c "$patchdir/check.md5" || die "error: MD5 check failed.")
+patch -stN --dry-run --no-backup-if-mismatch -p2 <"$patchdir/update.diff" || die "error: Patch dry run failed."
+
+echo "[$PWD] dry run OK, applying update"
+
+mv .scripts-version .scripts-version.old || aiee "Failed to back up scripts-version"
+patch -stN --no-backup-if-mismatch -p2 <"$patchdir/update.diff" || aiee "patch did not apply"
+xargs rm -f <"$patchdir/files.delete" || aiee "Failed to remove files"
+/afs/athena.mit.edu/contrib/scripts/bin/gtar -xzf "$patchdir/newfiles.tar.gz" || aiee "Failed to extract new files"
+[ -e "$patchdir/extra/postpatch.sh" ] && . "$patchdir/extra/postpatch.sh"
+(
+    cat .scripts-version.old
+    echo
+    date "+%%F %%T %%z"
+    echo "$USER@$(hostname)"
+    echo "$patchdir"
+    echo "$newpackages"
+) >.scripts-version
+rm -f .scripts-version.old || aiee "Failed to remove .scripts-version.old"
+
+rm -f .scripts-security-upd-lock || aiee "Failed to remove .scripts-security-upd-lock"
+
+echo "[$PWD] done"
+
+exit 0
+EOF
+chmod 0755, catfile($outdir, "update");
Index: branches/fc15-dev/locker/sbin/check-ldap-cert.pl
===================================================================
--- branches/fc15-dev/locker/sbin/check-ldap-cert.pl	(revision 1803)
+++ branches/fc15-dev/locker/sbin/check-ldap-cert.pl	(revision 1803)
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+
+use strict;
+use File::Basename;
+use Date::Parse;
+use Sys::Hostname;
+
+my @servers = qw(localhost);
+
+my $hostname = hostname();
+
+my $now = time();
+
+my $dir = dirname($0);
+
+our $verbose = 0;
+$verbose = 1 if ($ARGV[0] eq "-v");
+
+use constant WARNING => 60*60*24*14; # Warn if a cert is expiring within 14 days
+
+foreach my $server (@servers) {
+  open(X509, "-|", "$dir/ssl-get-endtime", "$server:636") or die "Couldn't invoke ssl-get-endtime: $!";
+  chomp(my $exp = <X509>);
+  close(X509);
+  $exp =~ s/^notAfter=// or warn "Cert appears broken: $server";
+
+  my $time = str2time($exp);
+
+  if ($verbose || ($time - $now) <= WARNING) {
+    printf "$hostname: Certificate expiring in %.2f days: %s\n", (($time - $now) / (60.0*60*24)), $server;
+  }
+}
Index: branches/fc15-dev/locker/sbin/check-users
===================================================================
--- branches/fc15-dev/locker/sbin/check-users	(revision 1803)
+++ branches/fc15-dev/locker/sbin/check-users	(revision 1803)
@@ -0,0 +1,79 @@
+#!/bin/bash
+set -e
+
+err() {
+    echo "$@"
+}
+
+if [ -z "$1" ]; then
+    filter="objectClass=posixAccount"
+else
+    filter=
+    for user; do
+	filter="$filter(uid=$user)"
+    done
+    filter="(&(objectClass=posixAccount)(|$filter))"
+fi
+
+unset "${!l_@}"
+while read attr value; do
+    if [ -n "$attr" ]; then
+	declare "l_${attr%:}=$value"
+	continue
+    fi
+
+    read f_type f_data < <(hesinfo "$l_uid" filsys) || :
+    if [ -z "$f_type" ]; then
+	err "$l_uid" "no_hesiod"
+    elif [ "$f_type" = "ERR" ]; then
+	err "$l_uid" "hesiod_err ERR $f_data"
+    elif [ "$f_type" = "AFS" ]; then
+	read f_path f_perm f_link z \
+	    < <(echo "$f_data")
+	[ "$l_homeDirectory" = "$f_path" ] || \
+	    err "$l_uid" "hesiod_path $f_path"
+    else
+	err "$l_uid" "wrong_hesiod $f_type"
+    fi
+
+    IFS=/ read p_empty p_top p_cell p \
+	< <(echo "$l_homeDirectory")
+    [ -z "${p_empty}" ] || \
+	err "$l_uid" "relative_home $l_homeDirectory"
+    [ "${p_top}" = "afs" ] || \
+	err "$l_uid" "not_afs $l_homeDirectory"
+
+    read v_vname v_vol v \
+	< <(vos exa -noauth "$l_uidNumber" -cell "$p_cell" 2>/dev/null) || :
+    [ "$v_vol" = "$l_uidNumber" ] ||
+	err "$l_uid" "no_vol $l_uidNumber"
+
+    if ! [ -d "$l_homeDirectory" ]; then
+	if ! [ -e "$l_homeDirectory" ]; then
+	    err "$l_uid" "deleted $l_homeDirectory"
+	else
+	    err "$l_uid" "not_dir $l_homeDirectory"
+	fi
+    else
+	read c c_path c c c c_cell \
+	    < <(fs whichcell "$l_homeDirectory" 2>/dev/null) || :
+	[ "$c_path" = "$l_homeDirectory" ] || \
+	    err "$l_uid" "no_cell $l_homeDirectory"
+	[ "$c_cell" = "'$p_cell'" ] || \
+	    err "$l_uid" "wrong_cell $l_homeDirectory"
+
+	read m_path m m m m m m m_vname \
+	    < <(fs lsmount "$l_homeDirectory" 2>/dev/null) || :
+	[ "$m_path" = "'$l_homeDirectory'" ] || \
+	    err "$l_uid" "no_mount $l_homeDirectory"
+	[ "$m_vname" = "'#$v_vname'" ] || [ "$m_vname" = "'%$v_vname'" ] || \
+	    err "$l_uid" "wrong_mount $m_vname ($l_uidNumber = $v_vname)"
+    fi
+
+    unset "${!l_@}"
+done < <(
+    ldapsearch -LLL -x -D 'cn=Directory Manager' -y /etc/signup-ldap-pw \
+        -b ou=People,dc=scripts,dc=mit,dc=edu "$filter" \
+        uid uidNumber homeDirectory loginShell | \
+        perl -0pe 's/\n //g;'
+    )
Index: branches/fc15-dev/locker/sbin/commit-email.pl
===================================================================
--- branches/fc15-dev/locker/sbin/commit-email.pl	(revision 1803)
+++ branches/fc15-dev/locker/sbin/commit-email.pl	(revision 1803)
@@ -0,0 +1,840 @@
+#!/usr/bin/env perl
+
+# ====================================================================
+# This script is deprecated.  The Subversion developers recommend
+# using mailer.py for post-commit and post-revprop change
+# notifications.  If you wish to improve or add features to a
+# post-commit notification script, please do that work on mailer.py.
+# See http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/mailer .
+# ====================================================================
+
+# ====================================================================
+# commit-email.pl: send a notification email describing either a
+# commit or a revprop-change action on a Subversion repository.
+#
+# For usage, see the usage subroutine or run the script with no
+# command line arguments.
+#
+# This script requires Subversion 1.2.0 or later.
+#
+# $HeadURL: http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/commit-email.pl.in $
+# $LastChangedDate: 2009-05-12 13:25:35 -0400 (Tue, 12 May 2009) $
+# $LastChangedBy: blair $
+# $LastChangedRevision: 37715 $
+#
+# ====================================================================
+# Copyright (c) 2000-2006 CollabNet.  All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution.  The terms
+# are also available at http://subversion.tigris.org/license-1.html.
+# If newer versions of this license are posted there, you may use a
+# newer version instead, at your option.
+#
+# This software consists of voluntary contributions made by many
+# individuals.  For exact contribution history, see the revision
+# history and logs, available at http://subversion.tigris.org/.
+# ====================================================================
+
+# Turn on warnings the best way depending on the Perl version.
+BEGIN {
+  if ( $] >= 5.006_000)
+    { require warnings; import warnings; }
+  else
+    { $^W = 1; }
+}
+
+use strict;
+use Carp;
+use POSIX qw(strftime);
+my ($sendmail, $smtp_server);
+
+######################################################################
+# Configuration section.
+
+$ENV{'LC_ALL'} = 'en_US.UTF-8';
+
+# Sendmail path, or SMTP server address.
+# You should define exactly one of these two configuration variables,
+# leaving the other commented out, to select which method of sending
+# email should be used.
+# Using --stdout on the command line overrides both.
+$sendmail = "/usr/sbin/sendmail";
+#$smtp_server = "127.0.0.1";
+
+# Svnlook path.
+my $svnlook = "/usr/bin/svnlook";
+
+# By default, when a file is deleted from the repository, svnlook diff
+# prints the entire contents of the file.  If you want to save space
+# in the log and email messages by not printing the file, then set
+# $no_diff_deleted to 1.
+my $no_diff_deleted = 0;
+# By default, when a file is added to the repository, svnlook diff
+# prints the entire contents of the file.  If you want to save space
+# in the log and email messages by not printing the file, then set
+# $no_diff_added to 1.
+my $no_diff_added = 0;
+
+# End of Configuration section.
+######################################################################
+
+# Check that the required programs exist, and the email sending method
+# configuration is sane, to ensure that the administrator has set up
+# the script properly.
+{
+  my $ok = 1;
+  foreach my $program ($sendmail, $svnlook)
+    {
+      next if not defined $program;
+      if (-e $program)
+        {
+          unless (-x $program)
+            {
+              warn "$0: required program `$program' is not executable, ",
+                   "edit $0.\n";
+              $ok = 0;
+            }
+        }
+      else
+        {
+          warn "$0: required program `$program' does not exist, edit $0.\n";
+          $ok = 0;
+        }
+    }
+  if (not (defined $sendmail xor defined $smtp_server))
+    {
+      warn "$0: exactly one of \$sendmail or \$smtp_server must be ",
+           "set, edit $0.\n";
+      $ok = 0;
+    }
+  exit 1 unless $ok;
+}
+
+require Net::SMTP if defined $smtp_server;
+
+######################################################################
+# Initial setup/command-line handling.
+
+# Each value in this array holds a hash reference which contains the
+# associated email information for one project.  Start with an
+# implicit rule that matches all paths.
+my @project_settings_list = (&new_project);
+
+# Process the command line arguments till there are none left.
+# In commit mode: The first two arguments that are not used by a command line
+# option are the repository path and the revision number.
+# In revprop-change mode: The first four arguments that are not used by a
+# command line option are the repository path, the revision number, the
+# author, and the property name. This script has no support for the fifth
+# argument (action) added to the post-revprop-change hook in Subversion
+# 1.2.0 yet - patches welcome!
+my $repos;
+my $rev;
+my $author;
+my $propname;
+
+my $mode = 'commit';
+my $date;
+my $diff_file;
+
+# Use the reference to the first project to populate.
+my $current_project = $project_settings_list[0];
+
+# This hash matches the command line option to the hash key in the
+# project.  If a key exists but has a false value (''), then the
+# command line option is allowed but requires special handling.
+my %opt_to_hash_key = ('--from' => 'from_address',
+                       '--revprop-change' => '',
+                       '-d'     => '',
+                       '-h'     => 'hostname',
+                       '-l'     => 'log_file',
+                       '-m'     => '',
+                       '-r'     => 'reply_to',
+                       '-s'     => 'subject_prefix',
+                       '--summary' => '',
+                       '--diff' => '',
+                       '--stdout' => '');
+
+while (@ARGV)
+  {
+    my $arg = shift @ARGV;
+    if ($arg =~ /^-/)
+      {
+        my $hash_key = $opt_to_hash_key{$arg};
+        unless (defined $hash_key)
+          {
+            die "$0: command line option `$arg' is not recognized.\n";
+          }
+
+        my $value;
+        if ($arg ne '--revprop-change' and $arg ne '--stdout' and $arg ne '--summary')
+          {
+            unless (@ARGV)
+              {
+                die "$0: command line option `$arg' is missing a value.\n";
+              }
+            $value = shift @ARGV;
+          }
+
+        if ($hash_key)
+          {
+            $current_project->{$hash_key} = $value;
+          }
+        else
+          {
+            if ($arg eq '-m')
+              {
+                $current_project                = &new_project;
+                $current_project->{match_regex} = $value;
+                push(@project_settings_list, $current_project);
+              }
+            elsif ($arg eq '-d')
+              {
+                if ($mode ne 'revprop-change')
+                  {
+                    die "$0: `-d' is valid only when used after"
+                      . " `--revprop-change'.\n";
+                  }
+                if ($diff_file)
+                  {
+                    die "$0: command line option `$arg'"
+                      . " can only be used once.\n";
+                  }
+                $diff_file = $value;
+              }
+            elsif ($arg eq '--revprop-change')
+              {
+                if (defined $repos)
+                  {
+                    die "$0: `--revprop-change' must be specified before"
+                      . " the first non-option argument.\n";
+                  }
+                $mode = 'revprop-change';
+              }
+            elsif ($arg eq '--diff')
+              {
+                $current_project->{show_diff} = parse_boolean($value);
+              }
+            elsif ($arg eq '--stdout')
+              {
+                $current_project->{stdout} = 1;
+              }
+            elsif ($arg eq '--summary')
+              {
+                $current_project->{summary} = 1;
+              }
+            else
+              {
+                die "$0: internal error:"
+                  . " should not be handling `$arg' here.\n";
+              }
+          }
+      }
+    else
+      {
+        if (! defined $repos)
+          {
+            $repos = $arg;
+          }
+        elsif (! defined $rev)
+          {
+            $rev = $arg;
+          }
+        elsif (! defined $author && $mode eq 'revprop-change')
+          {
+            $author = $arg;
+          }
+        elsif (! defined $propname && $mode eq 'revprop-change')
+          {
+            $propname = $arg;
+          }
+        else
+          {
+            push(@{$current_project->{email_addresses}}, $arg);
+          }
+      }
+  }
+
+if ($mode eq 'commit')
+  {
+    &usage("$0: too few arguments.") unless defined $rev;
+  }
+elsif ($mode eq 'revprop-change')
+  {
+    &usage("$0: too few arguments.") unless defined $propname;
+  }
+
+# Check the validity of the command line arguments.  Check that the
+# revision is an integer greater than 0 and that the repository
+# directory exists.
+unless ($rev =~ /^\d+/ and $rev > 0)
+  {
+    &usage("$0: revision number `$rev' must be an integer > 0.");
+  }
+unless (-e $repos)
+  {
+    &usage("$0: repos directory `$repos' does not exist.");
+  }
+unless (-d _)
+  {
+    &usage("$0: repos directory `$repos' is not a directory.");
+  }
+
+# Check that all of the regular expressions can be compiled and
+# compile them.
+{
+  my $ok = 1;
+  for (my $i=0; $i<@project_settings_list; ++$i)
+    {
+      my $match_regex = $project_settings_list[$i]->{match_regex};
+
+      # To help users that automatically write regular expressions
+      # that match the root directory using ^/, remove the / character
+      # because subversion paths, while they start at the root level,
+      # do not begin with a /.
+      $match_regex =~ s#^\^/#^#;
+
+      my $match_re;
+      eval { $match_re = qr/$match_regex/ };
+      if ($@)
+        {
+          warn "$0: -m regex #$i `$match_regex' does not compile:\n$@\n";
+          $ok = 0;
+          next;
+        }
+      $project_settings_list[$i]->{match_re} = $match_re;
+    }
+  exit 1 unless $ok;
+}
+
+# Harvest common data needed for both commit or revprop-change.
+
+# Figure out what directories have changed using svnlook.
+my @dirschanged = &read_from_process($svnlook, 'dirs-changed', $repos,
+                                     '-r', $rev);
+
+# Lose the trailing slash in the directory names if one exists, except
+# in the case of '/'.
+my $rootchanged = 0;
+for (my $i=0; $i<@dirschanged; ++$i)
+  {
+    if ($dirschanged[$i] eq '/')
+      {
+        $rootchanged = 1;
+      }
+    else
+      {
+        $dirschanged[$i] =~ s#^(.+)[/\\]$#$1#;
+      }
+  }
+
+# Figure out what files have changed using svnlook.
+my @svnlooklines = &read_from_process($svnlook, 'changed', $repos, '-r', $rev);
+
+# Parse the changed nodes.
+my @adds;
+my @dels;
+my @mods;
+foreach my $line (@svnlooklines)
+  {
+    my $path = '';
+    my $code = '';
+
+    # Split the line up into the modification code and path, ignoring
+    # property modifications.
+    if ($line =~ /^(.).  (.*)$/)
+      {
+        $code = $1;
+        $path = $2;
+      }
+
+    if ($code eq 'A')
+      {
+        push(@adds, $path);
+      }
+    elsif ($code eq 'D')
+      {
+        push(@dels, $path);
+      }
+    else
+      {
+        push(@mods, $path);
+      }
+  }
+
+# Declare variables which carry information out of the inner scope of
+# the conditional blocks below.
+my $subject_base;
+my $subject_logbase;
+my @body;
+# $author - declared above for use as a command line parameter in
+#   revprop-change mode.  In commit mode, gets filled in below.
+
+if ($mode eq 'commit')
+  {
+    ######################################################################
+    # Harvest data using svnlook.
+
+    # Get the author, date, and log from svnlook.
+    my @infolines = &read_from_process($svnlook, 'info', $repos, '-r', $rev);
+    $author = shift @infolines;
+    $date = shift @infolines;
+    shift @infolines;
+    my @log = map { "$_\n" } @infolines;
+
+    ######################################################################
+    # Modified directory name collapsing.
+
+    # Collapse the list of changed directories only if the root directory
+    # was not modified, because otherwise everything is under root and
+    # there's no point in collapsing the directories, and only if more
+    # than one directory was modified.
+    my $commondir = '';
+    my @edited_dirschanged = @dirschanged;
+    if (!$rootchanged and @edited_dirschanged > 1)
+      {
+        my $firstline    = shift @edited_dirschanged;
+        my @commonpieces = split('/', $firstline);
+        foreach my $line (@edited_dirschanged)
+          {
+            my @pieces = split('/', $line);
+            my $i = 0;
+            while ($i < @pieces and $i < @commonpieces)
+              {
+                if ($pieces[$i] ne $commonpieces[$i])
+                  {
+                    splice(@commonpieces, $i, @commonpieces - $i);
+                    last;
+                  }
+                $i++;
+              }
+          }
+        unshift(@edited_dirschanged, $firstline);
+
+        if (@commonpieces)
+          {
+            $commondir = join('/', @commonpieces);
+            my @new_dirschanged;
+            foreach my $dir (@edited_dirschanged)
+              {
+                if ($dir eq $commondir)
+                  {
+                    $dir = '.';
+                  }
+                else
+                  {
+                    $dir =~ s#^\Q$commondir/\E##;
+                  }
+                push(@new_dirschanged, $dir);
+              }
+            @edited_dirschanged = @new_dirschanged;
+          }
+      }
+    my $dirlist = join(' ', @edited_dirschanged);
+
+    ######################################################################
+    # Assembly of log message.
+
+    if ($commondir ne '')
+      {
+        $subject_base = "r$rev - in $commondir: $dirlist";
+      }
+    else
+      {
+        $subject_base = "r$rev - $dirlist";
+      }
+    my $summary = @log ? $log[0] : '';
+    chomp($summary);
+    $subject_logbase = "r$rev - $summary";
+
+    # Put together the body of the log message.
+    push(@body, "Author: $author\n");
+    push(@body, "Date: $date\n");
+    push(@body, "New Revision: $rev\n");
+    push(@body, "\n");
+    if (@adds)
+      {
+        @adds = sort @adds;
+        push(@body, "Added:\n");
+        push(@body, map { "   $_\n" } @adds);
+      }
+    if (@dels)
+      {
+        @dels = sort @dels;
+        push(@body, "Removed:\n");
+        push(@body, map { "   $_\n" } @dels);
+      }
+    if (@mods)
+      {
+        @mods = sort @mods;
+        push(@body, "Modified:\n");
+        push(@body, map { "   $_\n" } @mods);
+      }
+    push(@body, "Log:\n");
+    push(@body, @log);
+    push(@body, "\n");
+  }
+elsif ($mode eq 'revprop-change')
+  {
+    ######################################################################
+    # Harvest data.
+
+    my @svnlines;
+    # Get the diff file if it was provided, otherwise the property value.
+    if ($diff_file)
+      {
+        open(DIFF_FILE, $diff_file) or die "$0: cannot read `$diff_file': $!\n";
+        @svnlines = <DIFF_FILE>;
+        close DIFF_FILE;
+      }
+    else
+      {
+        @svnlines = &read_from_process($svnlook, 'propget', '--revprop', '-r',
+                                       $rev, $repos, $propname);
+      }
+
+    ######################################################################
+    # Assembly of log message.
+
+    $subject_base = "propchange - r$rev $propname";
+
+    # Put together the body of the log message.
+    push(@body, "Author: $author\n");
+    push(@body, "Revision: $rev\n");
+    push(@body, "Property Name: $propname\n");
+    push(@body, "\n");
+    unless ($diff_file)
+      {
+        push(@body, "New Property Value:\n");
+      }
+    push(@body, map { /[\r\n]+$/ ? $_ : "$_\n" } @svnlines);
+    push(@body, "\n");
+  }
+
+# Cached information - calculated when first needed.
+my @difflines;
+
+# Go through each project and see if there are any matches for this
+# project.  If so, send the log out.
+foreach my $project (@project_settings_list)
+  {
+    my $match_re = $project->{match_re};
+    my $match    = 0;
+    foreach my $path (@dirschanged, @adds, @dels, @mods)
+      {
+        if ($path =~ $match_re)
+          {
+            $match = 1;
+            last;
+          }
+      }
+
+    next unless $match;
+
+    my @email_addresses = @{$project->{email_addresses}};
+    my $userlist        = join(' ', @email_addresses);
+    my $to              = join(', ', @email_addresses);
+    my $from_address    = $project->{from_address};
+    my $hostname        = $project->{hostname};
+    my $log_file        = $project->{log_file};
+    my $reply_to        = $project->{reply_to};
+    my $subject_prefix  = $project->{subject_prefix};
+    my $summary         = $project->{summary};
+    my $diff_wanted     = ($project->{show_diff} and $mode eq 'commit');
+    my $stdout          = $project->{stdout};
+
+    my $subject         = $summary ? $subject_logbase : $subject_base;
+    if ($subject_prefix =~ /\w/)
+      {
+        $subject = "$subject_prefix $subject";
+      }
+    my $mail_from = $author;
+
+    if ($from_address =~ /\w/)
+      {
+        $mail_from = $from_address;
+      }
+    elsif ($hostname =~ /\w/)
+      {
+        $mail_from = "$mail_from\@$hostname";
+      }
+    elsif (defined $smtp_server and ! $stdout)
+      {
+        die "$0: use of either `-h' or `--from' is mandatory when ",
+            "sending email using direct SMTP.\n";
+      }
+
+    my @head;
+    my $formatted_date;
+    if ($stdout)
+      {
+        $formatted_date = strftime('%a %b %e %X %Y', localtime());
+        push(@head, "From $mail_from $formatted_date\n");
+      }
+    $formatted_date = strftime('%a, %e %b %Y %X %z', localtime());
+    push(@head, "Date: $formatted_date\n");
+    push(@head, "To: $to\n");
+    push(@head, "From: $mail_from\n");
+    push(@head, "Subject: $subject\n");
+    push(@head, "Reply-to: $reply_to\n") if $reply_to;
+
+    ### Below, we set the content-type etc, but see these comments
+    ### from Greg Stein on why this is not a full solution.
+    #
+    # From: Greg Stein <gstein@lyra.org>
+    # Subject: Re: svn commit: rev 2599 - trunk/tools/cgi
+    # To: dev@subversion.tigris.org
+    # Date: Fri, 19 Jul 2002 23:42:32 -0700
+    #
+    # Well... that isn't strictly true. The contents of the files
+    # might not be UTF-8, so the "diff" portion will be hosed.
+    #
+    # If you want a truly "proper" commit message, then you'd use
+    # multipart MIME messages, with each file going into its own part,
+    # and labeled with an appropriate MIME type and charset. Of
+    # course, we haven't defined a charset property yet, but no biggy.
+    #
+    # Going with multipart will surely throw out the notion of "cut
+    # out the patch from the email and apply." But then again: the
+    # commit emailer could see that all portions are in the same
+    # charset and skip the multipart thang.
+    #
+    # etc etc
+    #
+    # Basically: adding/tweaking the content-type is nice, but don't
+    # think that is the proper solution.
+    push(@head, "Content-Type: text/plain; charset=UTF-8\n");
+    push(@head, "Content-Transfer-Encoding: 8bit\n");
+
+    push(@head, "\n");
+
+    if ($diff_wanted and not @difflines)
+      {
+        # Get the diff from svnlook.
+        my @no_diff_deleted = $no_diff_deleted ? ('--no-diff-deleted') : ();
+        my @no_diff_added = $no_diff_added ? ('--no-diff-added') : ();
+        @difflines = &read_from_process($svnlook, 'diff', $repos,
+                                        '-r', $rev, @no_diff_deleted,
+                                        @no_diff_added);
+        @difflines = map { /[\r\n]+$/ ? $_ : "$_\n" } @difflines;
+      }
+
+    if ($stdout)
+      {
+        print @head, @body;
+        print @difflines if $diff_wanted;
+      }
+    elsif (defined $sendmail and @email_addresses)
+      {
+        # Open a pipe to sendmail.
+        my $command = "$sendmail -f'$mail_from' $userlist";
+        if (open(SENDMAIL, "| $command"))
+          {
+            print SENDMAIL @head, @body;
+            print SENDMAIL @difflines if $diff_wanted;
+            close SENDMAIL
+              or warn "$0: error in closing `$command' for writing: $!\n";
+          }
+        else
+          {
+            warn "$0: cannot open `| $command' for writing: $!\n";
+          }
+      }
+    elsif (defined $smtp_server and @email_addresses)
+      {
+        my $smtp = Net::SMTP->new($smtp_server)
+          or die "$0: error opening SMTP session to `$smtp_server': $!\n";
+        handle_smtp_error($smtp, $smtp->mail($mail_from));
+        handle_smtp_error($smtp, $smtp->recipient(@email_addresses));
+        handle_smtp_error($smtp, $smtp->data());
+        handle_smtp_error($smtp, $smtp->datasend(@head, @body));
+        if ($diff_wanted)
+          {
+            handle_smtp_error($smtp, $smtp->datasend(@difflines));
+          }
+        handle_smtp_error($smtp, $smtp->dataend());
+        handle_smtp_error($smtp, $smtp->quit());
+      }
+
+    # Dump the output to logfile (if its name is not empty).
+    if ($log_file =~ /\w/)
+      {
+        if (open(LOGFILE, ">> $log_file"))
+          {
+            print LOGFILE @head, @body;
+            print LOGFILE @difflines if $diff_wanted;
+            close LOGFILE
+              or warn "$0: error in closing `$log_file' for appending: $!\n";
+          }
+        else
+          {
+            warn "$0: cannot open `$log_file' for appending: $!\n";
+          }
+      }
+  }
+
+exit 0;
+
+sub handle_smtp_error
+{
+  my ($smtp, $retval) = @_;
+  if (not $retval)
+    {
+      die "$0: SMTP Error: " . $smtp->message() . "\n";
+    }
+}
+
+sub usage
+{
+  warn "@_\n" if @_;
+  die "usage (commit mode):\n",
+      "  $0 REPOS REVNUM [[-m regex] [options] [email_addr ...]] ...\n",
+      "usage: (revprop-change mode):\n",
+      "  $0 --revprop-change REPOS REVNUM USER PROPNAME [-d diff_file] \\\n",
+      "    [[-m regex] [options] [email_addr ...]] ...\n",
+      "options are:\n",
+      "  -m regex              Regular expression to match committed path\n",
+      "  --from email_address  Email address for 'From:' (overrides -h)\n",
+      "  -h hostname           Hostname to append to author for 'From:'\n",
+      "  -l logfile            Append mail contents to this log file\n",
+      "  -r email_address      Email address for 'Reply-To:'\n",
+      "  -s subject_prefix     Subject line prefix\n",
+      "  --summary             Use first line of commit log in subject\n",
+      "  --diff y|n            Include diff in message (default: y)\n",
+      "                        (applies to commit mode only)\n",
+      "  --stdout              Spit the message in mbox format to stdout.\n",
+      "\n",
+      "This script supports a single repository with multiple projects,\n",
+      "where each project receives email only for actions that affect that\n",
+      "project.  A project is identified by using the -m command line\n".
+      "option with a regular expression argument.  If the given revision\n",
+      "contains modifications to a path that matches the regular\n",
+      "expression, then the action applies to the project.\n",
+      "\n",
+      "Any of the following email addresses and command line options\n",
+      "(other than -d) are associated with this project, until the next -m,\n",
+      "which resets the options and the list of email addresses.\n",
+      "\n",
+      "To support a single project conveniently, the script initializes\n",
+      "itself with an implicit -m . rule that matches any modifications\n",
+      "to the repository.  Therefore, to use the script for a single-\n",
+      "project repository, just use the other command line options and\n",
+      "a list of email addresses on the command line.  If you do not want\n",
+      "a rule that matches the entire repository, then use -m with a\n",
+      "regular expression before any other command line options or email\n",
+      "addresses.\n",
+      "\n",
+      "'revprop-change' mode:\n",
+      "The message will contain a copy of the diff_file if it is provided,\n",
+      "otherwise a copy of the (assumed to be new) property value.\n",
+      "\n";
+}
+
+# Return a new hash data structure for a new empty project that
+# matches any modifications to the repository.
+sub new_project
+{
+  return {email_addresses => [],
+          from_address    => '',
+          hostname        => '',
+          log_file        => '',
+          match_regex     => '.',
+          reply_to        => '',
+          subject_prefix  => '',
+          show_diff       => 1,
+          stdout          => 0};
+}
+
+sub parse_boolean
+{
+  if ($_[0] eq 'y') { return 1; };
+  if ($_[0] eq 'n') { return 0; };
+
+  die "$0: valid boolean options are 'y' or 'n', not '$_[0]'\n";
+}
+
+# Start a child process safely without using /bin/sh.
+sub safe_read_from_pipe
+{
+  unless (@_)
+    {
+      croak "$0: safe_read_from_pipe passed no arguments.\n";
+    }
+
+  my $openfork_available = $^O ne "MSWin32";
+  if ($openfork_available) # We can fork on this system.
+    {
+      my $pid = open(SAFE_READ, '-|');
+      unless (defined $pid)
+        {
+          die "$0: cannot fork: $!\n";
+        }
+      unless ($pid)
+        {
+          open(STDERR, ">&STDOUT")
+            or die "$0: cannot dup STDOUT: $!\n";
+          exec(@_)
+            or die "$0: cannot exec `@_': $!\n";
+        }
+    }
+  else  # Running on Windows.  No fork.
+    {
+      my @commandline = ();
+      my $arg;
+
+      while ($arg = shift)
+        {
+          $arg =~ s/\"/\\\"/g;
+          if ($arg eq "" or $arg =~ /\s/) { $arg = "\"$arg\""; }
+          push(@commandline, $arg);
+        }
+
+      # Now do the pipe.
+      open(SAFE_READ, "@commandline |")
+        or die "$0: cannot pipe to command: $!\n";
+    }
+  my @output;
+  while (<SAFE_READ>)
+    {
+      s/[\r\n]+$//;
+      push(@output, $_);
+    }
+  close(SAFE_READ);
+  my $result = $?;
+  my $exit   = $result >> 8;
+  my $signal = $result & 127;
+  my $cd     = $result & 128 ? "with core dump" : "";
+  if ($signal or $cd)
+    {
+      warn "$0: pipe from `@_' failed $cd: exit=$exit signal=$signal\n";
+    }
+  if (wantarray)
+    {
+      return ($result, @output);
+    }
+  else
+    {
+      return $result;
+    }
+}
+
+# Use safe_read_from_pipe to start a child process safely and return
+# the output if it succeeded or an error message followed by the output
+# if it failed.
+sub read_from_process
+{
+  unless (@_)
+    {
+      croak "$0: read_from_process passed no arguments.\n";
+    }
+  my ($status, @output) = &safe_read_from_pipe(@_);
+  if ($status)
+    {
+      return ("$0: `@_' failed with this output:", @output);
+    }
+  else
+    {
+      return @output;
+    }
+}
Index: branches/fc15-dev/locker/sbin/commit-zephyr
===================================================================
--- branches/fc15-dev/locker/sbin/commit-zephyr	(revision 1803)
+++ branches/fc15-dev/locker/sbin/commit-zephyr	(revision 1803)
@@ -0,0 +1,52 @@
+#!/bin/bash
+#
+# This is a script that can be called from a Subversion post-commit hook
+# to zephyr a summary of the commit or the full commit.
+#
+# Use by putting something like the following in hooks/post-commit:
+# REPOS="$1"
+# REV="$2"
+# /mit/snippets/svn-hooks/commit-zephyr "$REPOS" "$REV" -c scripts
+# /mit/snippets/svn-hooks/commit-zephyr "$REPOS" "$REV" --full -c scripts-auto -i commits
+
+export LC_ALL=en_US.UTF-8
+
+CLASS=test
+INSTANCE=@
+FULL=0
+
+OPTS=$(getopt -o c:i:f -l class:,instance:,full -n "$0" -- "$@") || exit $?
+eval set -- "$OPTS"
+while :; do
+    case "$1" in
+	-c|--class) CLASS=$2; shift 2;;
+	-i|--instance) INSTANCE=$2; shift 2;;
+	-f|--full) FULL=1; shift;;
+	--) shift; break;;
+	*) exit 1;;
+    esac
+done
+[ $# -ge 2 ] || exit 1
+REPOS=$1
+REV=$2
+
+if [ "$INSTANCE" = "${INSTANCE%@}@" ]; then
+    INSTANCE=${INSTANCE%@}r$REV
+fi
+
+dirs=$(svnlook dirs-changed "$REPOS" -r "$REV")
+svnlook info "$REPOS" -r "$REV" | (
+    read -r author
+    read -r datestamp
+    read -r logsize
+    log=$(cat)
+    echo "r$REV by $author $datestamp"
+    echo "$log"
+    svnlook changed "$REPOS" -r "$REV"
+    if [ "$FULL" -eq 1 ]; then
+	echo
+	svnlook diff "$REPOS" -r "$REV"
+    else
+	echo svnlook diff "$REPOS" -r "$REV"
+    fi
+) | zwrite -d -c "$CLASS" -i "$INSTANCE" -O "auto" -s "SVN: r$REV"
Index: branches/fc15-dev/locker/sbin/get-homedirs.sh
===================================================================
--- branches/fc15-dev/locker/sbin/get-homedirs.sh	(revision 1803)
+++ branches/fc15-dev/locker/sbin/get-homedirs.sh	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Run this as root on scripts.
+
+/usr/bin/ldapsearch -LLL -z 0 -b ou=People,dc=scripts,dc=mit,dc=edu -s one -x -D 'cn=Directory Manager' -y /etc/signup-ldap-pw '' cn homeDirectory | \
+	perl -0pe 's/\n //g; s/^dn: .*\ncn: (.*)\nhomeDirectory: (.*)\n\n/$1 $2\n/gm'
Index: branches/fc15-dev/locker/sbin/get-ldap-admins
===================================================================
--- branches/fc15-dev/locker/sbin/get-ldap-admins	(revision 1803)
+++ branches/fc15-dev/locker/sbin/get-ldap-admins	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+# This script can be run on or off of scripts
+ldapsearch -x -h scripts.mit.edu -b dc=scripts,dc=mit,dc=edu -LLL 'cn=Directory Administrators' uniqueMember
Index: branches/fc15-dev/locker/sbin/get-versions.pl
===================================================================
--- branches/fc15-dev/locker/sbin/get-versions.pl	(revision 1803)
+++ branches/fc15-dev/locker/sbin/get-versions.pl	(revision 1803)
@@ -0,0 +1,21 @@
+#!/usr/bin/perl
+
+system("/mit/scripts/sec-tools/get-passwd.sh");
+system("/mit/scripts/sec-tools/parallel-find.pl");
+sleep 5;
+
+while(1) {
+    my $count = `ps -ef | grep find | grep $ENV{USER} | grep -v ps | grep -v grep | wc -l | tr -d '\n'`;
+    if ($count eq '0') {
+	last;
+    }
+    else {
+	print "Current have $count find processes running.  Please wait.\n";
+	sleep 1;
+    }
+}
+
+print "Done finding files\n";
+system("cat /mit/scripts/sec-tools/store/versions/* >| /mit/scripts/sec-tools/store/scripts-versions");
+print "Done\n";
+#print `cat /mit/scripts/sec-tools/store/versions/`;
Index: branches/fc15-dev/locker/sbin/mail-owners.pl
===================================================================
--- branches/fc15-dev/locker/sbin/mail-owners.pl	(revision 1803)
+++ branches/fc15-dev/locker/sbin/mail-owners.pl	(revision 1803)
@@ -0,0 +1,53 @@
+#!/usr/athena/bin/perl
+
+use strict;
+
+use warnings;
+
+open LIST, "actual";
+
+open TEMPLATE, "wordpress-email";
+
+my $template = do {local $/; <TEMPLATE>};
+
+sub bits {
+    # Given the argument of a locker, return users with rlidwka rights
+    my $DIR = shift;
+    open PERM, "fs la $DIR | ";
+    my @list = (); #to be filled with users or moira lists
+    while (my $line = <PERM>){
+	if ($line =~ m{(\S+) \s rlidwka}x) {
+	    my $temp = $1;
+	    $temp =~ s/system://g;	    
+	    push @list, $temp;
+	}
+    }
+    return @list;
+}
+
+while (my $line = <LIST>) {
+    print $line;
+    if ($line =~ m{( (.*/ ([^/]+) ) /web_scripts/(\S+) )\s.*'([.0-9]+)'}x) {  
+	my $PATH = $1;
+	#print $PATH;
+	my $DIR = $2;
+	my $LOCKER = $3;
+	my $URI = "$3.scripts.mit.edu/$4";
+	my $VERSION = $5;
+	next if $VERSION ne '2.0.2';
+	my $lockeremail = $template;
+	$lockeremail =~ s/<LOCKER>/$LOCKER/g;
+	$lockeremail =~ s/<URI>/$URI/g;
+	$lockeremail =~ s/<DIRECTORY>/$PATH/g;
+	$lockeremail =~ s/<VERSION>/$VERSION/g;
+	$lockeremail = "To: ".join(',',&bits($DIR))."\n\n".$lockeremail; 
+	open OUTPUT, ">./email/$LOCKER";
+	print OUTPUT $lockeremail; 
+    }
+}
+
+
+
+
+
+
Index: branches/fc15-dev/locker/sbin/parallel-find.pl
===================================================================
--- branches/fc15-dev/locker/sbin/parallel-find.pl	(revision 1803)
+++ branches/fc15-dev/locker/sbin/parallel-find.pl	(revision 1803)
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+
+# Script to help generate find the .scripts-version files
+
+use LockFile::Simple qw(trylock unlock);
+use File::stat;
+
+use lib '/mit/scripts/sec-tools/perl';
+
+open(FILE, "</mit/scripts/sec-tools/store/scriptslist");
+my $dump = "/mit/scripts/sec-tools/store/versions";
+my $dumpbackup = "/mit/scripts/sec-tools/store/versions-backup";
+
+# try to grab a lock on the version directory
+trylock($dump) || die "Can't acquire lock; lockfile already exists at <$dump.lock>.  Another parallel-find may be running.  If you are SURE there is not, remove the lock file and retry.";
+
+sub unlock_and_die ($) {
+    my $msg = shift;
+    unlock($dump);
+    die $msg;
+}
+
+# if the versions directory exists, move it to versions-backup
+# (removing the backup directory if necessary).  Then make a new copy.
+if (-e $dump){
+    if (-e $dumpbackup){
+        system("rm -rf $dumpbackup") && unlock_and_die "Can't remove old backup directory $dumpbackup";
+    }
+    system("mv", $dump, $dumpbackup) && unlock_and_die "Unable to back up current directory $dump";
+}
+system("mkdir", $dump) && unlock_and_die "mkdir failed to create $dump";
+
+use Proc::Queue size => 40, debug => 0, trace => 0;
+use POSIX ":sys_wait_h"; # imports WNOHANG
+
+# this loop creates new childs, but Proc::Queue makes it wait every
+# time the limit (50) is reached until enough childs exit
+
+# Note that we miss things where one volume is inside another if we
+# use -xdev.  May miss libraries stuff.
+
+sub updatable ($) {
+    my $filename = shift;
+    for my $l (`fs la "$filename"`) {
+        return 1 if ($l =~ /^  system:scripts-security-upd rlidwk/);
+    }
+    return 0;
+}
+
+sub old_version ($) {
+    my $dirname = shift;
+    open my $h, "$dirname/.scripts-version";
+    chomp (my $v = (<$h>)[-1]);
+    return $v;
+}
+
+sub version ($) {
+    my $dirname = shift;
+    $uid = stat($dirname)->uid;
+    open my $h, "sudo -u#$uid git --git-dir=$dirname/.git describe --tags --always 2>/dev/null |";
+    chomp($val = <$h>);
+    if (! $val) {
+        print "Failed to read value for $dirname\n"
+    }
+    return $val;
+}
+
+sub find ($$) {
+    my $user = shift;
+    my $homedir = shift;
+
+    open my $files, "find $homedir/web_scripts -xdev -name .scripts-version -o -name .scripts 2>/dev/null |";
+    open my $out, ">$dump/$user";
+    while (my $f = <$files>) {
+        chomp $f;
+        my $new_style;
+        $new_style = ($f =~ s!/\.scripts$!!);
+        if (! $new_style) {
+            $f =~ s!/\.scripts-version$!!;
+            # Don't use .scripts-version of .scripts is around!
+            if (-d "$f/.scripts") {
+                next;
+            }
+        }
+        if (! updatable($f)) {
+            print STDERR "not updatable: $f";
+            next;
+        }
+        $v = $new_style ? version($f) : old_version($f);
+        print $out "$f:$v\n";
+    }
+    return 0;
+}
+
+while (<FILE>) {
+    my ($user, $homedir) = /^([^ ]*) (.*)$/;
+    my $f=fork;
+    if(defined ($f) and $f==0) {
+        if ($homedir !~ m|^/afs/athena| && $homedir !~ m|^/afs/sipb| && $homedir !~ m|^/afs/zone|) {
+            print "ignoring foreign-cell $user $homedir\n";
+            exit(0);
+        }
+        print "$user\n";
+        $ret = find($user, $homedir);
+        sleep rand 1;
+        exit($ret);
+    }
+    1 while waitpid(-1, WNOHANG)>0; # avoids memory leaks in Proc::Queue
+}
+
+unlock($dump);
+1;
Index: branches/fc15-dev/locker/sbin/propose-update
===================================================================
--- branches/fc15-dev/locker/sbin/propose-update	(revision 1803)
+++ branches/fc15-dev/locker/sbin/propose-update	(revision 1803)
@@ -0,0 +1,173 @@
+#!/usr/athena/bin/perl
+
+use File::Spec::Functions;
+use Data::Dumper;
+use Getopt::Long;
+use Cwd;
+
+my ($redodelete, $redoadd, $redoreplace, $redodiff) = (0,0,0,0);
+
+my $scriptsdev = "";
+
+GetOptions("redo-delete" => \$redodelete,
+	   "redo-add" => \$redoadd,
+	   "redo-replace" => \$redoreplace,
+	   "redo-diff" => \$redodiff,
+	   "redo-all" => sub {$redodelete = $redoadd = $redoreplace = $redodiff = 1;},
+	   "dev" => sub {$scriptsdev = "dev";},
+		  );
+
+if (@ARGV < 3) {
+  print STDERR "Usage: $0 [--redo-{delete|add|replace|diff|all}] [--dev] package oldversion newversion\n";
+  exit(1);
+}
+
+my ($package, $oldversion, $newversion) = @ARGV;
+my ($old, $new, $updatename) = ($package.'-'.$oldversion, $package.'-'.$newversion, $package.'-'.$oldversion.'-to-'.$newversion);
+
+my $outdir = $updatename.".proposal";
+
+(-d $outdir || mkdir($outdir)) or die "mkdir($outdir) failed: $!";
+
+my $olddir = catdir($outdir,$old);
+my $newdir = catdir($outdir,$new);
+
+unpackPackage($old, $olddir);
+unpackPackage($new, $newdir);
+
+sub unpackPackage($$) {
+  my ($package, $dir) = @_;
+  print STDERR "Extracting $package to $dir... ";
+  if (-d $dir) {
+    warn "$dir already exists; assuming unpacking was successful";
+    return;
+  }
+  mkdir($dir) or die "mkdir($dir) failed: $!";
+  my $cwd = cwd();
+  chdir($dir) or die $!;
+  `athrun scripts gtar zxf "/mit/scripts/deploy$scriptsdev/$package/$package.tar.gz"`;
+  if ($?) { chdir($cwd); system("rmdir", "$dir"); die "Failed to unpack $package.tar.gz: $?"; }
+  my @files=`athrun scripts gfind . -mindepth 1 -maxdepth 1 | grep -v .admin`;
+  if (@files <= 1) {
+    `athrun scripts gfind . -mindepth 2 -maxdepth 2 -exec mv {} . \\;`;
+    rmdir($files[0]);
+  }
+  chdir($cwd) or die "Couldn't return to $cwd";
+  print "done.\n";
+}
+
+my @oldfiles = sort { $a->[1] cmp $b->[1] } map { chomp; s|$olddir\/?||g; [split(' ', $_, 2)] } `athrun scripts gfind $olddir -type f -exec md5sum {} \\;`;
+#print Dumper(\@oldfiles);
+my @newfiles = sort { $a->[1] cmp $b->[1] } map { chomp; s|$newdir\/?||g; [split(' ', $_, 2)] } `athrun scripts gfind $newdir -type f -exec md5sum {} \\;`;
+#print Dumper(\@newfiles);
+
+sub compareDirectories($$) {
+  my ($alist, $blist) = @_;
+  my @a = @$alist;
+  my @b = @$blist;
+  my @aonly, @bonly, @both;
+  $a = $b = 0;
+  my $debug = 0;
+  local $Data::Dumper::Indent = 0;
+  while ($a <= $#a || $b <= $#a) {
+    my $fa = $a[$a];
+    my $fb = $b[$b];
+    print STDERR "Comparing ".Dumper($fa, $fb)."\n" if $debug;
+    if ($fa->[1] eq $fb->[1]) { # Same file exists on both
+      print STDERR "Same file\n" if $debug;
+      if ($fa->[0] ne $fb->[0]) { # File has changed in some way
+	print STDERR "Different md5, pushing on \@both\n" if $debug;
+	push(@both, [$fa->[1], $fa, $fb]);
+      }
+      $a++; $b++; # increment both counters
+    } else {
+      my $a2 = $a;
+      while ($a2 <= $#a && $a[$a2]->[1] lt $fb->[1]) {
+	$a2++;
+      }
+      if ($a2 <= $#a && $a[$a2]->[1] eq $fb->[1]) {
+	for my $i ($a..$a2-1) {
+	  push @aonly, $a[$i];
+	}
+	$a = $a2;
+      } else {
+	my $b2 = $b;
+	while ($b2 <= $#b && $b[$b2]->[1] lt $fa->[1]) {
+	  $b2++;
+	}
+	if ($b2 <= $#b && $b[$b2]->[1] eq $fa->[1]) {
+	  for my $i ($b..$b2-1) {
+	    push @bonly, $b[$i];
+	  }
+	  $b = $b2;
+	} else {
+	  push @aonly, $a[$a];
+	  push @bonly, $b[$b];
+	  $a++; $b++;
+	}
+      }
+    }
+  }
+  return (\@aonly, \@bonly, \@both);
+}
+
+my (@todelete, @toadd, @changed);
+my @comp = compareDirectories(\@oldfiles, \@newfiles);
+open(DIFF, ">", catfile($outdir, "diff.pl"));
+print DIFF Dumper(@comp);
+close(DIFF);
+@todelete = @{$comp[0]};
+@toadd = @{$comp[1]};
+@changed = @{$comp[2]};
+
+if ($redodelete or ! -e catfile($outdir, "files.delete")) {
+	open(TODELETE, ">", catfile($outdir, "files.delete")) or die "Can't open files.delete: $!";
+	foreach my $file (@todelete) {
+	  printf TODELETE "%s %s\n", $file->[0], $file->[1];
+	}
+	close(TODELETE);
+	printf "Wrote %d filenames to files.delete\n", scalar(@todelete);
+} else { printf "Not overwriting existing files.delete\n"; }
+
+if ($redoadd or ! -e catfile($outdir, "files.add")) {
+	open(TOADD, ">", catfile($outdir, "files.add")) or die "Can't open files.add: $!";
+	foreach my $file (@toadd) {
+	  printf TOADD "%s %s\n", $file->[0], $file->[1];
+	}
+	close(TOADD);
+	printf "Wrote %d filenames to files.add\n", scalar(@toadd);
+} else { printf "Not overwriting existing files.add\n"; }
+
+my @toreplace;
+my @topatch;
+
+foreach my $file (@changed) {
+	if (-B catdir($newdir, $file->[0])) {
+		push (@toreplace, $file);
+	} else {
+		push (@topatch, $file);
+	}
+}
+
+if ($redoreplace or ! -e catfile($outdir, "files.replace")) {
+	open(TOREPLACE, ">", catfile($outdir, "files.replace")) or die "Can't open files.replace: $!";
+	foreach my $file (@toreplace) {
+		printf TOREPLACE "%s %s\n", $file->[1][0], $file->[0];
+	}
+	close(TOREPLACE);
+	printf "Wrote %d filenames to files.replace\n", scalar(@toreplace);
+} else { printf "Not overwriting existing files.replace\n"; }
+
+if ($redodiff or ! -e catfile($outdir, "update.diff")) {
+    open(DIFF, ">", catfile($outdir, "update.diff")) or die "Can't open update.diff: $!";
+    foreach my $file (@topatch) {
+	my $filename = $file->[0];
+	my $oldfile = catfile($olddir, $file->[1][1]);
+	my $newfile = catfile($newdir, $file->[2][1]);
+	my $cmd = "diff -urN $oldfile $newfile";
+	print DIFF "$cmd\n";
+	print DIFF `$cmd`;
+    }
+    close(DIFF);
+    printf "Wrote %d diffs to update.diff\n", scalar(@topatch);
+} else { printf "Not overwriting existing update.patch\n"; }
Index: branches/fc15-dev/locker/sbin/rpm-master.sh
===================================================================
--- branches/fc15-dev/locker/sbin/rpm-master.sh	(revision 1803)
+++ branches/fc15-dev/locker/sbin/rpm-master.sh	(revision 1803)
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+echo "Entering correct directory..."
+mkdir -p /mit/scripts/cron_scripts/rpm-sync/
+cd /mit/scripts/cron_scripts/rpm-sync/
+
+echo "Cleaning up environment..."
+rm -rf *.rpmlist *.diff rpmlist.master missing.rpms
+
+servers=`finger @scripts-director.mit.edu | grep "\->" | grep EDU | awk '{print $2}' | cut -d: -f1 | sort | uniq`
+
+for server in $servers; do
+    echo "Connecting to $server..."
+    { ssh $server /mit/scripts/sbin/rpmlist.sh 2>&1 >&3 | grep -Fxv 'If you have trouble logging in, see http://scripts.mit.edu/faq/41/.'; } 3>&1 >&2
+done
+
+echo "Creating master package list..."
+cat *.rpmlist | sort | uniq > rpmlist.master
+
+echo "Comparing scripts servers to overall rpm list..."
+touch missing.rpms
+for server in *.rpmlist; do
+    diff -U3 $server rpmlist.master > $server.diff
+    serverPretty=`basename $server .rpmlist`
+    echo "Server $serverPretty is missing:" >> missing.rpms
+    grep "^+[^+]" $server.diff | cut -b 1 --complement >> missing.rpms
+    echo >> missing.rpms
+done
+
+if [ `egrep -c -v '(missing)|(^$)' missing.rpms` -gt 0 ]; then
+    echo "Sending email..."
+    cat missing.rpms | mail -s "scripts.mit.edu servers are out of sync" root@scripts.mit.edu
+else
+    echo "No email needs to be sent! scripts.mit.edu is up to date."
+fi
Index: branches/fc15-dev/locker/sbin/rpmlist.sh
===================================================================
--- branches/fc15-dev/locker/sbin/rpmlist.sh	(revision 1803)
+++ branches/fc15-dev/locker/sbin/rpmlist.sh	(revision 1803)
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+copyTo='/mit/scripts/cron_scripts/rpm-sync/'
+packages=`mktemp --tmpdir rpmlist.XXXXXX`
+rpm -qa --queryformat '%{NAME}.%{ARCH}\n' | sort | uniq > $packages
+
+host=`hostname`
+extension='.rpmlist'
+file="$copyTo/$host$extension"
+mv $packages $file
Index: branches/fc15-dev/locker/sbin/ssl-get-endtime
===================================================================
--- branches/fc15-dev/locker/sbin/ssl-get-endtime	(revision 1803)
+++ branches/fc15-dev/locker/sbin/ssl-get-endtime	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo '' | openssl s_client -connect $1 2>/dev/null | openssl x509 -enddate -noout
Index: branches/fc15-dev/locker/sbin/vhostadd
===================================================================
--- branches/fc15-dev/locker/sbin/vhostadd	(revision 1803)
+++ branches/fc15-dev/locker/sbin/vhostadd	(revision 1803)
@@ -0,0 +1,74 @@
+#!/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
+
+while read attr value; do
+    echo "$attr" "$value"
+    case "$attr" in
+	dn:) user_dn=$value;;
+	uid:) user=$value;;
+	uidNumber:) uid=$value;;
+	gidNumber:) gid=$value;;
+	homeDirectory:) home=$value;;
+    esac
+done < <(ldapsearch -LLL -x -h scripts.mit.edu -b ou=People,dc=scripts,dc=mit,dc=edu "(uid=$user)" dn uid uidNumber gidNumber homeDirectory | perl -0pe 's/\n //g;')
+
+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
+
+dn: scriptsVhostName=$host,ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+objectClass: scriptsVhost
+objectClass: top
+scriptsVhostName: $host
+EOF
+
+if [ "${host%mit.edu}" != "$host" ]; then
+    cat <<EOF >> "$tmpfile"
+scriptsVhostAlias: ${host%.mit.edu}
+EOF
+fi
+
+cat <<EOF >> "$tmpfile"
+scriptsVhostAccount: $user_dn
+scriptsVhostDirectory: ${subdir#/}
+EOF
+
+exec ldapvi --bind sasl -Y GSSAPI -h scripts5.mit.edu -b dc=scripts,dc=mit,dc=edu --add --in "$tmpfile"
Index: branches/fc15-dev/locker/sbin/vhostedit
===================================================================
--- branches/fc15-dev/locker/sbin/vhostedit	(revision 1803)
+++ branches/fc15-dev/locker/sbin/vhostedit	(revision 1803)
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+if [ ! "$1" ]; then
+    echo "Usage: $0 <vhost>"
+    exit 2
+fi
+
+exec ldapvi --bind sasl -Y GSSAPI -h scripts5.mit.edu -b dc=scripts,dc=mit,dc=edu \
+       "(|(&(objectClass=apacheConfig)(|(apacheServerName=$1)(apacheServerAlias=$1)))(&(objectClass=scriptsVhost)(|(scriptsVhostName=$1)(scriptsVhostAlias=$1))))"
Index: branches/fc15-dev/locker/sql/bin/create-database
===================================================================
--- branches/fc15-dev/locker/sql/bin/create-database	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/create-database	(revision 1803)
@@ -0,0 +1,11 @@
+#!/usr/bin/php
+<?php
+
+list($h,$u,$p) = explode("\t",`/mit/scripts/sql/bin/get-password`);
+$d = $argv[1];
+$create_r = explode(',',file_get_contents('https://sql.mit.edu/main/do/batch/create_db?d=' . urlencode($d) . '&u=' . urlencode($u) . '&p=' . urlencode($p)));
+$return_r = array_shift($create_r);
+$created = implode(',',$create_r);
+if ($return_r == '0') echo $created;
+
+?>
Index: branches/fc15-dev/locker/sql/bin/drop-database
===================================================================
--- branches/fc15-dev/locker/sql/bin/drop-database	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/drop-database	(revision 1803)
@@ -0,0 +1,11 @@
+#!/usr/bin/php
+<?php
+
+list($h,$u,$p) = explode("\t",`/mit/scripts/sql/bin/get-password`);
+$d = $argv[1];
+$drop_r = explode(',',file_get_contents('https://sql.mit.edu/main/do/batch/drop_db?d=' . urlencode($d) . '&u=' . urlencode($u) . '&p=' . urlencode($p)));
+$return_r = array_shift($drop_r);
+$dropped = implode(',',$drop_r);
+if ($return_r == '0') echo $dropped;
+
+?>
Index: branches/fc15-dev/locker/sql/bin/get-next-database
===================================================================
--- branches/fc15-dev/locker/sql/bin/get-next-database	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/get-next-database	(revision 1803)
@@ -0,0 +1,16 @@
+#!/usr/bin/php
+<?php
+
+list($h,$u,$p) = explode("\t",`/mit/scripts/sql/bin/get-password`);
+$newdb = str_replace($u.'+','',$argv[1]);
+$testdb = str_replace('.','',$u).'+'.$newdb;
+$dbs = explode("\n",file_get_contents('https://sql.mit.edu/tools/list_dbs?h=' . urlencode($h) . '&u=' . urlencode($u) . '&p=' . urlencode($p)));
+if (in_array($testdb,$dbs)) {
+	$i = 1;
+	while(in_array($testdb.$i,$dbs)) {
+		$i++;
+	}
+	echo $newdb.$i;
+} else echo $newdb;
+
+?>
Index: branches/fc15-dev/locker/sql/bin/get-password
===================================================================
--- branches/fc15-dev/locker/sql/bin/get-password	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/get-password	(revision 1803)
@@ -0,0 +1,58 @@
+#!/usr/bin/php
+<?php
+
+$host = 'sql.mit.edu';
+$env_user = getenv('USER');
+$home = '/mit/'.$env_user;
+
+$cnfPath = $home.'/.sql/my.cnf';
+
+function getMyCnfInfo($path) {
+if (file_exists($path)) {
+	global $env_user;
+	$cnfFile = file_get_contents($path);
+	if (preg_match('/\[mysql\][^\[]*host *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$host = $match[1];
+	} elseif (preg_match('/\[client\][^\[]*host *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$host = $match[1];
+	} else {
+		$host = 'sql.mit.edu';
+	}
+	if (preg_match('/\[mysql\][^\[]*user *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$user = $match[1];
+	} elseif (preg_match('/\[client\][^\[]*user *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$user = $match[1];
+	} else {
+		$user = $env_user;
+	}
+	if (preg_match('/\[mysql\][^\[]*password *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$password = $match[1];
+	} elseif (preg_match('/\[client\][^\[]*password *= *([^\r\n]*)/',$cnfFile,$match)) {
+		$password = $match[1];
+	} else {
+		$password = 'password';
+	}
+	return array($host,$user,$password);
+}
+}
+
+$cnfinfo = getMyCnfInfo($cnfPath);
+if (is_array($cnfinfo)) {
+	list($h,$u,$p) = $cnfinfo;
+	echo "$h\t$u\t$p";
+	exit;
+}
+
+$sql_status = file_get_contents('https://sql.mit.edu/main/do/batch/status?u=' . urlencode($env_user));
+switch($sql_status) {
+	case 1:
+		$myPassword = `/usr/bin/sql-signup`;
+        file_put_contents($cnfPath, "[client]\nhost=$host\nuser=$env_user\npassword=$myPassword\n");
+        $cnfinfo = getMyCnfInfo($cnfPath);
+        if (is_array($cnfinfo)) {
+            list($h,$u,$p) = $cnfinfo;
+    	    echo "$h\t$u\t$p";
+        }
+		break;
+	case 0:
+}
Index: branches/fc15-dev/locker/sql/bin/get-status
===================================================================
--- branches/fc15-dev/locker/sql/bin/get-status	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/get-status	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+status=`wget --no-check-certificate https://sql.mit.edu/main/do/batch/status?u=$USER -q -O-`
+
+echo $status
+exit $status
Index: branches/fc15-dev/locker/sql/bin/save-password
===================================================================
--- branches/fc15-dev/locker/sql/bin/save-password	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/save-password	(revision 1803)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+mkdir $lroot/.sql 2>/dev/null
+fs sa $lroot/.sql system:anyuser none
+fs sa $lroot/.sql system:authuser none
+fs sa $lroot/.sql daemon.scripts write
+fs sa $lroot/.sql daemon.sql write
+rm -f $lroot/.sql/my.cnf $lroot/.my.cnf
+
+echo "[client]
+host=sql.mit.edu
+user=$sqluser
+password=$sqlpass" > $lroot/.sql/my.cnf
+
+ln -nfs .sql/my.cnf $lroot/.my.cnf 2>/dev/null
Index: branches/fc15-dev/locker/sql/bin/test-password
===================================================================
--- branches/fc15-dev/locker/sql/bin/test-password	(revision 1803)
+++ branches/fc15-dev/locker/sql/bin/test-password	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+mysql -e "select 1" 2>&1 | grep -i error
Index: branches/fc15-dev/lvs/debian/config/etc/aliases
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/aliases	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/aliases	(revision 1803)
@@ -0,0 +1,14 @@
+# /etc/aliases
+mailer-daemon: postmaster
+postmaster: root
+nobody: root
+hostmaster: root
+usenet: root
+news: root
+webmaster: root
+www: root
+ftp: root
+abuse: root
+noc: root
+security: root
+root:		andersk@mit.edu, quentin@mit.edu, geofft+root@mit.edu, mitchb@mit.edu, ezyang@mit.edu, xavid@mit.edu, adehnert-sipb@mit.edu, gdb@mit.edu
Index: branches/fc15-dev/lvs/debian/config/etc/cron.d/restart-inetd
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/cron.d/restart-inetd	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/cron.d/restart-inetd	(revision 1803)
@@ -0,0 +1,3 @@
+SHELL=/bin/sh
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+*/5 * * * * root /etc/init.d/inetd restart >/dev/null 2>&1
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/cib.xml
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/cib.xml	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/cib.xml	(revision 1803)
@@ -0,0 +1,66 @@
+<?xml version="1.0" ?>
+<cib admin_epoch="0" epoch="0" num_updates="0">
+	<configuration>
+		<crm_config>
+			<cluster_property_set id="cib-bootstrap-options">
+				<attributes>
+					<nvpair id="cib-bootstrap-options-symmetric_cluster" name="symmetric_cluster" value="true"/>
+					<nvpair id="cib-bootstrap-options-no_quorum_policy" name="no_quorum_policy" value="stop"/>
+					<nvpair id="cib-bootstrap-options-default_resource_stickiness" name="default_resource_stickiness" value="0"/>
+					<nvpair id="cib-bootstrap-options-default_resource_failure_stickiness" name="default_resource_failure_stickiness" value="0"/>
+					<nvpair id="cib-bootstrap-options-stonith_enabled" name="stonith_enabled" value="false"/>
+					<nvpair id="cib-bootstrap-options-stonith_action" name="stonith_action" value="reboot"/>
+					<nvpair id="cib-bootstrap-options-stop_orphan_resources" name="stop_orphan_resources" value="true"/>
+					<nvpair id="cib-bootstrap-options-stop_orphan_actions" name="stop_orphan_actions" value="true"/>
+					<nvpair id="cib-bootstrap-options-remove_after_stop" name="remove_after_stop" value="false"/>
+					<nvpair id="cib-bootstrap-options-short_resource_names" name="short_resource_names" value="true"/>
+					<nvpair id="cib-bootstrap-options-transition_idle_timeout" name="transition_idle_timeout" value="5min"/>
+					<nvpair id="cib-bootstrap-options-default_action_timeout" name="default_action_timeout" value="5s"/>
+					<nvpair id="cib-bootstrap-options-is_managed_default" name="is_managed_default" value="true"/>
+				</attributes>
+			</cluster_property_set>
+		</crm_config>
+		<nodes/>
+		<resources>
+			<group id="scripts_LVS">
+				<primitive class="heartbeat" id="scripts_LVS_ldirectord" provider="heartbeat" type="ldirectord">
+				</primitive>
+				<primitive class="ocf" id="ip_scripts.mit.edu" provider="heartbeat" type="IPaddr2">
+					<operations>
+						<op id="ip_scripts.mit.edu_mon" interval="5s" name="monitor" timeout="5s"/>
+					</operations>
+					<instance_attributes id="ip_scripts.mit.edu_inst_attr">
+						<attributes>
+							<nvpair id="ip_scripts.mit.edu_attr_0" name="ip" value="18.181.0.46"/>
+							<nvpair id="ip_scripts.mit.edu_attr_1" name="netmask" value="16"/>
+							<nvpair id="ip_scripts.mit.edu_attr_2" name="nic" value="eth0"/>
+							<nvpair id="ip_scripts.mit.edu_attr_3" name="broadcast" value="18.181.255.255"/>
+						</attributes>
+					</instance_attributes>
+				</primitive>
+				<primitive class="ocf" id="ip_scripts-cert.mit.edu" provider="heartbeat" type="IPaddr2">
+					<operations>
+						<op id="ip_scripts-cert.mit.edu_mon" interval="5s" name="monitor" timeout="5s"/>
+					</operations>
+					<instance_attributes id="ip_scripts-cert.mit.edu_inst_attr">
+						<attributes>
+							<nvpair id="ip_scripts-cert.mit.edu_attr_0" name="ip" value="18.181.0.50"/>
+							<nvpair id="ip_scripts-cert.mit.edu_attr_1" name="netmask" value="16"/>
+							<nvpair id="ip_scripts-cert.mit.edu_attr_2" name="nic" value="eth0"/>
+							<nvpair id="ip_scripts-cert.mit.edu_attr_3" name="broadcast" value="18.181.255.255"/>
+						</attributes>
+					</instance_attributes>
+				</primitive>
+			</group>
+		</resources>
+		<constraints>
+			<rsc_location id="rsc_location_scripts_LVS" rsc="scripts_LVS">
+				<rule id="prefered_location_group_1" score="100">
+					<expression attribute="#uname" id="prefered_location_group_1_expr" operation="eq" value="rack-forward"/>
+				</rule>
+			</rsc_location>
+		</constraints>
+	</configuration>
+	<status/>
+</cib>
+
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/ha.cf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/ha.cf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/ha.cf	(revision 1803)
@@ -0,0 +1,12 @@
+logfacility        local0
+debug 0
+use_logd on
+mcast eth0 224.0.0.181 694 1 0
+deadtime 10
+initdead 60
+keepalive 1
+warntime 3
+
+node        rack-forward
+node        rack-backward
+crm respawn
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/haresources
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/haresources	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/haresources	(revision 1803)
@@ -0,0 +1,5 @@
+not-forward        \
+        ldirectord \
+        LVSSyncDaemonSwap::master \
+        IPaddr2::18.181.0.46/16/eth0/18.181.255.255 \
+        IPaddr2::18.181.0.50/16/eth0/18.181.255.255
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-finger.sh
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-finger.sh	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-finger.sh	(revision 1803)
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+ulimit -v 10240
+
+read line
+line=${line%[:blank:]}
+line=${line%
+}
+
+/sbin/ipvsadm | awk '! ($1 == "->" && $4 == 0 && $5 == 0 && $6 == 0) { print }'
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-http.sh
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-http.sh	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord-http.sh	(revision 1803)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+ulimit -v 10240
+
+# Read and ignore the request
+line=foo
+while [ -n "$line" ]; do
+    read line
+    line=${line%[:blank:]}
+    line=${line%
+}
+done
+
+# Generate an HTTP reply
+
+echo "HTTP/1.0 200 OK
+"
+echo "Content-type: text/html
+"
+echo "
+"
+echo "<html><head><title>scripts.mit.edu server status</title></head><body><h1>scripts.mit.edu server status</h1><p>The following table shows a list of the servers that are currently handling web requests for scripts.mit.edu:</p><table>"
+/sbin/ipvsadm -L -f 2 | sed 's/:0//; s/:Port//' | awk 'BEGIN { OFS="</td><td>" } /->/ { print "<tr><td>" $2, $4, $5, $6 "</td></tr>"}'
+echo "</table></body></html>"
Index: branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord.cf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord.cf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ha.d/ldirectord.cf	(revision 1803)
@@ -0,0 +1,62 @@
+checktimeout=5
+checkinterval=1
+autoreload=yes
+logfile="/var/log/ldirectord.log"
+quiescent=yes
+
+# iptables rules caused SMTP to use FWM 3
+virtual=3
+        real=18.181.0.53:25  gate 4096 # old-faithful
+        real=18.181.0.57:25  gate 4096 # better-mousetrap
+        #real=18.181.0.167:25 gate 6144 # bees-knees
+	#real=18.181.0.228:25 gate 6144 # cats-whiskers
+	#real=18.181.0.234:25 gate 4096 # busy-beaver
+	#real=18.181.0.235:25 gate 4096 # real-mccoy
+	real=18.181.0.237:25 gate 4096 # pancake-bunny
+	real=18.181.0.236:25 gate 4096 # whole-enchilada
+	real=18.181.0.135:25 gate 1024 # shining-armor
+        service=smtp
+        scheduler=wlc
+        persistent=600
+        protocol=fwm
+        checktype=negotiate
+	checkport=25
+
+# Apache (80, 443, and 444) uses FWM 2
+virtual=2
+	real=18.181.0.53  gate 3096 # old-faithful
+	real=18.181.0.57  gate 3096 # better-mousetrap
+	real=18.181.0.167 gate 6144 # bees-knees
+	real=18.181.0.228 gate 6144 # cats-whiskers
+	real=18.181.0.234 gate 4096 # busy-beaver
+	real=18.181.0.235 gate 4096 # real-mccoy
+	real=18.181.0.237 gate 4096 # pancake-bunny
+	real=18.181.0.236 gate 4096 # whole-enchilada
+	real=18.181.0.135 gate 1024 # shining-armor
+	fallback=127.0.0.1 gate
+	service=http
+	request="heartbeat/http"
+	virtualhost="scripts.mit.edu"
+	receive="1"
+	checktype=negotiate
+	checkport=80
+	scheduler=wlc
+	persistent=600
+	protocol=fwm
+
+# Everything else uses FWM 1 and gets sent only to the primary
+virtual=1
+        real=18.181.0.53  gate "heartbeat/services", "1" # old-faithful
+        real=18.181.0.57  gate "heartbeat/services", "2" # better-mousetrap
+        real=18.181.0.167 gate "heartbeat/services", "3" # bees-knees
+	real=18.181.0.228 gate "heartbeat/services", "4" # cats-whiskers
+	real=18.181.0.234 gate "heartbeat/services", "5" # busy-beaver
+	real=18.181.0.235 gate "heartbeat/services", "6" # real-mccoy
+	real=18.181.0.237 gate "heartbeat/services", "7" # pancake-bunny
+	real=18.181.0.236 gate "heartbeat/services", "8" # whole-enchilada
+	real=18.181.0.135 gate "heartbeat/services", "9" # shining-armor
+	service=http
+        scheduler=wrr
+        protocol=fwm
+        checktype=negotiate
+	checkport=80
Index: branches/fc15-dev/lvs/debian/config/etc/inetd.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/inetd.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/inetd.conf	(revision 1803)
@@ -0,0 +1,42 @@
+# /etc/inetd.conf:  see inetd(8) for further informations.
+#
+# Internet superserver configuration database
+#
+#
+# Lines starting with "#:LABEL:" or "#<off>#" should not
+# be changed unless you know what you are doing!
+#
+# If you want to disable an entry so it isn't touched during
+# package updates just comment it out with a single '#' character.
+#
+# Packages should modify this file by using update-inetd(8)
+#
+# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
+#
+#:INTERNAL: Internal services
+#discard		stream	tcp	nowait	root	internal
+#discard		dgram	udp	wait	root	internal
+#daytime		stream	tcp	nowait	root	internal
+#time		stream	tcp	nowait	root	internal
+
+#:STANDARD: These are standard services.
+
+#:BSD: Shell, login, exec and talk are BSD protocols.
+
+#:MAIL: Mail, news and uucp services.
+
+#:INFO: Info services
+ident		stream	tcp	wait	identd	/usr/sbin/identd	identd
+
+#:BOOT: TFTP service is provided primarily for booting.  Most sites
+#       run this only on machines acting as "boot servers."
+
+#:RPC: RPC based services
+
+#:HAM-RADIO: amateur-radio services
+
+#:OTHER: Other services
+
+# Make it easy to remotely query these LVS servers
+79	stream	tcp	nowait	root	/etc/heartbeat/ldirectord-finger.sh
+78	stream	tcp	nowait	root	/etc/heartbeat/ldirectord-http.sh
Index: branches/fc15-dev/lvs/debian/config/etc/lighttpd/lighttpd.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/lighttpd/lighttpd.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/lighttpd/lighttpd.conf	(revision 1803)
@@ -0,0 +1,47 @@
+server.modules              = (
+	"mod_alias",
+	"mod_magnet",
+)
+
+server.max-connections=4096
+server.max-fds=9182
+server.max-read-idle=5
+
+## a static document-root, for virtual-hosting take look at the
+## server.virtual-* options
+server.document-root       = "/var/www/"
+
+## where to send error-messages to
+server.errorlog            = "/var/log/lighttpd/error.log"
+
+### files to check for if .../ is requested
+#index-file.names           = ( "index.php", "index.html",
+#                               "index.htm", "default.htm",
+#                               "index.lighttpd.html" )
+
+## bind to port (default: 80)
+server.port               = 80
+
+## bind to localhost only (default: all interfaces)
+## server.bind                = "localhost"
+
+## to help the rc.scripts
+server.pid-file            = "/var/run/lighttpd.pid"
+
+## change uid to <uid> (default: don't care)
+server.username            = "www-data"
+
+## change uid to <uid> (default: don't care)
+server.groupname           = "www-data"
+
+alias.url = (
+	"/__scripts/maint/" => "/etc/lighttpd/scripts-maint/"
+)
+
+$HTTP["url"] !~ "^/__scripts/maint" {
+	magnet.attract-physical-path-to = ( "/etc/lighttpd/scripts-maint.lua" )
+}
+
+#### external configuration files
+## mimetype mapping
+include_shell "/usr/share/lighttpd/create-mime.assign.pl"
Index: branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint.lua
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint.lua	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint.lua	(revision 1803)
@@ -0,0 +1,6 @@
+-- lighty.header["X-Maintenance-Mode"] = "1" 
+-- uncomment the above if you want to add the header
+lighty.content = { { filename = "/etc/lighttpd/scripts-maint/index.html" } }
+lighty.header["Content-Type"] = "text/html"
+return 503
+-- or return 200 if you want
Index: branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/index.html
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/index.html	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/index.html	(revision 1803)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" href="/__scripts/maint/style.css" type="text/css" />
+<link rel="alternate" type="application/rss+xml" title="scripts.mit.edu:
+Service unavailable" href="http://scripts.mit.edu/rss/" />
+<title>scripts.mit.edu: Service unavailable</title>
+</head>
+<body>
+<div id="farouter">
+    <div id="outer">
+            <div id="masthead">
+
+                <h1 id="header"><a rel="home" href="http://scripts.mit.edu/">scripts.mit.edu</a></h1>
+                <h2 id="tagline">MIT SIPB Script Services for Athena</h2>
+            </div>
+            <div id="hmenu">
+                <div id="hnav">
+                    <ul id="navlist">
+                        <li><a href="http://scripts.mit.edu/">home</a></li>
+
+    <li><a href="http://scripts.mit.edu/start/">quick-start</a></li>
+                        <li><a href="http://scripts.mit.edu/web/">web scripts</a></li>
+                        <li><a href="http://scripts.mit.edu/mysql/">mysql databases</a></li>
+                        <li><a href="http://scripts.mit.edu/mail/">mail scripts</a></li>
+                        <li><a href="http://scripts.mit.edu/cron/">cron</a></li>
+                        <li><a href="http://scripts.mit.edu/news/">blog</a></li>
+    <li><a href="http://scripts.mit.edu/faq/">faq</a></li>
+
+                    </ul>
+                </div>
+            </div>
+        <div id="rap">
+            <div id="main">
+                <div id="content">
+
+<h3 class="storytitle"><a>Service unavailable</a></h3>
+    <p>The scripts.mit.edu service is currently unavailable. The service maintainers are working on the problem and expect to have it resolved soon.</p>
+    <p>If this message does not go away after an hour or more, contact <a href="mailto:scripts@mit.edu">scripts@mit.edu</a> for assistance.</p>
+<div class="feedback">
+</div>
+<div align="center"><img src="/__scripts/maint/1.gif" style="height:1px;width:400px" class="divider" alt="" /></div>
+
+
+
+<p>
+
+
+</p>
+
+
+
+                </div>
+                <div id="menu">
+
+                    <div id="nav">
+
+
+
+
+
+
+
+                        <h2>Contact</h2>
+                        <ul><li><a href="mailto:scripts@mit.edu">scripts@mit.edu</a></li>
+                        </ul>
+
+Feel free to contact us with any questions, comments, or suggestions.
+                        <h2>Search</h2>
+                        <ul>
+                            <li><form action="http://scripts.mit.edu/" method="get"><p>Search<br /><input type="text" name="q" value="" size="15" /></p></form></li>
+                        </ul>
+                        <h2>Feeds</h2>
+                        <ul>
+                            <li><a href="http://scripts.mit.edu/rss/?section=special" title="RSS Feed">RSS</a></li> <li><a href="http://scripts.mit.edu/atom/?section=special" title="Atom Feed">Atom</a></li>
+
+                        </ul>
+
+<a class="nobutt" href="http://scripts.mit.edu/faq/45/"><img src="/__scripts/maint/powered_by-trans.gif" alt="Powered by scripts" /></a>
+
+                    </div>
+                </div>
+		    <div id="clearer">&nbsp;</div>
+            </div>
+        </div>
+        <div id="foot">&nbsp;</div>
+
+<!--
+        <div id="footer">
+            <p class="credit">Originally "Blue Horizon" by <a href="http://kaushalsheth.com">Kaushal Sheth</a>. Mangled for scripts.mit.edu by <a href="/~presbrey/">Joe Presbrey</a><br />
+            </p>
+        </div>
+-->
+    </div>
+</div>
+</body>
+</html>
Index: branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/style.css
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/style.css	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/lighttpd/scripts-maint/style.css	(revision 1803)
@@ -0,0 +1,325 @@
+/* -------  Layout CSS (Centered Fixed Width) ------ */
+
+body {
+  font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+  font-size: 80%;
+  margin: 0;
+  padding: 0;
+  text-align: center; /* IE 5.5 hack */
+}
+#farouter {
+	/*background: #ffffff;*/
+	width: 60em;
+	margin: 20px auto 20px auto;
+	text-align: left; /* IE 5.5 hack part II */
+}
+#outer {}
+#rap {
+	border: 1px solid #3A291F;
+}
+#masthead {
+            background: white;
+	border: 1px solid #3A291F;
+	letter-spacing: 0.2em;
+	padding: 0 10px 10px 60px;
+	font: normal 100% 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	min-height: 100px;
+}
+#main { padding-left:3em; }
+#content { float: left; width: 40em; margin-top: 1em; }
+#content_wide { padding-right:35px; }
+#content_home { float: left; width: 490px; padding-top: 0px; }
+#menu { float: right; width: 14em; margin-right: 10px; border-left: 1px dashed #2050A0; }
+#nav { padding-left: 10px; }
+#logo { padding-top: 25px; padding-left: 12px; }
+#hmenu { margin: 0; padding: 0; }
+#hnav { margin: 0; padding: 0; }
+#clearer { clear: both; margin: 0; padding: 0; }
+#footer { margin: 8px 8px 8px 8px; }
+
+/* ----------------- Color CSS ------------------------ */
+
+body { background: #2050A0; color:#333; }
+#rap { background: #ffffff; }
+#masthead { background-image: url('/__scripts/maint/sb.gif'); background-repeat: no-repeat; }
+#footer { background: #2050A0; }
+#hnav { background: #2050A0; }
+a { color: #2050A0; text-decoration: none; }
+a:visited { color: #2050A0; text-decoration: none; }
+a:hover { color: #2050A0; text-decoration: underline; }
+acronym, abbr { border-bottom: #333; }
+h2 { color: #17397A; font-size: 24px; font-weight: normal; }
+h3 a { color: #17397A; }
+h3 a:hover { color: #17397A; }
+h3 a:visited { color: #17397A; }
+.meta { color: #1F6710 }
+.meta a { color: #001700; }
+.feedback a { color: #001700; }
+
+/* -------- Core CSS --------- */
+
+
+a { text-decoration: none; font-weight:bold; }
+a img { border: none; }
+acronym, abbr { border-bottom: 1px dashed; }
+acronym, abbr, span.caps { cursor: help; font-size: 90%; letter-spacing: .07em; }
+blockquote { margin-left: 1.5em; }
+cite { font-size: 90%; font-style: normal; }
+#header a:hover { text-decoration: underline; }
+h1 { margin: 0; padding: 20px; text-align: right; }
+#hidden {display:none;}
+
+h2 {
+	font: 100% 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	letter-spacing: 0.2em;
+	margin: 0 20px 20px 0;
+	padding: 20px 0 0 0;
+}
+h2#tagline {
+	margin-right: 25px;
+	padding:0;
+	text-align: right;
+/*	color: #F2EEEC; */
+	border: 0px none;
+	margin-left:0;
+	margin-top:0;
+	margin-bottom:0
+}
+
+.post h2 {
+	font: 100% 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	letter-spacing: 0.2em;
+	margin: 0 20px 0 30px;
+	padding: 20px 0 30px 0;
+}
+h3 {
+	font: 18px 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	margin-left: 0;
+	margin-top: 20px;
+	color: #17397A;
+        border-bottom: solid thin #17397A;
+}
+h3#comments { margin-left: 20px; }
+h3#respond { margin-left: 20px; }
+h4 {
+	font-size: 16px;
+	font-weight: normal;
+}
+ol#comments li p { font-size: 100%; }
+img {
+	margin: 10px;
+	padding: 10px;
+	border: 0px solid #2F700F;
+}
+p, .feedback {
+	font: 100%/175% 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+}
+p {}
+.textarea { width:200px; margin:0; }
+#archvies {
+	font: 150% normal 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+}
+
+/* ------------------------- Classes used by the_meta() --------------------- */
+
+ul.post-meta {
+	list-style: none;
+}
+
+ul.post-meta span.post-meta-key {
+	font-weight: bold;
+}
+
+.credit {
+  color: #fff;
+  font-size: 90%;
+  margin: 10px 0 0 0;
+  padding: 3px;
+  text-align: center;
+}
+
+.credit a, .credit a:hover { color: #fff; text-decoration: none; }
+.feedback { text-align: right; clear: both; margin-right: 30px; font-size: 90% }
+.meta { font-size: .95em; }
+.meta li, ul.post-meta li { display: inline; }
+.meta ul { display: inline; list-style: none;margin: 0; padding: 0; }
+.meta, .meta a { font-weight: normal; letter-spacing: 0; }
+.post { margin: 35px 35px 20px 0; }
+.entrytext {margin-left: 30px; }
+.storytitle { margin-top: 10px; margin-bottom: 2px; }
+.storytitle a { text-decoration: none; }
+.storycontent { margin-bottom: 5px; border-bottom: 1px solid #2050A0; }
+#commentform { margin-left: 20px; }
+#commentform  #comment { width:450px; }
+#commentform #author, #commentform #email, #commentform #url, #commentform textarea {
+ 	background: #fff; padding: .2em;
+}
+#commentform textarea { width:100%; }
+#commentlist li { border: 2px solid #2050A0; margin-bottom: 20px; padding-left: 20px; }
+#commentlist li ul { border-left: 1px solid #ddd; font-size: 110%; list-style-type: none; }
+
+/* ----------  All menu styling except #menu itself (in layout above) ------- */
+
+#nav form {
+	margin: 0 0 0 13px;
+}
+
+#nav input#s {
+	width: 80%;
+	background: #eee;
+	border: 1px solid #999;
+	color: #000;
+}
+
+#nav ul li h2 {
+	font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	font-weight: normal;
+	letter-spacing: 0.1em;
+	border: 0px none;
+	text-align: left;
+	padding-left:0;
+	margin-left: 0
+}
+
+#nav ul ul ul.children {
+	font-size: 100%;
+	padding-left: 4px;
+}
+
+/*#nav { width: 170px; }*/
+
+#nav ul {
+	margin-left: 0;
+	padding-left: 0;
+	padding-right: 4px;
+	list-style-type: none;
+	font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	font-size: 95%;
+}
+
+#nav li {
+	display: block;
+	padding-left: 1.3em;
+	background-color: #FFF;
+	background-image: url('images/icon.gif');
+	background-repeat: no-repeat;
+	background-position: 0 55%;
+	border-bottom: 1px dotted #2050A0;
+	padding-right:3px; padding-top:3px; padding-bottom:3px;
+}
+
+#nav a.nobutt {
+	background-image: none;
+	border-bottom: none;
+}
+
+#nav a.nobutt:hover {
+	background-image: none;
+	border-bottom: none;
+}
+
+#nav a:link, #navlist a:visited {
+	text-decoration: none;
+}
+
+#nav li:hover {
+	background-image: url('images/icon2.gif'); 
+	/*color: #000*/
+}
+
+#themeswitcher {
+	font-size: 8px;
+}
+
+/*------------- hnav------------*/
+
+#hnav ul {
+	text-align: center;
+        margin: 0;
+        padding: 0;
+	background-color: #2050A0;
+	color: #F2EEEC;
+	width: 100%;
+	font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	/* fixes Firefox 0.9.3 */
+}
+
+#hnav ul li {
+	display: inline;
+              margin: 0; padding: 0;
+              line-height: 2.5em;
+}
+
+#hnav ul li a {
+                padding: .5em .8em;
+	color: #F2EEEC;
+	text-decoration: none;
+	border-left: 1px solid #F2EEEC;
+}
+#hnav ul li:first-child a {
+                            border-left: none;
+                            }
+#hnav ul li a:hover {
+	background: #F2EEEC;
+	color: #3A291F;
+}
+
+#hnav #active { border-left: 1px solid #F2EEEC; }
+
+/*------------- added ------------*/
+
+.gravatar {
+	float:left;
+	padding: 3px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+	border: 1px solid #2F700F;
+}	
+
+#commentbox {
+	background: #F2EEEC;
+	border: 1px solid #2F700F;
+	padding: 5px;
+	margin-bottom: 15px;
+}
+
+.commentby {
+	font-size: 14px;
+	text-transform: uppercase;
+}
+.commentinfo {
+	font-size: 10px;
+	margin-top: -10px;
+	border-bottom: 1px soild #1F6710;
+}
+
+.commentid {
+	float: right;
+	font-size: 24px;
+	font-style: italic;
+	padding-left: 10px;
+	padding-right: 5px;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	color: #2050A0;
+}
+
+.commentid a {
+	color: #2050A0;
+	text-decoration: none;
+}
+
+.post ul li {
+	padding: 0px;
+	font-weight: normal;
+	list-style: url('images/icon.gif');
+	line-height: 1.5em;
+}
+
+.post ul li:hover {
+	padding: 0px;
+	font-weight: normal;
+	list-style: url('images/icon2.gif');
+	line-height: 1.5em;
+}
+
Index: branches/fc15-dev/lvs/debian/config/etc/logd.cf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/logd.cf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/logd.cf	(revision 1803)
@@ -0,0 +1,43 @@
+#	File to write debug messages to
+#	Default: /var/log/ha-debug
+debugfile /var/log/ha-debug
+
+#
+#
+# 	File to write other messages to
+#	Default: /var/log/ha-log
+logfile	/var/log/ha-log
+
+#
+#
+#	Facility to use for syslog()/logger 
+#	Default: local7
+logfacility	local7
+
+
+#	Entity to be shown at beginning of a message
+# 	for logging daemon
+# 	Default: "logd"
+entity logd
+
+
+#	Do we register to apphbd
+#	Default: no
+#useapphbd no
+
+#	There are two processes running for logging daemon
+#  		1. parent process which reads messages from all client channels 
+#  		and writes them to the child process 
+#  
+#  		2. the child process which reads messages from the parent process through IPC
+#  		and writes them to syslog/disk
+
+
+#	set the send queue length from the parent process to the child process
+#
+#sendqlen 256 
+
+#	set the recv queue length in child process
+#
+#recvqlen 256
+
Index: branches/fc15-dev/lvs/debian/config/etc/modules
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/modules	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/modules	(revision 1803)
@@ -0,0 +1,18 @@
+# /etc/modules: kernel modules to load at boot time.
+#
+# This file contains the names of kernel modules that should be loaded
+# at boot time, one per line. Lines beginning with "#" are ignored.
+
+loop
+ip_vs_dh
+ip_vs_ftp
+ip_vs
+ip_vs_lblc
+ip_vs_lblcr
+ip_vs_lc
+ip_vs_nq
+ip_vs_rr
+ip_vs_sed
+ip_vs_sh
+ip_vs_wlc
+ip_vs_wrr
Index: branches/fc15-dev/lvs/debian/config/etc/munin/munin-node.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/munin-node.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/munin-node.conf	(revision 1803)
@@ -0,0 +1,39 @@
+#
+# Example config-file for munin-node
+#
+
+log_level 4
+log_file /var/log/munin/munin-node.log
+port 4949
+pid_file /var/run/munin/munin-node.pid
+background 1
+setseid 1
+
+# Which port to bind to;
+host *
+user root
+group root
+setsid yes
+
+# Regexps for files to ignore
+
+ignore_file ~$
+ignore_file \.bak$
+ignore_file %$
+ignore_file \.dpkg-(tmp|new|old|dist)$
+ignore_file \.rpm(save|new)$
+
+# Set this if the client doesn't report the correct hostname when
+# telnetting to localhost, port 4949
+#
+#host_name localhost.localdomain
+
+# A list of addresses that are allowed to connect.  This must be a
+# regular expression, due to brain damage in Net::Server, which
+# doesn't understand CIDR-style network notation.  You may repeat
+# the allow line as many times as you'd like
+
+allow ^127\.0\.0\.1$
+allow ^18\.187\.1\.128$
+allow ^18\.181\.0\.65$
+allow ^18\.181\.0\.51$
Index: branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/cps
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/cps	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/cps	(revision 1803)
@@ -0,0 +1,6 @@
+[cps_1_0]
+env.graph_title Load balanced miscellaneous connections
+[cps_2_0]
+env.graph_title Load balanced Apache connections
+[cps_3_0]
+env.graph_title Load balanced SMTP connections
Index: branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/hddtemp_smartctl
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/hddtemp_smartctl	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/plugin-conf.d/hddtemp_smartctl	(revision 1803)
@@ -0,0 +1,3 @@
+[hddtemp_smartctl]
+env.drives hda hdb
+
Index: branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_1_0
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_1_0	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_1_0	(revision 1803)
@@ -0,0 +1,268 @@
+#!/usr/bin/perl
+#
+# Plugin to monitor connections per second, for LVS loadbalancers.
+#
+# Magic name:
+#
+# 	cps_<port>
+# 	cps_<vip>_<port>
+#
+# Examples:
+#
+# 	cps_smtp
+# 	cps_mail.foo.boo_smtp
+# 	cps_pop3
+# 	cps_www.foo.boo_www
+# 	cps_vvv.foo.boo_www
+#
+# Parameters understood:
+#
+# 	config   (required)
+# 	autoconf (optional - used by munin-config)
+# 	suggest  (optional - used by munin-config)
+#
+# $Log$
+# Revision 1.8  2004/12/10 18:55:14  jimmyo
+# Removed hardcoded host_name in linux/cps_.
+#
+# Revision 1.7  2004/12/10 18:51:44  jimmyo
+# linux/apt* has been forced to LANG=C, to get predictable output.
+#
+# Revision 1.6  2004/12/10 11:48:42  jimmyo
+# linux/cps_ plugin now groks high numbers.
+#
+# Revision 1.5  2004/12/10 10:47:49  jimmyo
+# Change name from ${scale} to ${graph_period}, to be more consistent.
+#
+# Revision 1.4  2004/12/09 22:12:56  jimmyo
+# Added "graph_period" option, to make "graph_sums" usable.
+#
+# Revision 1.3  2004/11/21 00:16:57  jimmyo
+# Changed a lot of plugins so they use DERIVE instead of COUNTER.
+#
+# Revision 1.2  2004/05/20 19:02:37  jimmyo
+# Set categories on a bunch of plugins
+#
+# Revision 1.1  2004/01/02 18:50:01  jimmyo
+# Renamed occurrances of lrrd -> munin
+#
+# Revision 1.1.1.1  2004/01/02 15:18:07  jimmyo
+# Import of LRRD CVS tree after renaming to Munin
+#
+# Revision 1.4  2003/11/07 17:43:16  jimmyo
+# Cleanups and log entries
+#
+#
+#
+# Magic markers - optional - used by installation scripts and munin-config:
+#
+#%# family=manual
+#%# capabilities=autoconf suggest
+#
+
+use strict;
+
+if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
+{
+	&autoconf ();
+}
+if ( defined $ARGV[0] and $ARGV[0] eq "suggest" )
+{
+	my $sipvs;
+	$sipvs = &ipvs (".", ".", $sipvs);
+	exit 0 if $sipvs == undef;
+	&suggest ($sipvs);
+}
+
+unless ($0 =~ /cps(?:_([^_]+)|)_(.+)\s*$/)
+{
+	die "Could not parse name $0.\n";
+}
+my $vip  = $1;
+my $port = $2;
+my $ipvs;
+
+#print "Name: $0\nPort: $port\nVip : $vip\n";
+
+# Read ipvsadm-output
+
+$ipvs = &ipvs ($vip, $port, $ipvs);
+
+if ( defined $ARGV[0] and $ARGV[0] eq "dump" )
+{
+	use Data::Dumper;
+	print Dumper($ipvs);
+}
+
+if ( defined $ARGV[0] and $ARGV[0] eq "config" )
+{
+        &config ($vip, $port, $ipvs);
+}
+
+$vip = $vip || "";
+if (exists ($ipvs->{$vip}) and exists ($ipvs->{$vip}->{$port}))
+{
+	foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+	{
+		(my $fname = $host) =~ s/[.-]/_/g;
+		print "$fname.value ", $ipvs->{$vip}->{$port}->{$host}, "\n";;
+	}
+}
+else
+{
+	foreach my $vip (sort keys %{$ipvs})
+	{
+		foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+		{
+			(my $fname = ($vip . "-" . $host)) =~ s/[.-]/_/g;
+			print "$fname.value ", $ipvs->{$vip}->{$port}->{$host}, "\n";;
+		}
+	}
+}
+
+sub autoconf
+{
+	system ("/sbin/ipvsadm -L --stats >/dev/null 2>/dev/null");
+
+	if ($? == 0)
+	{
+		print "yes\n";
+		exit 0;
+	}
+	elsif (($?>>8) == 2)
+	{
+		print "no (permission denied)\n";
+		exit 1;
+	}
+	elsif ($? == 127)
+	{
+		print "no (ipvsadm not found)\n";
+		exit 1;
+	}
+	else
+	{
+		print "no\n";
+		exit 1;
+	}
+}
+sub suggest
+{
+	my $ipvs = shift;
+	exit 0 unless $ipvs;
+
+	foreach my $vip (sort keys %{$ipvs})
+	{
+		foreach my $port (sort keys %{$ipvs->{$vip}})
+		{
+			print "cps_${vip}_$port\n";
+		}
+	}
+	exit 0;
+}
+
+sub config
+{
+	my $vip  = shift;
+	my $port = shift;
+	my $ipvs = shift;
+
+	print "graph_title ", ($ENV{"graph_title"} || "Loadbalanced ".($vip?$vip:"*")."->".$port." connections"),"\n";
+	print "graph_args -l 0\n";
+	print "graph_total total\n";
+	print "graph_vlabel connections / \${graph_period}\n";
+	print "graph_category network\n";
+	my $first=1;
+	$vip = $vip || "";
+	if (exists ($ipvs->{$vip}) and exists ($ipvs->{$vip}->{$port}))
+	{
+		foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+		{
+			(my $fname = $host) =~ s/[.-]/_/g;
+			if ( $first == 1 )
+			{
+				print "$fname.draw AREA\n";
+				$first=0
+			}
+			else
+			{
+				print "$fname.draw STACK\n";
+			}
+			print "$fname.type DERIVE\n";
+			$host =~ s/-bak//;
+			print "$fname.label $host\n";
+			print "$fname.max 1000\n";
+			print "$fname.min 0\n";
+		}
+	}
+	else
+	{
+		foreach my $vip (reverse sort keys %{$ipvs})
+		{
+			foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+			{
+				(my $fname = ($vip . "-" . $host)) =~ s/[.-]/_/g;
+				if ( $first == 1 )
+				{
+					print "$fname.draw AREA\n";
+					$first=0
+				}
+				else
+				{
+					print "$fname.draw STACK\n";
+				}
+				print "$fname.type DERIVE\n";
+				$host =~ s/-bak//;
+				my $label = "$vip -> $host";
+				$label =~ s/\.MIT\.EDU//g;
+				print "$fname.label $label\n";
+				print "$fname.max 1000\n";
+				print "$fname.min 0\n";
+			}
+		}
+	}
+	exit 0;
+}
+
+sub ipvs
+{
+	my $vip  = shift;
+	my $port = shift;
+	my $ipvs = shift;
+	open (IPVS, "/sbin/ipvsadm -L --stats 2>/dev/null|") or return undef;
+	my $cvip  = "";
+	my $cport = "";
+	while (<IPVS>)
+	{
+		next if /^IP Virtual Server/;
+		next if /^Prot\s+LocalAddress/;
+		if (/^(\w+)\s+([\w\.-]+):([\w\d]+)\s+(\d+)[KMG]?\s+/)
+		{
+			$cvip  = $2;
+			$cport = $3;
+		}
+		elsif (/^FWM\s+([\d]+)\s/)
+		{
+		    $cvip = $1;
+		    $cport = 0;
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)G\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000000000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)M\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)K\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += $3;
+		}
+	}
+	close (IPVS) or return undef;
+	return $ipvs;
+}
+# vim:syntax=perl
Index: branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_2_0
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_2_0	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_2_0	(revision 1803)
@@ -0,0 +1,1 @@
+link cps_1_0
Index: branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_3_0
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_3_0	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/munin/plugins/cps_3_0	(revision 1803)
@@ -0,0 +1,1 @@
+link cps_1_0
Index: branches/fc15-dev/lvs/debian/config/etc/nagios/nrpe.cfg
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/nagios/nrpe.cfg	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/nagios/nrpe.cfg	(revision 1803)
@@ -0,0 +1,215 @@
+#############################################################################
+# Sample NRPE Config File 
+# Written by: Ethan Galstad (nagios@nagios.org)
+# 
+# Last Modified: 11-23-2007
+#
+# NOTES:
+# This is a sample configuration file for the NRPE daemon.  It needs to be
+# located on the remote host that is running the NRPE daemon, not the host
+# from which the check_nrpe client is being executed.
+#############################################################################
+
+
+# LOG FACILITY
+# The syslog facility that should be used for logging purposes.
+
+log_facility=daemon
+
+
+
+# PID FILE
+# The name of the file in which the NRPE daemon should write it's process ID
+# number.  The file is only written if the NRPE daemon is started by the root
+# user and is running in standalone mode.
+
+pid_file=/var/run/nrpe.pid
+
+
+
+# PORT NUMBER
+# Port number we should wait for connections on.
+# NOTE: This must be a non-priviledged port (i.e. > 1024).
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+server_port=5666
+
+
+
+# SERVER ADDRESS
+# Address that nrpe should bind to in case there are more than one interface
+# and you do not want nrpe to bind on all interfaces.
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+#server_address=192.168.1.1
+
+
+
+# ALLOWED HOST ADDRESSES
+# This is a comma-delimited list of IP address of hosts that are allowed
+# to talk to the NRPE daemon.
+#
+# NOTE: The daemon only does rudimentary checking of the client's IP
+#       address.  I would highly recommend adding entries in your
+#	/etc/hosts.allow file to allow only the specified host to connect
+#	to the port you are running this daemon on.
+#
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+allowed_hosts=18.187.1.128,18.181.0.65
+
+
+
+# NRPE USER
+# This determines the effective user that the NRPE daemon should run as.  
+# You can either supply a username or a UID.
+# 
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+nrpe_user=nagios
+
+
+
+# NRPE GROUP
+# This determines the effective group that the NRPE daemon should run as.  
+# You can either supply a group name or a GID.
+# 
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+nrpe_group=nagios
+
+
+
+# COMMAND ARGUMENT PROCESSING
+# This option determines whether or not the NRPE daemon will allow clients
+# to specify arguments to commands that are executed.  This option only works
+# if the daemon was configured with the --enable-command-args configure script
+# option.  
+#
+# *** ENABLING THIS OPTION IS A SECURITY RISK! *** 
+# Read the SECURITY file for information on some of the security implications
+# of enabling this variable.
+#
+# Values: 0=do not allow arguments, 1=allow command arguments
+
+dont_blame_nrpe=1
+
+
+
+# DEBUGGING OPTION
+# This option determines whether or not debugging messages are logged to the
+# syslog facility.
+# Values: 0=debugging off, 1=debugging on
+
+debug=0
+
+
+
+# COMMAND TIMEOUT
+# This specifies the maximum number of seconds that the NRPE daemon will
+# allow plugins to finish executing before killing them off.
+
+command_timeout=60
+
+
+
+# CONNECTION TIMEOUT
+# This specifies the maximum number of seconds that the NRPE daemon will
+# wait for a connection to be established before exiting. This is sometimes
+# seen where a network problem stops the SSL being established even though
+# all network sessions are connected. This causes the nrpe daemons to
+# accumulate, eating system resources. Do not set this too low.
+
+connection_timeout=300
+
+
+
+# WEEK RANDOM SEED OPTION
+# This directive allows you to use SSL even if your system does not have
+# a /dev/random or /dev/urandom (on purpose or because the necessary patches
+# were not applied). The random number generator will be seeded from a file
+# which is either a file pointed to by the environment valiable $RANDFILE
+# or $HOME/.rnd. If neither exists, the pseudo random number generator will
+# be initialized and a warning will be issued.
+# Values: 0=only seed from /dev/[u]random, 1=also seed from weak randomness
+
+#allow_weak_random_seed=1
+
+
+
+# INCLUDE CONFIG FILE
+# This directive allows you to include definitions from an external config file.
+
+#include=<somefile.cfg>
+
+
+
+# INCLUDE CONFIG DIRECTORY
+# This directive allows you to include definitions from config files (with a
+# .cfg extension) in one or more directories (with recursion).
+
+#include_dir=<somedirectory>
+#include_dir=<someotherdirectory>
+
+
+
+# COMMAND DEFINITIONS
+# Command definitions that this daemon will run.  Definitions
+# are in the following format:
+#
+# command[<command_name>]=<command_line>
+#
+# When the daemon receives a request to return the results of <command_name>
+# it will execute the command specified by the <command_line> argument.
+#
+# Unlike Nagios, the command line cannot contain macros - it must be
+# typed exactly as it should be executed.
+#
+# Note: Any plugins that are used in the command lines must reside
+# on the machine that this daemon is running on!  The examples below
+# assume that you have plugins installed in a /usr/local/nagios/libexec
+# directory.  Also note that you will have to modify the definitions below
+# to match the argument format the plugins expect.  Remember, these are
+# examples only!
+
+# The following examples use hardcoded command arguments...
+
+#command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
+#command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
+command[check_disk1]=/usr/lib/nagios/plugins/check_disk -w 20 -c 10 -p /dev/hda1
+command[check_disk2]=/usr/lib/nagios/plugins/check_disk -w 20 -c 10 -p /dev/hdb1
+command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
+command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200 
+
+# The following examples allow user-supplied arguments and can
+# only be used if the NRPE daemon was compiled with support for 
+# command arguments *AND* the dont_blame_nrpe directive in this
+# config file is set to '1'...
+
+command[check_users]=/usr/lib/nagios/plugins/check_users -w $ARG1$ -c $ARG2$
+command[check_load]=/usr/lib/nagios/plugins/check_load -w $ARG1$ -c $ARG2$
+command[check_disk]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$
+command[check_disk_p]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
+command[check_procs]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$
+command[check_procs_C]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -C $ARG3$
+command[check_procs_P]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -P $ARG3$
+command[check_procs_m]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -m $ARG3$
+command[check_procs_s]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
+command[check_procs_u]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -u $ARG3$
+command[check_procs_z]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -z $ARG3$
+
+#command[check_users]=/usr/lib/nagios/plugins/check_users -w $ARG1$ -c $ARG2$
+#command[check_load]=/usr/lib/nagios/plugins/check_load -w $ARG1$ -c $ARG2$
+#command[check_disk]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
+#command[check_procs]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
+
+#
+# local configuration:
+#	if you'd prefer, you can instead place directives here
+include=/etc/nagios/nrpe_local.cfg
+
+# 
+# you can place your config snipplets into nrpe.d/
+include_dir=/etc/nagios/nrpe.d/
+
+
Index: branches/fc15-dev/lvs/debian/config/etc/network/if-up.d/iptables
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/network/if-up.d/iptables	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/network/if-up.d/iptables	(revision 1803)
@@ -0,0 +1,33 @@
+#!/bin/sh
+## Joe Presbrey <presbrey@mit.edu>
+## Quentin Smith <quentin@mit.edu>
+## Mitchell Berger <mitchb@mit.edu>
+## SIPB Scripts LVS Firewall marks
+
+iptables -F -t mangle
+
+# Create a table for regular scripts hosts
+iptables -t mangle -N scripts 2>/dev/null || :
+
+# scripts-vhosts.mit.edu
+iptables -A PREROUTING -t mangle -d 18.181.0.46 -j scripts
+# scripts.mit.edu
+iptables -A PREROUTING -t mangle -d 18.181.0.43 -j scripts
+# scripts-cert.mit.edu
+iptables -A PREROUTING -t mangle -d 18.181.0.50 -j scripts
+
+# Send Apache-bound traffic to FWM 2 (load-balanced)
+iptables -A scripts -t mangle -m tcp -m multiport -p tcp --dports 80,443,444 -j MARK --set-mark 2
+# Send SMTP-bound traffic to FWM 3 (load-balanced)
+iptables -A scripts -t mangle -m tcp -p tcp --dport 25 -j MARK --set-mark 3
+# Send finger-bound traffic to FWM 255 (the LVS director itself)
+iptables -A scripts -t mangle -m tcp -p tcp --dport 78:79 -j MARK --set-mark 255
+# Send everything else to FWM 1 (primary)
+iptables -A scripts -t mangle -m mark --mark 0 -j MARK --set-mark 1
+
+# webzephyr.mit.edu is special because its SMTP needs to always go to the primary (FWM 1)
+iptables -A PREROUTING -t mangle -m tcp -m multiport -p tcp -d 18.181.0.49 --dports 80,443,444 -j MARK --set-mark 2
+iptables -A PREROUTING -t mangle -m mark --mark 0 -d 18.181.0.49 -j MARK --set-mark 1
+
+# scripts-primary.mit.edu goes to the primary (FWM 1) on all ports
+iptables -A PREROUTING -t mangle -d 18.181.0.182 -j MARK --set-mark 1
Index: branches/fc15-dev/lvs/debian/config/etc/ntp.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/ntp.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/ntp.conf	(revision 1803)
@@ -0,0 +1,45 @@
+# /etc/ntp.conf, configuration for ntpd
+
+driftfile /var/lib/ntp/ntp.drift
+statsdir /var/log/ntpstats/
+
+statistics loopstats peerstats clockstats
+filegen loopstats file loopstats type day enable
+filegen peerstats file peerstats type day enable
+filegen clockstats file clockstats type day enable
+
+
+# You do need to talk to an NTP server or two (or three).
+server time.mit.edu
+
+# pool.ntp.org maps to more than 300 low-stratum NTP servers.
+# Your server will pick a different set every time it starts up.
+#  *** Please consider joining the pool! ***
+#  *** <http://www.pool.ntp.org/join.html> ***
+#server 0.debian.pool.ntp.org iburst
+#server 1.debian.pool.ntp.org iburst
+#server 2.debian.pool.ntp.org iburst
+#server 3.debian.pool.ntp.org iburst
+
+# By default, exchange time with everybody, but don't allow configuration.
+# See /usr/share/doc/ntp-doc/html/accopt.html for details.
+restrict -4 default kod notrap nomodify nopeer noquery
+restrict -6 default kod notrap nomodify nopeer noquery
+
+# Local users may interrogate the ntp server more closely.
+restrict 127.0.0.1
+restrict ::1
+
+# Clients from this (example!) subnet have unlimited access,
+# but only if cryptographically authenticated
+#restrict 192.168.123.0  mask  255.255.255.0 notrust
+
+# If you want to provide time to your local subnet, change the next line.
+# (Again, the address is an example only.)
+#broadcast 192.168.123.255
+
+# If you want to listen to time broadcasts on your local subnet,
+# de-comment the next lines. Please do this only if you trust everybody
+# on the network!
+#disable auth
+#broadcastclient
Index: branches/fc15-dev/lvs/debian/config/etc/sysctl.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/sysctl.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/sysctl.conf	(revision 1803)
@@ -0,0 +1,69 @@
+#
+# /etc/sysctl.conf - Configuration file for setting system variables
+# See /etc/sysctl.d/ for additonal system variables
+# See sysctl.conf (5) for information.
+#
+
+#kernel.domainname = example.com
+
+# Uncomment the following to stop low-level messages on console
+#kernel.printk = 4 4 1 7
+
+##############################################################3
+# Functions previously found in netbase
+#
+
+# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
+# Turn on Source Address Verification in all interfaces to
+# prevent some spoofing attacks
+#net.ipv4.conf.default.rp_filter=1
+#net.ipv4.conf.all.rp_filter=1
+
+# Uncomment the next line to enable TCP/IP SYN cookies
+# This disables TCP Window Scaling (http://lkml.org/lkml/2008/2/5/167),
+# and is not recommended.
+#net.ipv4.tcp_syncookies=1
+
+# Uncomment the next line to enable packet forwarding for IPv4
+net.ipv4.ip_forward=1
+
+# Uncomment the next line to enable packet forwarding for IPv6
+#net.ipv6.conf.all.forwarding=1
+
+
+###################################################################
+# Additional settings - these settings can improve the network
+# security of the host and prevent against some network attacks
+# including spoofing attacks and man in the middle attacks through
+# redirection. Some network environments, however, require that these
+# settings are disabled so review and enable them as needed.
+#
+# Ignore ICMP broadcasts
+#net.ipv4.icmp_echo_ignore_broadcasts = 1
+#
+# Ignore bogus ICMP errors
+#net.ipv4.icmp_ignore_bogus_error_responses = 1
+# 
+# Do not accept ICMP redirects (prevent MITM attacks)
+#net.ipv4.conf.all.accept_redirects = 0
+#net.ipv6.conf.all.accept_redirects = 0
+# _or_
+# Accept ICMP redirects only for gateways listed in our default
+# gateway list (enabled by default)
+# net.ipv4.conf.all.secure_redirects = 1
+#
+# Do not send ICMP redirects (we are not a router)
+#net.ipv4.conf.all.send_redirects = 0
+#
+# Do not accept IP source route packets (we are not a router)
+#net.ipv4.conf.all.accept_source_route = 0
+#net.ipv6.conf.all.accept_source_route = 0
+#
+# Log Martian Packets
+#net.ipv4.conf.all.log_martians = 1
+#
+# The contents of /proc/<pid>/maps and smaps files are only visible to 
+# readers that are allowed to ptrace() the process
+# kernel.maps_protect = 1
+
+net.ipv4.vs.expire_quiescent_template = 1
Index: branches/fc15-dev/lvs/debian/config/etc/syslog-ng/syslog-ng.conf
===================================================================
--- branches/fc15-dev/lvs/debian/config/etc/syslog-ng/syslog-ng.conf	(revision 1803)
+++ branches/fc15-dev/lvs/debian/config/etc/syslog-ng/syslog-ng.conf	(revision 1803)
@@ -0,0 +1,348 @@
+#
+# Configuration file for syslog-ng under Debian
+#
+# attempts at reproducing default syslog behavior
+
+# the standard syslog levels are (in descending order of priority):
+# emerg alert crit err warning notice info debug
+# the aliases "error", "panic", and "warn" are deprecated
+# the "none" priority found in the original syslogd configuration is
+# only used in internal messages created by syslogd
+
+
+######
+# options
+
+options {
+        # disable the chained hostname format in logs
+        # (default is enabled)
+        chain_hostnames(0);
+
+        # the time to wait before a died connection is re-established
+        # (default is 60)
+        time_reopen(10);
+
+        # the time to wait before an idle destination file is closed
+        # (default is 60)
+        time_reap(360);
+
+        # the number of lines buffered before written to file
+        # you might want to increase this if your disk isn't catching with
+        # all the log messages you get or if you want less disk activity
+        # (say on a laptop)
+        # (default is 0)
+        #sync(0);
+
+        # the number of lines fitting in the output queue
+        log_fifo_size(2048);
+
+        # enable or disable directory creation for destination files
+        create_dirs(yes);
+
+        # default owner, group, and permissions for log files
+        # (defaults are 0, 0, 0600)
+        #owner(root);
+        group(adm);
+        perm(0640);
+
+        # default owner, group, and permissions for created directories
+        # (defaults are 0, 0, 0700)
+        #dir_owner(root);
+        #dir_group(root);
+        dir_perm(0755);
+
+        # enable or disable DNS usage
+        # syslog-ng blocks on DNS queries, so enabling DNS may lead to
+        # a Denial of Service attack
+        # (default is yes)
+        use_dns(no);
+
+        # maximum length of message in bytes
+        # this is only limited by the program listening on the /dev/log Unix
+        # socket, glibc can handle arbitrary length log messages, but -- for
+        # example -- syslogd accepts only 1024 bytes
+        # (default is 2048)
+        #log_msg_size(2048);
+
+	#Disable statistic log messages.
+	stats_freq(0);
+
+	# Some program send log messages through a private implementation.
+	# and sometimes that implementation is bad. If this happen syslog-ng
+	# may recognise the program name as hostname. Whit this option
+	# we tell the syslog-ng that if a hostname match this regexp than that
+	# is not a real hostname.
+	bad_hostname("^gconfd$");
+};
+
+
+######
+# sources
+
+# all known message sources
+source s_all {
+        # message generated by Syslog-NG
+        internal();
+        # standard Linux log source (this is the default place for the syslog()
+        # function to send logs to)
+        unix-stream("/dev/log");
+        # messages from the kernel
+        file("/proc/kmsg" log_prefix("kernel: "));
+        # use the following line if you want to receive remote UDP logging messages
+        # (this is equivalent to the "-r" syslogd flag)
+        # udp();
+};
+
+
+######
+# destinations
+
+# some standard log files
+destination df_auth { file("/var/log/auth.log"); };
+destination df_syslog { file("/var/log/syslog"); };
+destination df_cron { file("/var/log/cron.log"); };
+destination df_daemon { file("/var/log/daemon.log"); };
+destination df_kern { file("/var/log/kern.log"); };
+destination df_lpr { file("/var/log/lpr.log"); };
+destination df_mail { file("/var/log/mail.log"); };
+destination df_user { file("/var/log/user.log"); };
+destination df_uucp { file("/var/log/uucp.log"); };
+
+# these files are meant for the mail system log files
+# and provide re-usable destinations for {mail,cron,...}.info,
+# {mail,cron,...}.notice, etc.
+destination df_facility_dot_info { file("/var/log/$FACILITY.info"); };
+destination df_facility_dot_notice { file("/var/log/$FACILITY.notice"); };
+destination df_facility_dot_warn { file("/var/log/$FACILITY.warn"); };
+destination df_facility_dot_err { file("/var/log/$FACILITY.err"); };
+destination df_facility_dot_crit { file("/var/log/$FACILITY.crit"); };
+
+# these files are meant for the news system, and are kept separated
+# because they should be owned by "news" instead of "root"
+destination df_news_dot_notice { file("/var/log/news/news.notice" owner("news")); };
+destination df_news_dot_err { file("/var/log/news/news.err" owner("news")); };
+destination df_news_dot_crit { file("/var/log/news/news.crit" owner("news")); };
+
+# some more classical and useful files found in standard syslog configurations
+destination df_debug { file("/var/log/debug"); };
+destination df_messages { file("/var/log/messages"); };
+
+# pipes
+# a console to view log messages under X
+destination dp_xconsole { pipe("/dev/xconsole"); };
+
+# consoles
+# this will send messages to everyone logged in
+destination du_all { usertty("*"); };
+
+
+######
+# filters
+
+# all messages from the auth and authpriv facilities
+filter f_auth { facility(auth, authpriv); };
+
+# all messages except from the auth and authpriv facilities
+filter f_syslog { not facility(auth, authpriv); };
+
+# respectively: messages from the cron, daemon, kern, lpr, mail, news, user,
+# and uucp facilities
+filter f_cron { facility(cron); };
+filter f_daemon { facility(daemon); };
+filter f_kern { facility(kern); };
+filter f_lpr { facility(lpr); };
+filter f_mail { facility(mail); };
+filter f_news { facility(news); };
+filter f_user { facility(user); };
+filter f_uucp { facility(uucp); };
+
+# some filters to select messages of priority greater or equal to info, warn,
+# and err
+# (equivalents of syslogd's *.info, *.warn, and *.err)
+filter f_at_least_info { level(info..emerg); };
+filter f_at_least_notice { level(notice..emerg); };
+filter f_at_least_warn { level(warn..emerg); };
+filter f_at_least_err { level(err..emerg); };
+filter f_at_least_crit { level(crit..emerg); };
+
+# all messages of priority debug not coming from the auth, authpriv, news, and
+# mail facilities
+filter f_debug { level(debug) and not facility(auth, authpriv, news, mail); };
+
+# all messages of info, notice, or warn priority not coming form the auth,
+# authpriv, cron, daemon, mail, and news facilities
+filter f_messages {
+        level(info,notice,warn)
+            and not facility(auth,authpriv,cron,daemon,mail,news);
+};
+
+# messages with priority emerg
+filter f_emerg { level(emerg); };
+
+# complex filter for messages usually sent to the xconsole
+filter f_xconsole {
+    facility(daemon,mail)
+        or level(debug,info,notice,warn)
+        or (facility(news)
+                and level(crit,err,notice));
+};
+
+
+######
+# logs
+# order matters if you use "flags(final);" to mark the end of processing in a
+# "log" statement
+
+# these rules provide the same behavior as the commented original syslogd rules
+
+# auth,authpriv.*                 /var/log/auth.log
+log {
+        source(s_all);
+        filter(f_auth);
+        destination(df_auth);
+};
+
+# *.*;auth,authpriv.none          -/var/log/syslog
+log {
+        source(s_all);
+        filter(f_syslog);
+        destination(df_syslog);
+};
+
+# this is commented out in the default syslog.conf
+# cron.*                         /var/log/cron.log
+#log {
+#        source(s_all);
+#        filter(f_cron);
+#        destination(df_cron);
+#};
+
+# daemon.*                        -/var/log/daemon.log
+log {
+        source(s_all);
+        filter(f_daemon);
+        destination(df_daemon);
+};
+
+# kern.*                          -/var/log/kern.log
+log {
+        source(s_all);
+        filter(f_kern);
+        destination(df_kern);
+};
+
+# lpr.*                           -/var/log/lpr.log
+log {
+        source(s_all);
+        filter(f_lpr);
+        destination(df_lpr);
+};
+
+# mail.*                          -/var/log/mail.log
+log {
+        source(s_all);
+        filter(f_mail);
+        destination(df_mail);
+};
+
+# user.*                          -/var/log/user.log
+log {
+        source(s_all);
+        filter(f_user);
+        destination(df_user);
+};
+
+# uucp.*                          /var/log/uucp.log
+log {
+        source(s_all);
+        filter(f_uucp);
+        destination(df_uucp);
+};
+
+# mail.info                       -/var/log/mail.info
+log {
+        source(s_all);
+        filter(f_mail);
+        filter(f_at_least_info);
+        destination(df_facility_dot_info);
+};
+
+# mail.warn                       -/var/log/mail.warn
+log {
+        source(s_all);
+        filter(f_mail);
+        filter(f_at_least_warn);
+        destination(df_facility_dot_warn);
+};
+
+# mail.err                        /var/log/mail.err
+log {
+        source(s_all);
+        filter(f_mail);
+        filter(f_at_least_err);
+        destination(df_facility_dot_err);
+};
+
+# news.crit                       /var/log/news/news.crit
+log {
+        source(s_all);
+        filter(f_news);
+        filter(f_at_least_crit);
+        destination(df_news_dot_crit);
+};
+
+# news.err                        /var/log/news/news.err
+log {
+        source(s_all);
+        filter(f_news);
+        filter(f_at_least_err);
+        destination(df_news_dot_err);
+};
+
+# news.notice                     /var/log/news/news.notice
+log {
+        source(s_all);
+        filter(f_news);
+        filter(f_at_least_notice);
+        destination(df_news_dot_notice);
+};
+
+
+# *.=debug;\
+#         auth,authpriv.none;\
+#         news.none;mail.none     -/var/log/debug
+log {
+        source(s_all);
+        filter(f_debug);
+        destination(df_debug);
+};
+
+
+# *.=info;*.=notice;*.=warn;\
+#         auth,authpriv.none;\
+#         cron,daemon.none;\
+#         mail,news.none          -/var/log/messages
+log {
+        source(s_all);
+        filter(f_messages);
+        destination(df_messages);
+};
+
+# *.emerg                         *
+log {
+        source(s_all);
+        filter(f_emerg);
+        destination(du_all);
+};
+
+
+# daemon.*;mail.*;\
+#         news.crit;news.err;news.notice;\
+#         *.=debug;*.=info;\
+#         *.=notice;*.=warn       |/dev/xconsole
+log {
+        source(s_all);
+        filter(f_xconsole);
+        destination(dp_xconsole);
+};
+
Index: branches/fc15-dev/lvs/debian/sys/sbin/in.vs_conn
===================================================================
--- branches/fc15-dev/lvs/debian/sys/sbin/in.vs_conn	(revision 1803)
+++ branches/fc15-dev/lvs/debian/sys/sbin/in.vs_conn	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cat /proc/net/ip_vs_conn
Index: branches/fc15-dev/lvs/debian/sys/sbin/in.vs_main
===================================================================
--- branches/fc15-dev/lvs/debian/sys/sbin/in.vs_main	(revision 1803)
+++ branches/fc15-dev/lvs/debian/sys/sbin/in.vs_main	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cat /proc/net/ip_vs
Index: branches/fc15-dev/lvs/debian/sys/sbin/in.vs_stat
===================================================================
--- branches/fc15-dev/lvs/debian/sys/sbin/in.vs_stat	(revision 1803)
+++ branches/fc15-dev/lvs/debian/sys/sbin/in.vs_stat	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cat /proc/net/ip_vs_stats
Index: branches/fc15-dev/lvs/doc/install-howto
===================================================================
--- branches/fc15-dev/lvs/doc/install-howto	(revision 1803)
+++ branches/fc15-dev/lvs/doc/install-howto	(revision 1803)
@@ -0,0 +1,31 @@
+- TO TEMPORARILY DISABLE HEARTBEAT: on an existing node, run
+  crm_attribute -n is_managed_default -v false
+- confirm that the change occurred with crm_attribute -n is_managed_default -G
+- Install Debian 4.0 from a minimal Debian install CD
+- aptitude install openssh-server krb5-user krb5-clients
+- dpkg-reconfigure krb5-config
+- Set GSSAPIAuthentication yes in /etc/ssh/sshd_config
+- Add keytab and .k5login
+- Edit lvs/debian/config/etc/ha.d/ha.cf in SVN to add "node foo", where foo is the new machine's hostname as reported by uname -n
+- Synchronize /etc out of SVN by running
+svn co https://scripts.mit.edu:1111/lvs/config/etc /etc
+and moving files/directories out of the way as it checks out.
+- aptitude update; aptitude install heartbeat ldirectord lighttpd-mod-magnet; # should install version >= 2.1.2
+- aptitude install munin-node
+- Copy /etc/ha.d/authkeys from an existing LVS node
+- svn up on each existing LVS node and then run /etc/init.d/heartbeat reload
+- If the node will run LVS, run "dpkg-reconfigure ipvsadm" and configure it to run "both" daemons on the correct network interface
+- Run /etc/init.d/heartbeat start on the new node
+- No services will be allocated to this node. To allocate scripts_LVS to it, run
+cibadmin -M -X '
+       <rsc_location id="rsc_location_scripts_LVS_all" rsc="scripts_LVS">
+         <rule id="prefered_rsc_location_scripts_LVS_all" score="-INFINITY" boolean_op="and">
+           <expression attribute="#uname" id="733286ca-cde9-4941-bab0-59af8bd6b55a" operation="ne" value="rack-forward"/>
+           <expression attribute="#uname" id="55373ba0-9e5e-43de-adf6-ac77bfe5bac6" operation="ne" value="not-backward"/>
+	   <expression attribute="#uname" id="UNIQUE_ID" operation="ne" value="new-node"/>
+         </rule>
+       </rsc_location>
+'
+- TO REENABLE HEARTBEAT, run crm_attribute -n is_managed_default -v true
+- Watch /var/log/messages and /var/log/syslog to make sure heartbeat is working
+- Add machine to noc/munin/munin.conf (syn:/etc/munin/munin.conf)
Index: branches/fc15-dev/noc/html/.attic/show.php
===================================================================
--- branches/fc15-dev/noc/html/.attic/show.php	(revision 1803)
+++ branches/fc15-dev/noc/html/.attic/show.php	(revision 1803)
@@ -0,0 +1,91 @@
+<?php
+/*
+(c)2006 Joe Presbrey <presbrey@mit.edu>
+*/
+
+include('rrdgraph.inc.php');
+require_once('rrdgraph.lib.php');
+
+if (isset($_GET['h'])&&isset($_GET['s'])&&isset($_GET['i'])) {
+	displayGraph($_GET['h'],$_GET['s'],$_GET['i']);
+	exit;
+}
+
+$skip_host[] = 'localhost';
+$skip_service[] = 'DISK_%2Fafs';
+$skip_service[] = 'DISK_%2Fboot';
+$skip_service[] = 'DISK_%2Fdev%2Fshm';
+$only_host = array();
+if (isset($_GET['host']))
+	$only_host[] = $_GET['host'];
+$only_service = array();
+if (isset($_GET['service']))
+	$only_service[] = $_GET['service'];
+
+function getServices($time=115200) {
+	$s = array();
+	foreach(glob("{$GLOBALS['RRD_PATH']}/*.rrd") as $f) {
+		if (time()-filemtime($f)<=$time) {
+			$e = explode('_', basename($f));
+//			//$s[$e[0]][] = $e[1];
+			if ($e[1] == 'DISK')
+				$s[array_shift($e)][] = substr(implode('_', $e),0,-4);
+			else {
+//				array_pop($e);
+				$s[$e[0]][] = $e[1];
+			}
+		}
+	}
+	return $s;
+}
+
+function displayGraph($host,$service,$time=null) {
+	$times = array(
+		'hour' => 19200,
+		'day' => 115200,
+		'week' => 691200,
+		'month' => 3024000,
+		'year' => 34560000);
+	$geom = array(
+		'hour' => '450x180',
+		'day' => '300x100',
+		'week' => '300x100',
+		'month' => '300x100',
+		'year' => '300x100');
+	$title = array(
+		'hour' => "$host: $service",
+		'day' => "$service today",
+		'week' => "$service this week",
+		'month' => "$service this month",
+		'year' => "$service this year");
+	if (is_null($time) || !isset($times[$time])) $time = 'day';
+	outputGraph($host, $service, $times[$time], array('legend'=>($time!='hour'?false:true),
+							'title'=>$title[$time],
+							'geom'=>explode('x',$geom[$time])));
+	//virtual('/ng/cgi-bin/show.cgi?host='.$host.'&service='.$service.'&graph='.$times[$time].'&geom='.$geom[$time].'&rrdopts='.str_replace(' ','_',$rrdopts[$time]));
+	//virtual('/ng/cgi-rin/show.cgi?host='.$host.'&service='.$service.'&graph=118800');
+	//virtual('/ng/cgi-bin/show.cgi?host=better-mousetrap&service=LOAD&db=load&graph=118800');
+	exit;
+}
+
+//displayGraph('better-mousetrap','LOAD');
+echo '<table border=0 cellspacing=0 cellpadding=0>';
+foreach(getServices() as $host=>$services) {
+	$host = urldecode($host);
+	if (in_array($host, $skip_host)) continue;
+	if (count($only_host) && !in_array($host, $only_host)) continue;
+	echo '<tr>';
+	foreach($services as $service) {
+		if (in_array($service, $skip_service)) continue;
+		if (count($only_service) && !in_array($service, $only_service)) continue;
+		echo '<td>';	
+		printf('<img src="show.php?h=%s&s=%s&i=%s">', $host, $service, 'hour');
+		echo '</td><td>';
+		printf('<img src="?h=%s&s=%s&i=%s">', $host, $service, 'day');
+		echo '<br />';
+		printf('<img src="?h=%s&s=%s&i=%s">', $host, $service, 'week');
+		echo '</td>';
+	}
+	echo '</tr>';
+}
+echo '</table>';
Index: branches/fc15-dev/noc/html/.htaccess
===================================================================
--- branches/fc15-dev/noc/html/.htaccess	(revision 1803)
+++ branches/fc15-dev/noc/html/.htaccess	(revision 1803)
@@ -0,0 +1,6 @@
+
+RewriteEngine On
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME}.php -f
+RewriteRule ^(.*) $1.php
Index: branches/fc15-dev/noc/html/graph.php
===================================================================
--- branches/fc15-dev/noc/html/graph.php	(revision 1803)
+++ branches/fc15-dev/noc/html/graph.php	(revision 1803)
@@ -0,0 +1,20 @@
+<?php
+include('rrdgraph.inc.php');
+require_once('rrdgraph.lib.php');
+
+import_request_variables('g','i_');
+
+$host = isset($i_host)?$i_host:'better-mousetrap';
+$service = isset($i_service)?$i_service:'LOAD';
+$time = isset($i_time)?$i_time:'115200';
+$legend = isset($i_legend)&&$i_legend==0?0:1;
+//$title = isset($i_title)&&strlen($i_title)?($i_title):('%h: %s');
+$title = '%h: %s';
+if (isset($i_title) && $i_title==0) $title = null;
+$geom = isset($i_geom)&&strpos($i_geom,'x')?explode('x',$i_geom):array(403,146); /* (500x200 on output) */
+$width = isset($i_width)&&is_numeric($i_width)?floor($i_width):$geom[0];
+$height = isset($i_height)&&is_numeric($i_height)?floor($i_height):$geom[1];
+
+$time = rrd_time($time);
+
+outputGraph($host, $service, $time, array('legend'=>($legend==1?true:false), 'title'=>$title, 'geom'=>array($width,$height)));
Index: branches/fc15-dev/noc/html/index.php
===================================================================
--- branches/fc15-dev/noc/html/index.php	(revision 1803)
+++ branches/fc15-dev/noc/html/index.php	(revision 1803)
@@ -0,0 +1,27 @@
+<?php
+
+
+?>
+<html>
+<head>
+<title>scripts-noc.mit.edu</title>
+<style>
+* {
+	margin: 0;
+}
+</style>
+</head>
+
+<body>
+
+<div style="display: block;">
+<img src="ping" /><img src="ping?t=604800" />
+</div>
+<div style="display: block;">
+<img src="load" /><img src="load?t=604800" />
+</div>
+<div style="display: block;">
+<img src="mysql" /><img src="mysql?t=604800" />
+</div>
+
+</body>
Index: branches/fc15-dev/noc/html/load.php
===================================================================
--- branches/fc15-dev/noc/html/load.php	(revision 1803)
+++ branches/fc15-dev/noc/html/load.php	(revision 1803)
@@ -0,0 +1,18 @@
+<?php
+require_once('rrdgraph.inc.php');
+require_once('rrdgraph.lib.php');
+
+$RRD_IGNORE['load'][] = 'avg1min';
+$RRD_IGNORE['load'][] = 'avg5min';
+
+$time = isset($_GET['t'])?rrd_time($_GET['t']):100000;
+
+outputGraph(array('b-m',
+		  'o-f',
+		  'k-s',
+		  's-b',
+		  'n-f',
+		  'n-b'),
+		  'LOAD', $time, array('legend'=>1,
+					'title'=>'%s',
+					'geom'=>array(403,146)));
Index: branches/fc15-dev/noc/html/mysql.php
===================================================================
--- branches/fc15-dev/noc/html/mysql.php	(revision 1803)
+++ branches/fc15-dev/noc/html/mysql.php	(revision 1803)
@@ -0,0 +1,14 @@
+<?php
+require_once('rrdgraph.inc.php');
+require_once('rrdgraph.lib.php');
+
+//$RRD_IGNORE['mysql'][] = 'avg15min';
+//$RRD_IGNORE['load'][] = 'avg5min';
+
+$time = isset($_GET['t'])?rrd_time($_GET['t']):100000;
+
+outputGraph(array('k-s',
+		  's-b'),
+		  'MYSQL', $time, array('legend'=>1,
+					'title'=>'%s',
+					'geom'=>array(403,146)));
Index: branches/fc15-dev/noc/html/ping.php
===================================================================
--- branches/fc15-dev/noc/html/ping.php	(revision 1803)
+++ branches/fc15-dev/noc/html/ping.php	(revision 1803)
@@ -0,0 +1,17 @@
+<?php
+require_once('rrdgraph.inc.php');
+require_once('rrdgraph.lib.php');
+
+$RRD_IGNORE['ping'][] = 'losspct';
+
+$time = isset($_GET['t'])?rrd_time($_GET['t']):100000;
+
+outputGraph(array('b-m',
+		  'o-f',
+		  'k-s',
+		  's-b',
+		  'n-f',
+		  'n-b'),
+		  'PING', $time, array('legend'=>1,
+					'title'=>'%s',
+					'geom'=>array(403,146)));
Index: branches/fc15-dev/noc/html/rrdgraph.inc.php
===================================================================
--- branches/fc15-dev/noc/html/rrdgraph.inc.php	(revision 1803)
+++ branches/fc15-dev/noc/html/rrdgraph.inc.php	(revision 1803)
@@ -0,0 +1,45 @@
+<?php
+/*
+(c)2006 Joe Presbrey <presbrey@mit.edu>
+*/
+
+$RRD_PATH = realpath(dirname(__FILE__).'/../ng/rrd');
+$RRD_IGNORE['tcp'][] = 'critical_time';
+$RRD_IGNORE['tcp'][] = 'warning_time';
+$RRD_IGNORE['tcp'][] = 'socket_timeout';
+$RRD_IGNORE['users'][] = 'uwarn';
+$RRD_IGNORE['users'][] = 'ucrit';
+$RRD_IGNORE['mysql'] = $RRD_IGNORE['tcp'];
+$RRD_IGNORE['https'] = $RRD_IGNORE['tcp'];
+$RRD_IGNORE['disk'][] = 'root';
+$RRD_IGNORE['disk'][] = 'user';
+$RRD_IGNORE['disk'][] = 'blockpct';
+$RRD_IGNORE['disk'][] = 'inodepct';
+$RRD_IGNORE['disk'][] = 'inodepct';
+$RRD_IGNORE['disk'][] = 'pctfree';
+$RRD_IGNORE['disk_/'] = $RRD_IGNORE['disk'];
+$RRD_IGNORE['disk_/afs'] = $RRD_IGNORE['disk'];
+$RRD_IGNORE['disk_/boot'] = $RRD_IGNORE['disk'];
+$RRD_IGNORE['disk_/dev/shm'] = $RRD_IGNORE['disk'];
+$RRD_IGNORE['disk_/srv'] = $RRD_IGNORE['disk'];
+
+$RRD_TIMES = array(
+	'hour' => 9000,
+	'day' => 115200,
+	'week' => 691200,
+	'month' => 3024000,
+	'year' => 34560000);
+
+function rrd_time($var) {
+	global $RRD_TIMES;
+	if (isset($RRD_TIMES[$var])) {
+		$time = $RRD_TIMES[$var];
+	} elseif (is_numeric($var)) {
+		$time = floor($var);
+	} else {
+		$time = 115200;
+	}
+	return $time;
+}
+
+?>
Index: branches/fc15-dev/noc/html/rrdgraph.lib.php
===================================================================
--- branches/fc15-dev/noc/html/rrdgraph.lib.php	(revision 1803)
+++ branches/fc15-dev/noc/html/rrdgraph.lib.php	(revision 1803)
@@ -0,0 +1,148 @@
+<?php
+/*
+(c)2006 Joe Presbrey <presbrey@mit.edu>
+inspired by parts of nagiosgraph in Perl
+*/
+
+function hashcolor($x) {
+  $x .= 'x'; $c=1;
+  for($i = 0; $i < strlen($x); $i++) { $c=(51*$c+ord($x{$i}))%216; }
+  $h = array(51*floor($c/36), 51*floor($c/6%6), 51*($c%6));
+  $i = $n = $m = 0;
+  for($i = 0; $i <= 2; $i++) {
+    if ($h[$i] < $h[$m]) $m = $i;
+    if ($h[$i] > $h[$n]) $n = $i;
+  }
+  if ($h[$m]>102) $h[$m] = 102;
+  if ($h[$n]<153) $h[$n] = 153;
+  $n = ($h[2])+($h[1]*256)+$h[0]*256*256;
+  $c = sprintf("%06X", ($h[2])+($h[1]*256)+$h[0]*256*256);
+  return $c;
+}
+
+function findRRD($host, $service) {
+	if (isset($GLOBALS['RRD_PATH'])) {
+		$rrd = $GLOBALS['RRD_PATH'];
+	} else {
+		$rrd = dirname(__FILE__);
+	}
+	$f = glob("$rrd/{$host}_{$service}_*.rrd");
+	if (count($f)) {
+		$o = array_shift($f);
+	} else {
+		$host = str_replace('-','%2D',rawurlencode($host));
+		$service = str_replace('-','%2D',rawurlencode($service));
+		$f = glob("$rrd/{$host}_{$service}_*.rrd");
+		if (count($f)) {
+			$o = array_shift($f);
+		} else {
+			$f = glob("$rrd/{$host}_{$service}*.rrd");
+			if (count($f))
+				$o = array_shift($f);
+		}
+	}
+	$p = realpath($o);
+	if (strlen($p)>strlen($host)+strlen($service)) {
+		if (preg_match_all('/([^_]+)_([^_]+)_(.+).rrd/iU', basename($p), $m)) {
+			return array($p, $m[1][0], $m[2][0], $m[3][0]);
+		}
+	}
+}
+
+function graphInfo($file) {
+	$rrdinfo = `rrdtool info $file`;
+	preg_match_all('/ds\[([^\]]*)\]\./',$rrdinfo,$ds);
+	$lines = array_unique($ds[1]);
+	//sort($lines);
+	return $lines;
+}
+
+function makeDefs($file, $ignores=array(), $oneHost=true) {
+	$info = graphInfo($file[0]);
+	$defs = array();
+	$def = 'DEF:$dj=$file:$di:AVERAGE' .
+               ' LINE2:$dj#$c:$dj' .
+               ' GPRINT:$dj:MAX:Max\\\\:\\ %6.2lf%s' .
+               ' GPRINT:$dj:AVERAGE:Avg\\\\:\\ %6.2lf%s' .
+               ' GPRINT:$dj:MIN:Min\\\\:\\ %6.2lf%s' .
+               ' GPRINT:$dj:LAST:Cur\\\\:\\ %6.2lf%s\\\\n';
+	foreach($info as $sv) {
+		if (in_array(strtolower($sv), $ignores)) continue;
+		$d = str_replace('$di',$sv,$def);
+		if ($oneHost) {
+			$d = str_replace('$dj',$sv,$d);
+			$d = str_replace('$c',hashcolor($sv),$d);
+		} else {
+			$d = str_replace('$dj',urldecode($file[1]).'_'.$sv,$d);
+			$d = str_replace('$c',hashcolor(md5($file[0].$sv)),$d);
+		}
+		$d = str_replace('$file',$file[0],$d);
+		$defs[] = $d;
+	}
+	return implode(' ',$defs);
+}
+
+function outputGraph($hosts, $service, $time, $opts = array()) {
+	if (!is_array($hosts)) $hosts = array($hosts);
+	$oneHost = count($hosts)<=1;
+//	if (!is_array($services)) $services = array($services);
+	$defs = array();
+	$args = array();
+	$files = array();
+	foreach($hosts as $host) {
+		$file = findRRD($host, $service);
+		if (is_array($file) && strlen($file[0])) $files[] = $file;
+	}
+	foreach($files as $file) {
+		if (isset($GLOBALS['RRD_IGNORE'])
+		   && isset($GLOBALS['RRD_IGNORE'][strtolower($service)])) {
+			$def = makeDefs($file, $GLOBALS['RRD_IGNORE'][strtolower($service)], $oneHost);
+		} else {
+			$def = makeDefs($file, array(), $oneHost);
+		}
+		if (strlen($def)) $defs[] = $def;
+	}
+
+	if (count($opts))
+		extract($opts);
+	if (isset($geom)) {
+		if (isset($geom[0]))
+			$args[] = '-w '.$geom[0];
+		if (isset($geom[1]))
+			$args[] = '-h '.$geom[1];
+	}
+	if (isset($legend) && !$legend) {
+		$args[] = '-g';
+	}
+	if (isset($title)) {
+		if (count($files)) {
+			list($fhost, $fservice, $fdb) = array_slice(explode('_',basename($files[0][0])),0,3);
+			if ($oneHost) {
+				$title = str_replace('%h', urldecode($fhost), $title);
+				$title = str_replace('%s', urldecode($fservice), $title);
+			} else {
+				$title = str_replace('%h', implode(',',$hosts), $title);
+				$title = str_replace('%s', urldecode($service), $title);
+			}
+		}
+		$title = escapeshellarg($title);
+		if (strlen($title)) $args[] = "-v$title";
+	}
+
+	if (count($defs)) {
+		$defs = implode(' ', $defs);
+		if (count($args))
+			$argstr = implode(' ', $args);
+		$cmd = "rrdtool graph - -a PNG --start -$time $defs $argstr";
+		$data = `$cmd`;
+		if (strlen($data)>0) {
+			header('Content-Type: image/png');
+			echo $data;
+			exit;
+		} else {
+			echo "failed: $cmd";
+		}
+	}
+}
+
+//outputGraph('better-mousetrap', 'DISK: /', 192000);
Index: branches/fc15-dev/noc/munin/munin.conf
===================================================================
--- branches/fc15-dev/noc/munin/munin.conf	(revision 1803)
+++ branches/fc15-dev/noc/munin/munin.conf	(revision 1803)
@@ -0,0 +1,344 @@
+# Example configuration file for Munin, generated by 'make build'
+
+# The next three variables specifies where the location of the RRD
+# databases, the HTML output, and the logs, severally.  They all
+# must be writable by the user running munin-cron.
+dbdir	/var/lib/munin
+htmldir	/var/www/html/munin
+logdir	/var/log/munin
+rundir  /var/run/munin
+
+# Where to look for the HTML templates
+tmpldir	/etc/munin/templates
+
+# Make graphs show values per minute instead of per second
+#graph_period minute
+
+# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime 
+# something changes (OK -> WARNING, CRITICAL -> OK, etc)
+#contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
+#contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm
+#
+# For those with Nagios, the following might come in handy. In addition,
+# the services must be defined in the Nagios server as well.
+#contact.nagios.command /usr/sbin/send_nsca -H nagios.host.com -c /etc/send_nsca.cfg
+
+# a simple host tree
+#[localhost]
+#    address 127.0.0.1
+#    use_node_name yes
+
+# 
+# A more complex example of a host tree
+#
+## First our "normal" host.
+# [fii.foo.com]
+#       address foo
+#
+## Then our other host...
+# [fay.foo.com]
+#       address fay
+#
+## Then we want totals...
+# [foo.com;Totals] #Force it into the "foo.com"-domain...
+#       update no   # Turn off data-fetching for this "host".
+#
+#   # The graph "load1". We want to see the loads of both machines... 
+#   # "fii=fii.foo.com:load.load" means "label=machine:graph.field"
+#       load1.graph_title Loads side by side
+#       load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+#
+#   # The graph "load2". Now we want them stacked on top of each other.
+#       load2.graph_title Loads on top of each other
+#       load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+#       load2.dummy_field.draw AREA # We want area instead the default LINE2.
+#       load2.dummy_field.label dummy # This is needed. Silly, really.
+#
+#   # The graph "load3". Now we want them summarised into one field
+#       load3.graph_title Loads summarised
+#       load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load
+#       load3.combined_loads.label Combined loads # Must be set, as this is
+#                                                 # not a dummy field!
+#
+## ...and on a side note, I want them listen in another order (default is
+## alphabetically)
+#
+# # Since [foo.com] would be interpreted as a host in the domain "com", we
+# # specify that this is a domain by adding a semicolon.
+# [foo.com;]
+#       node_order Totals fii.foo.com fay.foo.com
+#
+[sql.mit.edu;kitchen-sink]
+	address 18.181.0.56
+	use_node_name yes
+	df._dev_mapper_vg0_lv1.warning 98
+	df._dev_mapper_vg0_lv1.critical 99
+
+[sql.mit.edu;sliced-bread]
+	address 18.181.0.47
+	use_node_name yes
+	df._dev_mapper_vg0_lv1.warning 98
+	df._dev_mapper_vg0_lv1.critical 99
+
+[scripts.mit.edu;better-mousetrap]
+	address 18.181.0.57
+	use_node_name yes
+
+[scripts.mit.edu;old-faithful]
+	address 18.181.0.53
+	use_node_name yes
+
+[scripts.mit.edu;sx-blade-4]
+	address 18.181.0.167
+	use_node_name yes
+
+[scripts-LVS;not-forward]
+	address 18.181.0.54
+	use_node_name yes
+	update no
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+
+[scripts-LVS;not-backward]
+	address 18.181.0.55
+	use_node_name yes
+	update no
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+
+[scripts-LVS;rack-forward]
+	address 18.181.0.117
+	use_node_name yes
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+
+[scripts-LVS;rack-backward]
+	address 18.181.0.118
+	use_node_name yes
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BEES_KNEES_MIT_EDU.type DERIVE
+
+[scripts-LVS;Aggregated]
+        update no
+        contacts no
+ 
+        cps_www.update no
+        cps_www.graph_args -l 0
+        cps_www.graph_category network
+        cps_www.graph_title Loadbalanced *->www connections
+        cps_www.graph_vlabel connections / ${graph_period}
+
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.draw AREA
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.label SCRIPTS -> BETTER-MOUSETRAP
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.max 1000
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.label SCRIPTS -> OLD-FAITHFUL
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.max 1000
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.label SCRIPTS -> BEES-KNEES
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.max 1000
+	cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.label SCRIPTS-VHOSTS -> BETTER-MOUSETRAP
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.max 1000
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.label SCRIPTS-VHOSTS -> OLD-FAITHFUL
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.max 1000
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.min 0
+
+##	cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.draw STACK
+##	cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+##	cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.label SCRIPTS-VHOSTS -> BEES-KNEES
+##	cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.max 1000
+##	cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.label SCRIPTS-CERT -> BETTER-MOUSETRAP
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.max 1000
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.label SCRIPTS-CERT -> OLD-FAITHFUL
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.max 1000
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.draw STACK
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.type DERIVE
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.label SCRIPTS-CERT -> BEES-KNEES
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.max 1000
+	cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.min 0
+
+	cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		not-forward:cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		not-backward:cps_www.SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU
+
+	cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		not-forward:cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		not-backward:cps_www.SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU
+
+    cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU.sum \
+        rack-forward:cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU \
+        rack-backward:cps_www.SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU \
+        rack-forward:cps_www.SCRIPTS_MIT_EDU_BEES_KNEES_MIT_EDU
+
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU
+
+	cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU
+
+##    cps_www.SCRIPTS_VHOSTS_MIT_EDU_SX_BLADE_4_MIT_EDU.sum \
+##        rack-forward:cps_www.SCRIPTS_VHOSTS_MIT_EDU_BEES_KNEES_MIT_EDU
+
+	cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		not-forward:cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+		not-backward:cps_www.SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU
+
+	cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU.sum \
+		rack-forward:cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		rack-backward:cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		not-forward:cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+		not-backward:cps_www.SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU
+
+    cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU.sum \
+        rack-forward:cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU \
+        rack-backward:cps_www.SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU \
+        rack-forward:cps_www.SCRIPTS_CERT_MIT_EDU_BEES_KNEES_MIT_EDU
+
+	cps_www.graph_order SCRIPTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+			    SCRIPTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+			    SCRIPTS_MIT_EDU_SX_BLADE_4_MIT_EDU \
+			    SCRIPTS_VHOSTS_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+			    SCRIPTS_VHOSTS_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+			    SCRIPTS_CERT_MIT_EDU_BETTER_MOUSETRAP_MIT_EDU \
+			    SCRIPTS_CERT_MIT_EDU_OLD_FAITHFUL_MIT_EDU \
+			    SCRIPTS_CERT_MIT_EDU_SX_BLADE_4_MIT_EDU
+
+[linerva.mit.edu;linerva]
+	address 18.181.0.51
+	use_node_name yes
+
+[sipb-xen.mit.edu;black-mesa]
+	address 18.181.0.60
+	use_node_name yes
+
+[xvm-prod-sysvms.mit.edu;console]
+	address 18.181.0.134
+	use_node_name yes
+
+[xvm-prod-sysvms.mit.edu;remote]
+	address 18.181.0.188
+	use_node_name yes
+
+[xvm-prod-sysvms.mit.edu;xvm]
+	address 18.181.0.62
+	use_node_name yes
+
+[sipb-xen.mit.edu;sx-blade-2]
+	address 18.181.0.165
+	use_node_name yes
+
+[xvm-prod-hosts.mit.edu;citadel-station]
+	address 18.181.0.221
+	use_node_name yes
+
+[xvm-prod-hosts.mit.edu;aperture-science]
+	address 18.181.0.222
+	use_node_name yes
+
+[xvm-prod-hosts.mit.edu;shadow-moses]
+	address 18.181.0.223
+	use_node_name yes
+
+[xvm-prod-hosts.mit.edu;arklay-mansion]
+	address 18.181.0.224
+	use_node_name yes
+
+[lamp.mit.edu;lamp-www]
+	address 18.89.2.197
+	use_node_name yes
+
+[lamp.mit.edu;lamp-www2]
+	address 18.181.0.45
+	use_node_name yes
+
+[lamp.mit.edu;lamp-mp3]
+	address 18.181.0.45
+	port 24949
+
+[mit.edu;syn]
+	address 18.181.0.65
+	use_node_name yes
+
+[mit.edu;hodge-podge]
+	address 18.187.1.128
+	use_node_name yes
+	update no
+
+[sipb.mit.edu;ronald-ann]
+	address 18.181.0.23
+	use_node_name yes
+
+[sipb.mit.edu;rosebud2]
+	address 18.181.0.22
+	use_node_name yes
+
+[UPS;childrens-television-workshop]
+	address 18.181.0.65
+	use_node_name no
+
+[UPS;split-atom-blues]
+	address 18.181.0.65
+	use_node_name no
+
+[sipb-tor.mit.edu;sipb-tor]
+	address 18.187.1.68
+	use_node_name yes
Index: branches/fc15-dev/noc/munin/plugins/afs_df_athena.mit.edu
===================================================================
--- branches/fc15-dev/noc/munin/plugins/afs_df_athena.mit.edu	(revision 1803)
+++ branches/fc15-dev/noc/munin/plugins/afs_df_athena.mit.edu	(revision 1803)
@@ -0,0 +1,1 @@
+link afs_df_sipb.mit.edu
Index: branches/fc15-dev/noc/munin/plugins/afs_df_sipb.mit.edu
===================================================================
--- branches/fc15-dev/noc/munin/plugins/afs_df_sipb.mit.edu	(revision 1803)
+++ branches/fc15-dev/noc/munin/plugins/afs_df_sipb.mit.edu	(revision 1803)
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# Script to monitor disk usage.
+#
+# Parameters understood:
+#
+# 	config   (required)
+# 	autoconf (optional - used by munin-config)
+#
+#
+#
+# Magic markers (optional - used by munin-config and installation
+# scripts):
+#
+#%# family=auto
+#%# capabilities=autoconf
+
+MAXLABEL=20
+
+CELL=`basename $0 | sed 's/^afs_df_//g'`
+
+if [ "$1" = "autoconf" ]; then
+	echo yes
+	exit 0
+fi
+
+clean_name() {
+    echo $1 | sed 's/[\/.-]/_/g'
+}
+
+
+if [ "$1" = "config" ]; then
+
+	echo 'graph_title '"$CELL"' partition usage (in %)'
+	echo 'graph_args --upper-limit 100 -l 0'
+	echo 'graph_vlabel %'
+	echo 'graph_category AFS'
+	echo 'graph_info This graph shows disk usage on the '"$CELL"' cell.'
+	fs df /afs/"$CELL"/service/partitions/* | grep '^disk.' | while read i; do
+	    name=`clean_name $i`
+	    echo -n "$name.label "
+	    echo $i | awk "{ print \$1; }"
+	    echo "$name.warning 90"
+	    echo "$name.critical 98"
+	done
+	exit 0
+fi
+
+fs df /afs/"$CELL"/service/partitions/* | grep '^disk.' | while read i; do
+	name=`clean_name $i`
+	echo -n "$name.value "
+	echo $i | awk '{ print $3/$2*100 }'
+done
Index: branches/fc15-dev/noc/munin/plugins/cps_https
===================================================================
--- branches/fc15-dev/noc/munin/plugins/cps_https	(revision 1803)
+++ branches/fc15-dev/noc/munin/plugins/cps_https	(revision 1803)
@@ -0,0 +1,1 @@
+link cps_www
Index: branches/fc15-dev/noc/munin/plugins/cps_www
===================================================================
--- branches/fc15-dev/noc/munin/plugins/cps_www	(revision 1803)
+++ branches/fc15-dev/noc/munin/plugins/cps_www	(revision 1803)
@@ -0,0 +1,263 @@
+#!/usr/bin/perl
+#
+# Plugin to monitor connections per second, for LVS loadbalancers.
+#
+# Magic name:
+#
+# 	cps_<port>
+# 	cps_<vip>_<port>
+#
+# Examples:
+#
+# 	cps_smtp
+# 	cps_mail.foo.boo_smtp
+# 	cps_pop3
+# 	cps_www.foo.boo_www
+# 	cps_vvv.foo.boo_www
+#
+# Parameters understood:
+#
+# 	config   (required)
+# 	autoconf (optional - used by munin-config)
+# 	suggest  (optional - used by munin-config)
+#
+# $Log$
+# Revision 1.8  2004/12/10 18:55:14  jimmyo
+# Removed hardcoded host_name in linux/cps_.
+#
+# Revision 1.7  2004/12/10 18:51:44  jimmyo
+# linux/apt* has been forced to LANG=C, to get predictable output.
+#
+# Revision 1.6  2004/12/10 11:48:42  jimmyo
+# linux/cps_ plugin now groks high numbers.
+#
+# Revision 1.5  2004/12/10 10:47:49  jimmyo
+# Change name from ${scale} to ${graph_period}, to be more consistent.
+#
+# Revision 1.4  2004/12/09 22:12:56  jimmyo
+# Added "graph_period" option, to make "graph_sums" usable.
+#
+# Revision 1.3  2004/11/21 00:16:57  jimmyo
+# Changed a lot of plugins so they use DERIVE instead of COUNTER.
+#
+# Revision 1.2  2004/05/20 19:02:37  jimmyo
+# Set categories on a bunch of plugins
+#
+# Revision 1.1  2004/01/02 18:50:01  jimmyo
+# Renamed occurrances of lrrd -> munin
+#
+# Revision 1.1.1.1  2004/01/02 15:18:07  jimmyo
+# Import of LRRD CVS tree after renaming to Munin
+#
+# Revision 1.4  2003/11/07 17:43:16  jimmyo
+# Cleanups and log entries
+#
+#
+#
+# Magic markers - optional - used by installation scripts and munin-config:
+#
+#%# family=manual
+#%# capabilities=autoconf suggest
+#
+
+use strict;
+
+if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
+{
+	&autoconf ();
+}
+if ( defined $ARGV[0] and $ARGV[0] eq "suggest" )
+{
+	my $sipvs;
+	$sipvs = &ipvs (".", ".", $sipvs);
+	exit 0 if $sipvs == undef;
+	&suggest ($sipvs);
+}
+
+unless ($0 =~ /cps(?:_([^_]+)|)_(.+)\s*$/)
+{
+	die "Could not parse name $0.\n";
+}
+my $vip  = $1;
+my $port = $2;
+my $ipvs;
+
+#print "Name: $0\nPort: $port\nVip : $vip\n";
+
+# Read ipvsadm-output
+
+$ipvs = &ipvs ($vip, $port, $ipvs);
+
+if ( defined $ARGV[0] and $ARGV[0] eq "dump" )
+{
+	use Data::Dumper;
+	print Dumper($ipvs);
+}
+
+if ( defined $ARGV[0] and $ARGV[0] eq "config" )
+{
+        &config ($vip, $port, $ipvs);
+}
+
+$vip = $vip || "";
+if (exists ($ipvs->{$vip}) and exists ($ipvs->{$vip}->{$port}))
+{
+	foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+	{
+		(my $fname = $host) =~ s/[.-]/_/g;
+		print "$fname.value ", $ipvs->{$vip}->{$port}->{$host}, "\n";;
+	}
+}
+else
+{
+	foreach my $vip (sort keys %{$ipvs})
+	{
+		foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+		{
+			(my $fname = ($vip . "-" . $host)) =~ s/[.-]/_/g;
+			print "$fname.value ", $ipvs->{$vip}->{$port}->{$host}, "\n";;
+		}
+	}
+}
+
+sub autoconf
+{
+	system ("/sbin/ipvsadm -L --stats >/dev/null 2>/dev/null");
+
+	if ($? == 0)
+	{
+		print "yes\n";
+		exit 0;
+	}
+	elsif (($?>>8) == 2)
+	{
+		print "no (permission denied)\n";
+		exit 1;
+	}
+	elsif ($? == 127)
+	{
+		print "no (ipvsadm not found)\n";
+		exit 1;
+	}
+	else
+	{
+		print "no\n";
+		exit 1;
+	}
+}
+sub suggest
+{
+	my $ipvs = shift;
+	exit 0 unless $ipvs;
+
+	foreach my $vip (sort keys %{$ipvs})
+	{
+		foreach my $port (sort keys %{$ipvs->{$vip}})
+		{
+			print "cps_${vip}_$port\n";
+		}
+	}
+	exit 0;
+}
+
+sub config
+{
+	my $vip  = shift;
+	my $port = shift;
+	my $ipvs = shift;
+
+	print "graph_title Loadbalanced ",($vip?$vip:"*"),"->",$port," connections\n";
+	print "graph_args -l 0\n";
+	print "graph_total total\n";
+	print "graph_vlabel connections / \${graph_period}\n";
+	print "graph_category network\n";
+	my $first=1;
+	$vip = $vip || "";
+	if (exists ($ipvs->{$vip}) and exists ($ipvs->{$vip}->{$port}))
+	{
+		foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+		{
+			(my $fname = $host) =~ s/[.-]/_/g;
+			if ( $first == 1 )
+			{
+				print "$fname.draw AREA\n";
+				$first=0
+			}
+			else
+			{
+				print "$fname.draw STACK\n";
+			}
+			print "$fname.type DERIVE\n";
+			$host =~ s/-bak//;
+			print "$fname.label $host\n";
+			print "$fname.max 1000\n";
+			print "$fname.min 0\n";
+		}
+	}
+	else
+	{
+		foreach my $vip (reverse sort keys %{$ipvs})
+		{
+			foreach my $host (sort keys %{$ipvs->{$vip}->{$port}})
+			{
+				(my $fname = ($vip . "-" . $host)) =~ s/[.-]/_/g;
+				if ( $first == 1 )
+				{
+					print "$fname.draw AREA\n";
+					$first=0
+				}
+				else
+				{
+					print "$fname.draw STACK\n";
+				}
+				print "$fname.type DERIVE\n";
+				$host =~ s/-bak//;
+				my $label = "$vip -> $host";
+				$label =~ s/\.MIT\.EDU//g;
+				print "$fname.label $label\n";
+				print "$fname.max 1000\n";
+				print "$fname.min 0\n";
+			}
+		}
+	}
+	exit 0;
+}
+
+sub ipvs
+{
+	my $vip  = shift;
+	my $port = shift;
+	my $ipvs = shift;
+	open (IPVS, "/sbin/ipvsadm -L --stats 2>/dev/null|") or return undef;
+	my $cvip  = "";
+	my $cport = "";
+	while (<IPVS>)
+	{
+		next if /^IP Virtual Server/;
+		next if /^Prot\s+LocalAddress/;
+		if (/^(\w+)\s+([\w\.-]+):([\w\d]+)\s+(\d+)[KMG]?\s+/)
+		{
+			$cvip  = $2;
+			$cport = $3;
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)G\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000000000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)M\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)K\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += ($3*1000);
+		}
+		elsif (/^\s+->\s+([^:]+):(\S+)\s+(\d+)\s+/)
+		{
+			$ipvs->{$cvip}->{$cport}->{$1} += $3;
+		}
+	}
+	close (IPVS) or return undef;
+	return $ipvs;
+}
+# vim:syntax=perl
Index: branches/fc15-dev/noc/munin/templates/definitions.html
===================================================================
--- branches/fc15-dev/noc/munin/templates/definitions.html	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/definitions.html	(revision 1803)
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: definitions</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Jimmy Olsen" />
+</head>
+<body> 
+ <table cellpadding="3" border="0">
+  <tr>
+     <td><div class="logo">&nbsp;</div></td>
+     <td valign="top"><h1>Definition of terms used in Munin</h1></td>
+    </tr>
+ </table>
+ <div class="box">
+ <table cellpadding="2" cellspacing="4" border="0">
+   <tr>
+     <td valign="top" align="left"><a id="data_types">Data&nbsp;types:</a></td>
+   </tr>
+   <tr>
+     <td colspan="2"><hr class="ruler" /></td>
+   </tr>
+   <tr>
+     <td valign="top" align="left">&ndash;&nbsp;<a id="gauge">Gauge</a></td>
+	 <td valign="top" align="left">A data source of type gauge shows the state of the data source at the
+	 exact moment that Munin is run (every 5 minutes). Any peaks in-between data gatherings, will not be in
+	 the graph.</td>
+   </tr>
+   <tr>
+     <td valign="top" align="left">&ndash;&nbsp;<a id="counter">Counter</a></td>
+	 <td valign="top" align="left">A data source of type counter shows the state of the data source as an
+	 average between two plots (i.e. 5 minutes). Short peaks will therefore be hard to spot, but long peaks
+	 will be spottable, even though it occurs between plots.</td>
+   </tr>
+   <tr>
+     <td valign="top" align="left">&ndash;&nbsp;<a id="derive">Derive</a></td>
+	 <td valign="top" align="left">For the purposes of viewing data, the derive type works the same way as a
+	 counter</td>
+   </tr>
+   <tr>
+     <td valign="top" align="left">&ndash;&nbsp;<a id="absolute">Absolute</a></td>
+	 <td valign="top" align="left">Absolute works much as a counter, with the exception that it is assumed
+	 that the counter value is set to 0 upon each read of it. It's not a good idea to run these plugins by
+	 hand in-between Munin runs, since Munin won't receive all the data it expects.</td>
+   </tr>
+   <tr>
+     <td colspan="2"><hr class="ruler2" /></td>
+   </tr>
+   <tr>
+     <td valign="top" align="left"></td>
+   </tr>
+ </table>
+ </div>
+<table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small"><a href="http://www.linpro.no/projects/munin/">Munin</a></i></td>
+  </tr>
+</table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-comparison-day.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-comparison-day.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-comparison-day.tmpl	(revision 1803)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: day</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+      <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+      <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :: [ day <a href="comparison-week.html">week</a> <a href="comparison-month.html">month</a> <a href="comparison-year.html">year</a> ]</h2>
+    </td>    
+  </tr>
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: [ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="#<TMPL_VAR ESCAPE="HTML" NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</h2>
+    </td>
+  </tr>
+</table>
+
+<table class="invisiblebox">
+  <tr><td>
+    <hr class="ruler" />
+  </td></tr>
+
+  <TMPL_LOOP NAME="CATEGORIES">
+  <tr><td class="graphbox" id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">
+  <table>
+      <!-- <a id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">&nbsp;</a> -->
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><h3 class="nobottom"> <TMPL_VAR ESCAPE="HTML" NAME="NAME"></h3></td></tr>
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><hr class="ruler2" /></td></tr>
+        <TMPL_LOOP NAME="SERVICES">
+          <tr>
+		    <TMPL_LOOP NAME="NODES">
+            <td valign="top">
+			<table class="invisiblebox">
+			  <tr><td colspan="2"></td></tr>
+			  <tr><td colspan="2"><div class="lighttext"><TMPL_VAR ESCAPE="HTML" NAME="NODE"> :: <TMPL_IF NAME="URL"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"></TMPL_IF><TMPL_VAR ESCAPE="HTML" NAME="LABEL"><TMPL_IF NAME="URL"></a></TMPL_IF></div></td></tr>
+			  <tr><td>
+			<a title="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">"/><TMPL_IF NAME="IMGDAY"><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGDAY">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGDAYWIDTH">width="<TMPL_VAR NAME="IMGDAYWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGDAYHEIGHT">height="<TMPL_VAR NAME="IMGDAYHEIGHT">"</TMPL_IF>/></a></TMPL_IF>
+			</td></tr>
+			</table>
+			</td>
+			</TMPL_LOOP>
+          </tr>
+        </TMPL_LOOP>
+	</table>
+  </td></tr>
+
+  <tr><td></td></tr>
+
+  </TMPL_LOOP>
+  <tr><td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td></tr>
+</table>
+
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-comparison-month.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-comparison-month.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-comparison-month.tmpl	(revision 1803)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: month</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+      <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+      <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :: [ <a href="comparison-day.html">day</a> <a href="comparison-week.html">week</a> month <a href="comparison-year.html">year</a> ]</h2>
+    </td>    
+  </tr>
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: [ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="#<TMPL_VAR ESCAPE="HTML" NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</h2>
+    </td>
+  </tr>
+</table>
+
+<table class="invisiblebox">
+  <tr><td>
+    <hr class="ruler" />
+  </td></tr>
+
+  <TMPL_LOOP NAME="CATEGORIES">
+  <tr><td class="graphbox" id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">
+  <table>
+      <!-- <a id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">&nbsp;</a> -->
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><h3 class="nobottom"> <TMPL_VAR ESCAPE="HTML" NAME="NAME"></h3></td></tr>
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><hr class="ruler2" /></td></tr>
+        <TMPL_LOOP NAME="SERVICES">
+          <tr>
+		    <TMPL_LOOP NAME="NODES">
+            <td valign="top">
+			<table class="invisiblebox">
+			  <tr><td colspan="2"></td></tr>
+			  <tr><td colspan="2"><div class="lighttext"><TMPL_VAR ESCAPE="HTML" NAME="NODE"> :: <TMPL_IF NAME="URL"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"></TMPL_IF><TMPL_VAR ESCAPE="HTML" NAME="LABEL"><TMPL_IF NAME="URL"></a></TMPL_IF></div></td></tr>
+			  <tr><td>
+			<a title="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">"/><TMPL_IF NAME="IMGMONTH"><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGMONTH">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGMONTHWIDTH">width="<TMPL_VAR NAME="IMGMONTHWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGMONTHHEIGHT">height="<TMPL_VAR NAME="IMGMONTHHEIGHT">"</TMPL_IF>/></a></TMPL_IF>
+			</td></tr>
+			</table>
+			</td>
+			</TMPL_LOOP>
+          </tr>
+        </TMPL_LOOP>
+	</table>
+  </td></tr>
+
+  <tr><td></td></tr>
+
+  </TMPL_LOOP>
+  <tr><td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td></tr>
+</table>
+
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-comparison-week.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-comparison-week.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-comparison-week.tmpl	(revision 1803)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: week</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+      <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+      <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :: [ <a href="comparison-day.html">day</a> week <a href="comparison-month.html">month</a> <a href="comparison-year.html">year</a> ]</h2>
+    </td>    
+  </tr>
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: [ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="#<TMPL_VAR ESCAPE="HTML" NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</h2>
+    </td>
+  </tr>
+</table>
+
+<table class="invisiblebox">
+  <tr><td>
+    <hr class="ruler" />
+  </td></tr>
+
+  <TMPL_LOOP NAME="CATEGORIES">
+  <tr><td class="graphbox" id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">
+  <table>
+      <!-- <a id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">&nbsp;</a> -->
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><h3 class="nobottom"> <TMPL_VAR ESCAPE="HTML" NAME="NAME"></h3></td></tr>
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><hr class="ruler2" /></td></tr>
+        <TMPL_LOOP NAME="SERVICES">
+          <tr>
+		    <TMPL_LOOP NAME="NODES">
+            <td valign="top">
+			<table class="invisiblebox">
+			  <tr><td colspan="2"></td></tr>
+			  <tr><td colspan="2"><div class="lighttext"><TMPL_VAR ESCAPE="HTML" NAME="NODE"> :: <TMPL_IF NAME="URL"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"></TMPL_IF><TMPL_VAR ESCAPE="HTML" NAME="LABEL"><TMPL_IF NAME="URL"></a></TMPL_IF></div></td></tr>
+			  <tr><td>
+			<a title="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">"/><TMPL_IF NAME="IMGWEEK"><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGWEEK">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGWEEKWIDTH">width="<TMPL_VAR NAME="IMGWEEKWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGWEEKHEIGHT">height="<TMPL_VAR NAME="IMGWEEKHEIGHT">"</TMPL_IF>/></a></TMPL_IF>
+			</td></tr>
+			</table>
+			</td>
+			</TMPL_LOOP>
+          </tr>
+        </TMPL_LOOP>
+	</table>
+  </td></tr>
+
+  <tr><td></td></tr>
+
+  </TMPL_LOOP>
+  <tr><td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td></tr>
+</table>
+
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-comparison-year.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-comparison-year.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-comparison-year.tmpl	(revision 1803)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: year</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+      <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+      <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :: [ <a href="comparison-day.html">day</a> <a href="comparison-week.html">week</a> <a href="comparison-month.html">month</a> year ]</h2>
+    </td>    
+  </tr>
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: [ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="#<TMPL_VAR ESCAPE="HTML" NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</h2>
+    </td>
+  </tr>
+</table>
+
+<table class="invisiblebox">
+  <tr><td>
+    <hr class="ruler" />
+  </td></tr>
+
+  <TMPL_LOOP NAME="CATEGORIES">
+  <tr><td class="graphbox" id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">
+  <table>
+      <!-- <a id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">&nbsp;</a> -->
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><h3 class="nobottom"> <TMPL_VAR ESCAPE="HTML" NAME="NAME"></h3></td></tr>
+        <tr><td colspan="<TMPL_VAR NAME="numnodes">"><hr class="ruler2" /></td></tr>
+        <TMPL_LOOP NAME="SERVICES">
+          <tr>
+		    <TMPL_LOOP NAME="NODES">
+            <td valign="top">
+			<table class="invisiblebox">
+			  <tr><td colspan="2"></td></tr>
+			  <tr><td colspan="2"><div class="lighttext"><TMPL_VAR ESCAPE="HTML" NAME="NODE"> :: <TMPL_IF NAME="URL"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"></TMPL_IF><TMPL_VAR ESCAPE="HTML" NAME="LABEL"><TMPL_IF NAME="URL"></a></TMPL_IF></div></td></tr>
+			  <tr><td>
+			<a title="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">"/><TMPL_IF NAME="IMGYEAR"><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGYEAR">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGYEARWIDTH">width="<TMPL_VAR NAME="IMGYEARWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGYEARHEIGHT">height="<TMPL_VAR NAME="IMGYEARHEIGHT">"</TMPL_IF>/></a></TMPL_IF>
+			</td></tr>
+			</table>
+			</td>
+			</TMPL_LOOP>
+          </tr>
+        </TMPL_LOOP>
+	</table>
+  </td></tr>
+
+  <tr><td></td></tr>
+
+  </TMPL_LOOP>
+  <tr><td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td></tr>
+</table>
+
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-domainview.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-domainview.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-domainview.tmpl	(revision 1803)
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR NAME="DOMAIN"></title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body> 
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+         <h2><a href="../index.html">Overview</a> :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></h2>
+    </td>    
+  </tr>
+  <TMPL_IF NAME="COMPARE">
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: [ <a href="comparison-day.html">day</a> <a href="comparison-week.html">week</a> <a href="comparison-month.html">month</a> <a href="comparison-year.html">year</a> ]</h2>
+    </td>
+  </tr></TMPL_IF>
+</table>
+
+ <table class="largeinvisiblebox">
+ <tr>
+   <td class="linkbox">
+ <ul>	
+  <TMPL_LOOP NAME="NODES">
+  <li><span class="domain"><a href="<TMPL_VAR NAME="NODE">.html"><TMPL_VAR ESCAPE="HTML" NAME="NODE"></a></span>
+      <ul>
+	<TMPL_LOOP NAME="CATEGORIES">
+      <li><span class="domain"><a href="<TMPL_VAR NAME="NODE">.html#<TMPL_VAR NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
+      <ul>
+	<TMPL_LOOP NAME="SERVICES">
+	<li><span class="host"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="NODE">-<TMPL_VAR NAME="SERVICE">.html"><TMPL_VAR ESCAPE="HTML" NAME="LABEL"></a></span></li>
+        </TMPL_LOOP> 
+      </ul>
+   </li>
+   </TMPL_LOOP>
+      </ul>
+   </li>
+   </TMPL_LOOP>
+ </ul>
+ </td></tr>
+ <tr><td></td></tr>
+ <tr>
+   <td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td>
+ </tr>
+ </table>
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-nodeview.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-nodeview.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-nodeview.tmpl	(revision 1803)
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"> :: <TMPL_VAR ESCAPE="HTML" NAME="NODE"></title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+<table cellpadding="3" border="0">
+  <tr>
+    <td rowspan="2"><div class="logo">&nbsp;</div></td>
+    <td valign="top">
+      <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+      <TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :: <TMPL_VAR ESCAPE="HTML" NAME="NODE"></h2>
+    </td>    
+  </tr>
+  <tr>
+    <td valign="top">
+      <h2><TMPL_VAR NAME="NODE"> :: [ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="#<TMPL_VAR ESCAPE="HTML" NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</h2>
+    </td>
+  </tr>
+</table>
+
+<table class="invisiblebox">
+  <tr><td>
+    <hr class="ruler" />
+  </td></tr>
+
+  <TMPL_LOOP NAME="CATEGORIES">
+  <tr><td class="graphbox" id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">
+  <table>
+      <!-- <a id="<TMPL_VAR ESCAPE="HTML" NAME="NAME">">&nbsp;</a> -->
+        <tr><td colspan="2"><h3 class="nobottom"> <TMPL_VAR ESCAPE="HTML" NAME="NAME"></h3></td></tr>
+        <tr><td colspan="2"><hr class="ruler2" /></td></tr>
+        <TMPL_LOOP NAME="SERVICES">
+		  <tr><td></td></tr>
+		  <tr><td><div class="lighttext">:: <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="LABEL"></a></div></td></tr>
+          <tr>
+            <td><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGDAY">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGDAYWIDTH">width="<TMPL_VAR NAME="IMGDAYWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGDAYHEIGHT">height="<TMPL_VAR NAME="IMGDAYHEIGHT">"</TMPL_IF>/></a></td>
+            <td><a href="<TMPL_VAR NAME="URL">"><img src="<TMPL_VAR NAME="IMGWEEK">" alt="<TMPL_VAR ESCAPE="HTML" NAME="LABEL">" <TMPL_IF NAME="IMGWEEKWIDTH">width="<TMPL_VAR NAME="IMGWEEKWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGWEEKHEIGHT">height="<TMPL_VAR NAME="IMGWEEKHEIGHT">"</TMPL_IF>/></a></td>
+          </tr>
+        </TMPL_LOOP>
+	</table>
+  </td></tr>
+
+  <tr><td></td></tr>
+
+  </TMPL_LOOP>
+  <tr><td class="linkbox">
+ <TMPL_LOOP NAME="DOMAINS">
+<a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a> :
+    </TMPL_LOOP>
+ </td></tr>
+</table>
+
+ <table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+ </table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-overview.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-overview.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-overview.tmpl	(revision 1803)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: overview</title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body> 
+ <table cellpadding="3" border="0">
+  <tr>
+     <td><div class="logo">&nbsp;</div></td>
+     <td valign="top"><h1>Overview</h1></td>
+    </tr>
+ </table>
+ <div class="box">
+ <TMPL_LOOP NAME="DOMAINS">
+ <ul>
+  <li><span class="domain"><a href="<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR ESCAPE="HTML" NAME="DOMAIN"></a></span><TMPL_IF NAME="COMPARE"> :: [ <a href="<TMPL_VAR NAME="DOMAIN">/comparison-day.html">day</a> <a href="<TMPL_VAR NAME="DOMAIN">/comparison-week.html">week</a> <a href="<TMPL_VAR NAME="DOMAIN">/comparison-month.html">month</a> <a href="<TMPL_VAR NAME="DOMAIN">/comparison-year.html">year</a> ]</TMPL_IF>
+      <ul>	
+	<TMPL_LOOP NAME="NODES">
+	<li><span class="host"><a href="<TMPL_VAR NAME="DOMAIN">/<TMPL_VAR NAME="NODE">.html"><TMPL_VAR ESCAPE="HTML" NAME="NODE"></a></span> :: 
+	[ <TMPL_LOOP NAME="CATEGORIES"><a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="DOMAIN">/<TMPL_VAR NAME="NODE">.html#<TMPL_VAR NAME="NAME">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a> </TMPL_LOOP>]</li>
+        </TMPL_LOOP>
+      </ul>
+   </li>
+ </ul>
+ </TMPL_LOOP>
+ </div>
+<table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+</table>
+</body>
+</html>
Index: branches/fc15-dev/noc/munin/templates/munin-serviceview.tmpl
===================================================================
--- branches/fc15-dev/noc/munin/templates/munin-serviceview.tmpl	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/munin-serviceview.tmpl	(revision 1803)
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+  <link rel="stylesheet" href="../style.css" type="text/css" /> 
+  <meta http-equiv="refresh" content="300" />
+  <title>Munin :: <TMPL_VAR NAME="DOMAIN"> :: <TMPL_VAR NAME="NODE"> :: <TMPL_VAR ESCAPE="HTML" NAME="SERVICE"></title>
+  <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
+  <meta name="author" content="Auto-generated by Munin" />
+</head>
+<body>
+ <table cellpadding="3" border="0">
+  <tr>
+     <td><div class="logo">&nbsp;</div></td>
+     <td valign="top">
+         <h2><a href="../index.html">Overview</a> :: <a href="index.html">
+<TMPL_VAR NAME="DOMAIN"></a> :: 
+<a href="<TMPL_VAR NAME="NODE">.html"><TMPL_VAR NAME="NODE"></a> :: <TMPL_VAR ESCAPE="HTML" NAME="SERVICE"></h2>
+     </td>    
+    </tr>
+ </table>
+ <TMPL_LOOP NAME="SERVICES">
+
+  <table class="invisiblebox">
+    <tr>
+	  <td colspan="2"><hr class="ruler" /></td>
+	</tr>
+    <tr>
+      <td><img src="<TMPL_VAR NAME="IMGDAY">" alt="daily graph" <TMPL_IF NAME="IMGDAYWIDTH">width="<TMPL_VAR NAME="IMGDAYWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGDAYHEIGHT">height="<TMPL_VAR NAME="IMGDAYHEIGHT">"</TMPL_IF>/></td>
+      <td><img src="<TMPL_VAR NAME="IMGWEEK">" alt="weekly graph" <TMPL_IF NAME="IMGWEEKWIDTH">width="<TMPL_VAR NAME="IMGWEEKWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGWEEKHEIGHT">height="<TMPL_VAR NAME="IMGWEEKHEIGHT">"</TMPL_IF>/></td>
+    </tr>
+    <tr>
+      <td><img src="<TMPL_VAR NAME="IMGMONTH">" alt="monthly graph" <TMPL_IF NAME="IMGMONTHWIDTH">width="<TMPL_VAR NAME="IMGMONTHWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGMONTHHEIGHT">height="<TMPL_VAR NAME="IMGMONTHHEIGHT">"</TMPL_IF>/></td>
+      <td><img src="<TMPL_VAR NAME="IMGYEAR">" alt="yearly graph" <TMPL_IF NAME="IMGYEARWIDTH">width="<TMPL_VAR NAME="IMGYEARWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGYEARHEIGHT">height="<TMPL_VAR NAME="IMGYEARHEIGHT">"</TMPL_IF>/></td>
+    </tr>
+<TMPL_IF NAME="IMGWEEKSUM">
+    <tr>
+      <td><img src="<TMPL_VAR NAME="IMGWEEKSUM">" alt="summed weekly graph" <TMPL_IF NAME="IMGWEEKSUMWIDTH">width="<TMPL_VAR NAME="IMGWEEKSUMWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGWEEKSUMHEIGHT">height="<TMPL_VAR NAME="IMGWEEKSUMHEIGHT">"</TMPL_IF>/></td>
+      <td><img src="<TMPL_VAR NAME="IMGYEARSUM">" alt="summed monthly graph" <TMPL_IF NAME="IMGYEARSUMWIDTH">width="<TMPL_VAR NAME="IMGYEARSUMWIDTH">" </TMPL_IF> <TMPL_IF NAME="IMGYEARSUMHEIGHT">height="<TMPL_VAR NAME="IMGYEARSUMHEIGHT">"</TMPL_IF>/></td>
+    </tr>
+</TMPL_IF>
+	<tr>
+	  <td colspan="2" class="legendbox">
+	    <table width='100%'>
+		  <TMPL_LOOP NAME="GRAPHINFO">
+		    <tr>
+		      <td class='wrap' colspan="6" align='left' valign='top'><TMPL_VAR NAME="INFO"></td>
+		    </tr>
+		    <tr>
+		      <td colspan="6"><hr class="ruler2" /></td>
+		    </tr>
+		  </TMPL_LOOP>
+		    <tr>
+			  <th align='left' valign='top'>Field</th>
+			  <th align='left' valign='top'><span title="For use in munin.conf">Internal name</span></th>
+			  <th align='center' valign='top'><a href="../definitions.html#data_types">Type</a></th>
+			  <th align='center' valign='top'>Warn</th>
+			  <th align='center' valign='top'>Crit</th>
+			  <th>&nbsp;</th>
+		    </tr>
+		  <TMPL_LOOP NAME="FIELDINFO">
+		    <TMPL_IF NAME="HR">
+		      <tr>
+		        <td colspan="6"><hr class="ruler" /></td>
+		      </tr>
+		    </TMPL_IF>
+		    <tr>
+		      <td align='left' valign='top'><TMPL_VAR ESCAPE="HTML" NAME="LABEL"></td>
+		      <td align='left' valign='top'><span title="For use in munin.conf"><TMPL_VAR ESCAPE="HTML" NAME="FIELD"></span></td>
+		      <td align='center' valign='top'><TMPL_VAR NAME="TYPE"></td>
+		      <td align='center' valign='top'><TMPL_IF NAME="STATE_WARNING"><div class='warntext'></TMPL_IF><TMPL_VAR NAME="WARN"><TMPL_IF NAME="STATE_WARNING"></div></TMPL_IF></td>
+		      <td align='center' valign='top'><TMPL_IF NAME="STATE_CRITICAL"><div class='crittext'></TMPL_IF><TMPL_VAR NAME="CRIT"><TMPL_IF NAME="STATE_CRITICAL"></div></TMPL_IF></td>
+		      <td class='wrap' align='left' valign='top'><TMPL_VAR ESCAPE="HTML" NAME="INFO"></td>
+		    </tr>
+		  </TMPL_LOOP>
+	    </table>
+	  </td>
+	</tr>
+  </TMPL_LOOP>
+  <tr><td></td></tr>
+  <tr>
+    <td colspan="2" class="linkbox">
+      <TMPL_LOOP NAME="DOMAINS">
+        <a href="../<TMPL_VAR NAME="DOMAIN">/index.html"><TMPL_VAR NAME="DOMAIN"></a> :
+      </TMPL_LOOP>
+    </td>
+  </tr>
+</table>
+
+<table cellpadding="2" cellspacing="4" border="0">        
+  <tr>
+    <td><i class="small">This page was generated by <a href="http://munin.sourceforge.net/">Munin</a> version 1.2.5 at <TMPL_VAR NAME="TIMESTAMP"></i></td>
+  </tr>
+</table>
+
+</body>
+</html>
+  
Index: branches/fc15-dev/noc/munin/templates/style.css
===================================================================
--- branches/fc15-dev/noc/munin/templates/style.css	(revision 1803)
+++ branches/fc15-dev/noc/munin/templates/style.css	(revision 1803)
@@ -0,0 +1,199 @@
+body, h1, h2, h3, p, span, div { 
+  font-family: verdana, helvetica, arial, sans-serif;
+  font-size: small;
+ }
+
+body { 
+  background-color: #ffffff;
+  color: #000000;
+  
+ }
+
+h3.nobottom {
+    margin-top: 20px;
+    margin-bottom: 0px;
+}
+
+div.logo { 
+  background-image: url(logo.png);
+  background-repeat: no-repeat;  
+  width: 41px;
+  height: 59px;
+} 
+
+div.lighttext { 
+  background-color: #ffffff;
+  color: #777777;
+  font-style: italic;
+  
+ }
+
+.domain { 
+  font-size: medium;
+  font-weight: bold;
+ }
+
+.host { 
+  font-weight: bold;
+ }
+
+.center { 
+  text-align: center;
+}
+
+.small { 
+  font-size: smaller;
+ }
+
+.noborder { 
+  border-width: 0px;
+  border-collapse: collapse;
+ }
+
+table.largeinvisiblebox {
+        border-width: thin;
+        border-top: 0px;
+        border-bottom: 0px;
+        border-left: 0px;
+        border-right: 0px;
+        border-color: #999;
+        border-style: solid;
+        padding: 0px 0px 0px 0px;
+	margin: 0px 0px 0px 0px;
+	white-space: nowrap;
+	max-width: 90%;
+        width: 80%;
+}
+
+table.invisiblebox {
+        border-width: thin;
+        border-top: 0px;
+        border-bottom: 0px;
+        border-left: 0px;
+        border-right: 0px;
+        border-color: #999;
+        border-style: solid;
+        padding: 0px 0px 0px 0px;
+	margin: 0px 0px 0px 0px;
+	white-space: nowrap;
+	width: 1%;
+}
+
+td.graphbox {
+        border-width: thin;
+        border-top: 1px;
+        border-bottom: 1px;
+        border-left: 1px;
+        border-right: 1px;
+        border-color: #999;
+        border-style: solid;
+        padding: 4px 4px 4px 4px;
+	margin: 0px 0px 0px 0px;
+	white-space: nowrap;
+	width: 100%;
+}
+
+.box {
+        border-width: thin;
+        border-top: 1px;
+        border-bottom: 1px;
+        border-left: 1px;
+        border-right: 1px;
+        border-color: #999;
+        border-style: solid;
+        padding: 4px 4px 4px 4px;
+        margin: 2px 2px 2px 2px;
+        text-align: left;
+        width: 80%;
+        max-width: 90%
+}
+
+td.legendbox {
+        border-width: thin;
+        border-top: 1px;
+        border-bottom: 1px;
+        border-left: 1px;
+        border-right: 1px;
+        border-color: #999;
+        border-style: solid;
+        padding: 8px 4px 2px 2px;
+        margin: 2px 2px 2px 2px;
+        text-align: left;
+	width: 100%;
+}
+
+td.wrap {
+	white-space: normal;
+	max-width: 1%;
+}
+
+td.linkbox {
+        border-width: thin;
+        border-top: 1px;
+        border-bottom: 1px;
+        border-left: 1px;
+        border-right: 1px;
+        border-color: #999;
+        border-style: solid;
+        padding: 4px 4px 4px 4px;
+        margin: 2px 2px 2px 2px;
+	width: 100%;
+}
+
+.warntext {
+  font-weight: bold;
+  background-color: #cccc00;
+}
+
+.crittext {
+  font-weight: bold;
+  background-color: #ff6f22;
+}
+
+.ruler {
+  background-color: #999999;
+  border: 0px;
+  height: 1px;
+}
+
+.ruler2 {
+  background-color: #999999;
+  border: 0px;
+  height: 2px;
+}
+
+a.meek:link { 
+  color: #486aaf;
+  font-size: small;
+ }
+
+a.meek:visited { 
+  color: #af1a00;
+  font-size: small;
+ }
+
+a.meek:active { 
+  color: #486aaf;
+  font-size: small;
+ }
+
+a.meek:hover { 
+  color: #999999;
+  font-size: small;
+ }
+
+
+a.warn:link    { color: #cc9900; }
+a.warn:visited { color: #cc9900; }
+a.warn:active  { color: #cc9900; }
+a.warn:hover   { color: #cc9900; }
+
+a.crit:link    { color: #cc0000; } 
+a.crit:visited { color: #cc0000; } 
+a.crit:active  { color: #cc0000; } 
+a.crit:hover   { color: #cc0000; } 
+
+a:link    { color: #486aaf; } 
+a:visited { color: #486aaf; } 
+a:active  { color: #486aaf; } 
+a:hover   { color: #486aaf; } 
Index: branches/fc15-dev/noc/nagios/base.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/base.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/base.cfg	(revision 1803)
@@ -0,0 +1,149 @@
+define timeperiod{
+        timeperiod_name 24x7
+        alias           24 Hours A Day, 7 Days A Week
+        sunday          00:00-24:00
+        monday          00:00-24:00
+        tuesday         00:00-24:00
+        wednesday       00:00-24:00
+        thursday        00:00-24:00
+        friday          00:00-24:00
+        saturday        00:00-24:00
+        }
+
+define timeperiod{
+        timeperiod_name afs
+        alias           24 Hours A Day, 7 Days A Week, except Sunday Morning
+        sunday          00:00-05:59,06:30-24:00
+        monday          00:00-24:00
+        tuesday         00:00-24:00
+        wednesday       00:00-24:00
+        thursday        00:00-24:00
+        friday          00:00-24:00
+        saturday        00:00-24:00
+        }
+
+define timeperiod{
+        timeperiod_name 9x5
+        alias           9 Hours A Day, 5 Days A Week
+        monday          09:00-17:00
+        tuesday         09:00-17:00
+        wednesday       09:00-17:00
+        thursday        09:00-17:00
+        friday          09:00-17:00
+        }
+
+define timeperiod{
+        timeperiod_name never
+        alias           Never
+        }
+
+define contact{
+        contact_name                    nagios-admin
+        alias                           Nagios Admin
+        service_notification_period     24x7
+        host_notification_period        24x7
+        service_notification_options    n
+        host_notification_options       n
+        service_notification_commands   notify-by-email
+        host_notification_commands      host-notify-by-email
+        email                           nagios-admin@localhost
+}
+
+define contactgroup{
+        contactgroup_name       admins
+        alias                   Administrators
+        members                 nagios-admin
+        }
+
+define host{
+        name                            generic-host    ; The name of this host template
+        notifications_enabled           1       ; Host notifications are enabled
+        event_handler_enabled           1       ; Host event handler is enabled
+        flap_detection_enabled          1       ; Flap detection is enabled
+        failure_prediction_enabled      1       ; Failure prediction is enabled
+        process_perf_data               1       ; Process performance data
+        retain_status_information       1       ; Retain status information across program restarts
+        retain_nonstatus_information    1       ; Retain non-status information across program restarts
+        register                        0       ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
+        }
+
+define host {
+        use                     generic-host            ; Name of host template to use
+        host_name               localhost
+        alias                   localhost
+        address                 127.0.0.1
+        check_command           check-host-alive
+        max_check_attempts      10
+        check_period		24x7
+        notification_interval   240
+        notification_period     24x7
+        contact_groups  admins
+        }
+#        notification_options    n
+
+define hostgroup {
+	hostgroup_name	all
+	alias	All Servers
+	members	*
+	}
+
+define service{
+        name                            generic-service ; The 'name' of this service template
+        active_checks_enabled           1       ; Active service checks are enabled
+        passive_checks_enabled          1       ; Passive service checks are enabled/accepted
+        parallelize_check               1       ; Active service checks should be parallelized (disabling this can lead to major performance problems)
+        obsess_over_service             1       ; We should obsess over this service (if necessary)
+        check_freshness                 0       ; Default is to NOT check service 'freshness'
+        notifications_enabled           1       ; Service notifications are enabled
+        event_handler_enabled           1       ; Service event handler is enabled
+        flap_detection_enabled          1       ; Flap detection is enabled
+        failure_prediction_enabled      1       ; Failure prediction is enabled
+        process_perf_data               1       ; Process performance data
+        retain_status_information       1       ; Retain status information across program restarts
+        retain_nonstatus_information    1       ; Retain non-status information across program restarts
+        register                        0       ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
+        check_period                    24x7
+        max_check_attempts              4
+        normal_check_interval           5
+        retry_check_interval            1
+        contact_groups                  admins
+        notification_interval           1920
+        notification_period             24x7
+        is_volatile                     0
+}
+#	notification_options		n
+
+define service {
+        use                             generic-service
+        host_name			localhost
+        service_description             PING
+	check_command			check_ping!100.0,20%!500.0,60%
+        }
+
+define service {
+        use                             generic-service
+        host_name                       localhost
+        service_description             DISK: /
+	check_command			check_local_disk!20%!10%!/
+}
+
+define service {
+        use                             generic-service
+        host_name                       localhost
+        service_description             USERS
+	check_command			check_local_users!20!50
+}
+
+define service{
+        use                             generic-service
+        host_name                       localhost
+        service_description             PROCS
+	check_command			check_local_procs!250!400
+}
+
+define service{
+        use                             generic-service
+        host_name                       localhost
+        service_description             LOAD
+	check_command			check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
+}
Index: branches/fc15-dev/noc/nagios/cgi.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/cgi.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/cgi.cfg	(revision 1803)
@@ -0,0 +1,288 @@
+#################################################################
+#
+# CGI.CFG - CGI Configuration File for Nagios 
+#
+#################################################################
+
+
+# MAIN CONFIGURATION FILE
+# This tells the CGIs where to find your main configuration file.
+# The CGIs will read the main and host config files for any other
+# data they might need.
+
+main_config_file=/etc/nagios3/nagios.cfg
+
+
+
+# PHYSICAL HTML PATH
+# This is the path where the HTML files for Nagios reside.  This
+# value is used to locate the logo images needed by the statusmap
+# and statuswrl CGIs.
+
+physical_html_path=/usr/share/nagios3/htdocs
+
+
+
+# URL HTML PATH
+# This is the path portion of the URL that corresponds to the
+# physical location of the Nagios HTML files (as defined above).
+# This value is used by the CGIs to locate the online documentation
+# and graphics.  If you access the Nagios pages with an URL like
+# http://www.myhost.com/nagios, this value should be '/nagios'
+# (without the quotes).
+
+url_html_path=/nagios3
+
+
+
+# CONTEXT-SENSITIVE HELP
+# This option determines whether or not a context-sensitive
+# help icon will be displayed for most of the CGIs.
+# Values: 0 = disables context-sensitive help
+#         1 = enables context-sensitive help
+
+show_context_help=1
+
+
+
+# PENDING STATES OPTION
+# This option determines what states should be displayed in the web
+# interface for hosts/services that have not yet been checked.
+# Values: 0 = leave hosts/services that have not been check yet in their original state
+#         1 = mark hosts/services that have not been checked yet as PENDING
+
+use_pending_states=1
+
+nagios_check_command=/usr/lib/nagios/plugins/check_nagios /var/cache/nagios3/status.dat 5 '/usr/sbin/nagios3'
+
+
+# AUTHENTICATION USAGE
+# This option controls whether or not the CGIs will use any 
+# authentication when displaying host and service information, as
+# well as committing commands to Nagios for processing.  
+#
+# Read the HTML documentation to learn how the authorization works!
+#
+# NOTE: It is a really *bad* idea to disable authorization, unless
+# you plan on removing the command CGI (cmd.cgi)!  Failure to do
+# so will leave you wide open to kiddies messing with Nagios and
+# possibly hitting you with a denial of service attack by filling up
+# your drive by continuously writing to your command file!
+#
+# Setting this value to 0 will cause the CGIs to *not* use
+# authentication (bad idea), while any other value will make them
+# use the authentication functions (the default).
+
+use_authentication=1
+
+
+
+
+# x509 CERT AUTHENTICATION
+# When enabled, this option allows you to use x509 cert (SSL)
+# authentication in the CGIs.  This is an advanced option and should
+# not be enabled unless you know what you're doing.
+
+use_ssl_authentication=0
+
+
+
+
+# DEFAULT USER
+# Setting this variable will define a default user name that can
+# access pages without authentication.  This allows people within a
+# secure domain (i.e., behind a firewall) to see the current status
+# without authenticating.  You may want to use this to avoid basic
+# authentication if you are not using a secure server since basic
+# authentication transmits passwords in the clear.
+#
+# Important:  Do not define a default username unless you are
+# running a secure web server and are sure that everyone who has
+# access to the CGIs has been authenticated in some manner!  If you
+# define this variable, anyone who has not authenticated to the web
+# server will inherit all rights you assign to this user!
+ 
+default_user_name=guest
+
+
+
+# SYSTEM/PROCESS INFORMATION ACCESS
+# This option is a comma-delimited list of all usernames that
+# have access to viewing the Nagios process information as
+# provided by the Extended Information CGI (extinfo.cgi).  By
+# default, *no one* has access to this unless you choose to
+# not use authorization.  You may use an asterisk (*) to
+# authorize any user who has authenticated to the web server.
+
+authorized_for_system_information=presbrey@MIT.EDU,andersk@MIT.EDU,quentin@MIT.EDU,geofft@MIT.EDU,mitchb@MIT.EDU
+
+
+
+# CONFIGURATION INFORMATION ACCESS
+# This option is a comma-delimited list of all usernames that
+# can view ALL configuration information (hosts, commands, etc).
+# By default, users can only view configuration information
+# for the hosts and services they are contacts for. You may use
+# an asterisk (*) to authorize any user who has authenticated
+# to the web server.
+
+authorized_for_configuration_information=presbrey@MIT.EDU,andersk@MIT.EDU,quentin@MIT.EDU,geofft@MIT.EDU,mitchb@MIT.EDU
+
+
+
+# SYSTEM/PROCESS COMMAND ACCESS
+# This option is a comma-delimited list of all usernames that
+# can issue shutdown and restart commands to Nagios via the
+# command CGI (cmd.cgi).  Users in this list can also change
+# the program mode to active or standby. By default, *no one*
+# has access to this unless you choose to not use authorization.
+# You may use an asterisk (*) to authorize any user who has
+# authenticated to the web server.
+
+authorized_for_system_commands=presbrey@MIT.EDU,andersk@MIT.EDU,quentin@MIT.EDU,geofft@MIT.EDU,mitchb@MIT.EDU
+
+
+
+# GLOBAL HOST/SERVICE VIEW ACCESS
+# These two options are comma-delimited lists of all usernames that
+# can view information for all hosts and services that are being
+# monitored.  By default, users can only view information
+# for hosts or services that they are contacts for (unless you
+# you choose to not use authorization). You may use an asterisk (*)
+# to authorize any user who has authenticated to the web server.
+
+
+authorized_for_all_services=*
+authorized_for_all_hosts=*
+#authorized_for_all_services=presbrey@MIT.EDU,andersk@MIT.EDU
+#authorized_for_all_hosts=presbrey@MIT.EDU,andersk@MIT.EDU
+
+
+
+# GLOBAL HOST/SERVICE COMMAND ACCESS
+# These two options are comma-delimited lists of all usernames that
+# can issue host or service related commands via the command
+# CGI (cmd.cgi) for all hosts and services that are being monitored. 
+# By default, users can only issue commands for hosts or services 
+# that they are contacts for (unless you you choose to not use 
+# authorization).  You may use an asterisk (*) to authorize any
+# user who has authenticated to the web server.
+
+authorized_for_all_service_commands=presbrey@MIT.EDU,andersk@MIT.EDU,quentin@MIT.EDU,geofft@MIT.EDU,mitchb@MIT.EDU
+authorized_for_all_host_commands=presbrey@MIT.EDU,andersk@MIT.EDU,quentin@MIT.EDU,geofft@MIT.EDU,mitchb@MIT.EDU
+
+
+
+
+# STATUSMAP BACKGROUND IMAGE
+# This option allows you to specify an image to be used as a 
+# background in the statusmap CGI.  It is assumed that the image
+# resides in the HTML images path (i.e. /usr/local/nagios/share/images).
+# This path is automatically determined by appending "/images"
+# to the path specified by the 'physical_html_path' directive.
+# Note:  The image file may be in GIF, PNG, JPEG, or GD2 format.
+# However, I recommend that you convert your image to GD2 format
+# (uncompressed), as this will cause less CPU load when the CGI
+# generates the image.
+
+#statusmap_background_image=smbackground.gd2
+
+
+
+# DEFAULT STATUSMAP LAYOUT METHOD
+# This option allows you to specify the default layout method
+# the statusmap CGI should use for drawing hosts.  If you do
+# not use this option, the default is to use user-defined
+# coordinates.  Valid options are as follows:
+#	0 = User-defined coordinates
+#	1 = Depth layers
+#       2 = Collapsed tree
+#       3 = Balanced tree
+#       4 = Circular
+#       5 = Circular (Marked Up)
+
+default_statusmap_layout=5
+
+
+
+# DEFAULT STATUSWRL LAYOUT METHOD
+# This option allows you to specify the default layout method
+# the statuswrl (VRML) CGI should use for drawing hosts.  If you
+# do not use this option, the default is to use user-defined
+# coordinates.  Valid options are as follows:
+#	0 = User-defined coordinates
+#       2 = Collapsed tree
+#       3 = Balanced tree
+#       4 = Circular
+
+default_statuswrl_layout=4
+
+
+
+# STATUSWRL INCLUDE
+# This option allows you to include your own objects in the 
+# generated VRML world.  It is assumed that the file
+# resides in the HTML path (i.e. /usr/local/nagios/share).
+
+#statuswrl_include=myworld.wrl
+
+
+
+# PING SYNTAX
+# This option determines what syntax should be used when
+# attempting to ping a host from the WAP interface (using
+# the statuswml CGI.  You must include the full path to
+# the ping binary, along with all required options.  The
+# $HOSTADDRESS$ macro is substituted with the address of
+# the host before the command is executed.
+# Please note that the syntax for the ping binary is
+# notorious for being different on virtually ever *NIX
+# OS and distribution, so you may have to tweak this to
+# work on your system.
+
+ping_syntax=/bin/ping -n -U -c 5 $HOSTADDRESS$
+
+
+
+# REFRESH RATE
+# This option allows you to specify the refresh rate in seconds
+# of various CGIs (status, statusmap, extinfo, and outages).  
+
+refresh_rate=90
+
+
+
+# ESCAPE HTML TAGS
+# This option determines whether HTML tags in host and service
+# status output is escaped in the web interface.  If enabled,
+# your plugin output will not be able to contain clickable links.
+
+escape_html_tags=1
+
+
+
+
+# SOUND OPTIONS
+# These options allow you to specify an optional audio file
+# that should be played in your browser window when there are
+# problems on the network.  The audio files are used only in
+# the status CGI.  Only the sound for the most critical problem
+# will be played.  Order of importance (higher to lower) is as
+# follows: unreachable hosts, down hosts, critical services,
+# warning services, and unknown services. If there are no
+# visible problems, the sound file optionally specified by
+# 'normal_sound' variable will be played.
+#
+#
+# <varname>=<sound_file>
+#
+# Note: All audio files must be placed in the /media subdirectory
+# under the HTML path (i.e. /usr/local/nagios/share/media/).
+
+#host_unreachable_sound=hostdown.wav
+#host_down_sound=hostdown.wav
+#service_critical_sound=critical.wav
+#service_warning_sound=warning.wav
+#service_unknown_sound=warning.wav
+#normal_sound=noproblem.wav
+
Index: branches/fc15-dev/noc/nagios/checkcommands.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/checkcommands.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/checkcommands.cfg	(revision 1803)
@@ -0,0 +1,203 @@
+################################################################################
+# Sample object config file for Nagios 
+#
+# Read the documentation for more information on this configuration file.  I've
+# provided some comments here, but things may not be so clear without further
+# explanation, so make sure to read the HTML documentation!
+# 
+# Last Modified: 12-15-2005
+#
+################################################################################
+
+
+################################################################################
+# COMMAND DEFINITIONS
+#
+# SYNTAX:
+#
+#	define command{
+#               template      <templatename>
+#		name          <objectname>
+#               command_name  <commandname>
+#               command_line  <commandline>
+#               }
+#
+# WHERE:
+#
+# <templatename> = object name of another command definition that should be
+#                  used as a template for this definition (optional)
+# <objectname>   = object name of command definition, referenced by other
+#                  command definitions that use it as a template (optional)
+# <commandname>  = name of the command, as recognized/used by Nagios
+# <commandline>  = command line
+#
+################################################################################
+
+# 'check_http_heartbeat' command definition
+define command{
+       command_name	check_http_heartbeat
+       command_line	$USER1$/check_http -H $HOSTADDRESS$ -u /heartbeat/http -s 1
+       }
+
+# 'check_https_cert' command definition
+define command{
+       command_name	check_https_cert
+       command_line	$USER1$/check_https -H $HOSTADDRESS$ -S -C $ARG1$
+       }
+
+# 'check_https_cert' command definition
+define command{
+       command_name	check_https_cert_444
+       command_line	$USER1$/check_https -H $HOSTADDRESS$ -p 444 -S -C $ARG1$
+       }
+
+# 'check_local_disk' command definition
+define command{
+        command_name    check_local_disk
+        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
+        }
+
+
+# 'check_local_load' command definition
+define command{
+        command_name    check_local_load
+        command_line    $USER1$/check_load -w $ARG1$ -c $ARG2$
+        }
+
+
+# 'check_local_procs' command definition
+define command{
+        command_name    check_local_procs
+        command_line    $USER1$/check_procs -w $ARG1$ -c $ARG2$
+        }
+#command_line    $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
+
+
+# 'check_local_users' command definition
+define command{
+        command_name    check_local_users
+        command_line    $USER1$/check_users -w $ARG1$ -c $ARG2$
+        }
+
+################################################################################
+#
+# SAMPLE HOST CHECK COMMANDS
+#
+################################################################################
+
+
+# This command checks to see if a host is "alive" by pinging it
+# The check must result in a 100% packet loss or 5 second (5000ms) round trip 
+# average time to produce a critical error.
+# Note: Only one ICMP echo packet is sent (determined by the '-p 1' argument)
+
+# 'check-host-alive' command definition
+#define command{
+#        command_name    check-host-alive
+#        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1
+#        }
+
+#define command{
+#        command_name    check-host-alive
+#        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 99,99% -c 100,100% -p 1 
+#        }
+
+define command {
+	command_name	check_nrpe_alive
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$
+}
+
+define command {
+	command_name	check_remote_users
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_users -a $ARG1$ $ARG2$
+}
+
+define command {
+	command_name	check_remote_load
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_load -a $ARG1$ $ARG2$
+}
+
+define command {
+	command_name	check_remote_disk
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_disk -a $ARG1$ $ARG2$
+}
+
+define command {
+	command_name	check_remote_disk_p
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_disk_p -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs -a $ARG1$ $ARG2$
+}
+
+define command {
+	command_name	check_remote_procs_C
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_C -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs_P
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_P -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs_m
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_m -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs_s
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_s -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs_u
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_u -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_procs_z
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_procs_z -a $ARG1$ $ARG2$ $ARG3$
+}
+
+define command {
+	command_name	check_remote_mysql
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_mysql -a $USER3$ $USER4$
+}
+
+define command {
+	command_name	check_remote_mysql_slave
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_mysql_S -a $USER3$ $USER4$
+}
+
+define command {
+	command_name	check_remote_afs
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_afs
+}
+
+define command {
+	command_name	check_remote_cron_working
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_cron_working
+}
+
+define command {
+	command_name	check_remote_ldap_mmr
+	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ -u -c check_ldap_mmr
+}
+
+define command {
+    command_name    check_scripts_ldap
+    command_line    $USER1$/check_ldap -H $HOSTADDRESS$ -b dc=scripts,dc=mit,dc=edu
+}
+
+define command {
+	command_name	check_svn
+	command_line	$USER5$/check_svn -H $HOSTNAME$ -T
+}
+
+define command {
+	command_name	check_dns_server
+	command_line	/usr/lib/nagios/plugins/check_dns -H $ARG1$ -s '$HOSTADDRESS$'
+}
Index: branches/fc15-dev/noc/nagios/cnagios.help
===================================================================
--- branches/fc15-dev/noc/nagios/cnagios.help	(revision 1803)
+++ branches/fc15-dev/noc/nagios/cnagios.help	(revision 1803)
@@ -0,0 +1,23 @@
+  
+  Cnagios Commands
+  ----------------
+    u       display all host objects
+    d       display UNKNOWN and DOWN hosts
+    o       display all service objects
+    w       display UNKNOWN, PENDING, WARNING and CRITICAL services
+    c       display CRITICAL services
+    t       toggle between sort-by-age and sort-by-name (also s)
+    space   intelligent scroll 
+    >       go to next page (also ^f)
+    <       go to previous page (also ^b)
+    0       go to first page
+    G       go to last page
+    =       set a text filter (also g) (use \n to clear)
+    !       set a negative text filter (also v) (use \n to clear)
+    a       set an age filter (use \n to clear)
+    A       set an age filter for UP/OK objects only (use \n to clear)
+    x       clear all filters
+    r       reread the status.log and refresh display (also ^l)
+    h       display (this) help screen (also ?)
+    q       quit (also ^d)
+
Index: branches/fc15-dev/noc/nagios/cnagios.pl
===================================================================
--- branches/fc15-dev/noc/nagios/cnagios.pl	(revision 1803)
+++ branches/fc15-dev/noc/nagios/cnagios.pl	(revision 1803)
@@ -0,0 +1,220 @@
+#
+# the current cnagios.pl for UW-HEP
+#
+
+use strict;
+
+#------------------------------------------------------------------
+
+sub host_plugin_hook {
+  local($_) = $_[0];
+
+  s/\(Host assumed to be up\)/assumed up/;
+  s/\(Host check timed out\)/timed out/;
+  s/\(Not enough data to determine host status yet\)/none/;
+  s/\(No Information Returned From Host Check\)/none/;
+  s/Ping .*? - (\d+)% packet loss.*/$1% pkt loss/;
+
+  return $_;
+}
+
+#------------------------------------------------------------------
+
+sub service_plugin_hook {
+  local($_) = $_[0];
+
+  # generic...
+  s/Plugin timed out after \d+ seconds/timed out/;
+
+  # check_pingwithperl...
+  s/.* (\d+)% packet loss, \d+.\d+ ms ave rtt/$1% pkt loss/;
+
+  # check_tcp...
+  s/.* (\d+\.\d+) second[s]? response time.*/$1 sec response/;
+  s/.* (\d+) second[s]? response time.*/$1 sec response/;
+  s/.* (\d+\.\d+) sec[s]? response time.*/$1 sec response/;
+
+  # check_ftp
+  s/.*Invalid response from host/bad response/;
+
+  # chech_ssh...
+  s/.* (.*?OpenSSH.*?) .*/$1/;
+  s/.*OpenSSH_3.5p1.*/OpenSSH_3.5p1/;
+  s/.*Connection refused.*/connection refused/i;
+
+  # check_netsnmp_disk & check_netsnmp_bigdisk...
+  # also works for check_dcache_usage...
+  while ( $_ =~ /(\d+\.\d+) TB/ ) {
+     my $tb = $1;
+     # WARNING: will fail for > 9999 GB...
+     my $gb = sprintf("%4.4s",int($tb *1024)); 
+     $_ =~ s/$tb TB/$gb GB/;
+  }
+  while ( $_ =~ /(\d+\.\d+) GB/ ) {
+     my $gb = $1;
+     # WARNING: will fail for > 9999 GB...
+     my $gb_new = sprintf("%4.4s",int($gb)); 
+     $_ =~ s/$gb GB/$gb_new GB/;
+  }
+  s/.*?(\d+ GB total,).*?,(\s*\d+ GB avail)/$1$2/;
+
+  # check_netsnmp_loadave...
+  s/.* load average: (\d+\.\d+).*/$1 loadave/;
+
+  # check_ntp...
+  s/.* Offset ([-]*\d+\.\d+) secs.*/$1 sec offset/;
+  s/.* stratum (\d+), offset ([-]*\d+\.\d+).*/stratum $1, $2 sec offset/;
+  s/.*Jitter\s+too high.*/jittering/;
+  s/.*desynchronized peer server.*/desynchronized peer server/i;
+  s/.*probably down.*/down/;
+
+  # check_dhcp et al...
+  s/.* Received \d+ DHCPOFFER.*max lease time = (\d+) sec.*/$1 sec lease time/;
+  s/.* \d+ in use, (\d+) free/$1 free leases/;
+  if ( s/DHCP problem: (.*)/$1/ ) { $_ = lc($_); }
+
+  # check_afs_*...
+  s/File Server Performance/Performance/;
+  s/.* (\d+ blocked) connections/$1/;
+  s/(.*?) AFS (\/.*)/$1 $2/;
+  s/(.*?) AFS Volume Quotas/$1 AFS Volumes/;
+  s/(\d+) processes running normally/$1 ok processes/;
+  s/one process running normally/one ok process/;
+  s/% used/%/g;
+  s/user.(.*?)/$1/g;
+  s/(\d+) volumes under quota/$1 ok volumes/;
+  s/db version (\d+.\d+)/db $1/;
+
+  # check_condor_client...
+  s/.* vm1 = .*?\/(\S+), vm2 = .*?\/(\S+),.*/$1\/$2/;
+  s/.* vm1 = .*?\/(\S+), vm2 = .*?\/(\S+).*/$1\/$2/;
+  s/.* cpu = (\S+)/$1/;
+  s/CondorQueue.*?(\d+ job[s]?, \d+ running).*/$1/;
+  s/.*?No condor status.*/no condor status/;
+
+  # check_condor_pool...
+  s/.*?(\d+) nodes.*/$1 nodes/;
+
+  # check_condor_queue...
+  s/.*?(\d+ idle, \d+ held)/$1/;
+
+  # check_nsr...
+  s/.*?(\d+\.\d+ GB), (\d+ saves) since.*/$1, $2/;
+  s/.*?(\d+ GB), (\d+ saves) since.*/$1, $2/;
+  s/(\d+ GB avail)able, \d+ GB total/$1/;
+
+  # check_hpjd...
+  s/.*? - \(\".*\"\)/printer okay/;
+  if ( s/(.*)\s+\(\".*\"\)/$1/ ) { $_ = lc($_); }
+
+  # check_LPRng_queue...
+  s/(\d+) active job[s]?/$1 active/;
+  s/(\d+) stalled job[s]?/$1 stalled/;
+  s/(\d+) spooled job[s]?/$1 spooled/;
+  s/(\d+) incoming job[s]?/$1 incoming/;
+  s/(\d+) incoming job[s]?/$1 incoming/;
+
+  # check_jug_*...
+  s/(\d+) JugRPC processes.*/$1 processes/;
+  s/.*JugJobs.*?(\d+) running.*/$1 running/;
+  s/.*Jug Storage.*?(\d+) unassigned.*/$1 unassigned/;
+
+  # check_dcache*...
+  s/.*no status available.*/not found/;
+  s/.*not found in the cellInfo.*/not found/;
+  s/service is (.*)/$1/;
+  s/.*(\d+) ms ave ping time/$1 ms ping time/;
+  s/.*(\d+) ms ping time/$1 ms ping time/;
+
+  # (my) check_traffic & check_ifHighSpeed_traffic...
+  # makes columnized XXX.XX Mbps output...
+  s/.*? (.*) Traffic/$1 Traffic/;
+  s/Internet Traffic/Traffic/;
+  if ( $_ =~ /(\d+\.\d+) Gbps in/ ) {
+    my $rate = $1;
+    my $gbps = sprintf("%6.6s",$rate);
+    $_ =~ s/$rate Gbps in/$gbps Gbps in/;
+  }
+  if ( $_ =~ /(\d+\.\d+) Gbps out/ ) {
+    my $rate = $1;
+    my $gbps = sprintf("%6.6s",$rate);
+    $_ =~ s/$rate Gbps out/$gbps Gbps out/;
+  }
+  if ( $_ =~ /(\d+\.\d+) Mbps in/ ) {
+    my $rate = $1;
+    my $mbps = sprintf("%6.6s",$rate);
+    $_ =~ s/$rate Mbps in/$mbps Mbps in/;
+  }
+  if ( $_ =~ /(\d+\.\d+) Mbps out/ ) {
+    my $rate = $1;
+    my $mbps = sprintf("%6.6s",$rate);
+    $_ =~ s/$rate Mbps out/$mbps Mbps out/;
+  }
+  while ( $_ =~ /(\d+\.\d+) Kbps/ ) {
+    my $rate = $1;
+    my $mbps = sprintf("%.2f",$rate/1000);
+    $mbps = sprintf("%6.6s",$mbps);
+    $_ =~ s/$rate Kbps/$mbps Mbps/;
+  }
+  s/\d+\.\d+ bps/  0.00 Mbps/g;
+
+  # check_airport...
+  s/(.*? AirPort) Usage/$1/;
+  s/no connected clients/no clients/;
+  s/(\d+) connected clients/$1 clients/;
+
+  # check_netsnmp_raid...
+  s/.*connect failed.*/connect failed/;
+  s/.*degraded.*/degraded/;
+  s/.*degraded/degraded/;
+  s/.*rebuilding.*/rebuilding/;
+  s/.*rebuilding/rebuilding/;
+  s/.*built.*/building/;
+  s/.*built/building/;
+  s/.*optimal.*/optimal/;
+  s/.*optimal/optimal/;
+
+  # check_ip_routing_with_mtr
+  s/\S+ to \S+ hop not found, first hop out is (\S+)/hop is $1/i;
+
+  # check_phedex
+  s/.*(\d+ UP agents).*/$1/;
+
+  # plugin generic...
+  s/.*no response.*/connection timed out/i;
+  s/.*no route to host.*/no route to host/i;
+  s/Socket timeout.*/socket timed out/;
+
+  # nagios generic...
+  s/\(Service Check Timed Out\)/check timed out/;
+  s/\(No output returned from plugin\)/no output from plugin/;
+  s/Service check scheduled for.*/none/;
+  s/No data yet.*/no data yet/;
+  s/\.$//;
+
+  # generic generic...
+  s/.*?OK - //i;
+  s/.*?WARNING - //i;
+  s/.*?CRITICAL - //i;
+  s/.*?UNKNOWN - //i;
+
+  return $_;
+
+}
+
+#------------------------------------------------------------------
+
+# this sub is used for host/service/plugin-output 
+# filtering... it should not change...
+
+sub regex_hook {
+  my($str,$regex,$mode) = @_;
+  if ( $mode == 0 ) { 
+    if ( $str =~ /$regex/ ) { return 0 } else { return 1 }
+  }
+  if ( $mode == 1 ) { 
+    if ( $str !~ /$regex/ ) { return 0 } else { return 1 }
+  }
+  return 2;
+}
+
Index: branches/fc15-dev/noc/nagios/cnagiosrc
===================================================================
--- branches/fc15-dev/noc/nagios/cnagiosrc	(revision 1803)
+++ branches/fc15-dev/noc/nagios/cnagiosrc	(revision 1803)
@@ -0,0 +1,21 @@
+
+# add a site name to the upper left hand corner...
+default site_name = sipb-nagios
+
+## display OKAY services...
+#default level = OKAY
+
+## sort by age...
+#default sort_order = by_name
+
+# don't display hosts/services/plugin output that 
+# matches our compute node names... eg g12n01...
+#default text !~ /^g\d+n\d+/
+
+# only display OKAY services that have changed 
+# states within the last eight hours...
+#default okay_age = 8h
+
+# the "F1" key sets a /Ping/ filter... 
+#f1 text =~ /Ping/
+
Index: branches/fc15-dev/noc/nagios/contacts.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/contacts.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/contacts.cfg	(revision 1803)
@@ -0,0 +1,84 @@
+define contactgroup {
+        contactgroup_name       scripts
+        alias                   Scripts Maintainers
+        members                 scripts,scripts-zephyr
+}
+
+define contactgroup {
+        contactgroup_name       sql
+        alias                   SQL Maintainers
+        members                 sql
+}
+
+define contactgroup {
+        contactgroup_name       pagers
+        alias                   Scripts Maintainers (Pagers)
+        members                 quentin-cell,geofft-pager
+}
+
+define contact {
+        contact_name                    scripts
+        alias                           scripts
+        service_notification_period     24x7
+        host_notification_period        24x7
+        service_notification_options    w,u,c,r
+        host_notification_options       d,u,r
+        service_notification_commands   notify-by-email
+        host_notification_commands      host-notify-by-email
+        email                           scripts-alerts@mit.edu
+}
+define contact {
+        contact_name                    sql
+        alias                           sql
+        service_notification_period     24x7
+        host_notification_period        24x7
+        service_notification_options    w,u,c,r
+        host_notification_options       d,u,r
+        service_notification_commands   notify-by-email
+        host_notification_commands      host-notify-by-email
+        email                           sql@mit.edu
+}
+define contact {
+       contact_name			quentin-cell
+       alias				Quentin Smith (cell)
+       service_notification_period	24x7
+       host_notification_period		24x7
+       host_notification_options	d,r
+       service_notification_options	c,r
+       host_notification_commands	host-notify-by-epager
+       service_notification_commands	notify-by-epager
+       pager				6037598233@vtext.com
+}
+define contact {
+       contact_name			geofft-pager
+       alias				Geoff Thomas (cell)
+       service_notification_period	24x7
+       host_notification_period		24x7
+       host_notification_options	d,r
+       service_notification_options	c,r
+       host_notification_commands	host-notify-by-epager
+       service_notification_commands	notify-by-epager
+       pager				page-geofft@mit.edu
+}
+define contact {
+       contact_name			andersk-cell
+       alias				Anders Kaseorg (cell)
+       service_notification_period	24x7
+       host_notification_period		24x7
+       host_notification_options	d,r
+       service_notification_options	c,r
+       host_notification_commands	host-notify-by-epager
+       service_notification_commands	notify-by-epager
+       pager				7046182192@vtext.com
+}
+define contact {
+        contact_name                    scripts-zephyr
+        alias                           scripts-zephyr
+        service_notification_period     24x7
+        host_notification_period        24x7
+        service_notification_options    w,u,c,r
+        host_notification_options       d,u,r
+        service_notification_commands   notify-by-zephyr
+        host_notification_commands      host-notify-by-zephyr
+        email                           scripts
+}
Index: branches/fc15-dev/noc/nagios/hostgroups.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/hostgroups.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/hostgroups.cfg	(revision 1803)
@@ -0,0 +1,59 @@
+define hostgroup {
+	hostgroup_name	scripts-http
+	alias	Web servers
+	members	scripts,scripts-cert
+}
+
+define hostgroup {
+	hostgroup_name	scripts-https
+	alias	SSL servers
+	members	scripts,scripts-cert,wildcard.scripts
+}
+
+define hostgroup {
+	hostgroup_name	scripts-mysql
+	alias	MySQL servers
+	members	sql
+}
+
+define hostgroup {
+	hostgroup_name	mysql-masters
+	alias	MySQL master servers
+	members	sql
+}
+
+define hostgroup {
+	hostgroup_name	mysql-slaves
+	alias	MySQL slave servers
+	members	k-s,s-b
+}
+
+define hostgroup {
+	hostgroup_name	scripts-mail
+	alias	Mail servers
+	members	b-m,o-f,b-k,c-w,p-b,b-b,r-m
+}
+
+define hostgroup {
+	hostgroup_name	scripts-cron
+	alias	Cron servers
+	members	b-m,o-f,b-k,c-w,p-b,b-b,r-m
+}
+
+define hostgroup {
+	hostgroup_name	scripts-user
+	alias	User servers
+	members	b-m,o-f,b-k,c-w,p-b,b-b,r-m
+}
+
+define hostgroup {
+	hostgroup_name	scripts-all
+	alias	All scripts hosts
+	members	b-b,b-k,b-m,c-w,k-s,o-f,p-b,r-m,r-f,r-b,s-b,scripts,scripts-cert,sipb-ether,sql,wildcard.scripts
+}
+
+define hostgroup {
+	hostgroup_name	scripts-real
+	alias	All physical scripts servers
+	members	b-b,b-k,b-m,c-w,k-s,o-f,p-b,r-m,r-f,r-b,s-b
+}
Index: branches/fc15-dev/noc/nagios/hosts.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/hosts.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/hosts.cfg	(revision 1803)
@@ -0,0 +1,201 @@
+
+define host {
+	name	scripts-host
+	use	generic-host
+	register	0
+        max_check_attempts      10
+        check_period		24x7
+	check_command	check-host-alive
+        notification_interval   240
+        notification_period     24x7
+        notification_options    d,r
+        contact_groups  scripts
+}
+
+define host {
+	name	scripts-sipb-host
+	use	scripts-host
+	register	0
+	parents		sipb-ether
+}
+
+define host {
+       use  scripts-host
+       host_name	sipb-ether
+       address		18.181.0.1
+}
+
+# SQL
+
+define host {
+	name sql-sipb-host
+	use scripts-sipb-host
+	register 0
+	contact_groups sql,scripts
+}
+
+define host {
+	use	sql-sipb-host
+	host_name	sql
+	alias		sql
+	address		18.181.0.52
+	contact_groups	sql,scripts,pagers
+}
+
+define host {
+	use	sql-sipb-host
+	host_name	k-s
+	alias		kitchen-sink
+	address		18.181.0.56
+	notes		SQL
+	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/kitchen-sink.html
+}
+
+define host {
+	use	sql-sipb-host
+	host_name	s-b
+	alias		sliced-bread
+	address		18.181.0.47
+	notes		SQL
+	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/sliced-bread.html
+}
+
+# Scripts
+
+define host {
+	use	scripts-sipb-host
+	host_name	o-f
+	alias		old-faithful
+	address		18.181.0.53
+#	contact_groups	scripts,pagers
+	notes		Scripts
+	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/old-faithful.html
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	scripts
+	alias		scripts
+	address		18.181.0.46
+	contact_groups	scripts,pagers
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	scripts-cert
+	alias		scripts-cert
+	parents		scripts
+	address		18.181.0.50
+	contact_groups	scripts,pagers
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	wildcard.scripts
+	alias		wildcard.scripts
+	parents		scripts
+	address		wildcard.scripts.mit.edu
+	contact_groups	scripts,pagers
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	b-m
+	alias		better-mousetrap
+	address		18.181.0.57
+#	contact_groups	scripts,pagers
+	notes		Scripts
+	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/better-mousetrap.html
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	b-k
+	alias   	bees-knees
+	address		18.181.0.167
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	c-w
+	alias		cats-whiskers
+	address		18.181.0.228
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	p-b
+	alias		pancake-bunny
+	address		18.181.0.237
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	b-b
+	alias		busy-beaver
+	address		18.181.0.234
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	r-m
+	alias		real-mccoy
+	address		18.181.0.235
+}
+
+# LVS
+
+#define host {
+#	use	scripts-sipb-host
+#	host_name	n-f
+#	alias		not-forward
+#	address		18.181.0.54
+##	contact_groups	scripts,pagers
+#}
+
+#define hostextinfo {
+#	host_name	n-f
+#	notes		LVS Server
+#	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/18.181.0.3_9.html
+#}
+
+#define host {
+#	use	scripts-sipb-host
+#	host_name	n-b
+#	alias		not-backward
+#	address		18.181.0.55
+##	contact_groups	scripts,pagers
+#}
+
+#define hostextinfo {
+#	host_name	n-b
+#	notes		LVS Server
+#	notes_url	http://stuff.mit.edu/afs/sipb/project/mrtg/data/18.181.0.3_5.html
+#}
+
+define host {
+	use	scripts-sipb-host
+	host_name	r-f
+	alias		rack-forward
+	address		18.181.0.117
+#	contact_groups	scripts,pagers
+}
+
+define host {
+	use	scripts-sipb-host
+	host_name	r-b
+	alias		rack-backward
+	address		18.181.0.118
+#	contact_groups	scripts,pagers
+}
+
+# Test
+
+define host {
+	use	scripts-sipb-host
+	host_name	asdfasdfasdf
+	alias		nagios-test
+	address		18.187.1.70
+	register	0
+}
+
Index: branches/fc15-dev/noc/nagios/misccommands.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/misccommands.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/misccommands.cfg	(revision 1803)
@@ -0,0 +1,122 @@
+################################################################################
+# Sample object config file for Nagios 
+#
+# Read the documentation for more information on this configuration file.  I've
+# provided some comments here, but things may not be so clear without further
+# explanation, so make sure to read the HTML documentation!
+# 
+# Last Modified: 12-17-2005
+#
+################################################################################
+
+
+################################################################################
+# COMMAND DEFINITIONS
+#
+# SYNTAX:
+#
+#	define command{
+#               template      <templatename>
+#		name          <objectname>
+#               command_name  <commandname>
+#               command_line  <commandline>
+#               }
+#
+# WHERE:
+#
+# <templatename> = object name of another command definition that should be
+#                  used as a template for this definition (optional)
+# <objectname>   = object name of command definition, referenced by other
+#                  command definitions that use it as a template (optional)
+# <commandname>  = name of the command, as recognized/used by Nagios
+# <commandline>  = command line
+#
+################################################################################
+
+
+
+
+################################################################################
+#
+# SAMPLE NOTIFICATION COMMANDS
+#
+# These are some example notification commands.  They may or may not work on
+# your system without modification.
+#
+################################################################################
+
+# 'host-notify-by-email' command definition
+define command{
+	command_name	host-notify-by-email
+	command_line	/usr/bin/printf "%b" "***** Nagios  *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/bin/mail -s "Host $HOSTSTATE$ alert for $HOSTNAME$!" $CONTACTEMAIL$
+	}
+
+
+# 'host-notify-by-zephyr' command definition
+define command{
+	command_name	host-notify-by-zephyr
+	command_line	/usr/bin/printf "%b" "Host $HOSTSTATE$ $NOTIFICATIONTYPE$ alert for $HOSTNAME$!\n$HOSTOUTPUT$" | /usr/bin/zwrite -d -s "Nagios" -c $CONTACTEMAIL$ -i "nagios.$HOSTALIAS$"
+	}
+
+
+# 'host-notify-by-epager' command definition
+define command{
+	command_name	host-notify-by-epager
+	command_line	/usr/bin/printf "%b" "Host '$HOSTALIAS$' is $HOSTSTATE$\nInfo: $HOSTOUTPUT$\nTime: $LONGDATETIME$" | /usr/bin/mail -s "Host $HOSTNAME$ is $HOSTSTATE$" $CONTACTPAGER$
+	}
+
+# 'notify-by-email' command definition
+define command{
+	command_name	notify-by-email
+	command_line	/usr/bin/printf "%b" "***** Nagios  *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
+	}
+
+
+# 'notify-by-zephyr' command definition
+define command{
+	command_name	notify-by-zephyr
+	command_line	/usr/bin/printf "%b" "$NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$\n$SERVICEOUTPUT$" | /usr/bin/zwrite -d -s "Nagios" -c $CONTACTEMAIL$ -i "nagios.$HOSTALIAS$.$SERVICEDESC$"
+	}
+
+
+# 'notify-by-epager' command definition
+define command{
+	command_name	notify-by-epager
+	command_line	/usr/bin/printf "%b" "Info: $SERVICEOUTPUT$\nDate: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
+	}
+
+
+
+
+
+################################################################################
+#
+# SAMPLE PERFORMANCE DATA COMMANDS
+#
+# These are sample performance data commands that can be used to send performance
+# data output to two text files (one for hosts, another for services).  If you
+# plan on simply writing performance data out to a file, consider using the 
+# host_perfdata_file and service_perfdata_file options in the main config file.
+#
+################################################################################
+
+
+# 'process-host-perfdata' command definition
+define command{
+	command_name	process-host-perfdata
+	command_line	/usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >> /var/log/nagios/host-perfdata.out
+	}
+
+
+# 'process-service-perfdata' command definition
+define command{
+	command_name	process-service-perfdata
+	command_line	/usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >> /var/log/nagios/service-perfdata.out
+	}
+
+
+define command {
+  command_name  ng-service-perfdata
+  command_line  /home/noc/ng/bin/insert.pl
+}
+#  command_line  /home/nagios/ng/bin/test.sh
Index: branches/fc15-dev/noc/nagios/nagios.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/nagios.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/nagios.cfg	(revision 1803)
@@ -0,0 +1,1280 @@
+##############################################################################
+#
+# NAGIOS.CFG - Sample Main Config File for Nagios 
+#
+#
+##############################################################################
+
+
+# LOG FILE
+# This is the main log file where service and host events are logged
+# for historical purposes.  This should be the first option specified 
+# in the config file!!!
+
+log_file=/var/log/nagios3/nagios.log
+
+# Debian also defaults to using the check commands defined by the debian
+# nagios-plugins package
+cfg_dir=/etc/nagios-plugins/config
+
+# OBJECT CONFIGURATION FILE(S)
+# These are the object configuration files in which you define hosts,
+# host groups, contacts, contact groups, services, etc.
+# You can split your object definitions across several config files
+# if you wish (as shown below), or keep them all in a single config file.
+
+# You can specify individual object config files as shown below:
+cfg_file=/etc/nagios3/checkcommands.cfg
+cfg_file=/etc/nagios3/misccommands.cfg
+cfg_file=/etc/nagios3/base.cfg
+cfg_file=/etc/nagios3/contacts.cfg
+cfg_file=/etc/nagios3/hostgroups.cfg
+cfg_file=/etc/nagios3/hosts.cfg
+cfg_file=/etc/nagios3/services.cfg
+
+cfg_file=/etc/nagios3/xvm.cfg
+cfg_file=/etc/nagios3/sipb.cfg
+
+cfg_dir=/etc/nagios3/users
+
+
+# OBJECT CACHE FILE
+# This option determines where object definitions are cached when
+# Nagios starts/restarts.  The CGIs read object definitions from 
+# this cache file (rather than looking at the object config files
+# directly) in order to prevent inconsistencies that can occur
+# when the config files are modified after Nagios starts.
+
+object_cache_file=/var/cache/nagios3/objects.cache
+
+
+
+# PRE-CACHED OBJECT FILE
+# This options determines the location of the precached object file.
+# If you run Nagios with the -p command line option, it will preprocess
+# your object configuration file(s) and write the cached config to this
+# file.  You can then start Nagios with the -u option to have it read
+# object definitions from this precached file, rather than the standard
+# object configuration files (see the cfg_file and cfg_dir options above).
+# Using a precached object file can speed up the time needed to (re)start 
+# the Nagios process if you've got a large and/or complex configuration.
+# Read the documentation section on optimizing Nagios to find our more
+# about how this feature works.
+
+precached_object_file=/var/lib/nagios3/objects.precache
+
+
+
+# RESOURCE FILE
+# This is an optional resource file that contains $USERx$ macro
+# definitions. Multiple resource files can be specified by using
+# multiple resource_file definitions.  The CGIs will not attempt to
+# read the contents of resource files, so information that is
+# considered to be sensitive (usernames, passwords, etc) can be
+# defined as macros in this file and restrictive permissions (600)
+# can be placed on this file.
+
+resource_file=/etc/nagios3/private/resource.cfg
+
+
+
+# STATUS FILE
+# This is where the current status of all monitored services and
+# hosts is stored.  Its contents are read and processed by the CGIs.
+# The contents of the status file are deleted every time Nagios
+#  restarts.
+
+status_file=/var/cache/nagios3/status.dat
+
+
+
+# STATUS FILE UPDATE INTERVAL
+# This option determines the frequency (in seconds) that
+# Nagios will periodically dump program, host, and 
+# service status data.
+
+status_update_interval=10
+
+
+
+# NAGIOS USER
+# This determines the effective user that Nagios should run as.  
+# You can either supply a username or a UID.
+
+nagios_user=nagios
+
+
+
+# NAGIOS GROUP
+# This determines the effective group that Nagios should run as.  
+# You can either supply a group name or a GID.
+
+nagios_group=nagios
+
+
+
+# EXTERNAL COMMAND OPTION
+# This option allows you to specify whether or not Nagios should check
+# for external commands (in the command file defined below).  By default
+# Nagios will *not* check for external commands, just to be on the
+# cautious side.  If you want to be able to use the CGI command interface
+# you will have to enable this.
+# Values: 0 = disable commands, 1 = enable commands
+
+check_external_commands=1
+
+
+
+# EXTERNAL COMMAND CHECK INTERVAL
+# This is the interval at which Nagios should check for external commands.
+# This value works of the interval_length you specify later.  If you leave
+# that at its default value of 60 (seconds), a value of 1 here will cause
+# Nagios to check for external commands every minute.  If you specify a
+# number followed by an "s" (i.e. 15s), this will be interpreted to mean
+# actual seconds rather than a multiple of the interval_length variable.
+# Note: In addition to reading the external command file at regularly 
+# scheduled intervals, Nagios will also check for external commands after
+# event handlers are executed.
+# NOTE: Setting this value to -1 causes Nagios to check the external
+# command file as often as possible.
+
+#command_check_interval=15s
+command_check_interval=-1
+
+
+
+# EXTERNAL COMMAND FILE
+# This is the file that Nagios checks for external command requests.
+# It is also where the command CGI will write commands that are submitted
+# by users, so it must be writeable by the user that the web server
+# is running as (usually 'nobody').  Permissions should be set at the 
+# directory level instead of on the file, as the file is deleted every
+# time its contents are processed.
+# Debian Users: In case you didn't read README.Debian yet, _NOW_ is the
+# time to do it.
+
+command_file=/var/lib/nagios3/rw/nagios.cmd
+
+
+
+# EXTERNAL COMMAND BUFFER SLOTS
+# This settings is used to tweak the number of items or "slots" that
+# the Nagios daemon should allocate to the buffer that holds incoming 
+# external commands before they are processed.  As external commands 
+# are processed by the daemon, they are removed from the buffer.  
+
+external_command_buffer_slots=4096
+
+
+
+# LOCK FILE
+# This is the lockfile that Nagios will use to store its PID number
+# in when it is running in daemon mode.
+
+lock_file=/var/run/nagios3/nagios3.pid
+
+
+
+# TEMP FILE
+# This is a temporary file that is used as scratch space when Nagios
+# updates the status log, cleans the comment file, etc.  This file
+# is created, used, and deleted throughout the time that Nagios is
+# running.
+
+temp_file=/var/cache/nagios3/nagios.tmp
+
+
+
+# TEMP PATH
+# This is path where Nagios can create temp files for service and
+# host check results, etc.
+
+temp_path=/tmp
+
+
+
+# EVENT BROKER OPTIONS
+# Controls what (if any) data gets sent to the event broker.
+# Values:  0      = Broker nothing
+#         -1      = Broker everything
+#         <other> = See documentation
+
+event_broker_options=-1
+
+
+
+# EVENT BROKER MODULE(S)
+# This directive is used to specify an event broker module that should
+# by loaded by Nagios at startup.  Use multiple directives if you want
+# to load more than one module.  Arguments that should be passed to
+# the module at startup are seperated from the module path by a space.
+#
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#
+# Do NOT overwrite modules while they are being used by Nagios or Nagios
+# will crash in a fiery display of SEGFAULT glory.  This is a bug/limitation
+# either in dlopen(), the kernel, and/or the filesystem.  And maybe Nagios...
+#
+# The correct/safe way of updating a module is by using one of these methods:
+#    1. Shutdown Nagios, replace the module file, restart Nagios
+#    2. Delete the original module file, move the new module file into place, restart Nagios
+#
+# Example:
+#
+#   broker_module=<modulepath> [moduleargs]
+
+#broker_module=/somewhere/module1.o
+#broker_module=/somewhere/module2.o arg1 arg2=3 debug=0
+
+
+
+# LOG ROTATION METHOD
+# This is the log rotation method that Nagios should use to rotate
+# the main log file. Values are as follows..
+#	n	= None - don't rotate the log
+#	h	= Hourly rotation (top of the hour)
+#	d	= Daily rotation (midnight every day)
+#	w	= Weekly rotation (midnight on Saturday evening)
+#	m	= Monthly rotation (midnight last day of month)
+
+log_rotation_method=d
+
+
+
+# LOG ARCHIVE PATH
+# This is the directory where archived (rotated) log files should be 
+# placed (assuming you've chosen to do log rotation).
+
+log_archive_path=/var/log/nagios3/archives
+
+
+
+# LOGGING OPTIONS
+# If you want messages logged to the syslog facility, as well as the
+# Nagios log file set this option to 1.  If not, set it to 0.
+
+use_syslog=0
+
+
+
+# NOTIFICATION LOGGING OPTION
+# If you don't want notifications to be logged, set this value to 0.
+# If notifications should be logged, set the value to 1.
+
+log_notifications=1
+
+
+
+# SERVICE RETRY LOGGING OPTION
+# If you don't want service check retries to be logged, set this value
+# to 0.  If retries should be logged, set the value to 1.
+
+log_service_retries=1
+
+
+
+# HOST RETRY LOGGING OPTION
+# If you don't want host check retries to be logged, set this value to
+# 0.  If retries should be logged, set the value to 1.
+
+log_host_retries=1
+
+
+
+# EVENT HANDLER LOGGING OPTION
+# If you don't want host and service event handlers to be logged, set
+# this value to 0.  If event handlers should be logged, set the value
+# to 1.
+
+log_event_handlers=1
+
+
+
+# INITIAL STATES LOGGING OPTION
+# If you want Nagios to log all initial host and service states to
+# the main log file (the first time the service or host is checked)
+# you can enable this option by setting this value to 1.  If you
+# are not using an external application that does long term state
+# statistics reporting, you do not need to enable this option.  In
+# this case, set the value to 0.
+
+log_initial_states=0
+
+
+
+# EXTERNAL COMMANDS LOGGING OPTION
+# If you don't want Nagios to log external commands, set this value
+# to 0.  If external commands should be logged, set this value to 1.
+# Note: This option does not include logging of passive service
+# checks - see the option below for controlling whether or not
+# passive checks are logged.
+
+log_external_commands=1
+
+
+
+# PASSIVE CHECKS LOGGING OPTION
+# If you don't want Nagios to log passive host and service checks, set
+# this value to 0.  If passive checks should be logged, set
+# this value to 1.
+
+log_passive_checks=1
+
+
+
+# GLOBAL HOST AND SERVICE EVENT HANDLERS
+# These options allow you to specify a host and service event handler
+# command that is to be run for every host or service state change.
+# The global event handler is executed immediately prior to the event
+# handler that you have optionally specified in each host or
+# service definition. The command argument is the short name of a
+# command definition that you define in your host configuration file.
+# Read the HTML docs for more information.
+
+#global_host_event_handler=somecommand
+#global_service_event_handler=somecommand
+
+
+
+# SERVICE INTER-CHECK DELAY METHOD
+# This is the method that Nagios should use when initially
+# "spreading out" service checks when it starts monitoring.  The
+# default is to use smart delay calculation, which will try to
+# space all service checks out evenly to minimize CPU load.
+# Using the dumb setting will cause all checks to be scheduled
+# at the same time (with no delay between them)!  This is not a
+# good thing for production, but is useful when testing the
+# parallelization functionality.
+#	n	= None - don't use any delay between checks
+#	d	= Use a "dumb" delay of 1 second between checks
+#	s	= Use "smart" inter-check delay calculation
+#       x.xx    = Use an inter-check delay of x.xx seconds
+
+service_inter_check_delay_method=s
+
+
+
+# MAXIMUM SERVICE CHECK SPREAD
+# This variable determines the timeframe (in minutes) from the
+# program start time that an initial check of all services should
+# be completed.  Default is 30 minutes.
+
+max_service_check_spread=30
+
+
+
+# SERVICE CHECK INTERLEAVE FACTOR
+# This variable determines how service checks are interleaved.
+# Interleaving the service checks allows for a more even
+# distribution of service checks and reduced load on remote
+# hosts.  Setting this value to 1 is equivalent to how versions
+# of Nagios previous to 0.0.5 did service checks.  Set this
+# value to s (smart) for automatic calculation of the interleave
+# factor unless you have a specific reason to change it.
+#       s       = Use "smart" interleave factor calculation
+#       x       = Use an interleave factor of x, where x is a
+#                 number greater than or equal to 1.
+
+service_interleave_factor=s
+
+
+
+# HOST INTER-CHECK DELAY METHOD
+# This is the method that Nagios should use when initially
+# "spreading out" host checks when it starts monitoring.  The
+# default is to use smart delay calculation, which will try to
+# space all host checks out evenly to minimize CPU load.
+# Using the dumb setting will cause all checks to be scheduled
+# at the same time (with no delay between them)!
+#	n	= None - don't use any delay between checks
+#	d	= Use a "dumb" delay of 1 second between checks
+#	s	= Use "smart" inter-check delay calculation
+#       x.xx    = Use an inter-check delay of x.xx seconds
+
+host_inter_check_delay_method=s
+
+
+
+# MAXIMUM HOST CHECK SPREAD
+# This variable determines the timeframe (in minutes) from the
+# program start time that an initial check of all hosts should
+# be completed.  Default is 30 minutes.
+
+max_host_check_spread=30
+
+
+
+# MAXIMUM CONCURRENT SERVICE CHECKS
+# This option allows you to specify the maximum number of 
+# service checks that can be run in parallel at any given time.
+# Specifying a value of 1 for this variable essentially prevents
+# any service checks from being parallelized.  A value of 0
+# will not restrict the number of concurrent checks that are
+# being executed.
+
+max_concurrent_checks=0
+
+
+
+# HOST AND SERVICE CHECK REAPER FREQUENCY
+# This is the frequency (in seconds!) that Nagios will process
+# the results of host and service checks.
+
+check_result_reaper_frequency=10
+
+
+
+
+# MAX CHECK RESULT REAPER TIME
+# This is the max amount of time (in seconds) that  a single
+# check result reaper event will be allowed to run before 
+# returning control back to Nagios so it can perform other
+# duties.
+
+max_check_result_reaper_time=30
+
+
+
+
+# CHECK RESULT PATH
+# This is directory where Nagios stores the results of host and
+# service checks that have not yet been processed.
+#
+# Note: Make sure that only one instance of Nagios has access
+# to this directory!  
+
+check_result_path=/var/lib/nagios3/spool/checkresults
+
+
+
+
+# MAX CHECK RESULT FILE AGE
+# This option determines the maximum age (in seconds) which check
+# result files are considered to be valid.  Files older than this 
+# threshold will be mercilessly deleted without further processing.
+
+max_check_result_file_age=3600
+
+
+
+
+# CACHED HOST CHECK HORIZON
+# This option determines the maximum amount of time (in seconds)
+# that the state of a previous host check is considered current.
+# Cached host states (from host checks that were performed more
+# recently that the timeframe specified by this value) can immensely
+# improve performance in regards to the host check logic.
+# Too high of a value for this option may result in inaccurate host
+# states being used by Nagios, while a lower value may result in a
+# performance hit for host checks.  Use a value of 0 to disable host
+# check caching.
+
+cached_host_check_horizon=15
+
+
+
+# CACHED SERVICE CHECK HORIZON
+# This option determines the maximum amount of time (in seconds)
+# that the state of a previous service check is considered current.
+# Cached service states (from service checks that were performed more
+# recently that the timeframe specified by this value) can immensely
+# improve performance in regards to predictive dependency checks.
+# Use a value of 0 to disable service check caching.
+
+cached_service_check_horizon=15
+
+
+
+# ENABLE PREDICTIVE HOST DEPENDENCY CHECKS
+# This option determines whether or not Nagios will attempt to execute
+# checks of hosts when it predicts that future dependency logic test
+# may be needed.  These predictive checks can help ensure that your
+# host dependency logic works well.
+# Values:
+#  0 = Disable predictive checks
+#  1 = Enable predictive checks (default)
+
+enable_predictive_host_dependency_checks=1
+
+
+
+# ENABLE PREDICTIVE SERVICE DEPENDENCY CHECKS
+# This option determines whether or not Nagios will attempt to execute
+# checks of service when it predicts that future dependency logic test
+# may be needed.  These predictive checks can help ensure that your
+# service dependency logic works well.
+# Values:
+#  0 = Disable predictive checks
+#  1 = Enable predictive checks (default)
+
+enable_predictive_service_dependency_checks=1
+
+
+
+# SOFT STATE DEPENDENCIES
+# This option determines whether or not Nagios will use soft state 
+# information when checking host and service dependencies. Normally 
+# Nagios will only use the latest hard host or service state when 
+# checking dependencies. If you want it to use the latest state (regardless
+# of whether its a soft or hard state type), enable this option. 
+# Values:
+#  0 = Don't use soft state dependencies (default) 
+#  1 = Use soft state dependencies 
+
+soft_state_dependencies=1
+
+
+
+# TIME CHANGE ADJUSTMENT THRESHOLDS
+# These options determine when Nagios will react to detected changes
+# in system time (either forward or backwards).
+
+#time_change_threshold=900
+
+
+
+# AUTO-RESCHEDULING OPTION
+# This option determines whether or not Nagios will attempt to
+# automatically reschedule active host and service checks to
+# "smooth" them out over time.  This can help balance the load on
+# the monitoring server.  
+# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
+# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY
+
+auto_reschedule_checks=0
+
+
+
+# AUTO-RESCHEDULING INTERVAL
+# This option determines how often (in seconds) Nagios will
+# attempt to automatically reschedule checks.  This option only
+# has an effect if the auto_reschedule_checks option is enabled.
+# Default is 30 seconds.
+# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
+# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY
+
+auto_rescheduling_interval=30
+
+
+
+# AUTO-RESCHEDULING WINDOW
+# This option determines the "window" of time (in seconds) that
+# Nagios will look at when automatically rescheduling checks.
+# Only host and service checks that occur in the next X seconds
+# (determined by this variable) will be rescheduled. This option
+# only has an effect if the auto_reschedule_checks option is
+# enabled.  Default is 180 seconds (3 minutes).
+# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
+# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY
+
+auto_rescheduling_window=180
+
+
+
+# SLEEP TIME
+# This is the number of seconds to sleep between checking for system
+# events and service checks that need to be run.
+
+sleep_time=0.25
+
+
+
+# TIMEOUT VALUES
+# These options control how much time Nagios will allow various
+# types of commands to execute before killing them off.  Options
+# are available for controlling maximum time allotted for
+# service checks, host checks, event handlers, notifications, the
+# ocsp command, and performance data commands.  All values are in
+# seconds.
+
+service_check_timeout=60
+host_check_timeout=30
+event_handler_timeout=30
+notification_timeout=30
+ocsp_timeout=5
+perfdata_timeout=5
+
+
+
+# RETAIN STATE INFORMATION
+# This setting determines whether or not Nagios will save state
+# information for services and hosts before it shuts down.  Upon
+# startup Nagios will reload all saved service and host state
+# information before starting to monitor.  This is useful for 
+# maintaining long-term data on state statistics, etc, but will
+# slow Nagios down a bit when it (re)starts.  Since its only
+# a one-time penalty, I think its well worth the additional
+# startup delay.
+
+retain_state_information=1
+
+
+
+# STATE RETENTION FILE
+# This is the file that Nagios should use to store host and
+# service state information before it shuts down.  The state 
+# information in this file is also read immediately prior to
+# starting to monitor the network when Nagios is restarted.
+# This file is used only if the preserve_state_information
+# variable is set to 1.
+
+state_retention_file=/var/lib/nagios3/retention.dat
+
+
+
+# RETENTION DATA UPDATE INTERVAL
+# This setting determines how often (in minutes) that Nagios
+# will automatically save retention data during normal operation.
+# If you set this value to 0, Nagios will not save retention
+# data at regular interval, but it will still save retention
+# data before shutting down or restarting.  If you have disabled
+# state retention, this option has no effect.
+
+retention_update_interval=60
+
+
+
+# USE RETAINED PROGRAM STATE
+# This setting determines whether or not Nagios will set 
+# program status variables based on the values saved in the
+# retention file.  If you want to use retained program status
+# information, set this value to 1.  If not, set this value
+# to 0.
+
+use_retained_program_state=1
+
+
+
+# USE RETAINED SCHEDULING INFO
+# This setting determines whether or not Nagios will retain
+# the scheduling info (next check time) for hosts and services
+# based on the values saved in the retention file.  If you
+# If you want to use retained scheduling info, set this
+# value to 1.  If not, set this value to 0.
+
+use_retained_scheduling_info=1
+
+
+
+# RETAINED ATTRIBUTE MASKS (ADVANCED FEATURE)
+# The following variables are used to specify specific host and
+# service attributes that should *not* be retained by Nagios during
+# program restarts.
+#
+# The values of the masks are bitwise ANDs of values specified
+# by the "MODATTR_" definitions found in include/common.h.  
+# For example, if you do not want the current enabled/disabled state
+# of flap detection and event handlers for hosts to be retained, you
+# would use a value of 24 for the host attribute mask...
+# MODATTR_EVENT_HANDLER_ENABLED (8) + MODATTR_FLAP_DETECTION_ENABLED (16) = 24
+
+# This mask determines what host attributes are not retained
+retained_host_attribute_mask=0
+
+# This mask determines what service attributes are not retained
+retained_service_attribute_mask=0
+
+# These two masks determine what process attributes are not retained.
+# There are two masks, because some process attributes have host and service
+# options.  For example, you can disable active host checks, but leave active
+# service checks enabled.
+retained_process_host_attribute_mask=0
+retained_process_service_attribute_mask=0
+
+# These two masks determine what contact attributes are not retained.
+# There are two masks, because some contact attributes have host and
+# service options.  For example, you can disable host notifications for
+# a contact, but leave service notifications enabled for them.
+retained_contact_host_attribute_mask=0
+retained_contact_service_attribute_mask=0
+
+
+
+# INTERVAL LENGTH
+# This is the seconds per unit interval as used in the
+# host/contact/service configuration files.  Setting this to 60 means
+# that each interval is one minute long (60 seconds).  Other settings
+# have not been tested much, so your mileage is likely to vary...
+
+interval_length=30
+
+
+
+# AGGRESSIVE HOST CHECKING OPTION
+# If you don't want to turn on aggressive host checking features, set
+# this value to 0 (the default).  Otherwise set this value to 1 to
+# enable the aggressive check option.  Read the docs for more info
+# on what aggressive host check is or check out the source code in
+# base/checks.c
+
+use_aggressive_host_checking=0
+
+
+
+# SERVICE CHECK EXECUTION OPTION
+# This determines whether or not Nagios will actively execute
+# service checks when it initially starts.  If this option is 
+# disabled, checks are not actively made, but Nagios can still
+# receive and process passive check results that come in.  Unless
+# you're implementing redundant hosts or have a special need for
+# disabling the execution of service checks, leave this enabled!
+# Values: 1 = enable checks, 0 = disable checks
+
+execute_service_checks=1
+
+
+
+# PASSIVE SERVICE CHECK ACCEPTANCE OPTION
+# This determines whether or not Nagios will accept passive
+# service checks results when it initially (re)starts.
+# Values: 1 = accept passive checks, 0 = reject passive checks
+
+accept_passive_service_checks=1
+
+
+
+# HOST CHECK EXECUTION OPTION
+# This determines whether or not Nagios will actively execute
+# host checks when it initially starts.  If this option is 
+# disabled, checks are not actively made, but Nagios can still
+# receive and process passive check results that come in.  Unless
+# you're implementing redundant hosts or have a special need for
+# disabling the execution of host checks, leave this enabled!
+# Values: 1 = enable checks, 0 = disable checks
+
+execute_host_checks=1
+
+
+
+# PASSIVE HOST CHECK ACCEPTANCE OPTION
+# This determines whether or not Nagios will accept passive
+# host checks results when it initially (re)starts.
+# Values: 1 = accept passive checks, 0 = reject passive checks
+
+accept_passive_host_checks=1
+
+
+
+# NOTIFICATIONS OPTION
+# This determines whether or not Nagios will sent out any host or
+# service notifications when it is initially (re)started.
+# Values: 1 = enable notifications, 0 = disable notifications
+
+enable_notifications=1
+
+
+
+# EVENT HANDLER USE OPTION
+# This determines whether or not Nagios will run any host or
+# service event handlers when it is initially (re)started.  Unless
+# you're implementing redundant hosts, leave this option enabled.
+# Values: 1 = enable event handlers, 0 = disable event handlers
+
+enable_event_handlers=1
+
+
+
+# PROCESS PERFORMANCE DATA OPTION
+# This determines whether or not Nagios will process performance
+# data returned from service and host checks.  If this option is
+# enabled, host performance data will be processed using the
+# host_perfdata_command (defined below) and service performance
+# data will be processed using the service_perfdata_command (also
+# defined below).  Read the HTML docs for more information on
+# performance data.
+# Values: 1 = process performance data, 0 = do not process performance data
+
+process_performance_data=0
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS
+# These commands are run after every host and service check is
+# performed.  These commands are executed only if the
+# enable_performance_data option (above) is set to 1.  The command
+# argument is the short name of a command definition that you 
+# define in your host configuration file.  Read the HTML docs for
+# more information on performance data.
+
+#host_perfdata_command=process-host-perfdata
+#service_perfdata_command=process-service-perfdata
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA FILES
+# These files are used to store host and service performance data.
+# Performance data is only written to these files if the
+# enable_performance_data option (above) is set to 1.
+
+#host_perfdata_file=/tmp/host-perfdata
+#service_perfdata_file=/tmp/service-perfdata
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES
+# These options determine what data is written (and how) to the
+# performance data files.  The templates may contain macros, special
+# characters (\t for tab, \r for carriage return, \n for newline)
+# and plain text.  A newline is automatically added after each write
+# to the performance data file.  Some examples of what you can do are
+# shown below.
+
+#host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$
+#service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA FILE MODES
+# This option determines whether or not the host and service
+# performance data files are opened in write ("w") or append ("a")
+# mode. If you want to use named pipes, you should use the special
+# pipe ("p") mode which avoid blocking at startup, otherwise you will
+# likely want the defult append ("a") mode.
+
+#host_perfdata_file_mode=a
+#service_perfdata_file_mode=a
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING INTERVAL
+# These options determine how often (in seconds) the host and service
+# performance data files are processed using the commands defined
+# below.  A value of 0 indicates the files should not be periodically
+# processed.
+
+#host_perfdata_file_processing_interval=0
+#service_perfdata_file_processing_interval=0
+
+
+
+# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING COMMANDS
+# These commands are used to periodically process the host and
+# service performance data files.  The interval at which the
+# processing occurs is determined by the options above.
+
+#host_perfdata_file_processing_command=process-host-perfdata-file
+#service_perfdata_file_processing_command=process-service-perfdata-file
+
+
+
+# OBSESS OVER SERVICE CHECKS OPTION
+# This determines whether or not Nagios will obsess over service
+# checks and run the ocsp_command defined below.  Unless you're
+# planning on implementing distributed monitoring, do not enable
+# this option.  Read the HTML docs for more information on
+# implementing distributed monitoring.
+# Values: 1 = obsess over services, 0 = do not obsess (default)
+
+obsess_over_services=0
+
+
+
+# OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND
+# This is the command that is run for every service check that is
+# processed by Nagios.  This command is executed only if the
+# obsess_over_services option (above) is set to 1.  The command 
+# argument is the short name of a command definition that you
+# define in your host configuration file. Read the HTML docs for
+# more information on implementing distributed monitoring.
+
+#ocsp_command=somecommand
+
+
+
+# OBSESS OVER HOST CHECKS OPTION
+# This determines whether or not Nagios will obsess over host
+# checks and run the ochp_command defined below.  Unless you're
+# planning on implementing distributed monitoring, do not enable
+# this option.  Read the HTML docs for more information on
+# implementing distributed monitoring.
+# Values: 1 = obsess over hosts, 0 = do not obsess (default)
+
+obsess_over_hosts=0
+
+
+
+# OBSESSIVE COMPULSIVE HOST PROCESSOR COMMAND
+# This is the command that is run for every host check that is
+# processed by Nagios.  This command is executed only if the
+# obsess_over_hosts option (above) is set to 1.  The command 
+# argument is the short name of a command definition that you
+# define in your host configuration file. Read the HTML docs for
+# more information on implementing distributed monitoring.
+
+#ochp_command=somecommand
+
+
+
+# TRANSLATE PASSIVE HOST CHECKS OPTION
+# This determines whether or not Nagios will translate
+# DOWN/UNREACHABLE passive host check results into their proper
+# state for this instance of Nagios.  This option is useful
+# if you have distributed or failover monitoring setup.  In
+# these cases your other Nagios servers probably have a different
+# "view" of the network, with regards to the parent/child relationship
+# of hosts.  If a distributed monitoring server thinks a host
+# is DOWN, it may actually be UNREACHABLE from the point of
+# this Nagios instance.  Enabling this option will tell Nagios
+# to translate any DOWN or UNREACHABLE host states it receives
+# passively into the correct state from the view of this server.
+# Values: 1 = perform translation, 0 = do not translate (default)
+
+translate_passive_host_checks=0
+
+
+
+# PASSIVE HOST CHECKS ARE SOFT OPTION
+# This determines whether or not Nagios will treat passive host
+# checks as being HARD or SOFT.  By default, a passive host check
+# result will put a host into a HARD state type.  This can be changed
+# by enabling this option.
+# Values: 0 = passive checks are HARD, 1 = passive checks are SOFT
+
+passive_host_checks_are_soft=0
+
+
+
+# ORPHANED HOST/SERVICE CHECK OPTIONS
+# These options determine whether or not Nagios will periodically 
+# check for orphaned host service checks.  Since service checks are
+# not rescheduled until the results of their previous execution 
+# instance are processed, there exists a possibility that some
+# checks may never get rescheduled.  A similar situation exists for
+# host checks, although the exact scheduling details differ a bit
+# from service checks.  Orphaned checks seem to be a rare
+# problem and should not happen under normal circumstances.
+# If you have problems with service checks never getting
+# rescheduled, make sure you have orphaned service checks enabled.
+# Values: 1 = enable checks, 0 = disable checks
+
+check_for_orphaned_services=1
+check_for_orphaned_hosts=1
+
+
+
+# SERVICE FRESHNESS CHECK OPTION
+# This option determines whether or not Nagios will periodically
+# check the "freshness" of service results.  Enabling this option
+# is useful for ensuring passive checks are received in a timely
+# manner.
+# Values: 1 = enabled freshness checking, 0 = disable freshness checking
+
+check_service_freshness=1
+
+
+
+# SERVICE FRESHNESS CHECK INTERVAL
+# This setting determines how often (in seconds) Nagios will
+# check the "freshness" of service check results.  If you have
+# disabled service freshness checking, this option has no effect.
+
+service_freshness_check_interval=60
+
+
+
+# HOST FRESHNESS CHECK OPTION
+# This option determines whether or not Nagios will periodically
+# check the "freshness" of host results.  Enabling this option
+# is useful for ensuring passive checks are received in a timely
+# manner.
+# Values: 1 = enabled freshness checking, 0 = disable freshness checking
+
+check_host_freshness=0
+
+
+
+# HOST FRESHNESS CHECK INTERVAL
+# This setting determines how often (in seconds) Nagios will
+# check the "freshness" of host check results.  If you have
+# disabled host freshness checking, this option has no effect.
+
+host_freshness_check_interval=60
+
+
+
+
+# ADDITIONAL FRESHNESS THRESHOLD LATENCY
+# This setting determines the number of seconds that Nagios
+# will add to any host and service freshness thresholds that
+# it calculates (those not explicitly specified by the user).
+
+additional_freshness_latency=15
+
+
+
+
+# FLAP DETECTION OPTION
+# This option determines whether or not Nagios will try
+# and detect hosts and services that are "flapping".  
+# Flapping occurs when a host or service changes between
+# states too frequently.  When Nagios detects that a 
+# host or service is flapping, it will temporarily suppress
+# notifications for that host/service until it stops
+# flapping.  Flap detection is very experimental, so read
+# the HTML documentation before enabling this feature!
+# Values: 1 = enable flap detection
+#         0 = disable flap detection (default)
+
+enable_flap_detection=1
+
+
+
+# FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES
+# Read the HTML documentation on flap detection for
+# an explanation of what this option does.  This option
+# has no effect if flap detection is disabled.
+
+low_service_flap_threshold=5.0
+high_service_flap_threshold=20.0
+low_host_flap_threshold=5.0
+high_host_flap_threshold=20.0
+
+
+
+# DATE FORMAT OPTION
+# This option determines how short dates are displayed. Valid options
+# include:
+#	us		(MM-DD-YYYY HH:MM:SS)
+#	euro    	(DD-MM-YYYY HH:MM:SS)
+#	iso8601		(YYYY-MM-DD HH:MM:SS)
+#	strict-iso8601	(YYYY-MM-DDTHH:MM:SS)
+#
+
+date_format=iso8601
+
+
+
+
+# TIMEZONE OFFSET
+# This option is used to override the default timezone that this
+# instance of Nagios runs in.  If not specified, Nagios will use
+# the system configured timezone.
+#
+# NOTE: In order to display the correct timezone in the CGIs, you
+# will also need to alter the Apache directives for the CGI path 
+# to include your timezone.  Example:
+#
+#   <Directory "/usr/local/nagios/sbin/">
+#      SetEnv TZ "Australia/Brisbane"
+#      ...
+#   </Directory>
+
+#use_timezone=US/Mountain
+#use_timezone=Australia/Brisbane
+
+
+
+
+# P1.PL FILE LOCATION
+# This value determines where the p1.pl perl script (used by the
+# embedded Perl interpreter) is located.  If you didn't compile
+# Nagios with embedded Perl support, this option has no effect.
+
+p1_file=/usr/lib/nagios3/p1.pl
+
+
+
+# EMBEDDED PERL INTERPRETER OPTION
+# This option determines whether or not the embedded Perl interpreter
+# will be enabled during runtime.  This option has no effect if Nagios
+# has not been compiled with support for embedded Perl.
+# Values: 0 = disable interpreter, 1 = enable interpreter
+
+enable_embedded_perl=1
+
+
+
+# EMBEDDED PERL USAGE OPTION
+# This option determines whether or not Nagios will process Perl plugins
+# and scripts with the embedded Perl interpreter if the plugins/scripts
+# do not explicitly indicate whether or not it is okay to do so. Read
+# the HTML documentation on the embedded Perl interpreter for more 
+# information on how this option works.
+
+use_embedded_perl_implicitly=1
+
+
+
+# ILLEGAL OBJECT NAME CHARACTERS
+# This option allows you to specify illegal characters that cannot
+# be used in host names, service descriptions, or names of other
+# object types.
+
+illegal_object_name_chars=`~!$%^&*|'"<>?,()=
+
+
+
+# ILLEGAL MACRO OUTPUT CHARACTERS
+# This option allows you to specify illegal characters that are
+# stripped from macros before being used in notifications, event
+# handlers, etc.  This DOES NOT affect macros used in service or
+# host check commands.
+# The following macros are stripped of the characters you specify:
+#	$HOSTOUTPUT$
+#	$HOSTPERFDATA$
+#	$HOSTACKAUTHOR$
+#	$HOSTACKCOMMENT$
+#	$SERVICEOUTPUT$
+#	$SERVICEPERFDATA$
+#	$SERVICEACKAUTHOR$
+#	$SERVICEACKCOMMENT$
+
+illegal_macro_output_chars=`~$&|'"<>
+
+
+
+# REGULAR EXPRESSION MATCHING
+# This option controls whether or not regular expression matching
+# takes place in the object config files.  Regular expression
+# matching is used to match host, hostgroup, service, and service
+# group names/descriptions in some fields of various object types.
+# Values: 1 = enable regexp matching, 0 = disable regexp matching
+
+use_regexp_matching=0
+
+
+
+# "TRUE" REGULAR EXPRESSION MATCHING
+# This option controls whether or not "true" regular expression 
+# matching takes place in the object config files.  This option
+# only has an effect if regular expression matching is enabled
+# (see above).  If this option is DISABLED, regular expression
+# matching only occurs if a string contains wildcard characters
+# (* and ?).  If the option is ENABLED, regexp matching occurs
+# all the time (which can be annoying).
+# Values: 1 = enable true matching, 0 = disable true matching
+
+use_true_regexp_matching=0
+
+
+
+# ADMINISTRATOR EMAIL/PAGER ADDRESSES
+# The email and pager address of a global administrator (likely you).
+# Nagios never uses these values itself, but you can access them by
+# using the $ADMINEMAIL$ and $ADMINPAGER$ macros in your notification
+# commands.
+
+admin_email=sipb-nagios@mit.edu
+admin_pager=sipb-nagios@mit.edu
+
+
+
+# DAEMON CORE DUMP OPTION
+# This option determines whether or not Nagios is allowed to create
+# a core dump when it runs as a daemon.  Note that it is generally
+# considered bad form to allow this, but it may be useful for
+# debugging purposes.  Enabling this option doesn't guarantee that
+# a core file will be produced, but that's just life...
+# Values: 1 - Allow core dumps
+#         0 - Do not allow core dumps (default)
+
+daemon_dumps_core=0
+
+
+
+# LARGE INSTALLATION TWEAKS OPTION
+# This option determines whether or not Nagios will take some shortcuts
+# which can save on memory and CPU usage in large Nagios installations.
+# Read the documentation for more information on the benefits/tradeoffs
+# of enabling this option.
+# Values: 1 - Enabled tweaks
+#         0 - Disable tweaks (default)
+
+use_large_installation_tweaks=0
+
+
+
+# ENABLE ENVIRONMENT MACROS
+# This option determines whether or not Nagios will make all standard
+# macros available as environment variables when host/service checks
+# and system commands (event handlers, notifications, etc.) are
+# executed.  Enabling this option can cause performance issues in 
+# large installations, as it will consume a bit more memory and (more
+# importantly) consume more CPU.
+# Values: 1 - Enable environment variable macros (default)
+#         0 - Disable environment variable macros
+
+enable_environment_macros=1
+
+
+
+# CHILD PROCESS MEMORY OPTION
+# This option determines whether or not Nagios will free memory in
+# child processes (processed used to execute system commands and host/
+# service checks).  If you specify a value here, it will override
+# program defaults.
+# Value: 1 - Free memory in child processes
+#        0 - Do not free memory in child processes
+
+#free_child_process_memory=1
+
+
+
+# CHILD PROCESS FORKING BEHAVIOR
+# This option determines how Nagios will fork child processes
+# (used to execute system commands and host/service checks).  Normally
+# child processes are fork()ed twice, which provides a very high level
+# of isolation from problems.  Fork()ing once is probably enough and will
+# save a great deal on CPU usage (in large installs), so you might
+# want to consider using this.  If you specify a value here, it will
+# program defaults.
+# Value: 1 - Child processes fork() twice
+#        0 - Child processes fork() just once
+
+#child_processes_fork_twice=1
+
+
+
+# DEBUG LEVEL
+# This option determines how much (if any) debugging information will
+# be written to the debug file.  OR values together to log multiple
+# types of information.
+# Values: 
+#          -1 = Everything
+#          0 = Nothing
+#	   1 = Functions
+#          2 = Configuration
+#          4 = Process information
+#	   8 = Scheduled events
+#          16 = Host/service checks
+#          32 = Notifications
+#          64 = Event broker
+#          128 = External commands
+#          256 = Commands
+#          512 = Scheduled downtime
+#          1024 = Comments
+#          2048 = Macros
+
+debug_level=0
+
+
+
+# DEBUG VERBOSITY
+# This option determines how verbose the debug log out will be.
+# Values: 0 = Brief output
+#         1 = More detailed
+#         2 = Very detailed
+
+debug_verbosity=1
+
+
+
+# DEBUG FILE
+# This option determines where Nagios should write debugging information.
+
+debug_file=/var/lib/nagios3/nagios.debug
+
+
+
+# MAX DEBUG FILE SIZE
+# This option determines the maximum size (in bytes) of the debug file.  If
+# the file grows larger than this size, it will be renamed with a .old
+# extension.  If a file already exists with a .old extension it will
+# automatically be deleted.  This helps ensure your disk space usage doesn't
+# get out of control when debugging Nagios.
+
+max_debug_file_size=1000000
+
+
Index: branches/fc15-dev/noc/nagios/private/resource-dist.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/private/resource-dist.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/private/resource-dist.cfg	(revision 1803)
@@ -0,0 +1,9 @@
+# Sets $USER1$ to be the path to the plugins
+$USER1$=/usr/lib/nagios/plugins
+
+# Sets $USER2$ to be the path to event handlers
+#$USER2$=/usr/lib/nagios/plugins/eventhandlers
+
+# Store some usernames and passwords (hidden from the CGIs)
+$USER3$=%MYSQL_USERNAME%
+$USER4$=%MYSQL_PASSWORD%
Index: branches/fc15-dev/noc/nagios/scripts-plugins/check_svn
===================================================================
--- branches/fc15-dev/noc/nagios/scripts-plugins/check_svn	(revision 1803)
+++ branches/fc15-dev/noc/nagios/scripts-plugins/check_svn	(revision 1803)
@@ -0,0 +1,460 @@
+#!/usr/bin/env python
+#
+#   Copyright Hari Sekhon 2008
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+# 
+
+"""Nagios plugin to test the status of a Subversion (SVN) server. Requires
+   the subversion client "svn" to be installed somewhere in the path"""
+
+# Standard Nagios return codes
+OK       = 0
+WARNING  = 1
+CRITICAL = 2
+UNKNOWN  = 3
+
+import os
+import re
+import sys
+import signal
+import time
+try:
+    from subprocess import Popen, PIPE, STDOUT
+except ImportError:
+    print "UNKNOWN: Failed to import python subprocess module.",
+    print "Perhaps you are using a version of python older than 2.4?"
+    sys.exit(CRITICAL)
+from optparse import OptionParser
+
+__author__      = "Hari Sekhon"
+__title__       = "Nagios Plugin for Subversion"
+__version__     = 0.4
+
+DEFAULT_TIMEOUT = 10
+
+processes = []
+
+def end(status, message):
+    """Prints a message and exits. First arg is the status code
+    Second Arg is the string message"""
+
+    for process in processes:
+	try:
+		os.kill(process.pid, signal.SIGKILL)
+	except:
+		pass
+    
+    check_name = "SVN "
+    if status == OK:
+        print "%sOK: %s" % (check_name, message)
+        sys.exit(OK)
+    elif status == WARNING:
+        print "%sWARNING: %s" % (check_name, message)
+        sys.exit(WARNING)
+    elif status == CRITICAL:
+        print "%sCRITICAL: %s" % (check_name, message)
+        sys.exit(CRITICAL)
+    else:
+        # This one is intentionally different
+        print "UNKNOWN: %s" % message
+        sys.exit(UNKNOWN)
+
+
+# Pythonic version of "which", inspired by my beloved *nix core utils
+# although I've decided it makes more sense to fetch a non-executable
+# program and alert on it rather than say it wasn't found in the path 
+# at all from a user perspective.
+def which(executable):
+    """Takes an executable name as a string and tests if it is in the path.
+    Returns the full path of the executable if it exists in path, or None if it
+    does not"""
+
+    for basepath in os.environ['PATH'].split(os.pathsep):
+        path = os.path.join(basepath, executable)
+        if os.path.isfile(path):
+            if os.access(path, os.X_OK):
+                return path
+            else:
+                #print >> sys.stderr, "Warning: '%s' in path is not executable"
+                end(UNKNOWN, "svn utility '%s' is not executable" % path)
+
+    return None
+
+
+BIN = which("svn")
+if not BIN:
+    end(UNKNOWN, "'svn' cannot be found in path. Please install the " \
+               + "subversion client or fix your PATH environment variable")
+
+
+class SvnTester:
+    """Holds state for the svn test"""
+
+    def __init__(self):
+        """Initializes all variables to their default states"""
+
+        self.directory  = ""
+        self.http       = False
+        self.https      = False
+        self.password   = ""
+        self.port       = ""
+        self.protocol   = "svn"
+        self.server     = ""
+        self.timeout    = DEFAULT_TIMEOUT
+        self.username   = ""
+        self.verbosity  = 0
+
+
+    def validate_variables(self):
+        """Runs through the validation of all test variables
+        Should be called before the main test to perform a sanity check
+        on the environment and settings"""
+
+        self.validate_host()
+        self.validate_protocol()
+        self.validate_port()
+        self.validate_timeout()
+
+
+    def validate_host(self):
+        """Exits with an error if the hostname 
+        does not conform to expected format"""
+
+        # Input Validation - Rock my regex ;-)
+        re_hostname = re.compile("^[a-zA-Z0-9]+[a-zA-Z0-9-]*((([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6})?$")
+        re_ipaddr   = re.compile("^((25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)$")
+
+        if self.server == None:
+            end(UNKNOWN, "You must supply a server hostname or ip address. " \
+                       + "See --help for details")
+
+        if not re_hostname.match(self.server) and \
+           not re_ipaddr.match(self.server):
+            end(UNKNOWN, "Server given does not appear to be a valid " \
+                       + "hostname or ip address")
+    
+
+    def validate_protocol(self):
+        """Determines the protocol to use and sets it in the object"""
+
+        if self.http and self.https:
+            end(UNKNOWN, "cannot choose both http and https, they are " \
+                       + "mutually exclusive")
+        elif self.http:    
+            self.protocol = "http"
+        elif self.https:
+            self.protocol = "https"
+        else:
+            self.protocol = "svn"
+
+
+    def validate_port(self):
+        """Exits with an error if the port is not valid"""
+
+        if self.port == None:
+            self.port = ""
+        else:
+            try:
+                self.port = int(self.port)
+                if not 1 <= self.port <= 65535:
+                    raise ValueError
+            except ValueError:
+                end(UNKNOWN, "port number must be a whole number between " \
+                           + "1 and 65535")
+
+
+    def validate_timeout(self):
+        """Exits with an error if the timeout is not valid"""
+
+        if self.timeout == None:
+            self.timeout = DEFAULT_TIMEOUT
+        try:
+            self.timeout = int(self.timeout)
+            if not 1 <= self.timeout <= 65535:
+                end(UNKNOWN, "timeout must be between 1 and 3600 seconds")
+        except ValueError:
+            end(UNKNOWN, "timeout number must be a whole number between " \
+                       + "1 and 3600 seconds")
+
+        if self.verbosity == None:
+            self.verbosity = 0
+
+
+    def run(self, cmd):
+        """runs a system command and returns a tuple containing 
+        the return code and the output as a single text block"""
+
+        if cmd == "" or cmd == None:
+            end(UNKNOWN, "Internal python error - " \
+                       + "no cmd supplied for run function")
+        
+        self.vprint(3, "running command: %s" % cmd)
+
+        try:
+            process = Popen( cmd.split(), 
+                             shell=False, 
+                             stdin=PIPE, 
+                             stdout=PIPE, 
+                             stderr=STDOUT )
+	    processes.append(process)
+        except OSError, error:
+            error = str(error)
+            if error == "No such file or directory":
+                end(UNKNOWN, "Cannot find utility '%s'" % cmd.split()[0])
+            else:
+                end(UNKNOWN, "Error trying to run utility '%s' - %s" \
+                                                      % (cmd.split()[0], error))
+
+        stdout, stderr = process.communicate()
+
+        if stderr == None:
+            pass
+
+        if stdout == None or stdout == "":
+            end(UNKNOWN, "No output from utility '%s'" % cmd.split()[0])
+        
+        returncode = process.returncode
+
+        self.vprint(3, "Returncode: '%s'\nOutput: '%s'" % (returncode, stdout))
+        return (returncode, str(stdout))
+
+
+    def set_timeout(self):
+        """Sets an alarm to time out the test"""
+
+        if self.timeout == 1:
+            self.vprint(2, "setting plugin timeout to 1 second")
+        else:
+            self.vprint(2, "setting plugin timeout to %s seconds"\
+                                                                % self.timeout)
+
+        signal.signal(signal.SIGALRM, self.sighandler)
+        signal.alarm(self.timeout)
+
+
+    def sighandler(self, discarded, discarded2):
+        """Function to be called by signal.alarm to kill the plugin"""
+
+        # Nop for these variables
+        discarded = discarded2
+        discarded2 = discarded
+
+        if self.timeout == 1:
+            timeout = "(1 second)"
+        else:
+            timeout = "(%s seconds)" % self.timeout
+
+        end(CRITICAL, "svn plugin has self terminated after exceeding " \
+                    + "the timeout %s" % timeout)
+
+
+    def generate_uri(self):
+        """Creates the uri and returns it as a string"""
+
+        if self.port == "" or self.port == None:
+            port = ""
+        else:
+            port = ":" + str(self.port)
+
+        if self.directory == None:
+            directory = ""
+        else:
+            directory = "/" + str(self.directory).lstrip("/")
+
+        uri = self.protocol + "://"  \
+              + str(self.server)     \
+              + str(port)            \
+              + str(directory)
+
+        return str(uri)
+
+
+    def test_svn(self):
+        """Performs the test of the subversion server"""
+
+        self.validate_variables()
+        self.set_timeout()
+
+        self.vprint(2, "now running subversion test")
+
+        uri = self.generate_uri()
+
+        self.vprint(3, "subversion server address is '%s'" % uri)
+
+        cmd = BIN + " ls " + uri + " --no-auth-cache --non-interactive"
+        if self.username:
+            cmd += " --username=%s" % self.username
+        if self.password:
+            cmd += " --password=%s" % self.password
+
+        result, output = self.run(cmd)
+        
+        if result == 0:
+            if len(output) == 0:
+                return (WARNING, "Test passed but no output was received " \
+                               + "from svn program, abnormal condition, "  \
+                               + "please check.")
+            else:
+                if self.verbosity >= 1:
+                    return(OK, "svn repository online - directory listing: %s" \
+                                        % output.replace("\n", " ").rstrip(" "))
+                else:
+                    return (OK, "svn repository online - " \
+                              + "directory listing successful")
+        else:
+            if len(output) == 0:
+                return (CRITICAL, "Connection failed. " \
+                                + "There was no output from svn")
+            else:
+                if output == "svn: Can't get password\n":
+                    output = "password required to access this repository but" \
+                           + " none was given or cached"
+                output = output.lstrip("svn: ")
+                return (CRITICAL, "Error connecting to svn server - %s " \
+                                        % output.replace("\n", " ").rstrip(" "))
+ 
+
+    def vprint(self, threshold, message):
+        """Prints a message if the first arg is numerically greater than the
+        verbosity level"""
+
+        if self.verbosity >= threshold:
+            print "%s" % message
+
+
+def main():
+    """Parses args and calls func to test svn server"""
+
+    tester = SvnTester()
+    parser = OptionParser()
+    parser.add_option( "-H",
+                       "-S",
+                       "--host",
+                       "--server",
+                       dest="server",
+                       help="The Hostname or IP Address of the subversion "    \
+                          + "server")
+
+    parser.add_option( "-p",
+                       "--port",
+                       dest="port",
+                       help="The port on the server to test if not using the " \
+                          + "default port which is 3690 for svn://, 80 for "   \
+                          + "http:// or 443 for https://.")
+
+    parser.add_option( "--http",
+                       action="store_true",
+                       dest="http",
+                       help="Connect to the server using the http:// " \
+                          + "protocol (Default is svn://)")
+
+    parser.add_option( "--https",
+                       action="store_true",
+                       dest="https",
+                       help="Connect to the server using the https:// " \
+                          + "protocol (Default is svn://)")
+
+    parser.add_option( "--dir",
+                       "--directory",
+                       dest="directory",
+                       help="The directory on the host. Optional but usually " \
+                          + "necessary if using http/https, eg if using an "   \
+                          + "http WebDAV repository "                          \
+                          + "http://somehost.domain.com/repos/svn so this "    \
+                          + "would be --dir /repos/svn. Not usually needed "   \
+                          + "for the default svn:// unless you want to test "  \
+                          + "a specific directory in the repository")
+
+    parser.add_option( "-U",
+                       "--username",
+                       dest="username",
+                       help="The username to use to connect to the subversion" \
+                          + " server.")
+
+    parser.add_option( "-P",
+                       "--password",
+                       dest="password",
+                       help="The password to use to connect to the subversion" \
+                          + " server.")
+
+    parser.add_option( "-t",
+                       "--timeout",
+                       dest="timeout",
+                       help="Sets a timeout after which the the plugin will"   \
+                          + " self terminate. Defaults to %s seconds." \
+                                                              % DEFAULT_TIMEOUT)
+
+    parser.add_option( "-T",
+                       "--timing",
+                       action="store_true",
+                       dest="timing",
+                       help="Enable timer output")
+
+    parser.add_option(  "-v",
+                        "--verbose",
+                        action="count",
+                        dest="verbosity",
+                        help="Verbose mode. Good for testing plugin. By "     \
+                           + "default only one result line is printed as per" \
+                           + " Nagios standards")
+
+    parser.add_option( "-V",
+                        "--version",
+                        action = "store_true",
+                        dest = "version",
+                        help = "Print version number and exit" )
+
+    (options, args) = parser.parse_args()
+
+    if args:
+        parser.print_help()
+        sys.exit(UNKNOWN)
+
+    if options.version:
+        print "%s %s" % (__title__, __version__)
+        sys.exit(UNKNOWN)
+
+    tester.directory  = options.directory
+    tester.http       = options.http
+    tester.https      = options.https
+    tester.password   = options.password
+    tester.port       = options.port
+    tester.server     = options.server
+    tester.timeout    = options.timeout
+    tester.username   = options.username
+    tester.verbosity  = options.verbosity
+
+    if options.timing:
+        start_time = time.time()
+
+    returncode, output = tester.test_svn()
+
+    if options.timing:
+        finish_time = time.time()
+        total_time = finish_time - start_time
+        
+        output += ". Test completed in %.3f seconds" % total_time
+
+    end(returncode, output)
+    sys.exit(UNKNOWN)
+
+
+if __name__ == "__main__":
+    try:
+        main()
+    except KeyboardInterrupt:
+        print "Caught Control-C..."
+        sys.exit(CRITICAL)
Index: branches/fc15-dev/noc/nagios/services.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/services.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/services.cfg	(revision 1803)
@@ -0,0 +1,274 @@
+define service {
+	name	scripts-service
+	use	generic-service
+        max_check_attempts	6
+        normal_check_interval	2
+	retry_check_interval	1
+        contact_groups  scripts
+	notification_interval	240
+        notification_period	24x7
+        notification_options    w,u,c,r
+	register 0
+}
+
+define service {
+	name	scripts-nrpe-service
+	use	scripts-service
+	notification_options	w,c,r
+	register 0
+}
+
+define service {
+        use                             scripts-service
+        hostgroup_name			scripts-all
+        service_description             PING
+	check_command			check_ping!500.0,30%!3000.0,80%
+        }
+
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-real
+	service_description	SSH
+	check_command	check_ssh
+}
+
+define service {
+	use	scripts-service
+	host_name	scripts
+	service_description	SSH
+	check_command	check_ssh
+	notification_period	afs
+	contact_groups	scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-http
+	service_description	HTTP
+	notification_period	afs
+	check_command	check_http_heartbeat
+	contact_groups	scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name		scripts-https
+	service_description	HTTPS
+	notification_period	afs
+	check_command	check_https_cert!14
+	contact_groups	scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name		scripts-https
+	service_description	HTTPS-CERT
+	notification_period	afs
+	check_command	check_https_cert_444!14
+	contact_groups	scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	host_name	scripts
+	service_description	SVN
+	check_command	check_svn
+	notification_period	afs
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-user
+	service_description	SVN
+	check_command	check_svn
+	notification_period	afs
+}
+
+define servicedependency{
+	host_name			scripts
+	service_description		HTTP
+	dependent_host_name		scripts,scripts-cert,wildcard.scripts
+	dependent_service_description	HTTPS,HTTPS-CERT
+	execution_failure_criteria	n
+	notification_failure_criteria	w,u,c
+	}
+
+define servicedependency{
+	host_name			scripts
+	service_description		HTTP
+	dependent_host_name		scripts-cert
+	dependent_service_description	HTTP
+	execution_failure_criteria	n
+	notification_failure_criteria	w,u,c
+	}
+
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-mail
+	service_description	POSTFIX
+	check_command	check_remote_procs_u!1:128!1:256!postfix
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-user
+	service_description	HTTP
+	notification_period	afs
+	check_command	check_http_heartbeat
+	contact_groups	scripts
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name		scripts-user
+	service_description	HTTPS
+	notification_period	afs
+	check_command	check_https_cert!14
+	contact_groups	scripts
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-user
+	service_description	NSCD
+	check_command	check_remote_procs_u!1:256!1:512!nscd
+}
+
+define service {
+	use scripts-nrpe-service
+	hostgroup_name scripts-user
+	service_description	AFS
+	notification_period	afs
+	check_command	check_remote_afs
+}
+
+define service {
+	use scripts-nrpe-service
+	hostgroup_name scripts-user
+	service_description	CRON-WORKING
+	notification_period	afs
+	check_command	check_remote_cron_working
+}
+
+define service {
+	use scripts-nrpe-service
+	hostgroup_name scripts-user
+	service_description	LDAP-MMR
+	notification_period	afs
+	check_command	check_remote_ldap_mmr
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-user
+	service_description	USERS
+	check_command	check_remote_users!50!25
+}
+
+define service {
+    use scripts-service
+    hostgroup_name scripts-user
+    service_description LDAP
+    check_command check_scripts_ldap
+}
+
+define service {
+       use     scripts-service
+       hostgroup_name	scripts-mail
+       service_description	SMTP
+       check_command	check_smtp
+}
+
+define service {
+       use     scripts-service
+       host_name	scripts
+       notification_period	afs
+       service_description	SMTP
+       check_command	check_smtp
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-cron
+	service_description	CRON
+	check_command	check_remote_procs_C!1:!1:!crond
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-real
+	service_description	NRPE
+	check_command	check_nrpe_alive
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-real
+	service_description	DISK
+	check_command	check_remote_disk!10%!5%
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-user
+	notification_period	afs
+	service_description	LOAD
+	check_command	check_remote_load!50:50:50!100:50:50
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	mysql-masters,mysql-slaves
+	service_description	LOAD
+	check_command	check_remote_load!16:10:10!20:15:15
+	contact_groups  sql
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-mysql
+	service_description	MYSQL
+	check_command	check_tcp!3306
+	contact_groups	sql,scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-mysql
+	service_description	HTTP
+	check_command	check_http
+	contact_groups	sql,scripts,pagers
+}
+
+define service {
+	use	scripts-service
+	hostgroup_name	scripts-mysql
+	service_description	HTTPS
+	check_command	check_https_cert!14
+	contact_groups	sql
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	mysql-masters
+	service_description	MYSQL-M
+	check_command	check_remote_mysql
+	contact_groups  sql,scripts
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	mysql-slaves
+	service_description	MYSQL-S
+	check_command	check_remote_mysql_slave
+	contact_groups  sql,scripts
+}
+
+define service {
+	use	scripts-nrpe-service
+	hostgroup_name	scripts-user
+	service_description	CPU
+	check_command	check_remote_procs_P!4!6!50
+}
Index: branches/fc15-dev/noc/nagios/sipb.cfg
===================================================================
--- branches/fc15-dev/noc/nagios/sipb.cfg	(revision 1803)
+++ branches/fc15-dev/noc/nagios/sipb.cfg	(revision 1803)
@@ -0,0 +1,75 @@
+# XVM
+
+define contactgroup {
+        contactgroup_name       sipb
+        alias                   sipb Zephyr
+        members                 sipb-auto-zephyr
+}
+
+define contact {
+	use				xvm-contact
+        contact_name                    sipb-auto-zephyr
+        alias                           sipb-auto-zephyr
+	host_notification_period	24x7
+	service_notification_period	24x7
+        service_notification_options    w,u,c,r
+        host_notification_options       d,u,r
+        host_notification_commands      host-notify-by-zephyr
+        service_notification_commands   notify-by-zephyr
+        email                           sipb-auto
+}
+
+define host {
+	name sipb-host
+	use	generic-host
+	register	0
+        max_check_attempts      10
+        check_period		24x7
+	check_command	check-host-alive
+        notification_interval   120
+        notification_period     24x7
+        notification_options    d,r
+        contact_groups  sipb
+	parents	sipb-ether
+}
+
+define service {
+	name	sipb-service
+	use	generic-service
+        max_check_attempts	6
+        normal_check_interval	2
+	retry_check_interval	1
+        contact_groups  sipb
+	notification_interval	120
+        notification_period	24x7
+        notification_options    w,u,c,r
+	register 0
+}
+
+define host {
+	use	sipb-host
+	host_name	stuff
+	address	18.181.0.31
+}
+
+define service {
+        use                             sipb-service
+        host_name			stuff
+        service_description             PING
+	check_command			check_ping!500.0,30%!3000.0,80%
+}
+
+#define service {
+#	use	sipb-service
+#	host_name	stuff
+#	service_description	SSH
+#	check_command	check_ssh
+#}
+
+define service {
+	use	sipb-service
+	host_name	stuff
+	service_description	HTTP
+	notification_period	afs
+	check_command	check_http
+}
Index: branches/fc15-dev/noc/nagios/status-user/finger.sh
===================================================================
--- branches/fc15-dev/noc/nagios/status-user/finger.sh	(revision 1803)
+++ branches/fc15-dev/noc/nagios/status-user/finger.sh	(revision 1803)
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+ulimit -v 10240
+
+export LINES=1000
+export COLUMNS=80
+docnagios() {
+	echo q | env TERM=ansi /usr/local/nagios/bin/cnagios -b "$@" | sed 's/
+\[B/\n/g; s/
+/\n/g' | perl -pe '
+s/^.*(?=sipb-nagios)//; # remove garbage at beginning
+s/(.)\\[(\d+)b/$1x($2+1)/ge; # (\d+)b means repeat previous character n times
+s/\\[(\d+)d//g; # absolute go to line; ignored
+1 while s/\\[(\d+)G/" "x($1-$-[0]-1)/e; # go to absolute horizontal position
+1 while s/\\[\d+;(\d+)H/" "x($1-$-[0]-1)/e; # go to absolute position; line ignored
+'
+}
+
+gethostgroups() {
+    cat /etc/nagios3/*.cfg | perl -ne 'print if ( /^(\s*)define hostgroup [\{[]/ ... /[\}\]]/ )' | perl -ne 'm|hostgroup_name\s+(\S+)| and $name = $1; m|members\s+(.+)\s*$| and $members = $1; m|\}| and print "$name\t$members\n"'
+}
+
+gethgmembers() {
+    gethostgroups | grep "^$1	" | cut -f 2 -d "	" | sed 's/,/\n/g' | sort -u | perl -pe 's/\n/|/g' | sed 's/|$//'
+}
+
+read line
+line=${line%[:blank:]}
+line=${line%
+}
+
+cols=${line##*-}
+if [ "$cols" -eq "$cols" ] 2>/dev/null; then
+    export COLUMNS="$cols"
+    line=${line%-*}
+fi
+case "$line" in
+    status)
+	docnagios
+	;;
+    broken)
+	docnagios -l w
+	;;
+    load)
+	docnagios -g /LOAD/
+	;;
+    scripts-user)
+	docnagios -g "/$(gethgmembers "scripts-user.*")/"
+	;;
+    scripts)
+	docnagios -g "/$(gethgmembers "scripts.*")/"
+	;;
+    xvm)
+	docnagios -g "/$(gethgmembers "xvm.*")/"
+	;;
+    *)
+	cat <<EOF
+Available information:
+finger status@sipb-noc -- all services
+finger broken@sipb-noc -- services that are not OKAY
+finger load@sipb-noc   -- all LOAD services
+finger scripts-user@sipb-noc-- all scripts user services
+finger scripts@sipb-noc-- all scripts services
+finger xvm@sipb-noc    -- only XVM servers
+EOF
+	;;
+esac
+#s/\\[\d*[a-zA-Z]//g'
+#perl -pe 's/^.*?\[H //s; s/.\[\d+;1H/\n/g; s/^\s+//mg;'
+
+# s/^\s+$//mg; s/Command: .*//s; s/$/\[0m/'
Index: branches/fc15-dev/noc/ng/CHANGELOG
===================================================================
--- branches/fc15-dev/noc/ng/CHANGELOG	(revision 1803)
+++ branches/fc15-dev/noc/ng/CHANGELOG	(revision 1803)
@@ -0,0 +1,51 @@
+0.8.2 2006-04-12
+
+* Fix to match rrd files. Patch from elfrinjo.
+
+0.8.1 2006-04-08
+
+* Db-file-has-a-number bug fixed. Patch from Ton Voon.
+
+0.8 2006-04-05
+
+* Use stylesheet. Contribution from Ton Voon.
+* Splitting graphs is now default. Contribution from Doug Farley.
+
+0.7 2005-10-27
+
+* Another significant performance increase by eval of rules only once
+* Header flush bug fixed
+
+0.6 2005-10-18
+
+* Only using RRD perl modules is supported. Removed binary rrdtool 
+  dependency.
+* Added support for perfdata log file for performance increase.  
+  Contribution from Alex.
+
+0.5 2005-06-22
+
+* Color bug fixed
+* Support for customized heartbeat
+
+0.4 2005-04-22
+
+* Better color handling
+* New webpage design
+* Added rrdopts feature
+* Several bug fixes
+
+0.3 2004-12-04
+
+* Added logging of system errors
+* Added customized graph sizes feature
+* Several bug fixes
+
+0.2 2004-10-14
+
+* Added documentation.
+* Delimiter bug fixed.
+
+0.1 2004-08-03
+
+* Initial release
Index: branches/fc15-dev/noc/ng/INSTALL
===================================================================
--- branches/fc15-dev/noc/ng/INSTALL	(revision 1803)
+++ branches/fc15-dev/noc/ng/INSTALL	(revision 1803)
@@ -0,0 +1,124 @@
+nagiosgraph Installation
+------------------------
+
+File:    $Id: INSTALL,v 1.14 2006/04/05 12:37:11 sauber Exp $
+Author:  (c) Soren Dossing, 2005
+License: OSI Artistic License
+         http://www.opensource.org/licenses/artistic-license.php
+
+Follow instructions below to install and use nagiosgraph. The
+instructions are for Nagios 2.0b4, and might differ in other versions of
+Nagios.
+
+ - Check required packaged are installed: perl, CGI, nagios and rrdtool
+
+ - Install nagiosgraph.conf, map, insert.pl and show.cgi somewhere, for 
+   example in /usr/local/nagios/nagiosgraph/
+
+ - Edit paths, debug level etc. in nagiosgraph.conf.
+
+ - Check that nagios user can write to rrd dir, and www user can read.
+
+ - Check that nagios and www user can write to log file.
+
+ - In insert.pl and show.cgi edit path to nagiosgraph.conf file.
+
+ - In nagios.cfg set:
+
+     process_performance_data=1
+     service_perfdata_file=/var/spool/nagios/perfdata.log
+     service_perfdata_file_template=$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$
+     service_perfdata_file_mode=a
+     service_perfdata_file_processing_interval=30
+     service_perfdata_file_processing_command=process-service-perfdata
+
+   Make sure that service_perfdata_command is not defined.
+
+   Make sure that location of perfdata_file matches definition in 
+   nagiosgraph.conf .
+
+ - In checkcommands.cfg or misccommands.cfg:
+
+     define command {
+       command_name  process-service-perfdata
+       command_line  /usr/local/nagios/nagiosgraph/insert.pl
+     }
+
+   Make sure there is only one definition for process-service-perfdata.
+
+ - Alternative to the two points above: The old style is still possible. 
+   It uses far more CPU but inserts data in rrd files immediately for 
+   every service check.
+
+   In nagios.cfg:
+
+     service_perfdata_command=process-service-perfdata
+
+   Make sure that service_perfdata_file_processing_command is not 
+   defined.
+
+   In misccommands.cfg:
+
+     define command{
+       command_name    process-service-perfdata
+       command_line  /usr/local/nagios/nagiosgraph/insert.pl "$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$"
+     }
+
+ - Put an icon approx. 40x40 in .../share/images/logos/ for nagios to link
+   to graphs.
+
+ - Copy nagiosgraph.css to .../nagios/stylesheets/ .
+
+ - In cgi.cfg have:
+
+     xedtemplate_config_file=/usr/local/etc/nagios/serviceextinfo.cfg
+
+ - Edit serviceextinfo.cfg
+
+   Most services can be graphed with no particular configuration like this:
+
+     define serviceextinfo {
+       service_description  DNS
+       hostgroup       servers
+       notes_url       /nagiosgraph/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$
+       icon_image      graph.gif
+       icon_image_alt  View graphs
+     }
+
+   Instead of hostgroup line a host_name line with all hosts where this
+   type of data are being collected.
+
+   Some type of services have data values that have big differences in the
+   magnitude. In such cases it's good idea to split up into seperate
+   graphs. Here's an example for ntp:
+
+     define serviceextinfo {
+       service_description  NTP
+       host_name       server01,server02,server03,server04
+       notes_url       /nagiosgraph/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$&db=ntp,jitter,offset&db=ntp,stratum
+       icon_image      graph.gif
+       icon_image_alt  View graphs
+     }
+
+ - Add for example &geom=350x100 to notes_url line for custom sizes of 
+   graphs.
+
+ - Add for example &rrdopts=%2Dl%200%20%2Du%20100 (meaning: 
+   "-l 0 -u 100") to notes_url line for custom Y axis ranges. Any 
+   rrdgraph options can be specified, but has to be url encoded.
+
+ - Configure Apache to point to show.cgi. For example:
+
+     ScriptAlias /nagiosgraph/ /usr/local/nagios/nagiosgraph/
+
+ - To add new service types, edit the map file. This contains regular
+   expression to identify service types, and defines how to store data in 
+   rrd files. Use testentry.pl for testing before inserting in map file.
+
+ - Consider security.
+
+ - Start Nagios. Increase debug level in nagiosgraph.conf if things don't
+   work right away.
+
+ - Keep an eye on the log file. It can grow big. Perhaps rotate it, or
+   decrease log level when everything works fine.
Index: branches/fc15-dev/noc/ng/README
===================================================================
--- branches/fc15-dev/noc/ng/README	(revision 1803)
+++ branches/fc15-dev/noc/ng/README	(revision 1803)
@@ -0,0 +1,95 @@
+Nagiosgraph
+-----------
+
+File:    $Id: README,v 1.10 2006/04/05 12:37:11 sauber Exp $
+Author:  (c) Soren Dossing, 2005
+License: OSI Artistic License
+         http://www.opensource.org/licenses/artistic-license.php
+
+
+Summary:
+
+Collects perfdata from Nagios check scripts and inserts data into rrd
+files. Data in the rrdfiles can be displayed in html pages with cgi
+script.
+
+
+Note:
+
+Nagios is a registered trademark of Ethan Galstad.
+
+
+Files:
+
+CHANGELOG         - History of changes
+INSTALL           - Dcoument for how to install and use nagiosgraph
+README            - This file
+README.map        - Document for how to create map file entries
+insert.pl         - Reads perfdata log from nagios and insert into rrd 
+                    files.
+show.cgi          - Generates a html page for the host/sevice specified, 
+                    and generates graphs on-the-fly.
+nagiosgraph.conf  - paths and other configuration
+nagiosgraph.css   - CSS stylesheet
+map               - Regular expression to identify services and 
+                    specification for how to create rrd files.
+testcolor.cgi     - Preview of colors for keywords in each color scheme
+testentry.pl      - A script for testing new map file entries.
+
+
+Usage:
+
+Follow the instructions in INSTALL for how to install and configure 
+nagiosgraph.
+
+
+Getting Help:
+
+Discussions related to nagiosgraph are located in a Sourceforge help
+forum; http://sourceforge.net/forum/forum.php?forum_id=394748 . A
+Sourceforge account is necessary for posting.
+
+
+Principles of Operation:
+
+nagiosgraph is basically a simple interface between Nagios and rrd data
+files. Simplicity comes from three factors; it doesn't do much, behavior
+is programmed rather than configurable, and automatically detects new
+data from Nagios.
+
+nagiosgraphs is operating in two modes. One is to collect performance
+data from servicechecks from nagios, and the other is to display graphs
+of the performance data collected.
+
+All the data collected are stored in rrd files by using rrdtools. A file
+called 'map' defines how identify the data from nagios and how to store
+it in the rrd files. Nagios passes all the service data collected to a
+nagiosgraph script called 'insert.pl'. This script will look up in
+'map', which rrd file to insert the data into, and how to name the data.
+
+In Nagios it's also possible to have extended service information pages.
+A nagiosgraph cgi script called 'show.cgi' can be used for such service
+information links. 'show.cgi' will look up in 'map' which performance
+data is stored in rrd files, and display graphs of this data. 
+
+nagiosgraph will automatically detect when new hosts or services has
+been added in Nagios, so generally no configuration of nagiosgraph is
+necessary when configuration of Nagios changes.
+
+nagiosgraph is designed to only require very little configuration.
+Integrating with Nagios is a complicated process nevertheless. The
+'README' file describes how to configure nagiosgraph and integrate with
+Nagios.
+
+The 'map' configuration file is actually perl code, that will be eval'ed
+by 'insert.pl' and 'show.cgi'. Several examples of servicechecks are
+included in the distributed 'map' file, but generally it's necessary to
+make modifications or add entries to match the output of the particular
+nagiosplugins in use. Knowing perl is helpful when making modifications,
+but the examples supplied should cover most types of performance data.
+
+By default all available data for a servicecheck will be displayed in
+the same graph. With extra configuration, embedded in the url, it's
+possible to display less data or to split values into multiple graphs.
+There is also a general method for specifying any rrd graph options.
+
Index: branches/fc15-dev/noc/ng/README.map
===================================================================
--- branches/fc15-dev/noc/ng/README.map	(revision 1803)
+++ branches/fc15-dev/noc/ng/README.map	(revision 1803)
@@ -0,0 +1,100 @@
+map file
+--------
+
+File:    $Id: README.map,v 1.3 2005/10/08 05:55:08 sauber Exp $
+Author:  (c) Soren Dossing, 2005
+License: OSI Artistic License
+         http://www.opensource.org/licenses/artistic-license.php
+
+This describes how to work with the map file.
+
+The file called 'map' contains regular expressions to identify services 
+and define content in RRD databases. All entries are written in perl, so 
+editing, adding or deleting entries requires some perl programming 
+knowledge. Knowledge of RRD is also necessary.
+
+There has to be one entry for each type of service. The distributed map 
+file already have several examples for cpu, memory, disk, network etc.
+Most examples follow the same schema of identifying data from either 
+Nagios output or Nagios perfdata and defining a number of rrd data 
+sources.
+
+insert.pl is the script receiving data from Nagios. It format data for map 
+file by creating one string consisting of three lines of text. This string 
+might look like this:
+
+  servicedesc:ping
+  output:PING OK - Packet loss = 0%, RTA = 0.00 ms
+  perfdata:
+
+Or like this:
+
+  servicedescr:CPU Load 
+  output:OK - load average: 0.06, 0.12, 0.10
+  perfdata:load1=0;15;30;0 load5=0;10;25;0 load15=0;5;20;0 
+
+perfdata is not always set, so depending on type of service, the most 
+useful data can be in either the output or perfdata line.
+
+For the ping example above, data can be extracted from the output line 
+with a regular expression like this:
+
+  /output:PING.*?(\d+)%.+?([.\d]+)\sms/
+
+In this case, two values are extracted and available in $1 and $2. We can 
+then create a data structure describing the content of the database. The 
+general format is
+
+  [ db-name,
+    [ DS-name, TYPE, DS-value ],
+    [ DS-name, TYPE, DS-value ],
+    ...
+  ]
+
+Where DS-name is the name that will be assigned to a line showing on rrd 
+graphs. TYPE is either GAUGE or DERIVE. the DS value is the data 
+extracted in the regular expression. The DS value can be an expression, 
+for example to normalize to SI units.
+
+Each database definition must be added to the @s array.
+
+So the complete code to define and insert into and rrd database for the 
+PING example above, becomes:
+
+  /output:PING.*?(\d+)%.+?([.\d]+)\sms/
+  and push @s, [ ping,
+                [ losspct, GAUGE, $1      ],
+                [ rta,     GAUGE, $2/1000 ] ];
+
+In this case the database name is called 'ping' and the DS-names stored 
+are losspct and rta. The Nagios output reports round trip time in 
+milliseconds, so the value is multiplied by 1000 to convert to seconds. 
+Both DS type are GAUGE.
+
+Be careful about the database names and DS names. In the code example 
+above the names are barewords, which only works as long as the don't 
+conflict with perl functions or subroutines. For example the word 'sleep' 
+will not work without quoting.
+
+A safer version of the above example is
+
+  /output:PING.*?(\d+)%.+?([.\d]+)\sms/
+  and push @s, [ 'ping',
+                [ 'losspct', 'GAUGE', $1      ],
+                [ 'rta',     'GAUGE', $2/1000 ] ];
+
+After editing map file, the syntax can be checked with
+
+  perl -c map
+
+Again a word of caution. If map file has syntax errors, nothing will be 
+inserted into rrd files until the file is fixed. So don't edit production 
+map files. Instead do something like this:
+
+  cp map map.edit
+  vi map.edit
+  perl -c map.edit
+  mv map.edit map
+
+Share your work. If you have a good map file entry for standard Nagios 
+plugins, then please post it on the forum, or send it to me.
Index: branches/fc15-dev/noc/ng/bin/insert.pl
===================================================================
--- branches/fc15-dev/noc/ng/bin/insert.pl	(revision 1803)
+++ branches/fc15-dev/noc/ng/bin/insert.pl	(revision 1803)
@@ -0,0 +1,210 @@
+#!/usr/bin/perl
+
+# File:    $Id: insert.pl,v 1.17 2005/10/26 14:42:57 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+use strict;
+use RRDs;
+
+# Configuration
+my $configfile = '/home/noc/ng/etc/nagiosgraph.conf';
+
+# Main program - change nothing below
+
+my %Config;
+
+# Read in config file
+#
+sub readconfig {
+  die "config file not found" unless -r $configfile;
+
+  # Read configuration data
+  open FH, $configfile;
+    while (<FH>) {
+      s/\s*#.*//;    # Strip comments
+      /^(\w+)\s*=\s*(.*?)\s*$/ and do {
+        $Config{$1} = $2;
+        debug(5, "INSERT Config $1:$2");
+      };
+    }
+  close FH;
+
+  # Make sure log file can be written to
+  die "Log file $Config{logfile} not writable" unless -w $Config{logfile};
+
+  # Make sure rrddir exist and is writable
+  unless ( -w $Config{rrddir} ) {
+    mkdir $Config{rrddir};
+    die "rrd dir $Config{rrddir} not writable" unless -w $Config{rrddir};
+  }
+}
+
+# Parse performance data from input
+#
+sub parseinput {
+  my $data = shift;
+  #debug(5, "INSERT perfdata: $data");
+  my @d = split( /\|\|/, $data);
+  return ( lastcheck    => $d[0],
+           hostname     => $d[1],
+           servicedescr => $d[2],
+           output       => $d[3],
+           perfdata     => $d[4],
+         );
+}
+
+# Write debug information to log file
+#
+sub debug { 
+  my($l, $text) = @_;
+  if ( $l <= $Config{debug} ) {
+    $l = qw(none critical error warn info debug)[$l];
+    $text =~ s/(\w+)/$1 $l:/;
+    open LOG, ">>$Config{logfile}";
+      print LOG scalar localtime;
+      print LOG " $text\n";
+    close LOG;
+  }
+}
+
+# Dump to log the files read from Nagios
+#
+sub dumpperfdata {
+  my %P = @_;
+  for ( keys %P ) {
+    debug(4, "INSERT Input $_:$P{$_}");
+  }
+}
+
+# URL encode a string
+#
+sub urlencode {
+  $_[0] =~ s/([\W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg;
+  return $_[0];
+}
+
+# Create new rrd databases if necessary
+#
+sub createrrd {
+  my($host,$service,$start,$labels) = @_;
+  my($f,$v,$t,$ds,$db);
+
+  $db = shift @$labels;
+  $f = urlencode("${host}_${service}_${db}") . '.rrd';
+  debug(5, "INSERT Checking $Config{rrddir}/$f");
+  unless ( -e "$Config{rrddir}/$f" ) {
+    $ds = "$Config{rrddir}/$f --start $start";
+    for ( @$labels ) {
+      ($v,$t) = ($_->[0],$_->[1]);
+      my $u = $t eq 'DERIVE' ? '0' : 'U' ;
+      $ds .= " DS:$v:$t:$Config{heartbeat}:$u:U";
+    }
+    $ds .= " RRA:AVERAGE:0.5:1:600";
+    $ds .= " RRA:AVERAGE:0.5:6:700";
+    $ds .= " RRA:AVERAGE:0.5:24:775";
+    $ds .= " RRA:AVERAGE:0.5:288:797";
+
+    my @ds = split /\s+/, $ds;
+    debug(4, "INSERT RRDs::create $ds");
+    RRDs::create(@ds);
+    debug(2, "INSERT RRDs::create ERR " . RRDs::error) if RRDs::error;
+  }
+  return $f;
+}
+
+# Use RRDs to update rrd file
+#
+sub rrdupdate {
+  my($file,$time,$values) = @_;
+  my($ds,$c);
+
+  $ds = "$Config{rrddir}/$file $time";
+  for ( @$values ) {
+    $_->[2] ||= 0;
+    $ds .= ":$_->[2]";
+  }
+
+  my @ds = split /\s+/, $ds;
+  debug(4, "INSERT RRDs::update ". join ' ', @ds);
+  RRDs::update(@ds);
+  debug(2, "INSERT RRDs::update ERR " . RRDs::error) if RRDs::error;
+}
+
+# See if we can recognize any of the data we got
+#
+sub parseperfdata {
+  my %P = @_;
+
+  $_="servicedescr:$P{servicedescr}\noutput:$P{output}\nperfdata:$P{perfdata}";
+  evalrules($_);
+}
+
+# Check that we have some data to work on
+#
+sub inputdata {
+  my @inputlines;
+  if ( $ARGV[0] ) {
+    @inputlines = $ARGV[0];
+  } elsif ( defined $Config{perflog} ) {
+    open PERFLOG, $Config{perflog};
+      @inputlines = <PERFLOG>;
+    close PERFLOG
+  }
+
+  # Quit if there are no data to process
+  unless ( @inputlines ) {
+    debug(4, 'INSERT No inputdata. Exiting.');
+    exit 1;
+  }
+  return @inputlines;
+}
+
+# Process all input performance data
+#
+sub processdata {
+  my @perfdatalines = @_;
+  for my $l ( @perfdatalines ) {
+    debug(5, "INSERT processing perfdata: $l");
+    my %P = parseinput($l);
+    dumpperfdata(%P);
+    my $S = parseperfdata(%P);
+    for my $s ( @$S ) {
+      my $rrd = createrrd($P{hostname}, $P{servicedescr}, $P{lastcheck}-1, $s);
+      rrdupdate($rrd, $P{lastcheck}, $s);
+    }
+  }
+}
+
+### Main loop
+#  - Read config and input
+#  - Update rrd files
+#  - Create them first if necesary.
+
+readconfig();
+debug(5, 'INSERT nagiosgraph spawned');
+my @perfdata = inputdata();
+
+# Read the map file and define a subroutine that parses performance data
+my($rules);
+undef $/;
+open FH, $Config{mapfile};
+  $rules = <FH>;
+close FH;
+$rules = '
+sub evalrules {
+  $_=$_[0];
+  my @s;
+  no strict "subs";
+' . $rules . '
+  use strict "subs";
+  debug(3, "INSERT perfdata not recognized") unless @s;
+  return \@s;
+}';
+undef $@;
+eval $rules;
+debug(2, "INSERT Map file eval error: $@") if $@;
+
+processdata( @perfdata );
+debug(5, 'INSERT nagiosgraph exited');
Index: branches/fc15-dev/noc/ng/cgi-bin/show.cgi
===================================================================
--- branches/fc15-dev/noc/ng/cgi-bin/show.cgi	(revision 1803)
+++ branches/fc15-dev/noc/ng/cgi-bin/show.cgi	(revision 1803)
@@ -0,0 +1,276 @@
+#!/usr/bin/perl
+
+# File:    $Id: show.cgi,v 1.22 2006/04/12 09:42:16 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+use strict;
+use RRDs;
+use CGI qw/:standard/;
+
+# Configuration
+my $configfile = '/home/nagios/ng/etc/nagiosgraph.conf';
+
+# Main program - change nothing below
+
+my %Config;
+
+# Read in configuration data
+#
+sub readconfig {
+  die "config file not found" unless -r $configfile;
+
+  # Read configuration data
+  open FH, $configfile;
+    while (<FH>) {
+      s/\s*#.*//;    # Strip comments
+      /^(\w+)\s*=\s*(.*?)\s*$/ and do {
+        $Config{$1} = $2;
+        debug(5, "CGI Config $1:$2");
+      };
+    }
+  close FH;
+
+  # Make sure log file can be written to
+  unless ( -w $Config{logfile} ) {
+    my $msg = "Log file $Config{logfile} not writable";
+    print header(-type => "text/html", -expires => 0);
+    print p($msg);
+    debug (2, "CGI Config $msg");
+    return undef;
+  }
+
+  # Make sure rrddir is readable
+  unless ( -r $Config{rrddir} ) {
+    my $msg = "rrd dir $Config{rrddir} not readable";
+    print header(-type => "text/html", -expires => 0);
+    print p($msg);
+    debug (2, "CGI Config $msg");
+    return undef;
+  }
+
+  return 1;
+}
+
+# Write debug information to log file
+#
+sub debug {
+  my($l, $text) = @_;
+  if ( $l <= $Config{debug} ) {
+    $l = qw(none critical error warn info debug)[$l];
+    $text =~ s/(\w+)/$1 $l:/;
+    open LOG, ">>$Config{logfile}";
+      print LOG scalar localtime;
+      print LOG " $text\n";
+    close LOG;
+  }
+}
+
+# URL encode a string
+#
+sub urlencode {
+  $_[0] =~ s/([\W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg;
+  return $_[0];
+}
+
+# Get list of matching rrd files
+#
+sub dbfilelist {
+  my($host,$service) = @_;
+  my $hs = urlencode "${host}_${service}";
+  my @rrd;
+  opendir DH, $Config{rrddir};
+    @rrd = grep s/^${hs}_(.+)\.rrd$/$1/, readdir DH;
+  closedir DH;
+  return @rrd;
+}
+
+# Find graphs and values
+#
+sub graphinfo {
+  my($host,$service,@db) = @_;
+  my(@rrd,$ds,$f,$dsout,@values,$hs,%H,%R);
+
+  $hs = urlencode "${host}_${service}";
+
+  debug(5, 'CGI @db=' . join '&', @db);
+
+  # Determine which files to read lines from
+  if ( @db ) {
+    my $n = 0;
+    for my $d ( @db ) {
+      my($db,@lines) = split ',', $d;
+      $rrd[$n]{file} = $hs . urlencode("_$db") . '.rrd';
+      for my $l ( @lines ) {
+        my($line,$unit) = split '~', $l;
+        if ( $unit ) {
+          $rrd[$n]{line}{$line}{unit} = $unit if $unit;
+        } else {
+          $rrd[$n]{line}{$line} = 1;
+        }
+      }
+      $n++;
+    }
+    debug(4, "CGI Specified $hs db files in $Config{rrddir}: "
+           . join ', ', map { $_->{file} } @rrd);
+  } else {
+    @rrd = map {{ file=>$_ }}
+           map { "${hs}_${_}.rrd" }
+           dbfilelist($host,$service);
+    debug(4, "CGI Listing $hs db files in $Config{rrddir}: "
+           . join ', ', map { $_->{file} } @rrd);
+  }
+
+  for $f ( @rrd ) {
+    unless ( $f->{line} ) {
+      $ds = RRDs::info "$Config{rrddir}/$f->{file}";
+      debug(2, "CGI RRDs::info ERR " . RRDs::error) if RRDs::error;
+      map { $f->{line}{$_} = 1}
+      grep {!$H{$_}++}
+      map { /ds\[(.*)\]/; $1 }
+      grep /ds\[(.*)\]/,
+      keys %$ds;
+    }
+    debug(5, "CGI DS $f->{file} lines: "
+           . join ', ', keys %{ $f->{line} } );
+  }
+  return \@rrd;
+}
+
+# Choose a color for service
+#
+sub hashcolor {
+  my$c=$Config{colorscheme};
+  map{
+    $c=(51*$c+ord)%(216)
+  } split//,"$_[0]x";
+  my($i,$n,$m,@h);
+  @h=(51*int$c/36,
+      51*int$c/6%6,
+      51*($c%6));
+#debug(2, "hashcolor $_[0], $c, $h[0]");
+  for$i(0..2){
+	$m=$i if$h[$i]<$h[$m];
+	$n=$i if$h[$i]>$h[$n]
+  }
+  $h[$m]=102 if$h[$m]>102;
+  $h[$n]=153 if$h[$n]<153;
+#debug(2, "hashcolor $_[0]\t$c\t$h[0]\t$h[1]\t$h[2]");
+  #$c=sprintf"%06X",$h[2]+$h[1]*256+$h[0]*16**4;
+  $n = $h[2]+$h[1]*256+$h[0]*16**4;
+  $c=sprintf"%06X",$n;
+#debug(2, "hashcolor $_[0]\t$n\t$c");
+  return $c;
+}
+
+# Generate all the parameters for rrd to produce a graph
+#
+sub rrdline {
+  my($host,$service,$geom,$rrdopts,$G,$time) = @_;
+  my($g,$f,$v,$c,@ds);
+
+  @ds = ('-', '-a', 'PNG', '--start', "-$time");
+  # Identify where to pull data from and what to call it
+  for $g ( @$G ) {
+    $f = $g->{file};
+    debug(5, "CGI file=$f");
+    for $v ( sort keys %{ $g->{line} } ) {
+      $c = hashcolor($v);
+      debug(5, "CGI file=$f line=$v color=$c");
+      my $sv = "$v";
+      push @ds , "DEF:$sv=$Config{rrddir}/$f:$v:AVERAGE"
+               , "LINE2:${sv}#$c:$sv"
+               , "GPRINT:$sv:MAX:Max\\: %6.2lf%s"
+               , "GPRINT:$sv:AVERAGE:Avg\\: %6.2lf%s"
+               , "GPRINT:$sv:MIN:Min\\: %6.2lf%s"
+               , "GPRINT:$sv:LAST:Cur\\: %6.2lf%s\\n";
+    }
+  }
+
+  # Dimensions of graph if geom is specified
+  if ( $geom ) {
+    my($w,$h) = split 'x', $geom;
+    push @ds, '-w', $w, '-h', $h;
+  }
+  # Additional parameters to rrd graph, if specified
+  if ( $rrdopts ) {
+    push @ds, split /\s+/, $rrdopts;
+  }
+  return @ds;
+}
+
+# Write a pretty page with various graphs
+#
+sub page {
+  my($h,$s,$d,$o,@db) = @_;
+
+  # Reencode rrdopts
+  $o = urlencode $o;
+
+  # Detect available db files
+  @db = dbfilelist($h,$s) unless @db;
+  debug(5, "CGI dbfilelist @db");
+
+  # Define graph sizes
+  #   Daily   =  33h =   118800s
+  #   Weekly  =   9d =   777600s
+  #   Monthly =   5w =  3024000s
+  #   Yearly  = 400d = 34560000s
+  my @T=(['dai',118800], ['week',777600], ['month',3024000], ['year',34560000]);
+  print h1("Nagiosgraph");
+  print p("Performance data for ".strong("Host: ").tt($h).' &#183; '.strong("Service: ").tt($s));
+  for my $l ( @T ) {
+    my($p,$t) = ($l->[0],$l->[1]);
+    print h2(ucfirst $p . "ly");
+    if ( @db ) {
+      for my $g ( @db ) {
+        my $arg = join '&', "host=$h", "service=$s", "db=$g", "graph=$t",
+                            "geom=$d", "rrdopts=$o";
+        my @gl = split ',', $g;
+        my $ds = shift @gl;
+        print div({-class => "graphs"}, img( {-src => "?$arg", -alt => "Graph"} ) );
+        print div({-class => "graph_description"}, cite(strong($ds).br().small(join(", ", @gl))));
+      }
+    } else {
+      my $arg = join '&', "host=$h", "service=$s", "graph=$t",
+                          "geom=$d", "rrdopts=$o";
+      print div({-class => "graphs"}, img( {-src => "?$arg", -alt => "Graph"} ) );
+    }
+  }
+}
+
+exit unless readconfig();
+
+# Expect host, service and db input
+my $host = param('host') if param('host');
+my $service = param('service') if param('service');
+my @db = param('db') if param('db');
+my $graph = param('graph') if param('graph');
+my $geom = param('geom') if param('geom');
+my $rrdopts = param('rrdopts') if param('rrdopts');
+
+# Draw a graph or a page
+if ( $graph ) {
+  $| = 1; # Make sure headers arrive before image data
+  print header(-type => "image/png");
+  # Figure out db files and line labels
+  my $G = graphinfo($host,$service,@db);
+  my @ds = rrdline($host,$service,$geom,$rrdopts,$G,$graph);
+  debug(4, "CGI RRDs::graph ". join ' ', @ds);
+  RRDs::graph(@ds);
+  debug(2, "CGI RRDs::graph ERR " . RRDs::error) if RRDs::error;
+  exit;
+} else {
+  my @style;
+  if ($Config{stylesheet}) {
+    @style = ( -style => {-src => "$Config{stylesheet}"} );
+  }
+  print header, start_html(-id=>"nagiosgraph", -title => "nagiosgraph: $host-$service",
+    -meta => { -http_equiv => "Refresh", -content => "300" },
+    @style
+    );
+  page($host,$service,$geom,$rrdopts,@db);
+  print div({-id => "footer"}, hr(), small( "Created by ". a( {-href=>"http://nagiosgraph.sf.net/"}, "nagiosgraph"). "." ));
+  print end_html();
+}
Index: branches/fc15-dev/noc/ng/cgi-bin/testcolor.cgi
===================================================================
--- branches/fc15-dev/noc/ng/cgi-bin/testcolor.cgi	(revision 1803)
+++ branches/fc15-dev/noc/ng/cgi-bin/testcolor.cgi	(revision 1803)
@@ -0,0 +1,55 @@
+#!/usr/bin/perl
+
+# File:    $Id: testcolor.cgi,v 1.2 2005/10/08 05:55:08 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+use strict;
+use CGI qw/:standard/;
+
+# Suggest some commonly used keywords
+my $w = param('words') ? join ' ', param('words') : 'response rta pctfree';
+
+# Start each page with an input field
+print <<EOF;
+Content-type: text/html
+
+<html><body>
+<form>
+Type some space seperated nagiosgraph line names here:<br>
+<input name=words size=80 value="$w">
+<input type=submit>
+</form><br>
+EOF
+
+# Render a table of colors of all schemes for each keyword
+if ( param('words') ) {
+  print "<table cellpadding=0><tr><td></td>";
+  print "<th>$_</th>" for 1..8;
+  print "</tr>\n";
+  for my $w ( split /\s+/, param('words') ) {
+    print "<tr><td>$w</td>";
+    for my $c ( 1..8 ) {
+      my $h = hashcolor($w, $c);
+      print "<td><table bgcolor=#000000><tr><td bgcolor=#$h>&nbsp;</td></tr></table></td>";
+    }
+    print "</tr>\n";
+  }
+  print "</table>\n";
+}
+
+# End of page
+print "</body></html>\n";
+
+# Calculate a color for a keyword
+#
+sub hashcolor {
+  my$c=$_[1];map{$c=1+(51*$c+ord)%(216)}split//,$_[0];
+  my($i,$n,$m,@h);@h=(51*int$c/36,51*int$c/6%6,51*($c%6));
+  for$i(0..2){$m=$i if$h[$i]<$h[$m];$n=$i if$h[$i]>$h[$n]}
+  $h[$m]=102if$h[$m]>102;$h[$n]=153if$h[$n]<153;
+  $c=sprintf"%06X",$h[2]+$h[1]*256+$h[0]*16**4;
+  return $c;
+}
+
Index: branches/fc15-dev/noc/ng/cgi-bin/testentry.pl
===================================================================
--- branches/fc15-dev/noc/ng/cgi-bin/testentry.pl	(revision 1803)
+++ branches/fc15-dev/noc/ng/cgi-bin/testentry.pl	(revision 1803)
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+# File:    $Id: testentry.pl,v 1.4 2005/10/08 05:55:08 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+# Modify this script to test map entries before inserting into real
+# map file. Run the script and check if the output is as expected.
+
+use strict;
+no strict "subs";
+use Data::Dumper;
+my @s;
+
+# Insert servicesdescr, output and perfdata here as it appears in log file.
+#
+$_ = <<DATA;
+servicedescr:ping
+output:Total RX Bytes: 4058.14 MB, Total TX Bytes: 2697.28 MB<br>Average Traffic: 3.57 kB/s (0.0%) in, 4.92 kB/s (0.0%) out| inUsage=0.0,85,98 outUsage=0.0,85,98
+perfdata:
+DATA
+
+eval {
+
+# Insert here a map entry to parse the nagios plugin data above.
+#
+/output:.*Average Traffic.*?([.\d]+) kB.+?([.\d]+) kB/
+and push @s, [ rxbytes,
+               [ in,  GAUGE, $1 ],
+               [ out, GAUGE, $2 ] ];
+
+};
+
+print Data::Dumper->Dump([\@s], [qw(*s)]);
Index: branches/fc15-dev/noc/ng/etc/httpd-ng.conf
===================================================================
--- branches/fc15-dev/noc/ng/etc/httpd-ng.conf	(revision 1803)
+++ branches/fc15-dev/noc/ng/etc/httpd-ng.conf	(revision 1803)
@@ -0,0 +1,13 @@
+#ScriptAlias /ng/cgi-bin/ /home/noc/ng/cgi-bin/
+#
+#<Directory /home/noc/ng/cgi-bin/>
+#   Options ExecCGI
+#   SSLRequireSSL
+#</Directory>
+#
+#Alias /ng/ /home/noc/ng/html/
+#
+#<Directory /home/noc/ng/html/>
+#   Options None
+#   SSLRequireSSL
+#</Directory>
Index: branches/fc15-dev/noc/ng/etc/map
===================================================================
--- branches/fc15-dev/noc/ng/etc/map	(revision 1803)
+++ branches/fc15-dev/noc/ng/etc/map	(revision 1803)
@@ -0,0 +1,192 @@
+# File:    $Id: map,v 1.9 2005/10/08 05:55:08 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+########################################################################
+#
+# INSTRUCTIONS:
+#
+# This file contains several example of service types. Edit this file to 
+# add more service types. The data string from Nagios is in $_ . Use 
+# regular expressions to identify and extract data like the examples below
+# below.  Match on either output: or perfdata: . The code is pure perl, 
+# that will be run inside and eval{}. Results are expected in @s. The
+# general format is:
+# 
+# /output|perfdata:<servicetype> <key>=<value> <key2=value2> .../
+# and push @s, [ <databasename>,
+#                [ <key>,  GAUGE|DERIVE, <value>  ],
+#                [ <key2>, GAUGE|DERIVE, <value2> ],
+#                [ .       .              .        ],
+#                [ .       .              .        ] ];
+# 
+# But more advanced code is possible, as long as the resulting 
+# datastructure is correct.
+# 
+########################################################################
+
+# Service type: ping
+#   output:PING OK - Packet loss = 0%, RTA = 0.00 ms
+/output:PING.*?(\d+)%.+?([.\d]+)\sms/
+and push @s, [ "ping",
+               [ "losspct", GAUGE, $1      ],
+               [ "rta",     GAUGE, $2/1000 ] ];
+
+# Service type: single disk
+#  output:DISK OK - free space: /tmp 663 MB (90%):
+/output:DISK.*free space: (\S+) (\d+) MB \((\d+)\%\)/
+and push @s, [ $1,
+               [ "bytesfree", GAUGE, $2*1024**2 ],
+               [ "bytesmax", GAUGE, $3 ? $2*1024**2/$3*100 : 'U' ],
+               [ "pctfree", GAUGE, $3 ] ];
+
+# Service type: all unix-disk
+# Note: nagiosplugin requires the inode patch
+#   ouput:DISK OK - free space: / 12372 mB (77% inode=96%): /raid 882442 mB (88% inode=91%):
+#   perfdata: /=12372mB;14417;15698;96;16019 /raid=882441mB;999780;999780;91;999780
+/output:DISK.*inode=/ and do {
+  my @_pct = /: (\/.*?) .*?(\d+)% inode=(\d+)%/g;
+  while ( my($_d,$_b,$_i) = splice @_pct,0,3 ) {
+    my @_s;
+    /perfdata:.*$_d=(\d+)\w*?;(\d+);(\d+);(\d+);(\d+)/;
+    push @s, [ $_d,
+               [ "free",     GAUGE, $1*1024**2  ],
+               [ "user",     GAUGE, $2*1024**2  ],
+               [ "root",     GAUGE, $3*1024**2  ],
+               [ "max",      GAUGE, $5*1024**2  ],
+               [ "blockpct", GAUGE, $_b ],
+               [ "inodepct", GAUGE, $_i ] ];
+  }
+};
+
+# Service type: unix-dns
+#   output:DNS OK - 0.008 seconds response time (test.test.1M IN A192.169.0.47)
+#   perfdata:time=8260us;;;0
+/output:DNS.*?([.0-9]+) sec/
+and push @s, [ "dns",
+               [ "response",  GAUGE, $1 ] ];
+
+# Service type: unix-imap
+#   output:IMAP OK - 0.009 second response time on port 143
+/output:IMAP.*?([-.0-9]+) sec/
+and push @s, [ "imap",
+               [ "response", GAUGE, $1 ] ];
+
+# Service type: unix-ldap
+#   ouput:LDAP OK - 0.004 seconds response time
+#   perfdata:time=3657us;;;0
+/output:LDAP.*?([.0-9]+) sec/
+and push @s, [ "ldap",
+               [ "response", GAUGE, $1 ] ];
+
+# Service type: unix-load
+#   output: OK - load average: 0.66, 0.70, 0.73
+#   perfdata:load1=0;15;30;0 load5=0;10;25;0 load15=0;5;20;0
+/output:.*load average: ([.0-9]+), ([.0-9]+), ([.0-9]+)/
+and push @s, [ "load",
+               [ "avg1min",  GAUGE, $1 ],
+               [ "avg5min",  GAUGE, $2 ],
+               [ "avg15min", GAUGE, $3 ] ];
+
+# Service type: unix-mailq
+#   output:WARNING: mailq is 5717 (threshold w = 5000)
+#   perfdata:unsent=5717;5000;10000;0
+/perfdata:unsent=(\d+);(\d+);(\d+);(\d+)/
+and push @s, [ "mailq",
+               [ "qsize", GAUGE, $1 ],
+               [ "qwarn", GAUGE, $2 ],
+               [ "qcrit", GAUGE, $3 ] ];
+
+# Service type: unix-netstat
+#   output:OK
+#   perfdata:udpInDatagrams=46517147, udpOutDatagrams=46192507, udpInErrors=0, 
+#   tcpActiveOpens=1451583, tcpPassiveOpens=1076181, tcpAttemptFails=1909, 
+#   tcpEstabResets=5045, tcpCurrEstab=6, tcpOutDataBytes=3162434373, 
+#   tcpInDataBytes=1942718261, tcpRetransBytes=215439
+/perfdata:.*udpInDatagrams=(\d+), udpOutDatagrams=(\d+), udpInErrors=(\d+), tcpActiveOpens=(\d+), tcpPassiveOpens=(\d+), tcpAttemptFails=(\d+), tcpEstabResets=(\d+), tcpCurrEstab=(\d+), tcpOutDataBytes=(\d+), tcpInDataBytes=(\d+), tcpRetransBytes=(\d+)/
+and push @s, [ "udp",
+               [ "InPkts",  DERIVE, int $1/300 ],
+               [ "OutPkts", DERIVE, int $2/300 ],
+               [ "Errors",  DERIVE, int $3/300 ] ],
+             [ "tcp",
+               [ "ActOpens",    DERIVE, int $4/300    ],
+               [ "PsvOpens",    DERIVE, int $5/300    ],
+               [ "AttmptFails", DERIVE, int $6/300    ],
+               [ "OutBytes",    DERIVE, int $9/300*8  ],
+               [ "InBytes",     DERIVE, int $10/300*8 ] ];
+
+# Service type: unix-ntp
+#   output:NTP OK: Offset 0.001083 secs, jitter 14.84 msec, peer is stratum 1
+/output:NTP.*Offset ([-.0-9]+).*jitter ([-.0-9]+).*stratum (\d+)/
+and push @s, [ "ntp",
+               [ "offset",  GAUGE, $1      ],
+               [ "jitter",  GAUGE, $2/1000 ],
+               [ "stratum", GAUGE, $3+1    ] ];
+
+# Service type: unix-pop
+#   output:POP OK - 0.008 second response time on port 110
+/output:POP.*?([.0-9]+) second/
+and push @s, [ "pop3",
+               [ "response", GAUGE, $1 ] ];
+
+# Service type: unix-procs
+#   output:PROCS OK: 43 processes
+/output:PROCS.*?(\d+) processes\n/
+and push @s, [ "procs",
+               [ "procs", GAUGE, $1 ] ];
+
+# Service type: unix-smtp
+#   output:SMTP OK - 0.187 sec. response time
+/output:SMTP.*?([-.0-9]+) sec/
+and push @s, [ "smtp",
+               [ "response", GAUGE, $1 ] ];
+
+# Service type: unix-swap
+#   output:SWAP OK: 96% free (2616 MB out of 2744 MB)
+#   perfdata:swap=2616MB;274;54;0;2744
+/perfdata:swap=(\d+)MB;(\d+);(\d+);\d+;(\d+)/
+and push @s, [ "swap",
+               [ "swapfree", GAUGE, $1*1024**2 ],
+               [ "swapwarn", GAUGE, $2*1024**2 ],
+               [ "swapcrit", GAUGE, $3*1024**2 ],
+               [ "swapmax",  GAUGE, $4*1024**2 ] ];
+
+# Service type: unix-users
+#   output:USERS OK - 4 users currently logged in
+#   perfdata:users=4;5;10;0 
+/perfdata:users=(\d+);(\d+);(\d+)/
+and push @s, [ "procs",
+               [ "users", GAUGE, $1 ],
+               [ "uwarn",  GAUGE, $2 ],
+               [ "ucrit",  GAUGE, $3 ] ];
+
+# Service type: unix-zombies
+#   ouput:PROCS OK: 0 processes with STATE = Z
+/output:PROCS.*?(\d+) processes.*Z/
+and push @s, [ "zombie",
+               [ "zombies", GAUGE, $1 ] ];
+
+# Service type: unix-www
+#   ouput:HTTP OK HTTP/1.1 200 OK - 1456 bytes in 0.003 seconds
+/output:HTTP.*?(\d+) byte.*?([.0-9]+) sec/
+and push @s, [ "http",
+               [ "bps", GAUGE, $1/$2 ] ];
+
+# Service type: unix-tcp
+#   output:TCP OK - 0.061 second response time on port 22
+#   perfdata:time=0.060777s;0.000000;0.000000;0.000000;10.000000
+/output:TCP.*?on port (\d+)\s*perfdata:time=(\d+\.\d+).*(\d+\.\d+)\D*(\d+\.\d+)\D*(\d+\.\d+)\D*(\d+\.\d+)/
+and push @s, [ "tcp_$1",
+               [ 'connect_time',   GAUGE, $2 ],
+               [ 'warning_time',   GAUGE, $3 ],
+               [ 'critical_time',  GAUGE, $4 ],
+               [ 'socket_timeout', GAUGE, $6 ],
+             ];
+
+# Service type: mysql
+#   output: Uptime: 1659115  Threads: 1  Questions: 6424617  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 512  Queries per second avg: 3.872 Slave IO: Yes Slave SQL: Yes Seconds Behind Master: 0
+/output:Uptime.*Questions: (\d+).*Queries per second avg: (\d+\.?\d+)/
+and push @s, [ "mysql",
+		[ 'qps', DERIVE, $1 ],
+		[ 'avgqps', GAUGE, $2 ]];
Index: branches/fc15-dev/noc/ng/etc/nagios-ng.cfg
===================================================================
--- branches/fc15-dev/noc/ng/etc/nagios-ng.cfg	(revision 1803)
+++ branches/fc15-dev/noc/ng/etc/nagios-ng.cfg	(revision 1803)
@@ -0,0 +1,13 @@
+# /etc/nagios/nagios.cfg
+process_performance_data=1
+service_perfdata_file=/home/noc/ng/log/perfdata
+service_perfdata_file_template=$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$
+service_perfdata_file_mode=a
+service_perfdata_file_processing_interval=60
+service_perfdata_file_processing_command=ng-service-perfdata
+
+# /etc/nagios/misccommands.cfg
+define command {
+  command_name  ng-service-perfdata
+  command_line  /home/noc/ng/bin/insert.pl
+}
Index: branches/fc15-dev/noc/ng/etc/nagiosgraph.conf
===================================================================
--- branches/fc15-dev/noc/ng/etc/nagiosgraph.conf	(revision 1803)
+++ branches/fc15-dev/noc/ng/etc/nagiosgraph.conf	(revision 1803)
@@ -0,0 +1,35 @@
+# File:    $Id: nagiosgraph.conf,v 1.8 2006/04/06 10:00:06 sauber Exp $
+# Author:  (c) Soren Dossing, 2005
+# License: OSI Artistic License
+#          http://www.opensource.org/licenses/artistic-license.php
+
+# Debug levels
+# 0 = None
+# 1 = Critical
+# 2 = Error
+# 3 = Warn
+# 4 = Info
+# 5 = Debug
+debug = 2
+
+# Location of debug log file
+logfile = /home/noc/ng/log/debug
+
+# Directory to store rrd database files
+rrddir =  /home/noc/ng/rrd
+
+# File containing regular expressions to identify service and perf data
+mapfile = /home/noc/ng/etc/map
+
+# Color scheme for graphs. Choose a number between 1 and 8.
+colorscheme = 1
+
+# Heartbeat. In seconds, twice the size of servicecheck intervals
+#heartbeat = 600
+heartbeat = 60
+
+# Location of performance data log file. Comment out it not used.
+perflog = /home/noc/ng/log/perfdata
+
+# Stylesheet - added to head of show.cgi. Comment out if not used
+stylesheet = /ng/nagiosgraph.css
Index: branches/fc15-dev/noc/ng/html/nagiosgraph.css
===================================================================
--- branches/fc15-dev/noc/ng/html/nagiosgraph.css	(revision 1803)
+++ branches/fc15-dev/noc/ng/html/nagiosgraph.css	(revision 1803)
@@ -0,0 +1,27 @@
+body#nagiosgraph {
+	color: #000000;
+	background-color: #BBBBFF;
+}
+h1 {
+	font-size: x-large;
+}
+div.graphs, div#footer {
+	clear: both;
+}
+h2 {
+	font-size: large;
+	padding-top: 1em;
+	margin-bottom: 0.5em;
+	clear: left;
+}
+img {
+	float: left;
+	margin-left: 15px;
+	margin-bottom: 1em;
+	padding-right: 10px;
+}
+div.graph_description {
+	/* to valign the text */
+	margin-top: 0;
+	padding-top: 70px;
+}
Index: branches/fc15-dev/noc/setup.sh
===================================================================
--- branches/fc15-dev/noc/setup.sh	(revision 1803)
+++ branches/fc15-dev/noc/setup.sh	(revision 1803)
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+chown -R nagios:nagios /home/noc/
+chmod 711 /home/noc/
+
+find /home/noc/ -type f | xargs -n1 chmod 644
+find /home/noc/ -type d | xargs -n1 chmod 755
+find /home/noc/ -name '*.cgi' -or -name '*.php' -or -name '*.pl' -or -name '*.sh' | xargs -n1 chmod a+x
+
+chown -R nagios:apache /home/noc/html/ /home/noc/ng/html/ /home/noc/ng/log/ /home/noc/ng/rrd/
+chmod -R g-w /home/noc/html/* /home/noc/ng/html/*
+chmod -R g+w /home/noc/ng/log/ /home/noc/ng/rrd/
+chmod g+w /home/noc/ng/log/ /home/noc/ng/rrd/
+
+if [ ! -h /etc/nagios ]; then
+	mv /etc/nagios /etc/nagios_OLD
+	ln -nfs /home/noc/nagios/ /etc/nagios
+fi
+
+chown -R root:root /home/noc/nagios/
+find /home/noc/nagios/ -type f | xargs -n1 chmod 644
+find /home/noc/nagios/ -type d | xargs -n1 chmod 755
+
+chown -R root:nagios /home/noc/nagios/private/
+chmod -R o-rwx /home/noc/nagios/private/
Index: branches/fc15-dev/selinux/Makefile
===================================================================
--- branches/fc15-dev/selinux/Makefile	(revision 1803)
+++ branches/fc15-dev/selinux/Makefile	(revision 1803)
@@ -0,0 +1,18 @@
+include /usr/share/selinux/devel/Makefile
+#include /usr/share/selinux/devel/include/Makefile
+
+/usr/share/selinux/devel/include/Makefile:
+	yum -y install selinux-policy-devel
+
+build/%.fc: %.fc
+	rm -rf tmp
+
+install:
+	/usr/sbin/semodule -n -i openafs.pp;
+	/usr/sbin/semodule -n -i scripts.pp;
+	/usr/sbin/semodule -n -i signup.pp;
+	/usr/sbin/semodule -n -i admof.pp;
+	/usr/sbin/semodule -n -i nagios-nrpe.pp;
+	/usr/sbin/semodule -n -i zephyr.pp;
+	/usr/sbin/semodule -R
+	/usr/sbin/getenforce
Index: branches/fc15-dev/selinux/build/admof.fc
===================================================================
--- branches/fc15-dev/selinux/build/admof.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/admof.fc	(revision 1803)
@@ -0,0 +1,5 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+/usr/local/sbin/admof					gen_context(system_u:object_r:admof_exec_t,s0)
Index: branches/fc15-dev/selinux/build/admof.if
===================================================================
--- branches/fc15-dev/selinux/build/admof.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/admof.if	(revision 1803)
@@ -0,0 +1,4 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
Index: branches/fc15-dev/selinux/build/admof.te
===================================================================
--- branches/fc15-dev/selinux/build/admof.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/admof.te	(revision 1803)
@@ -0,0 +1,41 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(admof,1.0.0)
+
+require {
+	type sshd_t, sshd_tmp_t, proc_t;
+};
+
+type admof_t;
+type admof_exec_t;
+role system_r types admof_t;
+domain_type(admof_t)
+domain_auto_trans(sshd_t,admof_exec_t,admof_t)
+domain_entry_file(admof_t, admof_exec_t)
+files_read_etc_files(admof_t)
+libs_use_ld_so(admof_t)
+libs_use_shared_libs(admof_t)
+miscfiles_read_localization(admof_t)
+
+allow admof_t sshd_t:fd use;
+allow admof_t sshd_t:fifo_file write;
+allow admof_t sshd_t:tcp_socket { read write };
+allow admof_t sshd_tmp_t:file all_file_perms;
+allow admof_t sshd_t:process sigchld;
+allow admof_t self:fifo_file { getattr ioctl read write };
+allow admof_t proc_t:file { getattr read };
+
+dev_read_urand(admof_t)
+corecmd_exec_all_executables(admof_t)
+
+allow sshd_t admof_exec_t:file rx_file_perms;
+
+require { type afs_t; };
+
+afs_access(admof_t)
+allow afs_t admof_t:fifo_file { getattr write };
+allow afs_t sshd_t:fifo_file write;
+allow afs_t sshd_t:tcp_socket { read write };
+allow afs_t sshd_tmp_t:file { read write };
Index: branches/fc15-dev/selinux/build/nagios-nrpe.fc
===================================================================
--- branches/fc15-dev/selinux/build/nagios-nrpe.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/nagios-nrpe.fc	(revision 1803)
@@ -0,0 +1,5 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+/usr/sbin/nrpe gen_context(system_u:object_r:nrpe_exec_t,s0)
Index: branches/fc15-dev/selinux/build/nagios-nrpe.if
===================================================================
--- branches/fc15-dev/selinux/build/nagios-nrpe.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/nagios-nrpe.if	(revision 1803)
@@ -0,0 +1,25 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+interface(`nrpe_domtrans',`
+        gen_requires(`
+                type nrpe_t, nrpe_exec_t;
+        ')
+
+        domain_auto_trans($1,nrpe_exec_t,nrpe_t)
+
+        allow $1 nrpe_t:fd use;
+        allow nrpe_t $1:fd use;
+        allow nrpe_t:$1:fifo_file rw_file_perms;
+        allow nrpe_t $1:process sigchld;
+')
+
+template(`nrpe_access',`
+        require {
+                type nrpe_etc_t;
+        }
+
+	allow $1 nrpe_etc_t:file r_file_perms;
+	allow $1 nrpe_etc_t:dir r_dir_perms;
+')
Index: branches/fc15-dev/selinux/build/nagios-nrpe.te
===================================================================
--- branches/fc15-dev/selinux/build/nagios-nrpe.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/nagios-nrpe.te	(revision 1803)
@@ -0,0 +1,56 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(nrpe,1.0.0)
+
+require {
+	type nrpe_t, nrpe_exec_t;
+        type inaddr_any_node_t;
+        type inetd_child_port_t;
+        type initrc_var_run_t;
+        type nrpe_t;
+        type port_t;
+        type var_run_t;
+};
+
+########################################
+#
+# nrpe local policy
+
+files_read_etc_files(nrpe_t)
+files_rw_etc_runtime_files(nrpe_t)
+libs_use_ld_so(nrpe_t)
+libs_use_shared_libs(nrpe_t)
+miscfiles_read_localization(nrpe_t)
+
+sysnet_dns_name_resolve(nrpe_t)
+corenet_tcp_sendrecv_all_nodes(nrpe_t)
+corenet_udp_sendrecv_all_nodes(nrpe_t)
+
+nagios_read_config(nrpe_t)
+files_rw_generic_pids(nrpe_t)
+allow nrpe_t self:capability { setgid setuid };
+allow nrpe_t self:tcp_socket { accept bind create listen setopt };
+
+require {
+	attribute domain;
+	attribute file_type;
+	attribute filesystem_type;
+};
+
+domain_read_all_domains_state(nrpe_t)
+dontaudit nrpe_t domain:dir getattr;
+dontaudit nrpe_t file_type:dir all_dir_perms;
+dontaudit nrpe_t file_type:file all_file_perms;
+files_getattr_all_dirs(nrpe_t)
+files_getattr_all_files(nrpe_t)
+fs_getattr_all_fs(nrpe_t)
+fs_get_xattr_fs_quotas(nrpe_t)
+
+allow nrpe_t inaddr_any_node_t:tcp_socket node_bind;
+allow nrpe_t inetd_child_port_t:tcp_socket name_bind;
+allow nrpe_t initrc_var_run_t:file { lock read };
+allow nrpe_t port_t:tcp_socket { recv_msg send_msg };
+allow nrpe_t var_run_t:dir { add_name write };
+allow nrpe_t var_run_t:file create;
Index: branches/fc15-dev/selinux/build/openafs.fc
===================================================================
--- branches/fc15-dev/selinux/build/openafs.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/openafs.fc	(revision 1803)
@@ -0,0 +1,40 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+/afs			-d	gen_context(system_u:object_r:default_t,s0)
+/etc/openafs(/.*)?		gen_context(system_u:object_r:afsd_etc_t,s0)
+/usr/vice/etc(/.*)?		gen_context(system_u:object_r:afsd_etc_t,s0)
+/usr/vice/etc/afsd	--	gen_context(system_u:object_r:afsd_exec_t,s0)
+/usr/vice/cache(/.*)?		gen_context(system_u:object_r:afsd_cache_t,s0)
+
+/usr/bin/afsmonitor		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/bos			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/fs			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/kapasswd		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/klog			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/klog.krb		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/kpasswd		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/pagsh			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/pagsh.krb		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/pts			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/scout			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/sys			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/tokens			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/tokens.krb		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/translate_et		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/udebug			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/bin/unlog			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/backup		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/butc			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/copyauth		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/fms			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/fstrace		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/kas			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/kseal			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/read_tape		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/restorevol		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/rxdebug		gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/uss			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/vos			gen_context(system_u:object_r:afs_bin_t,s0)
+/usr/sbin/vsys			gen_context(system_u:object_r:afs_bin_t,s0)
Index: branches/fc15-dev/selinux/build/openafs.if
===================================================================
--- branches/fc15-dev/selinux/build/openafs.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/openafs.if	(revision 1803)
@@ -0,0 +1,41 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+interface(`afsd_domtrans',`
+	gen_require(`
+		type afsd_t, afsd_exec_t;
+	')
+
+	domain_auto_trans($1,afsd_exec_t,afsd_t)
+
+	allow $1 afsd_t:fd use;
+	allow afsd_t $1:fd use;
+	allow afsd_t $1:fifo_file rw_file_perms;
+	allow afsd_t $1:process sigchld;
+')
+
+interface(`afs_access',`
+	gen_require(`
+		type afs_t, afs_bin_t;
+		type afsd_t, afsd_etc_t;
+	')
+
+	allow $1 afs_bin_t:file rx_file_perms;
+	domain_auto_trans($1, afs_bin_t, afs_t)
+	allow afs_t $1:fd use;
+	allow afs_t $1:process sigchld;
+
+	allow $1 afsd_t:udp_socket write;
+	allow $1 afsd_etc_t:dir r_dir_perms;
+	allow $1 afsd_etc_t:file r_file_perms;
+	allow $1 afsd_etc_t:lnk_file r_file_perms;
+	fs_manage_autofs_symlinks($1)
+	fs_manage_nfs_dirs($1)
+	fs_manage_nfs_files($1)
+	fs_manage_nfs_symlinks($1)
+	fs_manage_nfs_named_pipes($1)
+	fs_manage_nfs_named_sockets($1)
+	allow $1 nfs_t:file entrypoint;
+	allow $1 nfs_t:{file dir} rx_file_perms;
+')
Index: branches/fc15-dev/selinux/build/openafs.te
===================================================================
--- branches/fc15-dev/selinux/build/openafs.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/openafs.te	(revision 1803)
@@ -0,0 +1,103 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(openafs,1.0.0)
+
+type afs_t;
+type afs_bin_t;
+domain_type(afs_t)
+domain_entry_file(afs_t, afs_bin_t)
+corecmd_executable_file(afs_bin_t)
+
+role system_r types afs_t;
+role user_r types afs_t;
+
+type afsd_t;
+type afsd_exec_t;
+domain_type(afsd_t)
+init_daemon_domain(afsd_t, afsd_exec_t)
+
+type afsd_etc_t;
+type afsd_cache_t;
+files_type(afsd_etc_t)
+files_type(afsd_cache_t)
+
+allow afsd_t { afsd_etc_t afsd_cache_t }:dir manage_dir_perms;
+allow afsd_t { afsd_etc_t afsd_cache_t }:file_class_set manage_file_perms;
+
+########################################
+#
+# AFS local policy
+
+files_read_etc_files(afs_t)
+files_read_etc_runtime_files(afs_t)
+libs_use_ld_so(afs_t)
+libs_use_shared_libs(afs_t)
+miscfiles_read_localization(afs_t)
+
+files_read_etc_files(afsd_t)
+files_rw_etc_runtime_files(afsd_t)
+libs_use_ld_so(afsd_t)
+libs_use_shared_libs(afsd_t)
+miscfiles_read_localization(afsd_t)
+
+init_use_fds(afsd_t)
+init_use_script_ptys(afsd_t)
+domain_use_interactive_fds(afsd_t)
+term_use_console(afsd_t)
+
+files_mounton_default(afsd_t)
+kernel_read_system_state(afsd_t)
+kernel_write_proc_files(afsd_t)
+fs_mount_nfs(afsd_t)
+fs_remount_nfs(afsd_t)
+fs_unmount_nfs(afsd_t)
+fs_manage_nfs_dirs(afsd_t)
+fs_manage_nfs_files(afsd_t)
+fs_manage_nfs_symlinks(afsd_t)
+fs_manage_nfs_named_pipes(afsd_t)
+fs_manage_nfs_named_sockets(afsd_t)
+
+allow afsd_t self:dir mounton;
+allow afsd_t self:process setsched;
+allow afsd_t self:capability { sys_admin sys_nice sys_tty_config };
+
+sysnet_dns_name_resolve(afsd_t)
+corenet_tcp_sendrecv_all_nodes(afsd_t)
+corenet_udp_sendrecv_all_nodes(afsd_t)
+
+# some redundancy here
+afs_access(afsd_t);
+
+require {
+	type afs_bos_port_t,afs_fs_port_t,afs_fs_port_t,afs_ka_port_t,afs_pt_port_t,afs_vl_port_t;
+	type netif_t, node_t;
+	type kernel_t;
+}
+allow afsd_t { self afs_bos_port_t afs_fs_port_t afs_fs_port_t afs_ka_port_t afs_pt_port_t afs_vl_port_t }:tcp_socket all_tcp_socket_perms;
+allow afsd_t { self afs_bos_port_t afs_fs_port_t afs_fs_port_t afs_ka_port_t afs_pt_port_t afs_vl_port_t }:udp_socket all_udp_socket_perms;
+allow afsd_t netif_t:netif { udp_recv udp_send };
+allow afsd_t node_t:node { udp_recv udp_send };
+
+allow kernel_t afsd_t:udp_socket all_udp_socket_perms;
+
+allow afsd_t kernel_t:key all_key_perms;
+allow kernel_t self:key all_key_perms;
+
+require {
+	type inaddr_any_node_t;
+};
+
+afs_access(afs_t)
+allow afs_t afs_pt_port_t:udp_socket all_udp_socket_perms;
+allow afs_t self:udp_socket all_udp_socket_perms;
+allow afs_t afsd_t:udp_socket all_udp_socket_perms; 
+allow afs_t inaddr_any_node_t:udp_socket all_udp_socket_perms;
+allow afs_t netif_t:netif { udp_recv udp_send };
+allow afs_t node_t:node { udp_recv udp_send };
+allow afs_t proc_t:file { ioctl read write };
+term_use_all_user_ptys(afs_t)
+
+require { type sshd_t; };
+dontaudit afs_t sshd_t:key all_key_perms;
Index: branches/fc15-dev/selinux/build/scripts.fc
===================================================================
--- branches/fc15-dev/selinux/build/scripts.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/scripts.fc	(revision 1803)
@@ -0,0 +1,5 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+/tmp/sessions	-d	gen_context(system_u:object_r:tmp_t,s0)
Index: branches/fc15-dev/selinux/build/scripts.if
===================================================================
--- branches/fc15-dev/selinux/build/scripts.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/scripts.if	(revision 1803)
@@ -0,0 +1,4 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
Index: branches/fc15-dev/selinux/build/scripts.te
===================================================================
--- branches/fc15-dev/selinux/build/scripts.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/scripts.te	(revision 1803)
@@ -0,0 +1,218 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(scripts,1.0.0)
+
+### USER ###
+
+require {
+	attribute domain, userdomain, unpriv_userdomain;
+	attribute can_change_process_identity, can_change_process_role;
+	type user_t, user_tmp_t;
+	type staff_t, sysadm_t;
+};
+
+corenet_tcp_bind_all_nodes(user_t)
+corenet_tcp_bind_all_ports(user_t)
+#corenet_udp_bind_generic_port(user_t)
+
+## user_setuid_t ##
+
+type user_setuid_t, domain, userdomain, unpriv_userdomain;
+role user_r types user_setuid_t;
+domain_interactive_fd(user_setuid_t)
+files_read_etc_files(user_setuid_t)
+libs_use_ld_so(user_setuid_t)
+libs_use_shared_libs(user_setuid_t)
+miscfiles_read_localization(user_setuid_t)
+corecmd_exec_all_executables(user_setuid_t)
+term_use_all_user_ptys(user_setuid_t)
+kernel_read_system_state(user_setuid_t)
+
+allow user_setuid_t bin_t:file entrypoint;
+allow user_setuid_t sbin_t:file entrypoint;
+
+# allow user_setuid_t domain to call setuid and setgid
+allow user_setuid_t self:capability { setuid setgid };
+
+# transition back to the user domain when executing "user" binaries
+domain_auto_trans(user_setuid_t, nfs_t, user_t)
+
+# allow user_setuid_t domain to signal its caller
+allow user_setuid_t user_t:process sigchld;
+
+## user_script_t ##
+userdom_base_user_template(user_script)
+userdom_basic_networking_template(user_script)
+domain_interactive_fd(user_script_t)
+corecmd_exec_all_executables(user_script_t)
+files_exec_usr_files(user_script_t)
+corenet_tcp_bind_all_nodes(user_script_t)
+corenet_tcp_bind_all_ports(user_script_t)
+corenet_udp_bind_all_nodes(user_script_t)
+corenet_udp_bind_all_ports(user_script_t)
+#corenet_udp_bind_generic_port(user_script_t)
+kerberos_use(user_script_t)
+files_read_kernel_symbol_table(user_script_t)
+kernel_dontaudit_read_ring_buffer(user_script_t)
+dev_read_urand(user_script_t)
+apache_append_log(user_script_t)
+allow user_script_t user_tmp_t:file all_file_perms;
+allow user_script_t user_tmp_t:dir all_dir_perms;
+allow user_script_t user_tmp_t:fifo_file all_fifo_file_perms;
+kernel_read_system_state(user_script_t)
+
+afs_access(user_t);
+afs_access(user_script_t);
+afs_access(user_setuid_t);
+afs_access(staff_t);
+afs_access(sysadm_t);
+zephyr_access(user_t);
+zephyr_access(user_script_t);
+
+# permit aklog:
+kernel_write_proc_files(user_t)
+#allow user_t proc_t:file write;
+
+### AFS ###
+
+require {
+	type kernel_t;
+};
+
+afs_access(kernel_t);
+zephyr_access(kernel_t);
+
+### INIT ###
+
+require {
+	type initrc_t, tmp_t;
+};
+
+# init.d script sets up cell files:
+afs_access(initrc_t);
+allow initrc_t afsd_etc_t:file { rw_file_perms setattr };
+
+# init.d makes the sessions directory:
+allow initrc_t tmp_t:dir { create setattr };
+
+# AFS fs
+kernel_write_proc_files(initrc_t)
+
+### CRON ###
+
+require {
+	type crond_t, user_cron_spool_t, user_crontab_t;
+	type system_crond_t;
+	type var_log_t;
+};
+
+afs_access(crond_t);
+afs_access(user_crontab_t);
+### crond can switch to user_t rather than user_crond_t
+### (we have pam_env set SELINUX_ROLE_TYPE to accomplish this)
+domain_cron_exemption_target(user_t)
+domain_entry_file(user_t, user_cron_spool_t)
+domain_trans(crond_t, user_cron_spool_t, user_t)
+allow user_t crond_t:process sigchld;
+allow crond_t self:process setrlimit;
+allow crond_t user_t:fd use;
+allow user_t crond_t:fd use;
+allow user_t crond_t:fifo_file rw_file_perms;
+allow crond_t user_t:fifo_file rw_file_perms;
+allow system_crond_t var_log_t:file rw_file_perms;
+
+### SSH ###
+
+require {
+	type sshd_t, sshd_tmp_t;
+};
+
+afs_access(sshd_t);
+### sshd GSSAPI authentication
+kerberos_read_keytab(sshd_t)
+# forwarded kerberos tickets via ssh -K
+allow user_t sshd_tmp_t:file r_file_perms;
+
+dontaudit user_t kernel_t:key all_key_perms;
+dontaudit user_script_t kernel_t:key all_key_perms;
+
+# (for admof)
+corecmd_exec_all_executables(sshd_t)
+kernel_write_proc_files(sshd_t)
+
+### MAIL ###
+
+require {
+	type postfix_local_t, procmail_t, sendmail_t;
+};
+
+afs_access(postfix_local_t);
+afs_access(procmail_t);
+mta_sendmail_exec(user_t)
+mta_sendmail_exec(user_script_t)
+mta_sendmail_exec(system_crond_t)
+can_exec(user_t, sendmail_exec_t)
+can_exec(user_script_t, sendmail_exec_t)
+can_exec(system_crond_t, sendmail_exec_t)
+allow sendmail_t postfix_local_t:fd use;
+allow sendmail_t postfix_local_t:fifo_file { getattr write };
+corecmd_exec_bin(procmail_t)
+corecmd_exec_sbin(procmail_t)
+
+### HTTPD ###
+
+require {
+	type httpd_t, httpd_suexec_exec_t, httpd_suexec_t;
+	role user_r;
+};
+
+afs_access(httpd_t);
+dontaudit httpd_t self:key all_key_perms;
+dontaudit httpd_t sshd_t:key all_key_perms;
+dontaudit httpd_t kernel_t:key all_key_perms;
+allow httpd_t self:process setrlimit;
+
+# SUEXEC PHASE 1
+can_exec(httpd_t, httpd_suexec_exec_t)
+domain_auto_trans(httpd_t, httpd_suexec_exec_t, httpd_suexec_t)
+apache_read_config(httpd_suexec_t)
+apache_read_log(httpd_suexec_t)
+apache_append_log(httpd_suexec_t)
+
+# SUEXEC PHASE 2
+allow httpd_suexec_t self:process { setexec };
+allow httpd_suexec_t { user_t user_script_t }:process { transition siginh rlimitinh noatsecure };
+
+# SUEXEC PHASE 3
+allow { httpd_suexec_t user_t user_script_t } httpd_t:fd { use };
+allow { httpd_suexec_t user_t user_script_t } httpd_t:fifo_file { read write };
+allow { httpd_suexec_t user_t user_script_t } httpd_t:process { sigchld };
+allow { user_t user_script_t } httpd_suexec_t:fd { use };
+allow httpd_suexec_t { user_t user_script_t }:process transition;
+typeattribute httpd_suexec_t can_change_process_identity, can_change_process_role;
+#domain_unconfined(httpd_suexec_t)
+apache_append_log(user_t)
+
+# mod_fcgid in user_t
+allow { httpd_suexec_t user_t user_script_t } httpd_t:unix_stream_socket all_unix_stream_socket_perms;
+allow httpd_t { user_t user_script_t }:process { sigkill signal };
+
+### *** ###
+
+require {
+	type var_run_t;
+};
+
+# named.pid
+allow initrc_t var_run_t:lnk_file create;
+
+# semodule -i
+require { type semanage_t, sysadm_home_t; };
+allow semanage_t sysadm_home_t:dir rw_dir_perms;
+allow semanage_t sysadm_home_t:file rw_file_perms;
+
+require { type restorecond_t, crond_t; };
+dontaudit restorecond_t kernel_t:key all_key_perms;
+dontaudit { domain userdomain crond_t } sshd_t:key all_key_perms;
Index: branches/fc15-dev/selinux/build/signup.fc
===================================================================
--- branches/fc15-dev/selinux/build/signup.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/signup.fc	(revision 1803)
@@ -0,0 +1,4 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
Index: branches/fc15-dev/selinux/build/signup.if
===================================================================
--- branches/fc15-dev/selinux/build/signup.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/signup.if	(revision 1803)
@@ -0,0 +1,4 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
Index: branches/fc15-dev/selinux/build/signup.te
===================================================================
--- branches/fc15-dev/selinux/build/signup.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/signup.te	(revision 1803)
@@ -0,0 +1,60 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(signup,1.0.0)
+
+require {
+	attribute domain, userdomain, unpriv_userdomain;
+};
+
+require { type sudo_exec_t; };
+type signup_t, domain, userdomain, unpriv_userdomain;
+type signup_su_t, domain, userdomain;
+role system_r types { signup_t signup_su_t };
+role user_r types { signup_t signup_su_t };
+afs_access(signup_t)
+afs_access(signup_su_t)
+afs_access(useradd_t)
+files_read_etc_files(signup_t)
+libs_use_ld_so(signup_t)
+libs_use_shared_libs(signup_t)
+miscfiles_read_localization(signup_t)
+files_read_etc_files(signup_su_t)
+libs_use_ld_so(signup_su_t)
+libs_use_shared_libs(signup_su_t)
+miscfiles_read_localization(signup_su_t)
+domain_auto_trans(signup_t, sudo_exec_t, signup_su_t)
+auth_rw_shadow(signup_su_t)
+sysnet_dns_name_resolve(signup_t)
+sysnet_dns_name_resolve(signup_su_t)
+usermanage_run_useradd(signup_su_t,system_r,signup_t)
+usermanage_run_groupadd(signup_su_t,system_r,signup_t)
+allow groupadd_t signup_t:fifo_file { getattr ioctl read write };
+allow groupadd_t signup_t:process sigchld;
+
+allow useradd_t { httpd_t signup_t }:fd use;
+allow useradd_t { httpd_t signup_t }:fifo_file { getattr ioctl read write};
+allow useradd_t signup_t:process sigchld;
+allow signup_su_t signup_t:fd use;
+allow signup_su_t signup_t:fifo_file { ioctl write };
+allow signup_su_t signup_t:process sigchld;
+allow signup_su_t sudo_exec_t:file entrypoint;
+allow signup_su_t self:capability { audit_write setgid setuid };
+dev_read_urand(signup_t)
+kernel_read_system_state(signup_t)
+logging_send_syslog_msg(signup_su_t)
+
+corecmd_exec_all_executables(signup_t)
+allow signup_t sbin_t:dir search;
+allow signup_t sbin_t:file { execute execute_no_trans read };
+allow signup_t shell_exec_t:file { execute execute_no_trans getattr read };
+allow signup_t self:fifo_file { getattr ioctl read write };
+
+# SUEXEC #
+require { type httpd_suexec_t, httpd_t; };
+allow httpd_suexec_t { signup_t }:process { transition siginh rlimitinh noatsecure };
+allow { signup_t } httpd_t:fd { use };
+allow { signup_t } httpd_t:fifo_file { getattr ioctl read write };
+allow { signup_t } httpd_t:process { sigchld };
+allow { signup_t } httpd_suexec_t:fd { use };
Index: branches/fc15-dev/selinux/build/zephyr.fc
===================================================================
--- branches/fc15-dev/selinux/build/zephyr.fc	(revision 1803)
+++ branches/fc15-dev/selinux/build/zephyr.fc	(revision 1803)
@@ -0,0 +1,13 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+/usr/sbin/zhm           --      gen_context(system_u:object_r:zephyr_exec_t,s0)
+/usr/bin/zaway          --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zctl           --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zleave         --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zlocate        --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/znol           --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zstat          --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zwgc           --      gen_context(system_u:object_r:zephyr_bin_t,s0)
+/usr/bin/zwrite         --      gen_context(system_u:object_r:zephyr_bin_t,s0)
Index: branches/fc15-dev/selinux/build/zephyr.if
===================================================================
--- branches/fc15-dev/selinux/build/zephyr.if	(revision 1803)
+++ branches/fc15-dev/selinux/build/zephyr.if	(revision 1803)
@@ -0,0 +1,26 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+interface(`zephyr_domtrans',`
+        gen_requires(`
+                type zephyr_t, zephyr_exec_t;
+        ')
+
+        domain_auto_trans($1,zephyr_exec_t,zephyr_t)
+
+        allow $1 zephyr_t:fd use;
+        allow zephyr_t $1:fd use;
+        allow zephyr_t:$1:fifo_file rw_file_perms;
+        allow zephyr_t $1:process sigchld;
+')
+
+template(`zephyr_access',`
+        require {
+                type zephyr_t, zephyr_bin_t;
+        }
+
+        allow $1 zephyr_t:udp_socket { read write };
+        can_exec($1, zephyr_t)
+        can_exec($1, zephyr_bin_t)
+')
Index: branches/fc15-dev/selinux/build/zephyr.te
===================================================================
--- branches/fc15-dev/selinux/build/zephyr.te	(revision 1803)
+++ branches/fc15-dev/selinux/build/zephyr.te	(revision 1803)
@@ -0,0 +1,43 @@
+# Joe Presbrey
+# presbrey@mit.edu
+# 2006/1/15
+
+policy_module(zephyr,1.0.0)
+
+########################################
+#
+# Declarations
+#
+
+type zephyr_t;
+type zephyr_bin_t;
+type zephyr_exec_t;
+domain_type(zephyr_t)
+corecmd_executable_file(zephyr_bin_t)
+init_daemon_domain(zephyr_t, zephyr_exec_t)
+
+########################################
+#
+# zephyr local policy
+
+files_read_etc_files(zephyr_t)
+files_rw_etc_runtime_files(zephyr_t)
+libs_use_ld_so(zephyr_t)
+libs_use_shared_libs(zephyr_t)
+miscfiles_read_localization(zephyr_t)
+
+init_use_fds(zephyr_t)
+init_use_script_ptys(zephyr_t)
+domain_use_interactive_fds(zephyr_t)
+term_use_console(zephyr_t)
+corenet_udp_bind_generic_port(zephyr_t)
+dev_read_urand(zephyr_t)
+sysnet_dns_name_resolve(zephyr_t)
+corenet_tcp_sendrecv_all_nodes(zephyr_t)
+corenet_udp_sendrecv_all_nodes(zephyr_t)
+corenet_tcp_sendrecv_all_ports(zephyr_t)
+corenet_udp_sendrecv_all_ports(zephyr_t)
+kerberos_use(zephyr_t)
+
+allow zephyr_t self:process setsched;
+allow zephyr_t self:capability { sys_admin sys_nice sys_tty_config };
Index: branches/fc15-dev/selinux/selinux.conf
===================================================================
--- branches/fc15-dev/selinux/selinux.conf	(revision 1803)
+++ branches/fc15-dev/selinux/selinux.conf	(revision 1803)
@@ -0,0 +1,15 @@
+# This file controls the state of SELinux on the system.
+# SELINUX= can take one of these three values:
+#	enforcing - SELinux security policy is enforced.
+#	permissive - SELinux prints warnings instead of enforcing.
+#	disabled - SELinux is fully disabled.
+SELINUX=enforcing
+# SELINUXTYPE= type of policy in use. Possible values are:
+#	targeted - Only targeted network daemons are protected.
+#	strict - Full SELinux protection.
+SELINUXTYPE=strict
+
+# SETLOCALDEFS= Check local definition changes
+SETLOCALDEFS=0 
+
+CRONTYPE=relabel
Index: branches/fc15-dev/selinux/set_booleans.sh
===================================================================
--- branches/fc15-dev/selinux/set_booleans.sh	(revision 1803)
+++ branches/fc15-dev/selinux/set_booleans.sh	(revision 1803)
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+setsebool -P \
+	allow_gssd_read_tmp=1 \
+	allow_httpd_anon_write=1 \
+	allow_httpd_staff_script_anon_write=1 \
+	allow_httpd_sys_script_anon_write=1 \
+	allow_httpd_sysadm_script_anon_write=1 \
+	allow_httpd_user_script_anon_write=1 \
+	allow_java_execstack=1 \
+	allow_kerberos=1 \
+	allow_mounton_anydir=1 \
+	allow_nfsd_anon_write=1 \
+	allow_ssh_keysign=1 \
+	allow_user_mysql_connect=1 \
+	cron_can_relabel=1 \
+	httpd_builtin_scripting=0 \
+	httpd_can_network_connect=1 \
+	httpd_can_network_connect_db=1 \
+	httpd_can_network_relay=1 \
+	httpd_enable_cgi=1 \
+	httpd_enable_homedirs=1 \
+	httpd_ssi_exec=0 \
+	httpd_tty_comm=1 \
+	nfs_export_all_ro=1 \
+	nfs_export_all_rw=1 \
+	ssh_sysadm_login=1 \
+	use_nfs_home_dirs=1 \
+	use_samba_home_dirs=1 \
+	user_ping=1 \
+	user_rw_noexattrfile=1 \
+	user_tcp_server=1
+#	allow_daemons_use_tty=1 \
+#	allow_mount_anyfile=1 \
+#	staff_read_sysadm_file=1 \
Index: branches/fc15-dev/server/README
===================================================================
--- branches/fc15-dev/server/README	(revision 1803)
+++ branches/fc15-dev/server/README	(revision 1803)
@@ -0,0 +1,11 @@
+common: 
+  distribution-independent code needed to run a scripts.mit.edu server
+
+fedora:
+  distribution-dependent code needed to run a fedora scripts.mit.edu server
+
+debian:
+  distribution-dependent code needed to run a debian scripts.mit.edu server
+
+doc:
+  documentation related to running a scripts.mit.edu server
Index: branches/fc15-dev/server/common/oursrc/accountadm/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/Makefile.in	(revision 1803)
@@ -0,0 +1,33 @@
+CC = @CC@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+sbindir = @sbindir@
+bindir = @bindir@
+sysconfdir = @sysconfdir@
+
+all-local: admof signup-scripts-frontend
+
+admof: admof.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) $< -L/usr/lib/afs -L/usr/lib64/afs -lprot -lauth -lrxkad -lubik -laudit -lsys -lrx -llwp -lsys -lafsutil -lcom_err -lresolv -lkrb5 -ldes -o $@
+
+install:
+	install -p -m644 -D mbashrc $(DESTDIR)$(sysconfdir)/mbashrc
+	install -p -m755 -D mbash $(DESTDIR)$(bindir)/mbash
+	install -p -m755 -D admof $(DESTDIR)$(bindir)/admof
+	install -p -m755 -D admof $(DESTDIR)$(sbindir)/ssh-admof
+	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
+	install -p -m755 -D ldap-backup $(DESTDIR)$(sbindir)/ldap-backup
+
+clean:
+	rm -f admof signup-scripts-frontend
+
+distclean: clean
+	rm -f mbash signup-scripts-backend
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/accountadm/admof.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/admof.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/admof.c	(revision 1803)
@@ -0,0 +1,292 @@
+/* admof
+ * Version 2.0, released 2007-12-30
+ * Anders Kaseorg <andersk@mit.edu>
+ * replacing Perl version by Jeff Arnold <jbarnold@mit.edu>
+ *
+ * Usage:
+ *   admof scripts andersk/root@ATHENA.MIT.EDU
+ * Outputs "yes" and exits with status 33 if the given principal is an
+ * administrator of the locker.
+ *
+ * Requires tokens (to authenticate/encrypt the connection to the
+ * ptserver) unless -noauth is given.
+ */
+
+#include <stdio.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <afs/vice.h>
+#include <afs/venus.h>
+#include <afs/ptclient.h>
+#include <afs/ptuser.h>
+#include <afs/prs_fs.h>
+#include <afs/ptint.h>
+#include <afs/cellconfig.h>
+#include <afs/afsutil.h>
+#include <krb5.h>
+#include <stdbool.h>
+#include <syslog.h>
+
+#define ANAME_SZ 40
+#define REALM_SZ 40
+#define INST_SZ 40
+#define MAX_K_NAME_SZ (ANAME_SZ + INST_SZ + REALM_SZ + 2)
+
+extern int pioctl(char *, afs_int32, struct ViceIoctl *, afs_int32);
+
+#define die(args...) do { fprintf(stderr, args); pr_End(); exit(1); } while(0)
+#define _STR(x) #x
+#define STR(x) _STR(x)
+
+#define SYSADMINS "system:scripts-root"
+#define SYSADMIN_CELL "athena.mit.edu"
+
+static bool
+ismember(char *user, char *group)
+{
+    int flag;
+    if (pr_IsAMemberOf(user, group, &flag) == 0)
+	return flag;
+    else
+	return 0;
+}
+
+/* Parse an ACL of n entries, returning the rights for user. */
+static int
+parse_rights(int n, const char **p, char *user)
+{
+    int rights = 0, *trights = malloc(n * sizeof(int)), i;
+    namelist tnames = {.namelist_len = n,
+		       .namelist_val = malloc(n * PR_MAXNAMELEN)};
+    idlist tids = {.idlist_len = 0,
+		   .idlist_val = NULL};
+
+    if (trights == NULL || tnames.namelist_val == NULL)
+	die("internal error: malloc failed: %m");
+
+    for (i = 0; i < n; ++i) {
+	int off;
+	if (sscanf(*p, "%" STR(PR_MAXNAMELEN) "s %d\n%n",
+		   tnames.namelist_val[i], &trights[i], &off) < 2)
+	    die("internal error: can't parse output from pioctl\n");
+	*p += off;
+    }
+
+    if (pr_NameToId(&tnames, &tids) != 0)
+	die("internal error: pr_NameToId failed");
+    if (tids.idlist_len < n)
+	die("internal error: pr_NameToId did not return enough ids");
+
+    for (i = 0; i < n; ++i) {
+	if (~rights & trights[i] &&
+	    (strcasecmp(tnames.namelist_val[i], user) == 0 ||
+	     (tids.idlist_val[i] < 0 && ismember(user, tnames.namelist_val[i]))))
+	    rights |= trights[i];
+    }
+
+    /* Note: this first free probably should be xdr_free in OpenAFS 1.5.
+     * See commits b40b606 and f02f2e8 */
+    free(tids.idlist_val);
+    tids.idlist_val = NULL;
+    free(tnames.namelist_val);
+    free(trights);
+
+    return rights;
+}
+
+/* Resolve a Kerberos principal to a name usable by the AFS PTS. */
+void
+resolve_principal(const char *name, const char *cell, char *user)
+{
+    /* Figure out the cell's realm. */
+    krb5_context context;
+    krb5_init_context(&context);
+
+    char **realm_list;
+    if (krb5_get_host_realm(context, cell, &realm_list) != 0 ||
+	realm_list[0] == NULL)
+	die("internal error: krb5_get_host_realm failed");
+
+    /* Convert the Kerberos 5 principal into a (Kerberos IV-style) AFS
+       name, omitting the realm if it equals the cell's realm. */
+    krb5_principal principal;
+    if (krb5_parse_name(context, name, &principal) != 0)
+	die("internal error: krb5_parse_name failed");
+    char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ];
+    if (krb5_524_conv_principal(context, principal, pname, pinst, prealm) != 0)
+	die("internal error: krb5_524_conv_principal failed\n");
+
+    krb5_data realm = *krb5_princ_realm(context, principal);
+    if (realm.length > REALM_SZ - 1)
+	realm.length = REALM_SZ - 1;
+    if (strlen(realm_list[0]) == realm.length &&
+	memcmp(realm.data, realm_list[0], realm.length) == 0)
+	snprintf(user, MAX_K_NAME_SZ, "%s%s%s",
+		 pname, pinst[0] ? "." : "", pinst);
+    else
+	snprintf(user, MAX_K_NAME_SZ, "%s%s%s@%.*s",
+		 pname, pinst[0] ? "." : "", pinst, realm.length, realm.data);
+
+    krb5_free_principal(context, principal);
+    krb5_free_host_realm(context, realm_list);
+    krb5_free_context(context);
+
+    /* Instead of canonicalizing the name as below, we just use
+       strcasecmp above. */
+#if 0
+    afs_int32 id;
+    if (pr_SNameToId((char *)user, &id) != 0)
+	die("bad principal\n");
+    if (id == ANONYMOUSID)
+	die("anonymous\n");
+    if (pr_SIdToName(id, user) != 0)
+	die("internal error: pr_SIdToName failed\n");
+#endif
+}
+
+int
+main(int argc, const char *argv[])
+{
+    /* Get arguments. */
+    const char *locker, *name;
+    afs_int32 secLevel;
+
+    if (argc == 3) {
+	locker = argv[1];
+	name = argv[2];
+	secLevel = 3;
+    } else if (argc == 4 && strcmp("-noauth", argv[1]) == 0) {
+	locker = argv[2];
+	name = argv[3];
+	secLevel = 0;
+    } else {
+	die("Usage: %s [-noauth] LOCKER PRINCIPAL\n", argv[0]);
+    }
+
+    /* Convert the locker into a directory. */
+    char dir[PATH_MAX];
+    int n;
+    struct passwd *pwd = getpwnam(locker);
+    if (pwd != NULL)
+	n = snprintf(dir, sizeof dir, "%s", pwd->pw_dir);
+    else
+	n = snprintf(dir, sizeof dir, "/mit/%s", locker);
+    if (n < 0 || n >= sizeof dir)
+	die("internal error\n");
+
+    /* For non-AFS homedirs, read the .k5login file. */
+    if (strncmp(dir, "/afs/", 5) != 0 && strncmp(dir, "/mit/", 5) != 0) {
+	if (chdir(dir) != 0)
+	    die("internal error: chdir: %m\n");
+	FILE *fp = fopen(".k5login", "r");
+	if (fp == NULL)
+	    die("internal error: .k5login: %m\n");
+	struct stat st;
+	if (fstat(fileno(fp), &st) != 0)
+	    die("internal error: fstat: %m\n");
+	if (st.st_uid != pwd->pw_uid && st.st_uid != 0) {
+	    fclose(fp);
+	    die("internal error: bad .k5login permissions\n");
+	}
+	bool found = false;
+	char *line = NULL;
+	size_t len = 0;
+	ssize_t read;
+	while ((read = getline(&line, &len, fp)) != -1) {
+	    if (read > 0 && line[read - 1] == '\n')
+		line[read - 1] = '\0';
+	    if (strcmp(name, line) == 0) {
+		found = true;
+		break;
+	    }
+	}
+	if (line)
+	    free(line);
+	fclose(fp);
+	if (found) {
+	    printf("yes\n");
+	    exit(33);
+	} else {
+	    printf("no\n");
+	    exit(1);
+	}
+    }
+
+    /* Get the locker's cell. */
+    char cell[MAXCELLCHARS];
+    struct ViceIoctl vi;
+    vi.in = NULL;
+    vi.in_size = 0;
+    vi.out = cell;
+    vi.out_size = sizeof cell;
+    if (pioctl(dir, VIOC_FILE_CELL_NAME, &vi, 1) != 0)
+	die("internal error: pioctl: %m\n");
+
+    if (pr_Initialize(secLevel, (char *)AFSDIR_CLIENT_ETC_DIRPATH, cell) != 0)
+	die("internal error: pr_Initialize failed\n");
+
+    /* Get the cell configuration. */
+    struct afsconf_dir *configdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH);
+    if (configdir == NULL)
+	die("internal error: afsconf_Open failed\n");
+    struct afsconf_cell cellconfig;
+    if (afsconf_GetCellInfo(configdir, cell, NULL, &cellconfig) != 0)
+	die("internal error: afsconf_GetCellInfo failed\n");
+    afsconf_Close(configdir);
+
+    char user[MAX(PR_MAXNAMELEN, MAX_K_NAME_SZ)];
+    resolve_principal(name, cellconfig.hostName[0], user);
+
+    /* Read the locker ACL. */
+    char acl[2048];
+    vi.in = NULL;
+    vi.in_size = 0;
+    vi.out = acl;
+    vi.out_size = sizeof acl;
+    if (pioctl(dir, VIOCGETAL, &vi, 1) != 0)
+	die("internal error: pioctl: %m\n");
+
+    /* Parse the locker ACL to compute the user's rights. */
+    const char *p = acl;
+
+    int nplus, nminus;
+    int off;
+    if (sscanf(p, "%d\n%d\n%n", &nplus, &nminus, &off) < 2)
+	die("internal error: can't parse output from pioctl\n");
+    p += off;
+
+    int rights = parse_rights(nplus, &p, user);
+    rights &= ~parse_rights(nminus, &p, user);
+    pr_End();
+
+#ifdef SYSADMINS
+    if (~rights & PRSFS_ADMINISTER) {
+	char sysadmins[] = SYSADMINS, sysadmin_cell[] = SYSADMIN_CELL;
+	if (pr_Initialize(secLevel, (char *)AFSDIR_CLIENT_ETC_DIRPATH, sysadmin_cell) == 0) {
+	    resolve_principal(name, sysadmin_cell, user);
+	    if (ismember(user, sysadmins)) {
+		openlog("admof", 0, LOG_AUTHPRIV);
+		syslog(LOG_NOTICE, "giving %s admin rights on %s", user, locker);
+		closelog();
+		rights |= PRSFS_ADMINISTER;
+	    }
+	    pr_End();
+	}
+	/* If not, that's okay -- the normal codepath ran fine, so don't error */
+    }
+#endif
+
+    /* Output whether the user is an administrator. */
+    if (rights & PRSFS_ADMINISTER) {
+	printf("yes\n");
+	exit(33);
+    } else {
+	printf("no\n");
+	exit(1);
+    }
+}
Index: branches/fc15-dev/server/common/oursrc/accountadm/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/configure.in	(revision 1803)
@@ -0,0 +1,29 @@
+AC_INIT(signup-scripts-frontend.c)
+
+AC_PROG_CC
+
+AC_DEFUN(REQUIRE_PATH,[
+AC_SUBST($1_path)
+if test "[$]$1_path" = ""; then
+        AC_ERROR(Cannot find $1)
+fi
+])
+
+AC_DEFUN(LOCATE,[
+AC_PATH_PROG($1_path, $1)
+REQUIRE_PATH($1)
+])
+
+dnl Needed by signup-scripts-backend.in
+
+LOCATE(hesinfo)
+LOCATE(ldapadd)
+LOCATE(sudo)
+
+dnl Needed by mbash.in
+
+LOCATE(bash)
+
+AC_OUTPUT(Makefile)
+AC_OUTPUT(signup-scripts-backend)
+AC_OUTPUT(mbash)
Index: branches/fc15-dev/server/common/oursrc/accountadm/cronload
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/cronload	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/cronload	(revision 1803)
@@ -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: branches/fc15-dev/server/common/oursrc/accountadm/ldap-backup
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/ldap-backup	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/ldap-backup	(revision 1803)
@@ -0,0 +1,172 @@
+#!/usr/bin/perl
+#
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+# 
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+# 
+# Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
+# Copyright (C) 2005 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+@instances = qw(userRoot);
+@included = qw();
+@excluded = qw();
+
+our $nowrap = 1; # output LDIF is not folded
+our $nobase64 = 0; # avoid base64 encoding
+our $noversion = 0; # don't print version line
+our $nouniqueid = 0; # don't export unique id
+our $useid2entry = 0; # use main db file only
+our $onefile = 1; # one file (MUST BE 1)
+our $printkey = 1; # print key
+our $ldiffile; # override LDIF output file location
+
+$doreplica = 0;
+$ldifdir = "/var/lib/dirsrv/slapd-scripts/ldif";
+$servid = "scripts";
+$verbose = 0;
+$rootdn = "cn=Directory Manager";
+our $passwd;
+our $passwdfile = "/etc/signup-ldap-pw";
+$i = 0;
+$insti = 0;
+$incli = 0;
+$excli = 0;
+$decrypt_on_export = 0;
+
+foreach (@ARGV) {
+    $verbose++ if ($_ eq "-v");
+}
+
+if ((!@instances && !@included) || !$rootdn || !($passwd || $passwdfile)) { &usage; exit(1); }
+
+($s, $m, $h, $dy, $mn, $yr, $wdy, $ydy, $r) = localtime(time);
+$mn++; $yr += 1900;
+$taskname = "export_${yr}_${mn}_${dy}_${h}_${m}_${s}";
+$dn = "dn: cn=$taskname, cn=export, cn=tasks, cn=config\n";
+$misc = "changetype: add\nobjectclass: top\nobjectclass: extensibleObject\n";
+$cn =  "cn: $taskname\n";
+$i = 0;
+$be = "";
+$nsinstance = "";
+foreach my $instance (@instances) {
+	$nsinstance .= "nsInstance: $instance\n";
+	if ( !$be ) {
+		$be = "$instance";
+	} else {
+		$be = "${be}-$instance";
+	}
+	$i++;
+}
+$i = 0;
+$nsincluded = "";
+foreach my $include (@included) {
+	$nsincluded .= "nsIncludeSuffix: $include\n";
+	my ($rdn, $rest) = split(/,/, $include);
+	my ($rest, $tmpbe) = split(/=/, $rdn);
+	if ( !$be ) {
+		$be = "$tmpbe";
+	} else {
+		$be = "${be}-$tmpbe";
+	}
+	$i++;
+}
+$i = 0;
+$nsexcluded = "";
+foreach my $exclude (@excluded) {
+	$nsexcluded .= "nsExcludeSuffix: $exclude\n";
+	$i++;
+}
+if ($ldiffile eq "") {
+	if ($onefile == 0) {
+		$ldiffile = "${ldifdir}/${servid}-${yr}_${mn}_${dy}_${h}_${m}_${s}.ldif";
+	} else {
+		$ldiffile = "${ldifdir}/${servid}-${be}-${yr}_${mn}_${dy}_${h}_${m}_${s}.ldif";
+	}
+}
+
+$nsreplica = "";
+if ($doreplica != 0) { $nsreplica = "nsExportReplica: true\n"; }
+$nsnobase64 = "";
+if ($nobase64 != 0) { $nsnobase64 = "nsMinimalEncoding: true\n"; }
+$nsnowrap = "";
+if ($nowrap != 0) { $nsnowrap = "nsNoWrap: true\n"; }
+$nsnoversion = "";
+if ($noversion != 0) { $nsnoversion = "nsNoVersionLine: true\n"; }
+$nsnouniqueid = "";
+if ($nouniqueid != 0) { $nsnouniqueid = "nsDumpUniqId: false\n"; }
+$nsuseid2entry = "";
+if ($useid2entry != 0) { $nsuseid2entry = "nsUseId2Entry: true\n"; }
+$nsonefile = "";
+if ($onefile != 0) { $nsonefile = "nsUseOneFile: true\n"; }
+if ($onefile == 0) { $nsonefile = "nsUseOneFile: false\n"; }
+$nsexportdecrypt = "";
+if ($decrypt_on_export != 0) { $nsexportdecrypt = "nsExportDecrypt: true\n"; }
+$nsprintkey = "";
+if ($printkey == 0) { $nsprintkey = "nsPrintKey: false\n"; }
+$nsldiffile = "nsFilename: ${ldiffile}\n";
+$entry = "${dn}${misc}${cn}${nsinstance}${nsincluded}${nsexcluded}${nsreplica}${nsnobase64}${nsnowrap}${nsnoversion}${nsnouniqueid}${nsuseid2entry}${nsonefile}${nsexportdecrypt}${nsprintkey}${nsldiffile}";
+my @vstr = ();
+if ($verbose != 0) { @vstr = ("-v"); }
+my @qstr = ("-q");
+if ($verbose) { @qstr = (); }
+$ENV{'PATH'} = "/usr/lib64/mozldap:/usr/bin:";
+print STDERR ("Exporting to ldif file: ${ldiffile}\n") if ($verbose);
+
+my @pass;
+if ($passwdfile) {
+    @pass = ("-j", $passwdfile);
+} elsif ($passwd) {
+    @pass = ("-w", $passwd);
+}
+
+my @cmd = ("ldapmodify", @vstr, @qstr, qw(-h localhost -p 389), "-D", $rootdn, @pass, "-a");
+
+print STDERR "@cmd\n" if ($verbose);
+print STDERR "$entry\n" if ($verbose);
+
+open(FOO, "|-", @cmd) or die "Couldn't start ldapmodify: $!";
+print(FOO "$entry");
+close(FOO);
+
+die "Couldn't successfully execute ldapmodify: $!" if $?;
+
+my @statuscmd = ("ldapsearch", @vstr, qw(-h localhost -p 389), "-D", $rootdn, @pass, qw(-T -b cn=export,cn=tasks,cn=config), "cn=$taskname", qw(nstaskstatus nstaskexitcode));
+
+print STDERR "Status command: @statuscmd\n" if ($verbose);
+
+my $exitstatus=255;
+
+STATUS: while (1) {
+    sleep(1);
+    open(FOO, "-|", @statuscmd) or die "Couldn't start ldapsearch: $!";
+    while (<FOO>) {
+	chomp;
+	my ($key, $value) = split(": ", $_, 2);
+	if ($key eq "nstaskstatus" && $verbose) {
+	    print STDERR "Status: $value\n";
+	}
+	if ($key eq "nstaskexitcode") {
+	    $exitstatus = $value;
+	    last STATUS;
+	}
+    }
+    close(FOO);
+}
+
+open(OUTPUT, "<", $ldiffile) or die "Couldn't open output file: $!";
+print while (<OUTPUT>);
+close(OUTPUT);
+
+exit $exitstatus;
Index: branches/fc15-dev/server/common/oursrc/accountadm/mbash.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/mbash.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/mbash.in	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+@bash_path@ --rcfile /usr/local/etc/mbashrc "$@"
Index: branches/fc15-dev/server/common/oursrc/accountadm/mbashrc
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/mbashrc	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/mbashrc	(revision 1803)
@@ -0,0 +1,87 @@
+# System-wide .bashrc file for interactive bash(1) shells.
+
+. /etc/bashrc
+
+shopt -s checkwinsize
+
+# enable bash completion in interactive shells
+
+#if [ "$PS1" -a -f /etc/bash_completion ]; then
+#    . /etc/bash_completion
+#fi
+# ~/.bashrc: executed by bash(1) for non-login shells.
+
+export PS1='[\u@\h]:\w\$ '
+umask 022
+
+__scripts_print_root_message ()
+{
+    echo "ERROR: scripts.mit.edu is a shared server, and as such" >&2
+    echo "you do not have root access." >&2
+    echo " * If you want a package installed or a setting configured," >&2
+    echo "   contact us at scripts@mit.edu." >&2
+    echo " * If you're having trouble editing a file without 'sudo'," >&2
+    echo "   try logging out and making your change from Athena." >&2
+}
+
+__scripts_print_install_message ()
+{
+    echo "ERROR: scripts.mit.edu is a shared server, and as such" >&2
+    echo "you do not have root access. We are happy to install most" >&2
+    echo "packages upon request -- please contact us at scripts@mit.edu." >&2
+}
+
+__scripts_print_edit_message ()
+{
+    echo "ERROR: scripts.mit.edu is a shared server, and as such you" >&2
+    echo "do not have root access. You can make most changes to your" >&2
+    echo "account without root access; you may need to log out of scripts," >&2
+    echo "and use your Athena account to get full permissions in your locker." >&2
+    echo "If you're having trouble, contact us at scripts@mit.edu for help." >&2
+}
+
+
+su ()
+{
+    while [[ "$1" == -* ]]; do shift; done
+    if [ $# -eq 0 ] || [ "$1" = "root" ]; then
+        __scripts_print_root_message
+    else
+        echo "su is no longer supported on scripts.mit.edu. To access your" >&2
+        echo "group locker, run ssh $1@scripts.mit.edu from Athena." >&2
+    fi
+    return 1
+}
+
+sudo ()
+{
+    case "$1" in
+        apt-get|aptitude|yum|easy_install|gem|make|./setup.py)
+            __scripts_print_install_message ;;
+        emacs|vi|vim|nano|chown|rm|fs)
+            __scripts_print_edit_message ;;
+        *)
+            __scripts_print_root_message
+    esac
+    return 1
+}
+
+# You may uncomment the following lines if you want `ls' to be colorized:
+# export LS_OPTIONS='--color=auto'
+# eval `dircolors`
+# alias ls='ls $LS_OPTIONS'
+# alias ll='ls $LS_OPTIONS -l'
+# alias l='ls $LS_OPTIONS -lA'
+#
+# Some more alias to avoid making mistakes:
+# alias rm='rm -i'
+# alias cp='cp -i'
+# alias mv='mv -i'
+
+if [ -f ~/.bashrc.scripts ]; then
+	. ~/.bashrc.scripts
+fi
+
+if [ -d ~/web_scripts ]; then
+	cd ~/web_scripts
+fi
Index: branches/fc15-dev/server/common/oursrc/accountadm/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/mrproper	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+rm -f signup-scripts-frontend admof signup-scripts-backend mbash
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-backend.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-backend.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-backend.in	(revision 1803)
@@ -0,0 +1,158 @@
+#!/usr/bin/perl
+use strict;
+
+# signup-scripts-backend
+# Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+# 
+# See /COPYRIGHT in this repository for more information.
+
+$ENV{PATH} = '';
+
+my $username = $ARGV[0];
+
+# Complain unless submitted username contains only valid characters
+complain("bad username") unless($username =~ /^[\w._-]+$/);
+
+open BANNEDUSERS, "</afs/athena.mit.edu/contrib/scripts/admin/users.banned" or
+    complain("internal error");
+while (<BANNEDUSERS>) {
+    chomp;
+    complain("banned username") if ($_ eq $username);
+}
+close(BANNEDUSERS);
+
+my %filsys;
+open HESINFO, '-|', '@hesinfo_path@', '--', $username, 'filsys' or
+    complain("internal error");
+while (<HESINFO>) {
+	chomp;
+	my %f; @f{qw(type path rw mount order)} = split / /;
+	%filsys = %f if (($f{order} || 9999) <= ($filsys{order} || 9999));
+}
+close HESINFO;
+unless (%filsys &&
+	$filsys{type} eq 'AFS' &&
+	$filsys{path} =~ /^\/afs\/[\w\._\/-]+/ &&
+	$filsys{mount} eq "/mit/$username") {
+	complain("athena user not found");
+}
+my $homedir = $filsys{path};
+
+# Tell AFS that we don't want to trigger fakestat, and confirm user's homedir
+chdir $homedir or complain("athena homedir not found");
+opendir TEMP, '.';
+closedir TEMP;
+
+# Obtain user's homedir uid
+my (undef, undef, undef, undef, $uid1, $gid1, undef, undef, undef, undef, undef, undef, undef) = stat '.' or complain("athena homedir could not be examined");
+
+# Complain if user's uid is too low or too high
+complain("bad uid") unless($uid1 > 110 and $uid1 < (1 << 31));
+
+# Complain if user's .scripts-signup file does not exist
+#complain("scripts-signup file not found") unless(-e '.scripts-signup');
+
+# Complain if the user's username is already taken
+complain("username already taken") if(getpwnam $username);
+
+# Complain if user's uid is already taken
+complain("uid already taken") if(getpwuid $uid1);
+
+if($homedir !~ /\/afs\/athena\.mit\.edu\/user\//) {
+	$gid1 = $uid1;
+}
+
+# Complain if user's gid is already taken
+complain("gid already taken") if(getgrgid $gid1);
+
+my $disabledmsg = "scripts.mit.edu signups are currently disabled";
+if(-e "/afs/athena.mit.edu/contrib/scripts/admin/nosignup") {
+	open NOSIGNUP, "</afs/athena.mit.edu/contrib/scripts/admin/nosignup" or
+		complain("internal error");
+	while (<NOSIGNUP>) {
+		chomp;
+		$disabledmsg .= "\n$_";
+	}
+	close NOSIGNUP;
+	complain($disabledmsg);
+}
+elsif(-e "/etc/nosignup") {
+	$disabledmsg .= " on this server";
+	open NOSIGNUP, "</etc/nosignup" or complain("internal error");
+	while (<NOSIGNUP>) {
+		chomp;
+		$disabledmsg .= "\n$_";
+	}
+	close NOSIGNUP;
+	complain($disabledmsg);
+}
+
+my $pid;
+defined ($pid = open LDAP, '|-') or complain("internal error");
+if (!$pid) {
+	close STDOUT;
+	open STDOUT, '>/dev/null';
+	exec '@ldapadd_path@', '-c', '-x', '-D', 'cn=Directory Manager', '-y', '/etc/signup-ldap-pw';
+	exit 1;
+}
+print LDAP <<EOF;
+dn: uid=$username,ou=People,dc=scripts,dc=mit,dc=edu
+objectClass: posixAccount
+cn: $username
+uid: $username
+uidNumber: $uid1
+gidNumber: $gid1
+homeDirectory: $homedir
+loginShell: /usr/local/bin/mbash
+
+dn: cn=$username,ou=Groups,dc=scripts,dc=mit,dc=edu
+objectClass: posixGroup
+cn: $username
+gidNumber: $gid1
+
+dn: apacheServerName=$username.scripts.mit.edu,ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+objectClass: apacheConfig
+apacheServerName: $username.scripts.mit.edu
+apacheServerAlias: $username.scripts
+apacheDocumentRoot: $homedir/web_scripts
+apacheSuexecUid: $uid1
+apacheSuexecGid: $gid1
+
+dn: scriptsVhostName=$username.scripts.mit.edu,ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+objectClass: scriptsVhost
+scriptsVhostName: $username.scripts.mit.edu
+scriptsVhostAlias: $username.scripts
+scriptsVhostAccount: uid=$username,ou=People,dc=scripts,dc=mit,dc=edu
+scriptsVhostDirectory: 
+
+EOF
+close LDAP or complain("internal error");
+# Add disk quota for user
+#system('@sudo_path@', '-u', 'root', '/usr/sbin/setquota', $username, '0', '25000', '0', '10000', '-a');
+
+printexit("done", 0);
+
+sub complain {
+  my ($complaint) = @_;
+  printexit($complaint, 1);
+}
+
+sub printexit {
+  my ($msg, $status) = @_;
+  print $msg;
+  exit($status);
+}
Index: branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-frontend.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-frontend.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/signup-scripts-frontend.c	(revision 1803)
@@ -0,0 +1,48 @@
+/*
+ * signup-scripts-frontend
+ * Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * See /COPYRIGHT in this repository for more information.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+extern char **environ;
+
+int main(int argc, char **argv) {
+	environ=NULL;
+	if(argc != 2) {
+		exit(1);
+	}
+
+	char uid[21]; // 64-bit uid requires 21
+	int retval = snprintf(uid, 21, "%d", getuid());
+	if(retval < 0 || retval >= 21) {
+		exit(1);
+	}
+	if(setreuid(geteuid(), -1) != 0) {
+		exit(1);
+	}
+	char *v[3];
+#define BACKEND_PATH "/usr/local/sbin/signup-scripts-backend"
+	v[0] = BACKEND_PATH;
+	v[1] = argv[1];
+	v[2] = NULL;
+	execv(BACKEND_PATH, v);
+	return 1;
+}
Index: branches/fc15-dev/server/common/oursrc/accountadm/vhostadd
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/vhostadd	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/vhostadd	(revision 1803)
@@ -0,0 +1,74 @@
+#!/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
+
+while read attr value; do
+    echo "$attr" "$value"
+    case "$attr" in
+	dn:) user_dn=$value;;
+	uid:) user=$value;;
+	uidNumber:) uid=$value;;
+	gidNumber:) gid=$value;;
+	homeDirectory:) home=$value;;
+    esac
+done < <(ldapsearch -LLL -x -b ou=People,dc=scripts,dc=mit,dc=edu "(uid=$user)" dn uid uidNumber gidNumber homeDirectory | perl -0pe 's/\n //g;')
+
+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
+
+dn: scriptsVhostName=$host,ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+objectClass: scriptsVhost
+objectClass: top
+scriptsVhostName: $host
+EOF
+
+if [ "${host%mit.edu}" != "$host" ]; then
+    cat <<EOF >> "$tmpfile"
+scriptsVhostAlias: ${host%.mit.edu}
+EOF
+fi
+
+cat <<EOF >> "$tmpfile"
+scriptsVhostAccount: $user_dn
+scriptsVhostDirectory: ${subdir#/}
+EOF
+
+exec ldapvi --add --in "$tmpfile"
Index: branches/fc15-dev/server/common/oursrc/accountadm/vhostedit
===================================================================
--- branches/fc15-dev/server/common/oursrc/accountadm/vhostedit	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/accountadm/vhostedit	(revision 1803)
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+if [ ! "$1" ]; then
+    echo "Usage: $0 <vhost>"
+    exit 2
+fi
+
+exec ldapvi -b dc=scripts,dc=mit,dc=edu "(|(&(objectClass=apacheConfig)(|(apacheServerName=$1)(apacheServerAlias=$1)))(&(objectClass=scriptsVhost)(|(scriptsVhostName=$1)(scriptsVhostAlias=$1))))"
Index: branches/fc15-dev/server/common/oursrc/athrun/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/athrun/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/athrun/Makefile.in	(revision 1803)
@@ -0,0 +1,14 @@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+
+all-local:
+
+install:
+	install -p -m755 -D athrun.sh $(DESTDIR)$(bindir)/athrun
+
+clean:
+
+distclean: clean
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/athrun/athrun.sh
===================================================================
--- branches/fc15-dev/server/common/oursrc/athrun/athrun.sh	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/athrun/athrun.sh	(revision 1803)
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# An analog of the Athena athrun utility for scripts.mit.edu.
+# The Athena athrun was written by Greg Hudson.
+# This version was kludged by Mitchell Berger.
+# "athrun moira" runs moira from the moira locker.
+# "athrun gnu gls -l" runs gls -l from the gnu locker.
+
+case $# in
+0)
+  echo "Usage: athrun locker [program] [args ...]" >&2
+  exit 1
+  ;;
+1)
+  exec "/mit/$1/arch/@sys/bin/$1"
+  ;;
+*)
+  locker=$1
+  program=$2
+  shift 2;
+  exec "/mit/$locker/arch/@sys/bin/$program" "$@"
+  ;;
+esac
Index: branches/fc15-dev/server/common/oursrc/athrun/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/athrun/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/athrun/configure.in	(revision 1803)
@@ -0,0 +1,5 @@
+AC_INIT()
+
+AC_PROG_CC
+
+AC_OUTPUT(Makefile)
Index: branches/fc15-dev/server/common/oursrc/athrun/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/athrun/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/athrun/mrproper	(revision 1803)
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/execsys/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/Makefile.in	(revision 1803)
@@ -0,0 +1,36 @@
+CC = @CC@
+CFLAGS = @CFLAGS@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libexecdir = @libexecdir@
+sysconfdir = @sysconfdir@
+sbindir = @sbindir@
+APACHEDIR = /etc/httpd
+SYSCATPATH = /usr/local/bin
+trusteddir = /usr/libexec/scripts-trusted
+
+all-local: static-cat
+
+static-cat.c: static-cat.c.pre
+	syscat_path=$(SYSCATPATH)/static-cat perl upd-execsys
+
+install: all-local
+	install -D -p -m644 execsys.conf $(DESTDIR)$(APACHEDIR)/conf.d/execsys.conf
+	install -D -p -m755 execsys-binfmt $(DESTDIR)/etc/init.d/execsys-binfmt
+	install -D -p -m755 static-cat $(DESTDIR)$(SYSCATPATH)/static-cat
+	install -D -p -m755 ldapize.pl $(DESTDIR)$(sbindir)/ldapize.pl
+
+	install -D -p -m755 svnproxy.pl $(DESTDIR)$(sbindir)/svnproxy.pl
+	install -D -p -m755 svn $(DESTDIR)$(trusteddir)/svn
+	install -D -p -m644 scripts-svn.xinetd $(DESTDIR)/etc/xinetd.d/scripts-svn
+
+	install -D -p -m755 gitproxy.pl $(DESTDIR)$(sbindir)/gitproxy.pl
+	install -D -p -m755 git $(DESTDIR)$(trusteddir)/git
+	install -D -p -m644 scripts-git.xinetd $(DESTDIR)/etc/xinetd.d/scripts-git
+
+clean:
+	rm -f static-cat
+
+distclean: clean
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/execsys/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/configure.in	(revision 1803)
@@ -0,0 +1,5 @@
+AC_INIT(static-cat.c.pre)
+
+AC_PROG_CC
+
+AC_OUTPUT(Makefile)
Index: branches/fc15-dev/server/common/oursrc/execsys/execsys-binfmt
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/execsys-binfmt	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/execsys-binfmt	(revision 1803)
@@ -0,0 +1,54 @@
+#!/bin/sh
+#
+# execsys-binfmt: test1
+#
+# chkconfig: 2345 2 98
+# description: test2
+#
+### BEGIN INIT INFO
+# Provides:          execsys-binfmt
+# Required-Start:    $syslog
+# Required-Stop:     $syslog
+# Should-Start:      $local_fs
+# Should-Stop:       $local_fs
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start scripts.mit.edu execsys system
+# Description:       Decides what interpreter to use to execute files
+### END INIT INFO
+
+stop ()
+{
+    echo "-1" > /proc/sys/fs/binfmt_misc/status
+    umount /proc/sys/fs/binfmt_misc
+}
+
+start ()
+{
+    mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
+    echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
+}
+
+case "$1" in
+start)
+    stop 2>/dev/null || :
+    start
+    ;;
+stop)
+    stop
+    ;;
+force-reload)
+    stop
+    start
+    ;;
+restart)
+    stop
+    start
+    ;;
+*)
+    echo "Usage: $0 [start|stop|restart|force-reload]" >&2
+    exit 2
+    ;;
+esac
+
+exit $?
Index: branches/fc15-dev/server/common/oursrc/execsys/git
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/git	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/git	(revision 1803)
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+case "$1" in
+*/.. | */../*)
+    exit 1
+    ;;
+${HOME%/Scripts}/Scripts/git/*)
+    exec /usr/bin/git daemon --inetd --base-path="$1"
+    ;;
+*)
+    exit 1
+    ;;
+esac
Index: branches/fc15-dev/server/common/oursrc/execsys/gitproxy.pl
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/gitproxy.pl	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/gitproxy.pl	(revision 1803)
@@ -0,0 +1,106 @@
+#!/usr/bin/perl
+#
+# gitproxy: Wrapper around git daemon for Git virtual hosting.
+# version 1.1, released 2008-12-28
+# Copyright © 2008 Anders Kaseorg <andersk@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+use strict;
+use warnings;
+use IPC::Open2;
+use Errno qw(EINTR);
+use IO::Poll qw(POLLIN POLLOUT POLLHUP);
+
+# Receive the first message from the client, and parse out the URL.
+my $host;
+my $msg = '';
+for (;;) {
+    my $n = sysread(STDIN, my $buf, 4096);
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "$0: read: $!";
+    $n > 0 or die "$0: unexpected message from client";
+    $msg .= $buf;
+    my $len;
+    if (($len) = $msg =~ m/^([[:xdigit:]]{4})/ and length($msg) >= hex($len)) {
+	foreach (split("\0", $')) {
+	    last if ($host) = m/^host=(.*)$/;
+	}
+	last if defined($host);
+	die "$0: no host found in client message";
+    } elsif ($msg !~ m/^[[:xdigit:]]{0,3}$/) {
+	die "$0: unexpected message from client";
+    }
+}
+
+# Now start the real git daemon based on the URL.
+my $pid = open2(\*IN, \*OUT, '/usr/local/sbin/ldapize.pl', "git://$host/") or die "$0: open: $!";
+
+# Finally, go into a poll loop to transfer the remaining data
+# (STDIN -> OUT, IN -> STDOUT), including the client's message to git daemon.
+my ($cbuf, $sbuf) = ($msg, '');
+my $poll = new IO::Poll;
+$poll->mask(\*STDOUT => POLLHUP);
+$poll->mask(\*OUT => POLLOUT);
+$poll->remove(\*STDIN);
+$poll->mask(\*IN => POLLIN);
+while ($poll->handles()) {
+    my $n = $poll->poll();
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "select: $!";
+    if ($poll->events(\*STDIN)) {
+	my $n = sysread(STDIN, $cbuf, 4096);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "read: $!";
+	$poll->remove(\*STDIN);
+	$poll->mask(\*OUT => POLLOUT);
+    } elsif ($poll->events(\*IN)) {
+	my $n = sysread(IN, $sbuf, 4096);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "read: $!";
+	$poll->remove(\*IN);
+	$poll->mask(\*STDOUT => POLLOUT);
+    } elsif ($poll->events(\*STDOUT) & POLLOUT && $sbuf ne '') {
+	my $n = syswrite(STDOUT, $sbuf);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "write: $!";
+	$sbuf = substr($sbuf, $n);
+	if ($sbuf eq '') {
+	    $poll->mask(\*STDOUT => POLLHUP);
+	    $poll->mask(\*IN => POLLIN);
+	}
+    } elsif ($poll->events(\*STDOUT)) {
+	$poll->remove(\*STDOUT);
+	$poll->remove(\*IN);
+	close(STDOUT) or die "close: $!";
+	close(IN) or die "close: $!";
+    } elsif ($poll->events(\*OUT) & POLLOUT && $cbuf ne '') {
+	my $n = syswrite(OUT, $cbuf);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "write: $!";
+	$cbuf = substr($cbuf, $n);
+	if ($cbuf eq '') {
+	    $poll->mask(\*OUT => POLLHUP);
+	    $poll->mask(\*STDIN => POLLIN);
+	}
+    } elsif ($poll->events(\*OUT)) {
+	$poll->remove(\*OUT);
+	$poll->remove(\*STDIN);
+	close(OUT) or die "close: $!";
+	close(STDIN) or die "close: $!";
+    }
+}
+
+while (waitpid($pid, 0) == -1 && $! == EINTR) { }
Index: branches/fc15-dev/server/common/oursrc/execsys/ldapize.pl
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/ldapize.pl	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/ldapize.pl	(revision 1803)
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Net::LDAP;
+use Net::LDAP::Filter;
+
+sub report_error
+{
+    my $proto = shift;
+    my $mesg = shift;
+
+    if ($proto eq 'git') {
+        $mesg = "ERR \n  " . $mesg . "\n";
+        my $len = length($mesg)+4;
+        printf "%04x%s", $len, $mesg;
+    } else {
+        print $mesg;
+    }
+    exit 0;
+}
+
+my $url = $ARGV[0];
+my ($proto, $hostname, $path) = $url =~ m|^(.*?)://([^/]*)(.*)| or die "Could not match URL";
+my $mesg;
+
+# oh my gosh Net::LDAP::Filter SUCKS
+my $filter = bless({and =>
+    [{equalityMatch => {attributeDesc  => 'objectClass',
+                        assertionValue => 'scriptsVhost'}},
+     {or =>
+         [{equalityMatch => {attributeDesc  => 'scriptsVhostName',
+                             assertionValue => $hostname}},
+          {equalityMatch => {attributeDesc  => 'scriptsVhostAlias',
+                             assertionValue => $hostname}}]}]},
+    'Net::LDAP::Filter');
+
+my $ldap = Net::LDAP->new("ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/");
+$mesg = $ldap->bind();
+$mesg->code && die $mesg->error;
+
+$mesg = $ldap->search(base => "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu",
+                      filter => $filter);
+$mesg->code && die $mesg->error;
+
+my $vhostEntry = $mesg->pop_entry;
+if (!$vhostEntry)
+{
+    report_error($proto, "Could not find Host $hostname");
+}
+my $vhostDirectory = $vhostEntry->get_value('scriptsVhostDirectory');
+
+$mesg = $ldap->search(base => $vhostEntry->get_value('scriptsVhostAccount'),
+                      scope => 'base', filter => 'objectClass=posixAccount');
+$mesg->code && die $mesg->error;
+
+my $userEntry = $mesg->pop_entry;
+my ($homeDirectory, $uidNumber, $gidNumber) =
+    map { $userEntry->get_value($_) } qw(homeDirectory uidNumber gidNumber);
+
+if ($proto eq 'svn') {
+  chdir '/usr/libexec/scripts-trusted';
+  exec('/usr/sbin/suexec', $uidNumber, $gidNumber, '/usr/libexec/scripts-trusted/svn', "$homeDirectory/Scripts/svn/$vhostDirectory");
+} elsif ($proto eq 'git') {
+  chdir '/usr/libexec/scripts-trusted';
+  exec('/usr/sbin/suexec', $uidNumber, $gidNumber, '/usr/libexec/scripts-trusted/git', "$homeDirectory/Scripts/git/$vhostDirectory");
+} elsif ($proto eq 'http') {
+  print "suexec $uidNumber $gidNumber $homeDirectory/Scripts/web/$vhostDirectory/$path\n";
+} else {
+  die "Unknown protocol\n";
+}
Index: branches/fc15-dev/server/common/oursrc/execsys/mime.types
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/mime.types	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/mime.types	(revision 1803)
@@ -0,0 +1,510 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s).  Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# Extra types can either be added here or by using an AddType directive
+# in your config files. For more information about Internet media types,
+# please read RFC 2045, 2046, 2047, 2048, and 2077.  The Internet media type
+# registry is at <http://www.iana.org/assignments/media-types/>.
+
+# MIME type			Extension
+application/EDI-Consent
+application/EDI-X12
+application/EDIFACT
+application/activemessage
+application/andrew-inset	ez
+application/applefile
+application/atomicmail
+application/batch-SMTP
+application/beep+xml
+application/cals-1840
+application/commonground
+application/cybercash
+application/dca-rft
+application/dec-dx
+application/dvcs
+application/eshop
+application/http
+application/hyperstudio
+application/iges
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/font-tdpfr
+application/java-archive	jar
+application/mac-binhex40	hqx
+application/mac-compactpro	cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/mathematica-old
+application/msword		doc
+application/news-message-id
+application/news-transmission
+application/ocsp-request
+application/ocsp-response
+application/octet-stream	bin dms lha lzh exe class so dll img iso il ttf otf
+application/ogg			ogg
+application/parityfec
+application/pdf			pdf
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature
+application/pkcs10
+application/pkcs7-mime
+application/pkcs7-signature
+application/pkix-cert
+application/pkix-crl
+application/pkixcmp
+application/postscript		ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww
+application/prs.nprend
+application/qsig
+application/remote-printing
+application/riscos
+application/rtf			rtf
+application/sdp
+application/set-payment
+application/set-payment-initiation
+application/set-registration
+application/set-registration-initiation
+application/sgml
+application/sgml-open-catalog
+application/sieve
+application/slate
+application/smil		smi smil
+application/timestamp-query
+application/timestamp-reply
+application/vemmi
+application/vnd.3M.Post-it-Notes
+application/vnd.FloGraphIt
+application/vnd.accpac.simply.aso
+application/vnd.accpac.simply.imp
+application/vnd.acucobol
+application/vnd.aether.imp
+application/vnd.anser-web-certificate-issue-initiation
+application/vnd.anser-web-funds-transfer-initiation
+application/vnd.audiograph
+application/vnd.businessobjects
+application/vnd.bmi
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.claymore
+application/vnd.commerce-battelle
+application/vnd.commonspace
+application/vnd.comsocaller
+application/vnd.contact.cmsg
+application/vnd.cosmocaller
+application/vnd.cups-postscript
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.ctc-posml
+application/vnd.cybank
+application/vnd.dna
+application/vnd.dpgraph
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven
+application/vnd.epson.esf
+application/vnd.epson.msf
+application/vnd.epson.quickanime
+application/vnd.epson.salt
+application/vnd.epson.ssf
+application/vnd.ericsson.quickcall
+application/vnd.eudora.data
+application/vnd.fdf
+application/vnd.ffsns
+application/vnd.framemaker
+application/vnd.fsc.weblaunch
+application/vnd.fujitsu.oasys
+application/vnd.fujitsu.oasys2
+application/vnd.fujitsu.oasys3
+application/vnd.fujitsu.oasysgp
+application/vnd.fujitsu.oasysprs
+application/vnd.fujixerox.ddd
+application/vnd.fujixerox.docuworks
+application/vnd.fujixerox.docuworks.binder
+application/vnd.fut-misnet
+application/vnd.grafeq
+application/vnd.groove-account
+application/vnd.groove-identity-message
+application/vnd.groove-injector
+application/vnd.groove-tool-message
+application/vnd.groove-tool-template
+application/vnd.groove-vcard
+application/vnd.hhe.lesson-player
+application/vnd.hp-HPGL
+application/vnd.hp-PCL
+application/vnd.hp-PCLXL
+application/vnd.hp-hpid
+application/vnd.hp-hps
+application/vnd.httphone
+application/vnd.hzn-3d-crossword
+application/vnd.ibm.afplinedata
+application/vnd.ibm.MiniPay
+application/vnd.ibm.modcap
+application/vnd.informix-visionary
+application/vnd.intercon.formnet
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo
+application/vnd.intu.qfx
+application/vnd.irepository.package+xml
+application/vnd.is-xpr
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.koan
+application/vnd.lotus-1-2-3
+application/vnd.lotus-approach
+application/vnd.lotus-freelance
+application/vnd.lotus-notes
+application/vnd.lotus-organizer
+application/vnd.lotus-screencam
+application/vnd.lotus-wordpro
+application/vnd.mcd
+application/vnd.mediastation.cdkey
+application/vnd.meridian-slingshot
+application/vnd.mif		mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf
+application/vnd.mobius.dis
+application/vnd.mobius.msl
+application/vnd.mobius.plc
+application/vnd.mobius.txf
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.mozilla.xul+xml
+application/vnd.ms-artgalry
+application/vnd.ms-asf
+application/vnd.ms-excel	xls
+application/vnd.ms-lrm
+application/vnd.ms-powerpoint	ppt
+application/vnd.ms-project
+application/vnd.ms-tnef
+application/vnd.ms-works
+application/vnd.mseq
+application/vnd.msign
+application/vnd.music-niff
+application/vnd.musician
+application/vnd.netfpx
+application/vnd.noblenet-directory
+application/vnd.noblenet-sealer
+application/vnd.noblenet-web
+application/vnd.novadigm.EDM
+application/vnd.novadigm.EDX
+application/vnd.novadigm.EXT
+application/vnd.oasis.opendocument.chart	odc
+application/vnd.oasis.opendocument.database	odb
+application/vnd.oasis.opendocument.formula	odf
+application/vnd.oasis.opendocument.graphics	odg
+application/vnd.oasis.opendocument.graphics-template	otg
+application/vnd.oasis.opendocument.image	odi
+application/vnd.oasis.opendocument.presentation	odp
+application/vnd.oasis.opendocument.presentation-template	otp
+application/vnd.oasis.opendocument.spreadsheet	ods
+application/vnd.oasis.opendocument.spreadsheet-template	ots
+application/vnd.oasis.opendocument.text	odt
+application/vnd.oasis.opendocument.text-master	odm
+application/vnd.oasis.opendocument.text-template	ott
+application/vnd.oasis.opendocument.text-web	oth
+application/vnd.osa.netdeploy
+application/vnd.palm
+application/vnd.pg.format
+application/vnd.pg.osasli
+application/vnd.powerbuilder6
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.previewsystems.box
+application/vnd.publishare-delta-tree
+application/vnd.pvi.ptid1
+application/vnd.pwg-xhtml-print+xml
+application/vnd.rapid
+application/vnd.s3sms
+application/vnd.seemail
+application/vnd.shana.informed.formdata
+application/vnd.shana.informed.formtemplate
+application/vnd.shana.informed.interchange
+application/vnd.shana.informed.package
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.sun.xml.writer	sxw
+application/vnd.sun.xml.writer.template	stw
+application/vnd.sun.xml.calc	sxc
+application/vnd.sun.xml.calc.template	stc
+application/vnd.sun.xml.draw	sxd
+application/vnd.sun.xml.draw.template	std
+application/vnd.sun.xml.impress	sxi
+application/vnd.sun.xml.impress.template	sti
+application/vnd.sun.xml.writer.global	sxg
+application/vnd.sun.xml.math	sxm
+application/vnd.street-stream
+application/vnd.svd
+application/vnd.swiftview-ics
+application/vnd.triscape.mxs
+application/vnd.trueapp
+application/vnd.truedoc
+application/vnd.tve-trigger
+application/vnd.ufdl
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio
+application/vnd.vividence.scriptfile
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml	wbxml
+application/vnd.wap.wmlc	wmlc
+application/vnd.wap.wmlscriptc	wmlsc
+application/vnd.webturbo
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf
+application/vnd.xara
+application/vnd.xfdl
+application/vnd.yellowriver-custom-menu
+application/whoispp-query
+application/whoispp-response
+application/wita
+application/wordperfect5.1
+application/x-bcpio		bcpio
+application/x-bittorrent	torrent
+application/x-bzip2		bz2
+application/x-cdlink		vcd
+application/x-chess-pgn		pgn
+application/x-compress
+application/x-cpio		cpio
+application/x-csh		csh
+application/x-director		dcr dir dxr
+application/x-dvi		dvi
+application/x-futuresplash	spl
+application/x-gtar		gtar
+application/x-gzip		gz tgz
+application/x-hdf		hdf
+application/x-javascript	js
+application/x-kword		kwd kwt
+application/x-kspread		ksp
+application/x-kpresenter	kpr kpt
+application/x-kchart		chrt
+application/x-killustrator	kil
+application/x-koan		skp skd skt skm
+application/x-latex		latex
+application/x-netcdf		nc cdf
+# This conflicts with audio/x-pn-realaudio-plugin, which is commented out below.
+application/x-rpm		rpm
+application/x-sh		sh
+application/x-shar		shar
+application/x-shockwave-flash	swf
+application/x-stuffit		sit
+application/x-sv4cpio		sv4cpio
+application/x-sv4crc		sv4crc
+application/x-tar		tar
+application/x-tcl		tcl
+application/x-tex		tex
+application/x-texinfo		texinfo texi
+application/x-troff		t tr roff
+application/x-troff-man		man
+application/x-troff-me		me
+application/x-troff-ms		ms
+application/x-ustar		ustar
+application/x-wais-source	src
+application/x400-bp
+application/xhtml+xml		xhtml xht
+application/xml
+application/xml-dtd
+application/xml-external-parsed-entity
+application/zip			zip
+audio/32kadpcm
+audio/basic			au snd
+audio/g.722.1
+audio/l16
+audio/midi			mid midi kar
+audio/mp4a-latm
+audio/mpa-robust
+audio/mpeg			mpga mp2 mp3
+audio/parityfec
+audio/prs.sid
+audio/telephone-event
+audio/tone
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff			aif aiff aifc
+audio/x-mpegurl			m3u
+audio/x-pn-realaudio		ram rm
+#audio/x-pn-realaudio-plugin	rpm
+audio/x-realaudio		ra
+audio/x-wav			wav
+chemical/x-pdb			pdb
+chemical/x-xyz			xyz
+image/bmp			bmp
+image/cgm
+image/g3fax
+image/gif			gif
+image/ief			ief
+image/jpeg			jpeg jpg jpe
+image/naplps
+image/png			png
+image/prs.btif
+image/prs.pti
+image/svg+xml			svg
+image/tiff			tiff tif
+image/vnd.cns.inf2
+image/vnd.djvu			djvu djv
+image/vnd.dwg
+image/vnd.dxf
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/vnd.fujixerox.edmics-mmr
+image/vnd.fujixerox.edmics-rlc
+image/vnd.microsoft.icon	ico
+image/vnd.mix
+image/vnd.net-fpx
+image/vnd.svf
+image/vnd.wap.wbmp		wbmp
+image/vnd.xiff
+image/x-cmu-raster		ras
+image/x-portable-anymap		pnm
+image/x-portable-bitmap		pbm
+image/x-portable-graymap	pgm
+image/x-portable-pixmap		ppm
+image/x-rgb			rgb
+image/x-xbitmap			xbm
+image/x-xpixmap			xpm
+image/x-xwindowdump		xwd
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/http
+message/news
+message/partial
+message/rfc822
+message/s-http
+model/iges			igs iges
+model/mesh			msh mesh silo
+model/vnd.dwf
+model/vnd.flatland.3dml
+model/vnd.gdl
+model/vnd.gs-gdl
+model/vnd.gtw
+model/vnd.mts
+model/vnd.vtu
+model/vrml			wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar
+text/css			css
+text/directory
+text/enriched
+text/html			html htm
+text/parityfec
+text/plain			asc txt
+text/prs.lines.tag
+text/rfc822-headers
+text/richtext			rtx
+text/rtf			rtf
+text/sgml			sgml sgm
+text/tab-separated-values	tsv
+text/t140
+text/uri-list
+text/vnd.DMClientScript
+text/vnd.IPTC.NITF
+text/vnd.IPTC.NewsML
+text/vnd.abc
+text/vnd.curl
+text/vnd.flatland.3dml
+text/vnd.fly
+text/vnd.fmi.flexstor
+text/vnd.in3d.3dml
+text/vnd.in3d.spot
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml		wml
+text/vnd.wap.wmlscript		wmls
+text/x-setext			etx
+text/xml			xml xsl
+text/xml-external-parsed-entity
+video/mp4v-es
+video/mpeg			mpeg mpg mpe
+video/parityfec
+video/pointer
+video/quicktime			qt mov
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl		mxu
+video/vnd.mts
+video/vnd.nokia.interleaved-multimedia
+video/vnd.vivo
+video/x-msvideo			avi
+video/x-sgi-movie		movie
+video/x-ms-wmv			wmv
+x-conference/x-cooltalk		ice
+application/xaml+xml		xaml
+application/x-silverlight-app	xap
Index: branches/fc15-dev/server/common/oursrc/execsys/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/mrproper	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm -f static-cat
+rm -f configure config.* Makefile
+rm -f static-cat.c execsys.conf
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/execsys/scripts-git.xinetd
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/scripts-git.xinetd	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/scripts-git.xinetd	(revision 1803)
@@ -0,0 +1,11 @@
+service git
+{
+	disable			= no
+	port			= 9418
+	socket_type		= stream
+	protocol		= tcp
+	wait			= no
+	user			= apache
+	passenv			= PATH
+	server			= /usr/local/sbin/gitproxy.pl
+}
Index: branches/fc15-dev/server/common/oursrc/execsys/scripts-svn.xinetd
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/scripts-svn.xinetd	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/scripts-svn.xinetd	(revision 1803)
@@ -0,0 +1,12 @@
+service svn
+{
+	disable			= no
+	port			= 3690
+	socket_type		= stream
+	protocol		= tcp
+	wait			= no
+	user			= apache
+	passenv			= PATH
+	server			= /usr/local/sbin/svnproxy.pl
+#	bind			= 127.0.0.1
+}
Index: branches/fc15-dev/server/common/oursrc/execsys/static-cat.c.pre
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/static-cat.c.pre	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/static-cat.c.pre	(revision 1803)
@@ -0,0 +1,357 @@
+/*
+ * static-cat
+ * Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ * 
+ * See /COPYRIGHT in this repository for more information.
+ */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <time.h>
+
+// Map from extensions to content-types
+
+// START-AUTOGENERATED: DO NOT EDIT THIS SECTION, INCLUDING THIS LINE!
+// This section is populated by the script upd-execsys
+// END-AUTOGENERATED: DO NOT EDIT THIS SECTION, INCLUDING THIS LINE!
+
+// Start code from w3c's libwww library
+// (as obtained from http://www.w3.org/Library/src/HTWWWStr.html)
+
+char *months[12] = {
+	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
+	"Oct", "Nov", "Dec"
+};
+
+char *wkdays[7] = {
+	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+/*
+**	Returns a string pointer to a static area of the current calendar
+**	time in RFC 1123 format, for example
+**
+**		Sun, 06 Nov 1994 08:49:37 GMT
+**
+**	The result can be given in both local and GMT dependent on the flag
+*/
+const char *HTDateTimeStr(time_t * calendar, int local)
+{
+	static char buf[40];
+
+#ifdef HAVE_STRFTIME
+	if (local) {
+		/*
+		 ** Solaris 2.3 has a bug so we _must_ use reentrant version
+		 ** Thomas Maslen <tmaslen@verity.com>
+		 */
+#if defined(HT_REENTRANT) || defined(SOLARIS)
+		struct tm loctime;
+		localtime_r(calendar, &loctime);
+		strftime(buf, 40, "%a, %d %b %Y %H:%M:%S", &loctime);
+#else
+		struct tm *loctime = localtime(calendar);
+		strftime(buf, 40, "%a, %d %b %Y %H:%M:%S", loctime);
+#endif				/* SOLARIS || HT_REENTRANT */
+	} else {
+#if defined(HT_REENTRANT) || defined(SOLARIS)
+		struct tm gmt;
+		gmtime_r(calendar, &gmt);
+		strftime(buf, 40, "%a, %d %b %Y %H:%M:%S GMT", &gmt);
+#else
+		struct tm *gmt = gmtime(calendar);
+		strftime(buf, 40, "%a, %d %b %Y %H:%M:%S GMT", gmt);
+#endif				/* SOLARIS || HT_REENTRANT */
+	}
+#else
+	if (local) {
+#if defined(HT_REENTRANT)
+		struct tm loctime;
+		localtime_r(calendar, &loctime);
+#else
+		struct tm *loctime = localtime(calendar);
+#endif				/* HT_REENTRANT */
+		sprintf(buf, "%s, %02d %s %04d %02d:%02d:%02d",
+			wkdays[loctime->tm_wday],
+			loctime->tm_mday,
+			months[loctime->tm_mon],
+			loctime->tm_year + 1900,
+			loctime->tm_hour, loctime->tm_min,
+			loctime->tm_sec);
+	} else {
+#if defined(HT_REENTRANT) || defined(SOLARIS)
+		struct tm gmt;
+		gmtime_r(calendar, &gmt);
+#else
+		struct tm *gmt = gmtime(calendar);
+#endif
+		sprintf(buf, "%s, %02d %s %04d %02d:%02d:%02d GMT",
+			wkdays[gmt->tm_wday],
+			gmt->tm_mday,
+			months[gmt->tm_mon],
+			gmt->tm_year + 1900, gmt->tm_hour, gmt->tm_min,
+			gmt->tm_sec);
+	}
+#endif
+	return buf;
+}
+
+// End code from w3c's libwww library
+
+// Start code from gnu
+// (as obtained from "apt-get source coreutils" on debian sarge)
+
+// JBA: included by safe_read.h, safe_write.h, full_read.h, and full_write.h
+#include <stddef.h>
+
+// JBA: included by safe_read.c and full_write.c
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+// JBA: included by safe_read.c and full_write.c
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+// Code from system.h:
+
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+
+// Code from safe_read.h:
+
+#define SAFE_READ_ERROR ((size_t) -1)
+
+// Code from safe_write.h
+
+#define SAFE_WRITE_ERROR ((size_t) -1)
+
+// Code from safe_read.c
+
+/* Get ssize_t.  */
+#include <sys/types.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef EINTR
+# define IS_EINTR(x) ((x) == EINTR)
+#else
+# define IS_EINTR(x) 0
+#endif
+
+#include <limits.h>
+
+/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
+   interrupted.  Return the actual number of bytes read(written), zero for EOF,
+   or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error.  */
+size_t safe_read(int fd, void *buf, size_t count)
+{
+	size_t result;
+
+	/* POSIX limits COUNT to SSIZE_MAX, but we limit it further, requiring
+	   that COUNT <= INT_MAX, to avoid triggering a bug in Tru64 5.1.
+	   When decreasing COUNT, keep the file pointer block-aligned.
+	   Note that in any case, read(write) may succeed, yet read(write)
+	   fewer than COUNT bytes, so the caller must be prepared to handle
+	   partial results.  */
+	if (count > INT_MAX)
+		count = INT_MAX & ~8191;
+
+	do {
+		result = read(fd, buf, count);
+	}
+	while (result < 0 && IS_EINTR(errno));
+
+	return (size_t) result;
+}
+
+/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
+   interrupted.  Return the actual number of bytes read(written), zero for EOF,
+   or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error.  */
+size_t safe_write(int fd, const void *buf, size_t count)
+{
+	size_t result;
+
+	/* POSIX limits COUNT to SSIZE_MAX, but we limit it further, requiring
+	   that COUNT <= INT_MAX, to avoid triggering a bug in Tru64 5.1.
+	   When decreasing COUNT, keep the file pointer block-aligned.
+	   Note that in any case, read(write) may succeed, yet read(write)
+	   fewer than COUNT bytes, so the caller must be prepared to handle
+	   partial results.  */
+	if (count > INT_MAX)
+		count = INT_MAX & ~8191;
+
+	do {
+		result = write(fd, buf, count);
+	}
+	while (result < 0 && IS_EINTR(errno));
+
+	return (size_t) result;
+}
+
+// Code from full_write.c
+
+/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
+   interrupted or if a partial write(read) occurs.  Return the number
+   of bytes transferred.
+   When writing, set errno if fewer than COUNT bytes are written.
+   When reading, if fewer than COUNT bytes are read, you must examine
+   errno to distinguish failure from EOF (errno == 0).  */
+size_t full_read(int fd, void *buf, size_t count)
+{
+	size_t total = 0;
+	char *ptr = buf;
+
+	while (count > 0) {
+		size_t n_rw = safe_read(fd, ptr, count);
+		if (n_rw == (size_t) - 1)
+			break;
+		if (n_rw == 0) {
+			errno = 0;
+			break;
+		}
+		total += n_rw;
+		ptr += n_rw;
+		count -= n_rw;
+	}
+
+	return total;
+}
+
+/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
+   interrupted or if a partial write(read) occurs.  Return the number
+   of bytes transferred.
+   When writing, set errno if fewer than COUNT bytes are written.
+   When reading, if fewer than COUNT bytes are read, you must examine
+   errno to distinguish failure from EOF (errno == 0).  */
+size_t full_write(int fd, const void *buf, size_t count)
+{
+	size_t total = 0;
+	const char *ptr = buf;
+
+	while (count > 0) {
+		size_t n_rw = safe_write(fd, ptr, count);
+		if (n_rw == (size_t) - 1)
+			break;
+		if (n_rw == 0) {
+			errno = ENOSPC;
+			break;
+		}
+		total += n_rw;
+		ptr += n_rw;
+		count -= n_rw;
+	}
+
+	return total;
+}
+
+// Code from cat.c
+
+/* Nonzero if a non-fatal error has occurred.  */
+static int exit_status = 0;
+
+static int input_desc;
+
+/* Plain cat.  Copies the file behind `input_desc' to STDOUT_FILENO.  */
+
+static void simple_cat(
+			      /* Pointer to the buffer, used by reads and writes.  */
+			      char *buf,
+			      /* Number of characters preferably read or written by each read and write
+			         call.  */
+			      int bufsize)
+{
+	/* Actual number of characters read, and therefore written.  */
+	size_t n_read;
+
+	/* Loop until the end of the file.  */
+
+	for (;;) {
+		/* Read a block of input.  */
+
+		n_read = safe_read(input_desc, buf, bufsize);
+		if (n_read == SAFE_READ_ERROR) {
+			// JBA: simplified to "exit_status=1; return;"
+			exit_status = 1;
+			return;
+		}
+
+		/* End of this file?  */
+
+		if (n_read == 0)
+			break;
+
+		/* Write this block out.  */
+
+		{
+			/* The following is ok, since we know that 0 < n_read.  */
+			size_t n = n_read;
+			if (full_write(STDOUT_FILENO, buf, n) != n)
+				exit(1);	// JBA: simplified to "exit(1);"
+		}
+	}
+}
+
+// End code from gnu
+
+int main(int argc, char **argv)
+{
+	input_desc = open(argv[1], O_RDONLY);
+	if (input_desc == -1) {
+		input_desc =
+		    open("/mit/scripts/www/403-404.html", O_RDONLY);
+		if (input_desc == -1)
+			exit(0);
+		printf("Status: 404 Not Found\n");
+		printf("Content-type: text/html;\n\n");
+	} else {
+		int i, j;
+		const char *content_type = "application/octet-stream";
+		for (i = strlen(argv[1]) - 1; i > 0; i--) {
+			if (argv[1][i - 1] == '.')
+				break;
+		}
+		if (i == 0)
+			exit(0);
+		for (j = 0; j < 2 * NEXTS; j += 2) {
+			if (strcasecmp(map[j], &argv[1][i]) == 0) {
+				content_type = map[j + 1];
+			}
+		}
+
+		struct stat statbuf;
+		if (fstat(input_desc, &statbuf) == 0) {
+			const char *dtstr =
+			    HTDateTimeStr(&statbuf.st_mtime, 0);
+			printf("Last-Modified: %s\n", dtstr);
+		}
+		printf("Content-type: %s\n\n", content_type);
+	}
+	fflush(stdout);
+	char *buf = malloc(4096);
+	simple_cat(buf, 4096);
+	free(buf);
+	close(input_desc);
+	return exit_status;
+}
Index: branches/fc15-dev/server/common/oursrc/execsys/svn
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/svn	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/svn	(revision 1803)
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+case "$1" in
+*/.. | */../*)
+    exit 1
+    ;;
+${HOME%/Scripts}/Scripts/svn/*)
+    exec /usr/bin/svnserve -i -r "$1"
+    ;;
+*)
+    exit 1
+    ;;
+esac
Index: branches/fc15-dev/server/common/oursrc/execsys/svnproxy.pl
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/svnproxy.pl	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/svnproxy.pl	(revision 1803)
@@ -0,0 +1,140 @@
+#!/usr/bin/perl
+#
+# svnproxy: Wrapper around svnserve for Subversion virtual hosting.
+# version 1.1, released 2008-12-28
+# Copyright © 2008 Anders Kaseorg <andersk@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+use strict;
+use warnings;
+use IPC::Open2;
+use Errno qw(EINTR);
+use IO::Poll qw(POLLIN POLLOUT POLLHUP);
+
+# Read the initial greeting from a dummy svnserve process.
+my $pid = open(IN, '-|');
+defined $pid or die "$0: open: $!";
+if ($pid == 0) {
+    close(STDIN) or die "$0: close: $!";
+    exec('svnserve', '-i') or die "$0: exec svnproxy: $!";
+}
+my $greeting = '';
+for (;;) {
+    my $n = sysread(IN, my $buf, 4096);
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "$0: read: $!";
+    last if $n == 0;
+    $greeting .= $buf;
+}
+
+# Send the greeting to the client.
+my $buf = $greeting;
+while ($buf ne '') {
+    my $n = syswrite(STDOUT, $buf);
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "$0: write: $!";
+    $buf = substr($buf, $n);
+}
+close(IN) or die "$0: close: $!";
+waitpid(-1, 0) or die "$0: waitpid: $!";
+
+# Receive the response from the client, and parse out the URL.
+my $url;
+my $response = '';
+for (;;) {
+    my $n = sysread(STDIN, my $buf, 4096);
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "$0: read: $!";
+    $n > 0 or die "$0: unexpected response from client";
+    $response .= $buf;
+    my $url_len;
+    if (($url_len) = $response =~ m/^\(\s\S+\s\(\s[^)]*\)\s(\d+):/ and
+	length($') >= $url_len) {
+	$url = substr($', 0, $url_len);
+	last;
+    } elsif ($response !~ m/^(?:\((?:\s(?:\S+(?:\s(?:\((?:\s(?:[^)]*(?:\)(?:\s(?:\d+:?)?)?)?)?)?)?)?)?)?)?$/) {
+	die "$0: unexpected response from client";
+    }
+}
+
+# Now start the real svnserve based on the URL.
+$pid = open2(\*IN, \*OUT, '/usr/local/sbin/ldapize.pl', $url) or die "$0: open: $!";
+
+# Read the greeting, expecting it to be identical to the dummy greeting.
+while ($greeting ne '') {
+    my $n = sysread(IN, my $buf, length($greeting));
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "$0: read: $!";
+    $n > 0 or die "$0: svnserve unexpectedly closed connection";
+    $greeting =~ s/^\Q$buf\E// or die "$0: unexpected greeting from svnserve";
+}
+
+# Finally, go into a select loop to transfer the remaining data
+# (STDIN -> OUT, IN -> STDOUT), including the client's response to svnserve.
+my ($cbuf, $sbuf) = ($response, '');
+my $poll = new IO::Poll;
+$poll->mask(\*STDOUT => POLLHUP);
+$poll->mask(\*OUT => POLLOUT);
+$poll->remove(\*STDIN);
+$poll->mask(\*IN => POLLIN);
+while ($poll->handles()) {
+    my $n = $poll->poll();
+    next if $n < 0 and $! == EINTR;
+    $n >= 0 or die "select: $!";
+    if ($poll->events(\*STDIN)) {
+	my $n = sysread(STDIN, $cbuf, 4096);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "read: $!";
+	$poll->remove(\*STDIN);
+	$poll->mask(\*OUT => POLLOUT);
+    } elsif ($poll->events(\*IN)) {
+	my $n = sysread(IN, $sbuf, 4096);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "read: $!";
+	$poll->remove(\*IN);
+	$poll->mask(\*STDOUT => POLLOUT);
+    } elsif ($poll->events(\*STDOUT) & POLLOUT && $sbuf ne '') {
+	my $n = syswrite(STDOUT, $sbuf);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "write: $!";
+	$sbuf = substr($sbuf, $n);
+	if ($sbuf eq '') {
+	    $poll->mask(\*STDOUT => POLLHUP);
+	    $poll->mask(\*IN => POLLIN);
+	}
+    } elsif ($poll->events(\*STDOUT)) {
+	$poll->remove(\*STDOUT);
+	$poll->remove(\*IN);
+	close(STDOUT) or die "close: $!";
+	close(IN) or die "close: $!";
+    } elsif ($poll->events(\*OUT) & POLLOUT && $cbuf ne '') {
+	my $n = syswrite(OUT, $cbuf);
+	next if $n < 0 and $! == EINTR;
+	$n >= 0 or die "write: $!";
+	$cbuf = substr($cbuf, $n);
+	if ($cbuf eq '') {
+	    $poll->mask(\*OUT => POLLHUP);
+	    $poll->mask(\*STDIN => POLLIN);
+	}
+    } elsif ($poll->events(\*OUT)) {
+	$poll->remove(\*OUT);
+	$poll->remove(\*STDIN);
+	close(OUT) or die "close: $!";
+	close(STDIN) or die "close: $!";
+    }
+}
+
+while (waitpid($pid, 0) == -1 && $! == EINTR) { }
Index: branches/fc15-dev/server/common/oursrc/execsys/upd-execsys
===================================================================
--- branches/fc15-dev/server/common/oursrc/execsys/upd-execsys	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/execsys/upd-execsys	(revision 1803)
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -w
+use strict;
+
+# upd-execsys
+# Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# See /COPYRIGHT in this repository for more information.
+
+my @dynamic = qw(
+ pl
+ php
+ py
+ cgi
+ scm
+ exe
+);
+
+my @static = qw(
+ html
+ css
+ gif
+ jpg
+ png
+ htm
+ jpeg
+ js
+ ico
+ xml
+ xsl
+ tiff
+ tif
+ tgz
+ tar
+ jar
+ zip
+ pdf
+ ps
+ doc
+ xls
+ ppt
+ swf
+ mp3
+ mov
+ wmv
+ mpg
+ mpeg
+ avi
+ il
+ xhtml
+ svg
+ xaml
+ xap
+ wav
+ mid
+ midi
+ ttf
+ otf
+);
+
+my %map;
+open(TYPES, "./mime.types");
+while(my $line = <TYPES>) {
+	next if($line =~ /^\#/ or $line =~ /^\s*$/);
+	my ($type, $exts) = ($line =~ /^(\S*)\s+(.*)$/);
+	next if($exts =~ /^\s*$/);
+	
+	foreach my $ext (split " ", $exts) {
+		$map{$ext} = $type;
+	}
+}
+close(TYPES);
+
+undef $/;
+my $regexp = '(.*[\/\#]+\sSTART-AUTOGENERATED:[^!]*!).*\s([\/\#]+\sEND-AUTOGENERATED.*)';
+
+open(CONF, ">./execsys.conf");
+
+foreach my $ext (@dynamic, @static) {
+	print CONF <<END
+<FilesMatch "(?i)\\.$ext\$">
+	SetHandler cgi-script
+	Options +ExecCGI
+</FilesMatch>
+
+END
+}
+close(CONF);
+
+open(CAT, "./static-cat.c.pre");
+my $file = <CAT>;
+my ($fstart, $fend) = ($file =~ /$regexp/s);
+close(CAT);
+
+open(CAT, ">./static-cat.c");
+print CAT $fstart, "\n";
+print CAT '#define NEXTS ', scalar(@static), "\n";
+print CAT "const char *map[2 * NEXTS] = {\n";
+for(my $i = 0; $i < scalar(@static); $i++) {
+	my $comma = ( $i < scalar(@static)-1 ? "," : "" );
+	print CAT "\t\"$static[$i]\", \"$map{$static[$i]}\"$comma\n";
+}
+print CAT "};\n";
+print CAT $fend;
+close(CAT);
Index: branches/fc15-dev/server/common/oursrc/hacron/hacron
===================================================================
--- branches/fc15-dev/server/common/oursrc/hacron/hacron	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/hacron/hacron	(revision 1803)
@@ -0,0 +1,360 @@
+#!/usr/bin/env python
+from __future__ import with_statement
+import glob
+import logging.handlers
+import fcntl
+import optparse
+import os
+import socket
+import shutil
+import subprocess
+import sys
+import time
+from os import path
+
+OCF_SUCCESS=0
+OCF_ERR_GENERIC=1
+OCF_ERR_ARGS=2
+OCF_ERR_UNIMPLEMENTED=3
+OCF_ERR_PERM=4
+OCF_ERR_INSTALLED=5
+OCF_ERR_CONFIGURED=6
+OCF_NOT_RUNNING=7
+
+logger = logging.getLogger('cron')
+
+HA_LOGD = os.environ.get('HA_LOGD') == 'yes'
+
+class HacronError(Exception):
+    def __init__(self, ocf_errno, msg='Something went wrong'):
+        self.ocf_errno = ocf_errno
+        self.msg = msg
+        logger.error(msg)
+    
+class HaLogHandler(logging.Handler):
+    """
+    A handler class which writes to ha_logger.
+    """
+    def __init__(self, ha_tag):
+        """
+        Initialize the handler.  ha_tag is the name of this resource.
+        """
+        logging.Handler.__init__(self)
+        self.ha_tag = ha_tag
+
+    def emit(self, record):
+        """
+        Emit a record.
+        """
+        print 'Passed', record
+        try:
+            levelname = record.levelname
+            msg = self.format(record)
+            subprocess.call(['/usr/sbin/ha_logger', '-t', self.ha_tag, msg])
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except:
+            self.handleError(record)
+
+class lock(object):
+    def __init__(self, filename):
+        self.filename = filename
+        if not _touch(filename):
+            raise
+
+    def __enter__(self):
+        f = open(self.filename)
+        fcntl.flock(f, fcntl.LOCK_EX)
+            
+    def __exit__(self, type, value, traceback):
+        f = open(self.filename)
+        fcntl.flock(f, fcntl.LOCK_UN)
+        
+def _touch(path):
+    """Effectively touches a file.  Returns true if successful, false
+    otherwise"""
+    try:
+        open(path, 'a').close()
+    except IOError:
+        return False
+    else:
+        return True
+
+def _remove(dest):
+    if not path.exists(dest) and not path.islink(dest):
+        logger.error('Tried to remove nonexistant path %s' % dest)
+        return True
+
+    try:
+        if path.isdir(dest):
+            os.rmdir(dest)
+        else:
+            os.remove(dest)
+    except OSError, e:
+        logging.error('Could not remove %s: %s' % (dest, e))
+        return False
+    else:
+        return True
+
+def _mkdir(dir):
+    try:
+        os.mkdir(dir)
+    except OSError, e:
+        logging.error('Could not mkdir %s: %s' % (dir, e))
+        return False
+    else:
+        return True
+    
+def _strip(name):
+    """Strip off the file extension, and leading /'s, if they exist"""
+    return path.splitext(path.basename(name))[0]
+
+def _suffix(name, suffix):
+    return '%s.%s' % (name, suffix)
+
+def _crondir(server):
+    return path.join(CRONSPOOL_DIR, _suffix(server, 'cronspool'))
+
+def _serverfile(server):
+    return path.join(SERVER_DIR, server)
+
+def _servers():
+    """Get a list of the servers."""
+    return [_strip(f) for f in glob.glob(path.join(SERVER_DIR, '*'))]
+
+def _is_master(server):
+    crondir = path.join(CRONSPOOL_DIR, _suffix(server, 'cronspool'))
+    return path.islink(crondir)
+
+def _restart_crond(args, options):
+    # TODO: insert correct cmd here.  Also, should we capture and log
+    # stdout?
+    if options.development:
+        cmd = ['echo', 'called crond reset']
+    else:
+        cmd = ['service', 'crond', 'reload']
+    try:
+        subprocess.check_call(cmd)
+    except OSError, e:
+        raise HacronError(OCF_ERR_GENERIC, 'Cron restart exited with return code %d' % e.errno)
+    else:
+        logger.info('Restarted crond')
+
+def start_cron(args, options):
+    serverfile = _serverfile(HOSTNAME)
+    if not _touch(serverfile):
+        logger.error('Could not touch %s' % serverfile)
+        return OCF_ERR_CONFIGURED
+    elif _is_master(HOSTNAME):
+        logger.error('%s is already the master!' % HOSTNAME)
+        return OCF_SUCCESS
+
+    logger.info('Starting %s' % HOSTNAME)
+    for server in _servers():
+        crondir = _crondir(server)
+        if server == HOSTNAME:
+            # Get rid of current crondir, and leave if that fails.
+            if not _remove(crondir):
+                logger.error("Could not remove dummy cronspool dir %s" % crondir)
+                return OCF_ERR_GENERIC
+            os.symlink('../cronspool', crondir)
+            logger.info('Created master symlink %s' % crondir)
+        else:
+            if path.islink(crondir):
+                _remove(crondir)
+                logger.info('Removed old master symlink: %s' % crondir)
+            if not path.exists(crondir):
+                _mkdir(crondir)
+                logger.info('Created slave dummy directory %s' % crondir)
+    try:
+        _restart_crond(args, options)
+    except HacronException, e:
+        return e.ocf_errno
+    return OCF_SUCCESS
+
+def stop_cron(args, options):
+    """Stop cron."""
+    if not _is_master(HOSTNAME):
+        logger.error('I am not the master!')
+        return OCF_NOT_RUNNING
+    else:
+        crondir = _crondir(HOSTNAME)
+        logger.info('Removing symlink %s' % crondir)
+        _remove(crondir)
+        _mkdir(crondir)
+        # TODO: should we do something else here?
+        try:
+            _restart_crond(args, options)
+        except HacronException, e:
+            return e.ocf_errno
+        return OCF_SUCCESS
+
+def monitor_cron(args, options):
+    """Check whether cron is running.  For now just makes sure that the
+    current machine is the master, although this should likely be fixed."""
+    if _is_master(HOSTNAME):
+        return OCF_SUCCESS
+    else:
+        return OCF_NOT_RUNNING
+
+def validate_all_cron(args, options):
+    if not _touch(_serverfile(HOSTNAME)):
+        logger.error('Could not touch %s' % _serverfile(HOSTNAME))
+        return OCF_ERR_GENERIC
+    elif not path.exists(CRONSPOOL_DIR):
+        return OCF_ERR_GENERIC
+    else:
+        return OCF_SUCCESS
+
+def setup(args, options):
+    for d in [CRONSPOOL_DIR, SERVER_DIR]:
+        if not path.exists(d):
+            os.makedirs(d)
+            logger.info('Created %s' % d)
+        else:
+            logger.info('Already exists: %s' % d)
+
+def remove_servers(servers, options):
+    """Remove servers from the list of available ones."""
+    for server in servers:
+        _remove(_serverfile(server))
+        _remove(_crondir(server))
+        logger.info('Removed %s from list of available ones' % server)
+
+
+def meta_data_cron(args, options):
+    print """<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="hacron" version="0.1">
+<version>1.0</version>
+
+<longdesc lang="en">
+This is the high-availability cron manager.  It uses an extremely overpowered
+clustering solution to make it so that people can have their crontabs.  Yay.
+</longdesc>
+<shortdesc lang="en">HA Cron</shortdesc>
+
+<parameters>
+<parameter name="cron_root" required="1">
+<longdesc lang="en">
+Base directory for storage of crontabs and server information.
+</longdesc>
+<shortdesc lang="en">Cron base directory</shortdesc>
+<content type="string" />
+</parameter>
+</parameters>
+
+<actions>
+<action name="start"        timeout="90" />
+<action name="stop"         timeout="100" />
+<action name="monitor"      timeout="20" interval="10" depth="0" start-delay="0" />
+<action name="reload"       timeout="90" />
+<action name="meta-data"    timeout="5" />
+<action name="validate-all"   timeout="30" />
+</actions>
+</resource-agent>
+"""
+    return OCF_SUCCESS
+
+def usage(parser):
+    parser.print_help()
+    return 1
+
+def _set_globals(args, options):
+    global HOSTNAME, CRONROOT, CRONSPOOL_DIR, SERVER_DIR, \
+        HA_RSCTMP, OCF_RESOURCE_INSTANCE
+    if options.development:
+        logging.basicConfig(level=logging.DEBUG)
+    else:
+        if HA_LOGD:
+            handler = HaLogHandler('hacron')
+        else:
+            handler = logging.handlers.SysLogHandler('/dev/log')
+        formatter = logging.Formatter("%(module)s: %(levelname)s %(message)s")
+        handler.setLevel(logging.INFO)
+        handler.setFormatter(formatter)
+        logger.addHandler(handler)
+    HOSTNAME = options.server or os.environ.get('HA_CURHOST') or socket.gethostname()
+    CRONROOT = options.cronroot or os.environ.get('OCF_RESKEY_cron_root')
+    if not CRONROOT:
+        raise HacronError(OCF_ERR_CONFIGURED, 'No cron_root specified.')
+    CRONSPOOL_DIR = path.join(CRONROOT, 'server-cronspools')
+    SERVER_DIR = path.join(CRONROOT, 'servers')
+    HA_RSCTMP = os.environ.get('HA_RSCTMP', '/tmp')
+    OCF_RESOURCE_INSTANCE = os.environ.get('OCF_RESOURCE_INSTANCE', 'default')
+    return OCF_SUCCESS
+
+def main():
+    usage_str = """usage: %prog [-s server] [-c cronroot] [-d] cmd
+
+Script for starting and stopping cron in a multiserver environment.
+One server is designated the master.
+
+== HA available commands: ==
+start: Make this server into the master and reload crond.
+reload: Same as start.
+stop: Demote this server to a spare and reload crond.
+monitor: Indicate whether this server is successfully the master.
+validate-all: Make sure that things look right and this server is
+  ready to be promoted to master.
+meta-data: Print out the XML meta data for this service
+
+== User-only commands: ==
+setup: Create the folders, etc. necessary for running hacron.
+remove-servers server1 server2 ...: Take a list of servers out of the
+  list of available ones.
+    """
+    parser = optparse.OptionParser(usage=usage_str)
+    parser.add_option("-s", "--server",
+                      action="store", dest="server",
+                      default=None,
+                      help="choose which server to run script as")
+    parser.add_option("-c", "--cronroot",
+                      action="store", dest="cronroot",
+                      default=None,
+                      help="pick root of cron dir")
+    parser.add_option("-d", "--development",
+                      action="store_true", dest="development",
+                      default=False,
+                      help="run in development mode")
+    (options, args) = parser.parse_args()
+    if len(args) < 1:
+        return usage(parser)
+    command = args[0]
+    args = args[1:]
+
+    if command == 'meta-data':
+        return meta_data_cron(args, options)
+
+    try:
+        _set_globals(args, options)
+    except HacronError, e:
+        return e.ocf_errno
+
+    with lock('%s/hacron-%s.lock' % (HA_RSCTMP, OCF_RESOURCE_INSTANCE)):
+        if command == 'start':
+            return start_cron(args, options)
+        elif command == 'reload':
+            return start_cron(args, options)
+        elif command == 'stop':
+            return stop_cron(args, options)
+        elif command == 'monitor':
+            return monitor_cron(args, options)
+        elif command == 'validate-all':
+            return validate_all_cron(args, options)
+        elif command == 'setup':
+            return setup(args, options)
+        elif command == 'remove-servers':
+            return remove_servers(args, options)
+        else:
+            usage(parser)
+            return OCF_ERR_UNIMPLEMENTED
+
+if __name__ == '__main__':
+    try:
+        ret = main()
+    except Exception, e:
+        logger.error('exception from main: %s' % e)
+        ret = OCF_ERR_GENERIC
+        raise
+    sys.exit(ret)
Index: branches/fc15-dev/server/common/oursrc/httpdmods/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/Makefile.in	(revision 1803)
@@ -0,0 +1,17 @@
+APXS = apxs
+
+MODS = mod_auth_sslcert mod_authz_afsgroup mod_auth_optional mod_vhost_ldap mod_original_dst
+
+all-local: $(patsubst %,.libs/%.so,$(MODS))
+
+APXSFLAGS_mod_vhost_ldap = -Wc,-DMOD_VHOST_LDAP_VERSION=\\\"mod_vhost_ldap/1.2.0scripts\\\" -lldap_r
+
+.libs/%.so: %.c
+	$(APXS) $(APXSFLAGS_$*) -c $<
+
+clean:
+	rm -f $(MODS:=.o) $(MODS:=.la) $(MODS:=.lo) $(MODS:=.slo)
+	rm -rf .libs
+
+distclean: clean
+	rm -f config.log config.cache config.status Makefile
Index: branches/fc15-dev/server/common/oursrc/httpdmods/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/configure.in	(revision 1803)
@@ -0,0 +1,5 @@
+AC_INIT()
+
+AC_PROG_CC
+
+AC_OUTPUT(Makefile)
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_optional.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_optional.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_optional.c	(revision 1803)
@@ -0,0 +1,80 @@
+/* mod_auth_optional
+ * version 1.0, released 2007-09-01
+ * Anders Kaseorg <andersk@mit.edu>
+ *
+ * This module can pretend that authentication succeeded even if no
+ * authorization module is authoritative, instead of returning a
+ * Forbidden error.
+ */
+
+#include "ap_config.h"
+#include "httpd.h"
+#include "http_config.h"
+#include "http_request.h"
+
+typedef struct {
+    int optional;
+    char *default_user;
+} auth_optional_config_rec;
+
+static void *create_auth_optional_dir_config(apr_pool_t *p, char *d)
+{
+    auth_optional_config_rec *conf = apr_pcalloc(p, sizeof(*conf));
+    conf->optional = 0;
+    conf->default_user = NULL;
+    return conf;
+}
+
+static const command_rec auth_optional_cmds[] =
+{
+    AP_INIT_FLAG("AuthOptional", ap_set_flag_slot,
+                 (void *)APR_OFFSETOF(auth_optional_config_rec, optional),
+                 OR_AUTHCFG,
+                 "Make authentication succeed if no authorization module is authoritative"),
+    AP_INIT_TAKE1("AuthOptionalDefaultUser", ap_set_string_slot,
+                   (void*)APR_OFFSETOF(auth_optional_config_rec, default_user),
+                  OR_AUTHCFG,
+                  "Default username to use if no authorization module is authoritative"),
+    {NULL}
+};
+
+module AP_MODULE_DECLARE_DATA auth_optional_module;
+
+static int auth_optional_check_user_id(request_rec *r)
+{
+    auth_optional_config_rec *conf = ap_get_module_config(r->per_dir_config,
+							  &auth_optional_module);
+    if (!conf->optional)
+	return DECLINED;
+
+    r->user = conf->default_user;
+    return OK;
+}
+
+static int auth_optional_auth_checker(request_rec *r)
+{
+    auth_optional_config_rec *conf = ap_get_module_config(r->per_dir_config,
+							  &auth_optional_module);
+    if (!conf->optional || conf->default_user != NULL)
+	return DECLINED;
+
+    return OK;
+}
+
+static void register_hooks(apr_pool_t *p)
+{
+    /* Right before mod_authz_default. */
+    ap_hook_check_user_id(auth_optional_check_user_id, NULL, NULL, APR_HOOK_LAST - 1);
+    ap_hook_auth_checker(auth_optional_auth_checker, NULL, NULL, APR_HOOK_REALLY_FIRST);
+}
+
+module AP_MODULE_DECLARE_DATA auth_optional_module =
+{
+    STANDARD20_MODULE_STUFF,
+    create_auth_optional_dir_config, /* dir config creater */
+    NULL,                            /* dir merger --- default is to override */
+    NULL,                            /* server config */
+    NULL,                            /* merge server config */
+    auth_optional_cmds,              /* command apr_table_t */
+    register_hooks                   /* register hooks */
+};
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_sslcert.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_sslcert.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mod_auth_sslcert.c	(revision 1803)
@@ -0,0 +1,170 @@
+/* mod_auth_sslcert
+ * version 1.1.1, released 2007-10-01
+ * Anders Kaseorg <andersk@mit.edu>
+ *
+ * This module does authentication based on SSL client certificates:
+ *   AuthType SSLCert
+ *   AuthSSLCertVar SSL_CLIENT_S_DN_Email
+ *   AuthSSLCertStripSuffix "@MIT.EDU"
+ */
+
+#include "apr_strings.h"
+#define APR_WANT_STRFUNC        /* for strcasecmp */
+#include "apr_want.h"
+
+#include "ap_config.h"
+#include "httpd.h"
+#include "http_config.h"
+#include "http_core.h"
+#include "http_log.h"
+#include "http_request.h"
+
+#include "mod_auth.h"
+#include "mod_ssl.h"
+
+static APR_OPTIONAL_FN_TYPE(ssl_var_lookup) *ssl_var_lookup;
+
+typedef struct {
+    int authoritative;
+    char *var;
+    char *strip_suffix;
+    int strip_suffix_required;
+} auth_sslcert_config_rec;
+
+static void *create_auth_sslcert_dir_config(apr_pool_t *p, char *dirspec)
+{
+    auth_sslcert_config_rec *conf = apr_pcalloc(p, sizeof(*conf));
+
+    conf->authoritative = -1;
+    conf->var = NULL;
+    conf->strip_suffix = NULL;
+    conf->strip_suffix_required = -1;
+
+    return conf;
+}
+
+static void *merge_auth_sslcert_dir_config(apr_pool_t *p, void *parent_conf, void *newloc_conf)
+{
+    auth_sslcert_config_rec *pconf = parent_conf, *nconf = newloc_conf,
+	*conf = apr_pcalloc(p, sizeof(*conf));
+
+    conf->authoritative = (nconf->authoritative != -1) ?
+	nconf->authoritative : pconf->authoritative;
+    conf->var = (nconf->var != NULL) ?
+	nconf->var : pconf->var;
+    conf->strip_suffix = (nconf->var != NULL || nconf->strip_suffix != NULL) ?
+	nconf->strip_suffix : pconf->strip_suffix;
+    conf->strip_suffix_required = (nconf->var != NULL || nconf->strip_suffix_required != -1) ?
+	nconf->authoritative : pconf->authoritative;
+
+    return conf;
+}
+
+static const command_rec auth_sslcert_cmds[] =
+{
+    AP_INIT_FLAG("AuthSSLCertAuthoritative", ap_set_flag_slot,
+                 (void *)APR_OFFSETOF(auth_sslcert_config_rec, authoritative),
+                 OR_AUTHCFG,
+                 "Set to 'Off' to allow access control to be passed along to "
+                 "lower modules if the UserID is not known to this module"),
+    AP_INIT_TAKE1("AuthSSLCertVar", ap_set_string_slot,
+		  (void*)APR_OFFSETOF(auth_sslcert_config_rec, var),
+		  OR_AUTHCFG,
+		  "SSL variable to use as the username"),
+    AP_INIT_TAKE1("AuthSSLCertStripSuffix", ap_set_string_slot,
+		  (void*)APR_OFFSETOF(auth_sslcert_config_rec, strip_suffix),
+		  OR_AUTHCFG,
+		  "An optional suffix to strip from the username"),
+    AP_INIT_FLAG("AuthSSLCertStripSuffixRequired", ap_set_flag_slot,
+		 (void *)APR_OFFSETOF(auth_sslcert_config_rec, strip_suffix_required),
+		 OR_AUTHCFG,
+		 "Set to 'Off' to allow certs that don't end with a recognized "
+		 "suffix to still authenticate"),
+    {NULL}
+};
+
+module AP_MODULE_DECLARE_DATA auth_sslcert_module;
+
+static int authenticate_sslcert_user(request_rec *r)
+{
+    auth_sslcert_config_rec *conf = ap_get_module_config(r->per_dir_config,
+							 &auth_sslcert_module);
+    const char *current_auth;
+
+    /* Are we configured to be SSLCert auth? */
+    current_auth = ap_auth_type(r);
+    if (!current_auth || strcasecmp(current_auth, "SSLCert") != 0) {
+        return DECLINED;
+    }
+
+    r->ap_auth_type = "SSLCert";
+
+    if (strcasecmp((char *)ssl_var_lookup(r->pool, r->server, r->connection, r,
+					  "SSL_CLIENT_VERIFY"),
+		   "SUCCESS") == 0) {
+	if (conf->var == NULL) {
+	    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+			  "AuthSSLCertVar is not set: \"%s\"", r->uri);
+	    return HTTP_INTERNAL_SERVER_ERROR;
+	}
+	char *user = (char *)ssl_var_lookup(r->pool, r->server, r->connection, r,
+					    conf->var);
+	if (user != NULL && user[0] != '\0') {
+	    if (conf->strip_suffix != NULL) {
+		int i = strlen(user) - strlen(conf->strip_suffix);
+		if (i >= 0 && strcasecmp(user + i, conf->strip_suffix) == 0) {
+		    r->user = apr_pstrmemdup(r->pool, user, i);
+		    return OK;
+		} else if (!conf->strip_suffix_required) {
+		    r->user = user;
+		    return OK;
+		} else {
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "SSL username for \"%s\" has wrong suffix: \"%s\"",
+				  r->uri, user);
+		}
+	    } else {
+		r->user = user;
+		return OK;
+	    }
+	} else {
+	    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+			  "no SSL username for \"%s\"", r->uri);
+	}
+    } else if (conf->authoritative) {
+	ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+		      "SSL client not verified for \"%s\"", r->uri);
+    }
+
+    /* If we're not authoritative, then any error is ignored. */
+    if (!conf->authoritative) {
+	return DECLINED;
+    }
+
+    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+		  "SSLCert authentication failure for \"%s\"",
+		  r->uri);
+    return HTTP_UNAUTHORIZED;
+}
+
+static void import_ssl_var_lookup()
+{
+    ssl_var_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup);
+}
+
+static void register_hooks(apr_pool_t *p)
+{
+    ap_hook_check_user_id(authenticate_sslcert_user, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_optional_fn_retrieve(import_ssl_var_lookup, NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+module AP_MODULE_DECLARE_DATA auth_sslcert_module =
+{
+    STANDARD20_MODULE_STUFF,
+    create_auth_sslcert_dir_config,  /* dir config creater */
+    merge_auth_sslcert_dir_config,   /* dir merger */
+    NULL,                            /* server config */
+    NULL,                            /* merge server config */
+    auth_sslcert_cmds,               /* command apr_table_t */
+    register_hooks                   /* register hooks */
+};
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mod_authz_afsgroup.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mod_authz_afsgroup.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mod_authz_afsgroup.c	(revision 1803)
@@ -0,0 +1,182 @@
+/* mod_authz_afsgroup
+ * version 1.1, released 2007-03-13
+ * Anders Kaseorg <anders@kaseorg.com>
+ *
+ * This module does authorization based on AFS groups:
+ *   Require afsgroup system:administrators
+ *
+ * It currently works by parsing the output of `pts membership
+ * <group>`.
+ */
+
+#include "apr_strings.h"
+
+#include "ap_config.h"
+#include "httpd.h"
+#include "http_config.h"
+#include "http_core.h"
+#include "http_log.h"
+#include "http_protocol.h"
+#include "http_request.h"
+
+#include <unistd.h>
+#include <stdio.h>
+
+typedef struct {
+    int authoritative;
+} authz_afsgroup_config_rec;
+
+static void *create_authz_afsgroup_dir_config(apr_pool_t *p, char *d)
+{
+    authz_afsgroup_config_rec *conf = apr_palloc(p, sizeof(*conf));
+
+    conf->authoritative = 1;
+    return conf;
+}
+
+static const command_rec authz_afsgroup_cmds[] =
+{
+    AP_INIT_FLAG("AuthzAFSGroupAuthoritative", ap_set_flag_slot,
+                 (void *)APR_OFFSETOF(authz_afsgroup_config_rec, authoritative),
+                 OR_AUTHCFG,
+                 "Set to 'Off' to allow access control to be passed along to "
+                 "lower modules if the 'require afsgroup' statement is not "
+                 "met. (default: On)."),
+    {NULL}
+};
+
+module AP_MODULE_DECLARE_DATA authz_afsgroup_module;
+
+static int check_afsgroup_access(request_rec *r)
+{
+    authz_afsgroup_config_rec *conf = ap_get_module_config(r->per_dir_config,
+							   &authz_afsgroup_module);
+    char *user = r->user;
+    int m = r->method_number;
+    int required_afsgroup = 0;
+    register int x;
+    const char *t;
+    char *w;
+    const apr_array_header_t *reqs_arr = ap_requires(r);
+    require_line *reqs;
+
+    if (!reqs_arr) {
+        return DECLINED;
+    }
+    reqs = (require_line *)reqs_arr->elts;
+
+    for (x = 0; x < reqs_arr->nelts; x++) {
+
+        if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) {
+            continue;
+        }
+
+        t = reqs[x].requirement;
+        w = ap_getword_white(r->pool, &t);
+        if (!strcasecmp(w, "afsgroup")) {
+            required_afsgroup = 1;
+            while (t[0]) {
+		int pfd[2];
+		pid_t cpid;
+		int status;
+		FILE *fp;
+		char *line = NULL;
+		char buf[256];
+		size_t len = 0;
+		ssize_t read;
+		int found = 0;
+                w = ap_getword_conf(r->pool, &t);
+		if (pipe(pfd) == -1) {
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "pipe() failed!");
+		    return HTTP_INTERNAL_SERVER_ERROR;
+		}
+		cpid = fork();
+		if (cpid == -1) {
+		    close(pfd[0]);
+		    close(pfd[1]);
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "fork() failed!");
+		    return HTTP_INTERNAL_SERVER_ERROR;
+		}
+		if (cpid == 0) {
+		    close(pfd[0]);
+		    dup2(pfd[1], STDOUT_FILENO);
+		    execve("/usr/bin/pts",
+			   (char *const[]) {
+			       "pts", "membership", "-nameorid", w, NULL
+			   },
+			   NULL);
+		    _exit(1);
+		}
+		close(pfd[1]);
+		fp = fdopen(pfd[0], "r");
+		if (fp == NULL) {
+		    close(pfd[0]);
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "fdopen() failed!");
+		    return HTTP_INTERNAL_SERVER_ERROR;
+		}
+		if (snprintf(buf, sizeof(buf), "  %s\n", user) >= sizeof(buf)) {
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "access to %s failed, reason: username '%s' "
+				  "is too long!",
+				  r->uri, user);
+		    continue;
+		}
+		while ((read = getline(&line, &len, fp)) != -1) {
+		    if (strcmp(line, buf) == 0)
+			found = 1;
+		}
+		if (line)
+		    free(line);
+		fclose(fp);
+		if (waitpid(cpid, &status, 0) == -1) {
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "waitpid() failed!");
+		    return HTTP_INTERNAL_SERVER_ERROR;
+		}
+		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+		    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+				  "`pts membership -nameorid %s` failed!",
+				  w);
+		    return HTTP_INTERNAL_SERVER_ERROR;
+		}
+		if (found)
+		    return OK;
+            }
+        }
+    }
+
+    if (!required_afsgroup) {
+        return DECLINED;
+    }
+
+    if (!conf->authoritative) {
+        return DECLINED;
+    }
+
+    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+                  "access to %s failed, reason: user '%s' does not meet "
+                  "'require'ments for afsgroup to be allowed access",
+                  r->uri, user);
+
+    ap_note_auth_failure(r);
+    return HTTP_FORBIDDEN;
+}
+
+static void register_hooks(apr_pool_t *p)
+{
+    ap_hook_auth_checker(check_afsgroup_access, NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+module AP_MODULE_DECLARE_DATA authz_afsgroup_module =
+{
+    STANDARD20_MODULE_STUFF,
+    create_authz_afsgroup_dir_config, /* dir config creater */
+    NULL,                             /* dir merger --- default is to override */
+    NULL,                             /* server config */
+    NULL,                             /* merge server config */
+    authz_afsgroup_cmds,              /* command apr_table_t */
+    register_hooks                    /* register hooks */
+};
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mod_original_dst.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mod_original_dst.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mod_original_dst.c	(revision 1803)
@@ -0,0 +1,90 @@
+/* mod_original_dst
+ * version 1.0, released 2011-03-25
+ * Anders Kaseorg <andersk@mit.edu>
+ *
+ * This replaces the address of incoming connections with the original
+ * destination, before any local masquerading (as given by
+ * SO_ORIGINAL_DST).
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <limits.h>
+#include <netdb.h>
+#include <linux/netfilter_ipv4.h>
+
+#include "ap_config.h"
+#include "ap_listen.h"
+#include "http_config.h"
+#include "http_log.h"
+#include "httpd.h"
+#include "mpm.h"
+
+extern void apr_sockaddr_vars_set(apr_sockaddr_t *, int, apr_port_t);
+
+static apr_status_t original_dst_accept_func(void **accepted, ap_listen_rec *lr, apr_pool_t *ptrans)
+{
+    apr_status_t status = MPM_ACCEPT_FUNC(accepted, lr, ptrans);
+    if (status != APR_SUCCESS)
+	return status;
+
+    apr_socket_t *csd = *accepted;
+
+    apr_sockaddr_t *local_addr;
+    status = apr_socket_addr_get(&local_addr, APR_LOCAL, csd);
+    if (status != APR_SUCCESS) {
+	ap_log_perror(APLOG_MARK, APLOG_EMERG, status, ptrans,
+		      "original_dst_accept_func: apr_socket_addr_get failed");
+	apr_socket_close(csd);
+	return APR_EGENERAL;
+    }
+
+    int sockdes;
+    status = apr_os_sock_get(&sockdes, csd);
+    if (status != APR_SUCCESS) {
+	ap_log_perror(APLOG_MARK, APLOG_EMERG, status, ptrans,
+		      "original_dst_accept_func: apr_os_sock_get failed");
+	apr_socket_close(csd);
+	return APR_EGENERAL;
+    }
+
+    socklen_t salen = sizeof(local_addr->sa);
+    status = getsockopt(sockdes, SOL_IP, SO_ORIGINAL_DST, &local_addr->sa, &salen);
+    if (status == 0) {
+	local_addr->salen = salen;
+	apr_sockaddr_vars_set(local_addr, local_addr->sa.sin.sin_family, htons(local_addr->sa.sin.sin_port));
+	return APR_SUCCESS;
+    } else if (errno == ENOENT) {
+	return APR_SUCCESS;
+    } else {
+	ap_log_perror(APLOG_MARK, APLOG_EMERG, errno, ptrans,
+		      "original_dst_accept_func: getsockopt failed");
+	apr_socket_close(csd);
+	return APR_EGENERAL;
+    }
+}
+
+static int original_dst_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
+{
+    ap_listen_rec *lr;
+    for (lr = ap_listeners; lr; lr = lr->next)
+	if (lr->accept_func == MPM_ACCEPT_FUNC)
+	    lr->accept_func = original_dst_accept_func;
+    return OK;
+}
+
+static void original_dst_register_hooks(apr_pool_t *p)
+{
+    ap_hook_post_config(original_dst_post_config, NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+module AP_MODULE_DECLARE_DATA original_dst_module =
+{
+    STANDARD20_MODULE_STUFF,
+    NULL,                           /* per-directory config creator */
+    NULL,                           /* dir config merger */
+    NULL,                           /* server config creator */
+    NULL,                           /* server config merger */
+    NULL,                           /* command table */
+    original_dst_register_hooks,    /* set up other request processing hooks */
+};
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mod_vhost_ldap.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mod_vhost_ldap.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mod_vhost_ldap.c	(revision 1803)
@@ -0,0 +1,754 @@
+/* ============================================================
+ * Copyright (c) 2003-2004, Ondrej Sury
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+/*
+ * mod_vhost_ldap.c --- read virtual host config from LDAP directory
+ */
+
+#define CORE_PRIVATE
+
+#include <unistd.h>
+
+#include "httpd.h"
+#include "http_config.h"
+#include "http_core.h"
+#include "http_log.h"
+#include "http_request.h"
+#include "apr_version.h"
+#include "apr_ldap.h"
+#include "apr_reslist.h"
+#include "apr_strings.h"
+#include "apr_tables.h"
+#include "util_ldap.h"
+#include "util_script.h"
+
+#if !defined(APU_HAS_LDAP) && !defined(APR_HAS_LDAP)
+#error mod_vhost_ldap requires APR-util to have LDAP support built in
+#endif
+
+#if !defined(WIN32) && !defined(OS2) && !defined(BEOS) && !defined(NETWARE)
+#define HAVE_UNIX_SUEXEC
+#endif
+
+#ifdef HAVE_UNIX_SUEXEC
+#include "unixd.h"              /* Contains the suexec_identity hook used on Unix */
+#endif
+
+#define MIN_UID 100
+#define MIN_GID 100
+const char USERDIR[] = "web_scripts";
+
+#define MAX_FAILURES 5
+
+module AP_MODULE_DECLARE_DATA vhost_ldap_module;
+
+typedef enum {
+    MVL_UNSET, MVL_DISABLED, MVL_ENABLED
+} mod_vhost_ldap_status_e;
+
+typedef struct mod_vhost_ldap_config_t {
+    mod_vhost_ldap_status_e enabled;			/* Is vhost_ldap enabled? */
+
+    /* These parameters are all derived from the VhostLDAPURL directive */
+    char *url;				/* String representation of LDAP URL */
+
+    char *host;				/* Name of the LDAP server (or space separated list) */
+    int port;				/* Port of the LDAP server */
+    char *basedn;			/* Base DN to do all searches from */
+    int scope;				/* Scope of the search */
+    char *filter;			/* Filter to further limit the search  */
+    deref_options deref;		/* how to handle alias dereferening */
+
+    char *binddn;			/* DN to bind to server (can be NULL) */
+    char *bindpw;			/* Password to bind to server (can be NULL) */
+
+    int have_deref;                     /* Set if we have found an Deref option */
+    int have_ldap_url;			/* Set if we have found an LDAP url */
+
+    int secure;				/* True if SSL connections are requested */
+
+    char *fallback;                     /* Fallback virtual host */
+
+} mod_vhost_ldap_config_t;
+
+typedef struct mod_vhost_ldap_request_t {
+    char *dn;				/* The saved dn from a successful search */
+    char *name;				/* ServerName */
+    char *admin;			/* ServerAdmin */
+    char *docroot;			/* DocumentRoot */
+    char *cgiroot;			/* ScriptAlias */
+    char *uid;				/* Suexec Uid */
+    char *gid;				/* Suexec Gid */
+} mod_vhost_ldap_request_t;
+
+char *attributes[] =
+  { "apacheServerName", "apacheDocumentRoot", "apacheScriptAlias", "apacheSuexecUid", "apacheSuexecGid", "apacheServerAdmin", 0 };
+
+static int total_modules;
+
+#if (APR_MAJOR_VERSION >= 1)
+static APR_OPTIONAL_FN_TYPE(uldap_connection_close) *util_ldap_connection_close;
+static APR_OPTIONAL_FN_TYPE(uldap_connection_find) *util_ldap_connection_find;
+static APR_OPTIONAL_FN_TYPE(uldap_cache_comparedn) *util_ldap_cache_comparedn;
+static APR_OPTIONAL_FN_TYPE(uldap_cache_compare) *util_ldap_cache_compare;
+static APR_OPTIONAL_FN_TYPE(uldap_cache_checkuserid) *util_ldap_cache_checkuserid;
+static APR_OPTIONAL_FN_TYPE(uldap_cache_getuserdn) *util_ldap_cache_getuserdn;
+static APR_OPTIONAL_FN_TYPE(uldap_ssl_supported) *util_ldap_ssl_supported;
+
+static void ImportULDAPOptFn(void)
+{
+    util_ldap_connection_close  = APR_RETRIEVE_OPTIONAL_FN(uldap_connection_close);
+    util_ldap_connection_find   = APR_RETRIEVE_OPTIONAL_FN(uldap_connection_find);
+    util_ldap_cache_comparedn   = APR_RETRIEVE_OPTIONAL_FN(uldap_cache_comparedn);
+    util_ldap_cache_compare     = APR_RETRIEVE_OPTIONAL_FN(uldap_cache_compare);
+    util_ldap_cache_checkuserid = APR_RETRIEVE_OPTIONAL_FN(uldap_cache_checkuserid);
+    util_ldap_cache_getuserdn   = APR_RETRIEVE_OPTIONAL_FN(uldap_cache_getuserdn);
+    util_ldap_ssl_supported     = APR_RETRIEVE_OPTIONAL_FN(uldap_ssl_supported);
+}
+#endif 
+
+static int mod_vhost_ldap_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
+{
+    module **m;
+    
+    /* Stolen from modules/generators/mod_cgid.c */
+    total_modules = 0;
+    for (m = ap_preloaded_modules; *m != NULL; m++)
+      total_modules++;
+
+    /* make sure that mod_ldap (util_ldap) is loaded */
+    if (ap_find_linked_module("util_ldap.c") == NULL) {
+        ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, s,
+                     "Module mod_ldap missing. Mod_ldap (aka. util_ldap) "
+                     "must be loaded in order for mod_vhost_ldap to function properly");
+        return HTTP_INTERNAL_SERVER_ERROR;
+
+    }
+
+    ap_add_version_component(p, MOD_VHOST_LDAP_VERSION);
+
+    return OK;
+}
+
+static void *
+mod_vhost_ldap_create_server_config (apr_pool_t *p, server_rec *s)
+{
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)apr_pcalloc(p, sizeof (mod_vhost_ldap_config_t));
+
+    conf->enabled = MVL_UNSET;
+    conf->have_ldap_url = 0;
+    conf->have_deref = 0;
+    conf->binddn = NULL;
+    conf->bindpw = NULL;
+    conf->deref = always;
+    conf->fallback = NULL;
+
+    return conf;
+}
+
+static void *
+mod_vhost_ldap_merge_server_config(apr_pool_t *p, void *parentv, void *childv)
+{
+    mod_vhost_ldap_config_t *parent = (mod_vhost_ldap_config_t *) parentv;
+    mod_vhost_ldap_config_t *child  = (mod_vhost_ldap_config_t *) childv;
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)apr_pcalloc(p, sizeof(mod_vhost_ldap_config_t));
+
+    if (child->enabled == MVL_UNSET) {
+	conf->enabled = parent->enabled;
+    } else {
+	conf->enabled = child->enabled;
+    }
+
+    if (child->have_ldap_url) {
+	conf->have_ldap_url = child->have_ldap_url;
+	conf->url = child->url;
+	conf->host = child->host;
+	conf->port = child->port;
+	conf->basedn = child->basedn;
+	conf->scope = child->scope;
+	conf->filter = child->filter;
+	conf->secure = child->secure;
+    } else {
+	conf->have_ldap_url = parent->have_ldap_url;
+	conf->url = parent->url;
+	conf->host = parent->host;
+	conf->port = parent->port;
+	conf->basedn = parent->basedn;
+	conf->scope = parent->scope;
+	conf->filter = parent->filter;
+	conf->secure = parent->secure;
+    }
+    if (child->have_deref) {
+	conf->have_deref = child->have_deref;
+	conf->deref = child->deref;
+    } else {
+	conf->have_deref = parent->have_deref;
+	conf->deref = parent->deref;
+    }
+
+    conf->binddn = (child->binddn ? child->binddn : parent->binddn);
+    conf->bindpw = (child->bindpw ? child->bindpw : parent->bindpw);
+
+    conf->fallback = (child->fallback ? child->fallback : parent->fallback);
+
+    return conf;
+}
+
+/* 
+ * Use the ldap url parsing routines to break up the ldap url into
+ * host and port.
+ */
+static const char *mod_vhost_ldap_parse_url(cmd_parms *cmd, 
+					    void *dummy,
+					    const char *url)
+{
+    int result;
+    apr_ldap_url_desc_t *urld;
+#if (APR_MAJOR_VERSION >= 1)
+    apr_ldap_err_t *result_err;
+#endif
+
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(cmd->server->module_config,
+							&vhost_ldap_module);
+
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: `%s'", 
+	         url);
+    
+#if (APR_MAJOR_VERSION >= 1)    /* for apache >= 2.2 */
+    result = apr_ldap_url_parse(cmd->pool, url, &(urld), &(result_err));
+    if (result != LDAP_SUCCESS) {
+        return result_err->reason;
+    }
+#else
+    result = apr_ldap_url_parse(url, &(urld));
+    if (result != LDAP_SUCCESS) {
+        switch (result) {
+            case LDAP_URL_ERR_NOTLDAP:
+                return "LDAP URL does not begin with ldap://";
+            case LDAP_URL_ERR_NODN:
+                return "LDAP URL does not have a DN";
+            case LDAP_URL_ERR_BADSCOPE:
+                return "LDAP URL has an invalid scope";
+            case LDAP_URL_ERR_MEM:
+                return "Out of memory parsing LDAP URL";
+            default:
+                return "Could not parse LDAP URL";
+        }
+    }
+#endif
+    conf->url = apr_pstrdup(cmd->pool, url);
+
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: Host: %s", urld->lud_host);
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: Port: %d", urld->lud_port);
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: DN: %s", urld->lud_dn);
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: attrib: %s", urld->lud_attrs? urld->lud_attrs[0] : "(null)");
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: scope: %s", 
+	         (urld->lud_scope == LDAP_SCOPE_SUBTREE? "subtree" : 
+		 urld->lud_scope == LDAP_SCOPE_BASE? "base" : 
+		 urld->lud_scope == LDAP_SCOPE_ONELEVEL? "onelevel" : "unknown"));
+    ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0,
+	         cmd->server, "[mod_vhost_ldap.c] url parse: filter: %s", urld->lud_filter);
+
+    /* Set all the values, or at least some sane defaults */
+    if (conf->host) {
+        char *p = apr_palloc(cmd->pool, strlen(conf->host) + strlen(urld->lud_host) + 2);
+        strcpy(p, urld->lud_host);
+        strcat(p, " ");
+        strcat(p, conf->host);
+        conf->host = p;
+    }
+    else {
+        conf->host = urld->lud_host? apr_pstrdup(cmd->pool, urld->lud_host) : "localhost";
+    }
+    conf->basedn = urld->lud_dn? apr_pstrdup(cmd->pool, urld->lud_dn) : "";
+
+    conf->scope = urld->lud_scope == LDAP_SCOPE_ONELEVEL ?
+        LDAP_SCOPE_ONELEVEL : LDAP_SCOPE_SUBTREE;
+
+    if (urld->lud_filter) {
+        if (urld->lud_filter[0] == '(') {
+            /* 
+	     * Get rid of the surrounding parens; later on when generating the
+	     * filter, they'll be put back.
+             */
+            conf->filter = apr_pstrdup(cmd->pool, urld->lud_filter+1);
+            conf->filter[strlen(conf->filter)-1] = '\0';
+        }
+        else {
+            conf->filter = apr_pstrdup(cmd->pool, urld->lud_filter);
+        }
+    }
+    else {
+        conf->filter = "objectClass=apacheConfig";
+    }
+
+      /* "ldaps" indicates secure ldap connections desired
+      */
+    if (strncasecmp(url, "ldaps", 5) == 0)
+    {
+        conf->secure = 1;
+        conf->port = urld->lud_port? urld->lud_port : LDAPS_PORT;
+        ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server,
+                     "LDAP: vhost_ldap using SSL connections");
+    }
+    else
+    {
+        conf->secure = 0;
+        conf->port = urld->lud_port? urld->lud_port : LDAP_PORT;
+        ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, 
+                     "LDAP: vhost_ldap not using SSL connections");
+    }
+
+    conf->have_ldap_url = 1;
+#if (APR_MAJOR_VERSION < 1) /* free only required for older apr */
+    apr_ldap_free_urldesc(urld);
+#endif
+    return NULL;
+}
+
+static const char *mod_vhost_ldap_set_enabled(cmd_parms *cmd, void *dummy, int enabled)
+{
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(cmd->server->module_config,
+							&vhost_ldap_module);
+
+    conf->enabled = (enabled) ? MVL_ENABLED : MVL_DISABLED;
+
+    return NULL;
+}
+
+static const char *mod_vhost_ldap_set_binddn(cmd_parms *cmd, void *dummy, const char *binddn)
+{
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(cmd->server->module_config,
+							&vhost_ldap_module);
+
+    conf->binddn = apr_pstrdup(cmd->pool, binddn);
+    return NULL;
+}
+
+static const char *mod_vhost_ldap_set_bindpw(cmd_parms *cmd, void *dummy, const char *bindpw)
+{
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(cmd->server->module_config,
+							&vhost_ldap_module);
+
+    conf->bindpw = apr_pstrdup(cmd->pool, bindpw);
+    return NULL;
+}
+
+static const char *mod_vhost_ldap_set_deref(cmd_parms *cmd, void *dummy, const char *deref)
+{
+    mod_vhost_ldap_config_t *conf = 
+	(mod_vhost_ldap_config_t *)ap_get_module_config (cmd->server->module_config,
+							 &vhost_ldap_module);
+
+    if (strcmp(deref, "never") == 0 || strcasecmp(deref, "off") == 0) {
+        conf->deref = never;
+	conf->have_deref = 1;
+    }
+    else if (strcmp(deref, "searching") == 0) {
+        conf->deref = searching;
+	conf->have_deref = 1;
+    }
+    else if (strcmp(deref, "finding") == 0) {
+        conf->deref = finding;
+	conf->have_deref = 1;
+    }
+    else if (strcmp(deref, "always") == 0 || strcasecmp(deref, "on") == 0) {
+        conf->deref = always;
+	conf->have_deref = 1;
+    }
+    else {
+        return "Unrecognized value for VhostLDAPAliasDereference directive";
+    }
+    return NULL;
+}
+
+static const char *mod_vhost_ldap_set_fallback(cmd_parms *cmd, void *dummy, const char *fallback)
+{
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(cmd->server->module_config,
+							&vhost_ldap_module);
+
+    conf->fallback = apr_pstrdup(cmd->pool, fallback);
+    return NULL;
+}
+
+static int reconfigure_directive(apr_pool_t *p,
+				 server_rec *s,
+				 const char *dir,
+				 const char *args)
+{
+    ap_directive_t dir_s = { .directive = dir, .args = args, .next = NULL,
+                             .line_num = 0, .filename = "VhostLDAPConf" };
+    return ap_process_config_tree(s, &dir_s, p, p);
+}
+
+command_rec mod_vhost_ldap_cmds[] = {
+    AP_INIT_TAKE1("VhostLDAPURL", mod_vhost_ldap_parse_url, NULL, RSRC_CONF,
+                  "URL to define LDAP connection. This should be an RFC 2255 compliant\n"
+                  "URL of the form ldap://host[:port]/basedn[?attrib[?scope[?filter]]].\n"
+                  "<ul>\n"
+                  "<li>Host is the name of the LDAP server. Use a space separated list of hosts \n"
+                  "to specify redundant servers.\n"
+                  "<li>Port is optional, and specifies the port to connect to.\n"
+                  "<li>basedn specifies the base DN to start searches from\n"
+                  "</ul>\n"),
+
+    AP_INIT_TAKE1 ("VhostLDAPBindDN", mod_vhost_ldap_set_binddn, NULL, RSRC_CONF,
+		   "DN to use to bind to LDAP server. If not provided, will do an anonymous bind."),
+    
+    AP_INIT_TAKE1("VhostLDAPBindPassword", mod_vhost_ldap_set_bindpw, NULL, RSRC_CONF,
+                  "Password to use to bind to LDAP server. If not provided, will do an anonymous bind."),
+
+    AP_INIT_FLAG("VhostLDAPEnabled", mod_vhost_ldap_set_enabled, NULL, RSRC_CONF,
+                 "Set to off to disable vhost_ldap, even if it's been enabled in a higher tree"),
+
+    AP_INIT_TAKE1("VhostLDAPDereferenceAliases", mod_vhost_ldap_set_deref, NULL, RSRC_CONF,
+                  "Determines how aliases are handled during a search. Can be one of the"
+                  "values \"never\", \"searching\", \"finding\", or \"always\". "
+                  "Defaults to always."),
+
+    AP_INIT_TAKE1("VhostLDAPFallback", mod_vhost_ldap_set_fallback, NULL, RSRC_CONF,
+		  "Set default virtual host which will be used when requested hostname"
+		  "is not found in LDAP database. This option can be used to display"
+		  "\"virtual host not found\" type of page."),
+
+    {NULL}
+};
+
+#define FILTER_LENGTH MAX_STRING_LEN
+static int mod_vhost_ldap_translate_name(request_rec *r)
+{
+    server_rec *server;
+    const char *error;
+    int code;
+    mod_vhost_ldap_request_t *reqc;
+    int failures = 0;
+    const char **vals = NULL;
+    char filtbuf[FILTER_LENGTH];
+    mod_vhost_ldap_config_t *conf =
+	(mod_vhost_ldap_config_t *)ap_get_module_config(r->server->module_config, &vhost_ldap_module);
+    util_ldap_connection_t *ldc = NULL;
+    int result = 0;
+    const char *dn = NULL;
+    const char *hostname = NULL;
+    int is_fallback = 0;
+    int sleep0 = 0;
+    int sleep1 = 1;
+    int sleep;
+    struct berval hostnamebv, shostnamebv;
+
+    if ((error = ap_init_virtual_host(r->pool, "", r->server, &server)) != NULL) {
+        ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
+		      "[mod_vhost_ldap.c]: Could not initialize a new VirtualHost: %s",
+		      error);
+	return HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    reqc =
+	(mod_vhost_ldap_request_t *)apr_pcalloc(r->pool, sizeof(mod_vhost_ldap_request_t));
+    memset(reqc, 0, sizeof(mod_vhost_ldap_request_t)); 
+
+    ap_set_module_config(r->request_config, &vhost_ldap_module, reqc);
+
+    // mod_vhost_ldap is disabled or we don't have LDAP Url
+    if ((conf->enabled != MVL_ENABLED)||(!conf->have_ldap_url)) {
+	return DECLINED;
+    }
+
+start_over:
+
+    if (conf->host) {
+        ldc = util_ldap_connection_find(r, conf->host, conf->port,
+					conf->binddn, conf->bindpw, conf->deref,
+					conf->secure);
+    }
+    else {
+        ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, 
+                      "[mod_vhost_ldap.c] translate: no conf->host - weird...?");
+        return HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    hostname = r->hostname;
+    if (hostname == NULL || hostname[0] == '\0')
+        goto null;
+
+fallback:
+
+    ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r,
+		  "[mod_vhost_ldap.c]: translating hostname [%s], uri [%s]",
+		  hostname, r->uri);
+
+    ber_str2bv(hostname, 0, 0, &hostnamebv);
+    if (ldap_bv2escaped_filter_value(&hostnamebv, &shostnamebv) != 0)
+	goto null;
+    apr_snprintf(filtbuf, FILTER_LENGTH, "(&(%s)(|(apacheServerName=%s)(apacheServerAlias=%s)))", conf->filter, shostnamebv.bv_val, shostnamebv.bv_val);
+    ber_memfree(shostnamebv.bv_val);
+
+    result = util_ldap_cache_getuserdn(r, ldc, conf->url, conf->basedn, conf->scope,
+				       attributes, filtbuf, &dn, &vals);
+
+    util_ldap_connection_close(ldc);
+
+    /* sanity check - if server is down, retry it up to 5 times */
+    if (AP_LDAP_IS_SERVER_DOWN(result) ||
+	(result == LDAP_TIMEOUT) ||
+	(result == LDAP_CONNECT_ERROR)) {
+        sleep = sleep0 + sleep1;
+        ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r,
+		      "[mod_vhost_ldap.c]: lookup failure, retry number #[%d], sleeping for [%d] seconds",
+		      failures, sleep);
+        if (failures++ < MAX_FAILURES) {
+	    /* Back-off exponentially */
+	    apr_sleep(apr_time_from_sec(sleep));
+	    sleep0 = sleep1;
+	    sleep1 = sleep;
+            goto start_over;
+        } else {
+	    return HTTP_GATEWAY_TIME_OUT;
+	}
+    }
+
+    if (result == LDAP_NO_SUCH_OBJECT) {
+	if (strcmp(hostname, "*") != 0) {
+	    if (strncmp(hostname, "*.", 2) == 0)
+		hostname += 2;
+	    hostname += strcspn(hostname, ".");
+	    hostname = apr_pstrcat(r->pool, "*", hostname, (const char *)NULL);
+	    ap_log_rerror(APLOG_MARK, APLOG_NOTICE|APLOG_NOERRNO, 0, r,
+		          "[mod_vhost_ldap.c] translate: "
+			  "virtual host not found, trying wildcard %s",
+			  hostname);
+	    goto fallback;
+	}
+
+null:
+	if (conf->fallback && (is_fallback++ <= 0)) {
+	    ap_log_rerror(APLOG_MARK, APLOG_NOTICE|APLOG_NOERRNO, 0, r,
+			  "[mod_vhost_ldap.c] translate: "
+			  "virtual host %s not found, trying fallback %s",
+			  hostname, conf->fallback);
+	    hostname = conf->fallback;
+	    goto fallback;
+	}
+
+	ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r,
+		      "[mod_vhost_ldap.c] translate: "
+		      "virtual host %s not found",
+		      hostname);
+
+	return HTTP_BAD_REQUEST;
+    }
+
+    /* handle bind failure */
+    if (result != LDAP_SUCCESS) {
+        ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, 
+                      "[mod_vhost_ldap.c] translate: "
+                      "translate failed; virtual host %s; URI %s [%s]",
+		      hostname, r->uri, ldap_err2string(result));
+	return HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    /* mark the user and DN */
+    reqc->dn = apr_pstrdup(r->pool, dn);
+
+    /* Optimize */
+    if (vals) {
+	int i;
+	for (i = 0; attributes[i]; i++) {
+
+	    const char *directive;
+	    char *val = apr_pstrdup (r->pool, vals[i]);
+	    /* These do not correspond to any real directives */
+	    if (strcasecmp (attributes[i], "apacheSuexecUid") == 0) {
+		reqc->uid = val;
+		continue;
+	    }
+	    else if (strcasecmp (attributes[i], "apacheSuexecGid") == 0) {
+		reqc->gid = val;
+		continue;
+	    }
+
+	    if (strcasecmp (attributes[i], "apacheServerName") == 0) {
+		reqc->name = val;
+		directive = "ServerName";
+	    }
+	    else if (strcasecmp (attributes[i], "apacheServerAdmin") == 0) {
+		reqc->admin = val;
+		directive = "ServerAdmin";
+	    }
+	    else if (strcasecmp (attributes[i], "apacheDocumentRoot") == 0) {
+		reqc->docroot = val;
+		directive = "DocumentRoot";
+	    }
+	    else if (strcasecmp (attributes[i], "apacheScriptAlias") == 0) {
+		if (val != NULL) {
+		    /* Hack to deal with current apacheScriptAlias lagout */
+		    if (strlen(val) > 0 && val[strlen(val) - 1] == '/')
+			val = apr_pstrcat(r->pool, "/cgi-bin/ ", val, (const char *)NULL);
+		    else
+			val = apr_pstrcat(r->pool, "/cgi-bin/ ", val, "/", (const char *)NULL);
+		    directive = "ScriptAlias";
+		}
+		reqc->cgiroot = val;
+	    }
+	    else {
+		/* This should not actually be reachable, but it's
+		   good to cover all all possible cases */
+                ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r,
+                              "Unexpected attribute %s encountered", attributes[i]);
+                continue;
+            }
+
+	    if (val == NULL)
+                continue;
+
+	    if ((code = reconfigure_directive(r->pool, server, directive, val)) != 0)
+		return code;
+	}
+    }
+
+    ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r,
+		  "[mod_vhost_ldap.c]: loaded from ldap: "
+		  "apacheServerName: %s, "
+		  "apacheServerAdmin: %s, "
+		  "apacheDocumentRoot: %s, "
+		  "apacheScriptAlias: %s, "
+		  "apacheSuexecUid: %s, "
+		  "apacheSuexecGid: %s",
+		  reqc->name, reqc->admin, reqc->docroot, reqc->cgiroot, reqc->uid, reqc->gid);
+
+    if ((reqc->name == NULL)||(reqc->docroot == NULL)) {
+        ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, 
+                      "[mod_vhost_ldap.c] translate: "
+                      "translate failed; ServerName or DocumentRoot not defined");
+	return HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    if (reqc->uid != NULL) {
+	char *username;
+	char *userdir_val;
+	uid_t uid = (uid_t) atoll(reqc->uid);
+
+	if ((code = reconfigure_directive(r->pool, server, "UserDir", USERDIR)) != 0)
+	    return code;
+
+        /* Deal with ~ expansion */
+        if ((code = reconfigure_directive(r->pool, server, "UserDir", "disabled")) != 0)
+            return code;
+
+	if (apr_uid_name_get(&username, uid, r->pool) != APR_SUCCESS) {
+	    ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, 
+		          "could not get username for uid %d", uid);
+	    return HTTP_INTERNAL_SERVER_ERROR;
+	}
+
+        userdir_val = apr_pstrcat(r->pool, "enabled ", username, (const char *)NULL);
+
+	if ((code = reconfigure_directive(r->pool, server, "UserDir", userdir_val)) != 0)
+	    return code;
+    }
+
+    ap_fixup_virtual_host(r->pool, r->server, server);
+    r->server = server;
+
+    /* Hack to allow post-processing by other modules (mod_rewrite, mod_alias) */
+    return DECLINED;
+}
+
+#ifdef HAVE_UNIX_SUEXEC
+static ap_unix_identity_t *mod_vhost_ldap_get_suexec_id_doer(const request_rec * r)
+{
+  ap_unix_identity_t *ugid = NULL;
+  mod_vhost_ldap_config_t *conf = 
+      (mod_vhost_ldap_config_t *)ap_get_module_config(r->server->module_config,
+						      &vhost_ldap_module);
+  mod_vhost_ldap_request_t *req =
+      (mod_vhost_ldap_request_t *)ap_get_module_config(r->request_config,
+						       &vhost_ldap_module);
+
+  uid_t uid = -1;
+  gid_t gid = -1;
+
+  // mod_vhost_ldap is disabled or we don't have LDAP Url
+  if ((conf->enabled != MVL_ENABLED)||(!conf->have_ldap_url)) {
+      return NULL;
+  }
+
+  if ((req == NULL)||(req->uid == NULL)||(req->gid == NULL)) {
+      return NULL;
+  }
+
+  if ((ugid = apr_palloc(r->pool, sizeof(ap_unix_identity_t))) == NULL) {
+      return NULL;
+  }
+
+  uid = (uid_t)atoll(req->uid);
+  gid = (gid_t)atoll(req->gid);
+
+  if ((uid < MIN_UID)||(gid < MIN_GID)) {
+      return NULL;
+  }
+
+  ugid->uid = uid;
+  ugid->gid = gid;
+  ugid->userdir = 0;
+  
+  return ugid;
+}
+#endif
+
+static void
+mod_vhost_ldap_register_hooks (apr_pool_t * p)
+{
+
+    /*
+     * Run before mod_rewrite
+     */
+    static const char * const aszRewrite[]={ "mod_rewrite.c", NULL };
+
+    ap_hook_post_config(mod_vhost_ldap_post_config, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_translate_name(mod_vhost_ldap_translate_name, NULL, aszRewrite, APR_HOOK_FIRST);
+#ifdef HAVE_UNIX_SUEXEC
+    ap_hook_get_suexec_identity(mod_vhost_ldap_get_suexec_id_doer, NULL, NULL, APR_HOOK_MIDDLE);
+#endif
+#if (APR_MAJOR_VERSION >= 1)
+    ap_hook_optional_fn_retrieve(ImportULDAPOptFn,NULL,NULL,APR_HOOK_MIDDLE);
+#endif
+}
+
+module AP_MODULE_DECLARE_DATA vhost_ldap_module = {
+  STANDARD20_MODULE_STUFF,
+  NULL,
+  NULL,
+  mod_vhost_ldap_create_server_config,
+  mod_vhost_ldap_merge_server_config,
+  mod_vhost_ldap_cmds,
+  mod_vhost_ldap_register_hooks,
+};
Index: branches/fc15-dev/server/common/oursrc/httpdmods/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/httpdmods/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/httpdmods/mrproper	(revision 1803)
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/logview/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/logview/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/logview/Makefile.in	(revision 1803)
@@ -0,0 +1,18 @@
+CC = @CC@
+CFLAGS = @CFLAGS@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+
+all-local: logview
+
+install:
+	install -p -m755 -D logview $(DESTDIR)$(bindir)/logview
+	install -p -m755 -D logview.pl $(DESTDIR)$(bindir)/logview.pl
+
+clean:
+	rm -f logview
+
+distclean: clean
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/logview/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/logview/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/logview/configure.in	(revision 1803)
@@ -0,0 +1,5 @@
+AC_INIT()
+
+AC_PROG_CC
+
+AC_OUTPUT(Makefile)
Index: branches/fc15-dev/server/common/oursrc/logview/logview.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/logview/logview.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/logview/logview.c	(revision 1803)
@@ -0,0 +1,8 @@
+#include <unistd.h>
+
+#define REALPATH "/usr/local/bin/logview.pl"
+
+int main (int argc, char** argv)
+{
+  execv(REALPATH, argv);
+}
Index: branches/fc15-dev/server/common/oursrc/logview/logview.pl
===================================================================
--- branches/fc15-dev/server/common/oursrc/logview/logview.pl	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/logview/logview.pl	(revision 1803)
@@ -0,0 +1,18 @@
+#!/usr/bin/perl -T -w
+
+%ENV = ();
+$ENV{'PATH'} = '/bin:/usr/bin';
+my $elogsrc = '/home/logview/error_log';
+# get by uid the caller's name to find the corresponding locker name
+my $caller = (getpwuid $<)[0];
+$\ = "\n";
+
+print "--- Error logs for $caller ---";
+open FOO, $elogsrc;
+while (<FOO>) {
+    # Prevent deviousness, like web_scripts directories within web_scripts
+    if (m|/afs/athena.mit.edu/| &&
+        m|/([^/]+)/web_scripts/| && $caller eq $1) {
+        print;
+    }
+}
Index: branches/fc15-dev/server/common/oursrc/logview/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/logview/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/logview/mrproper	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+rm -f logview
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/COPYING.LESSER
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/COPYING.LESSER	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/COPYING.LESSER	(revision 1803)
@@ -0,0 +1,511 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/Makefile.am
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/Makefile.am	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/Makefile.am	(revision 1803)
@@ -0,0 +1,16 @@
+lib_LTLIBRARIES = libnss_nonlocal.la
+libnss_nonlocal_la_SOURCES = \
+    nonlocal-passwd.c nonlocal-group.c nonlocal-shadow.c \
+    nonlocal.h nsswitch-internal.h
+libnss_nonlocal_la_LDFLAGS = \
+    -version-info 2:0:0 \
+    -export-symbols-regex '^_nss_nonlocal_'
+
+noinst_PROGRAMS = .linktest
+_linktest_SOURCES =
+_linktest_LDADD = libnss_nonlocal.la
+_linktest_LDFLAGS = -nostdlib -entry=0
+
+install-exec-hook:
+	rm -f $(DESTDIR)$(libdir)/libnss_nonlocal.so
+	rm -f $(DESTDIR)$(libdir)/libnss_nonlocal.la
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/README
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/README	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/README	(revision 1803)
@@ -0,0 +1,28 @@
+This is nss_nonlocal, an nsswitch module that acts as a proxy for other 
+nsswitch modules like hesiod, but prevents non-local users from 
+potentially gaining local privileges by spoofing local UIDs and GIDs.
+
+To use it, configure /etc/nsswitch.conf as follows:
+
+passwd:         compat nonlocal
+passwd_nonlocal: hesiod
+group:          compat nonlocal
+group_nonlocal: hesiod
+
+Copyright © 2007–2010 Anders Kaseorg <andersk@mit.edu> and Tim Abbott
+<tabbott@mit.edu>
+
+nss_nonlocal is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2.1 of the
+License, or (at your option) any later version.
+
+nss_nonlocal is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with nss_nonlocal; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301  USA
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/configure.ac
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/configure.ac	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/configure.ac	(revision 1803)
@@ -0,0 +1,21 @@
+AC_INIT([nss_nonlocal], [1.11], [andersk@mit.edu])
+AC_CANONICAL_TARGET
+AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
+
+AC_PREFIX_DEFAULT([/])
+AC_DISABLE_STATIC
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+
+case "$target_cpu" in
+    i386 | i486 | i586 | i686 | i786)
+	AC_DEFINE([USE_REGPARMS], [],
+	          [Define if the regparm attribute shall be used for local functions (gcc on ix86 only).])
+ 	;;
+esac
+
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-group.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-group.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-group.c	(revision 1803)
@@ -0,0 +1,540 @@
+/*
+ * nonlocal-group.c
+ * group database for nss_nonlocal proxy
+ *
+ * Copyright © 2007–2010 Anders Kaseorg <andersk@mit.edu> and Tim
+ * Abbott <tabbott@mit.edu>
+ *
+ * This file is part of nss_nonlocal.
+ *
+ * nss_nonlocal is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * nss_nonlocal is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with nss_nonlocal; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <errno.h>
+#include <grp.h>
+#include <nss.h>
+#include "nsswitch-internal.h"
+#include "nonlocal.h"
+
+#define MAGIC_NONLOCAL_GROUPNAME "nss-nonlocal-users"
+#define MAGIC_LOCAL_GROUPNAME "nss-local-users"
+
+
+enum nss_status
+_nss_nonlocal_getgrnam_r(const char *name, struct group *grp,
+			 char *buffer, size_t buflen, int *errnop);
+
+enum nss_status
+_nss_nonlocal_getgrgid_r(gid_t gid, struct group *grp,
+			 char *buffer, size_t buflen, int *errnop);
+
+
+static service_user *
+nss_group_nonlocal_database(void)
+{
+    static service_user *nip = NULL;
+    if (nip == NULL)
+	__nss_database_lookup("group_nonlocal", NULL, "", &nip);
+
+    return nip;
+}
+
+
+enum nss_status
+check_nonlocal_gid(const char *user, gid_t gid, int *errnop)
+{
+    static const char *fct_name = "getgrgid_r";
+    static service_user *startp = NULL;
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(gid_t gid, struct group *grp,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    struct group gbuf;
+    int old_errno = errno;
+
+    size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+    char *buf = malloc(buflen);
+    if (buf == NULL) {
+	*errnop = ENOMEM;
+	errno = old_errno;
+	return NSS_STATUS_TRYAGAIN;
+    }
+
+    if (fct_start == NULL &&
+	__nss_group_lookup(&startp, fct_name, &fct_start) != 0) {
+	free(buf);
+	return NSS_STATUS_UNAVAIL;
+    }
+    nip = startp;
+    fct.ptr = fct_start;
+    do {
+    morebuf:
+	if (fct.l == _nss_nonlocal_getgrgid_r)
+	    status = NSS_STATUS_NOTFOUND;
+	else
+	    status = DL_CALL_FCT(fct.l, (gid, &gbuf, buf, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) {
+	    free(buf);
+	    buflen *= 2;
+	    buf = malloc(buflen);
+	    if (buf == NULL) {
+		*errnop = ENOMEM;
+		errno = old_errno;
+		return NSS_STATUS_TRYAGAIN;
+	    }
+	    goto morebuf;
+	}
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+
+    if (status == NSS_STATUS_SUCCESS) {
+	syslog(LOG_DEBUG, "nss_nonlocal: removing local group %u (%s) from non-local user %s\n", gbuf.gr_gid, gbuf.gr_name, user);
+	status = NSS_STATUS_NOTFOUND;
+    } else if (status != NSS_STATUS_TRYAGAIN) {
+	status = NSS_STATUS_SUCCESS;
+    }
+
+    free(buf);
+    return status;
+}
+
+enum nss_status
+check_nonlocal_group(const char *user, struct group *grp, int *errnop)
+{
+    enum nss_status status = NSS_STATUS_SUCCESS;
+    int old_errno = errno;
+    char *end;
+    unsigned long gid;
+
+    errno = 0;
+    gid = strtoul(grp->gr_name, &end, 10);
+    if (errno == 0 && *end == '\0' && (gid_t)gid == gid)
+	status = check_nonlocal_gid(user, gid, errnop);
+    errno = old_errno;
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    return check_nonlocal_gid(user, grp->gr_gid, errnop);
+}
+
+enum nss_status
+get_local_group(const char *name, struct group *grp, char **buffer, int *errnop)
+{
+    static const char *fct_name = "getgrnam_r";
+    static service_user *startp = NULL;
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *name, struct group *grp,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    size_t buflen;
+    int old_errno = errno;
+
+    buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+    *buffer = malloc(buflen);
+    if (*buffer == NULL) {
+	*errnop = ENOMEM;
+	errno = old_errno;
+	return NSS_STATUS_TRYAGAIN;
+    }
+
+    if (fct_start == NULL &&
+	__nss_group_lookup(&startp, fct_name, &fct_start) != 0) {
+	free(*buffer);
+	*buffer = NULL;
+	return NSS_STATUS_UNAVAIL;
+    }
+    nip = startp;
+    fct.ptr = fct_start;
+    do {
+    morebuf:
+	if (fct.l == _nss_nonlocal_getgrnam_r)
+	    status = NSS_STATUS_NOTFOUND;
+	else
+	    status = DL_CALL_FCT(fct.l, (name, grp, *buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) {
+	    free(*buffer);
+	    buflen *= 2;
+	    *buffer = malloc(buflen);
+	    if (*buffer == NULL) {
+		*errnop = ENOMEM;
+		errno = old_errno;
+		return NSS_STATUS_TRYAGAIN;
+	    }
+	    goto morebuf;
+	}
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+
+    if (status != NSS_STATUS_SUCCESS) {
+	free(*buffer);
+	*buffer = NULL;
+    }
+
+    return status;
+}
+
+static service_user *grent_nip = NULL;
+static void *grent_fct_start;
+static union {
+    enum nss_status (*l)(struct group *grp, char *buffer, size_t buflen,
+			 int *errnop);
+    void *ptr;
+} grent_fct;
+static const char *grent_fct_name = "getgrent_r";
+
+enum nss_status
+_nss_nonlocal_setgrent(int stayopen)
+{
+    static const char *fct_name = "setgrent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(int stayopen);
+	void *ptr;
+    } fct;
+
+    nip = nss_group_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (stayopen));
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    grent_nip = nip;
+    if (grent_fct_start == NULL)
+	grent_fct_start = __nss_lookup_function(nip, grent_fct_name);
+    grent_fct.ptr = grent_fct_start;
+    return NSS_STATUS_SUCCESS;
+}
+
+enum nss_status
+_nss_nonlocal_endgrent(void)
+{
+    static const char *fct_name = "endgrent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(void);
+	void *ptr;
+    } fct;
+
+    grent_nip = NULL;
+
+    nip = nss_group_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, ());
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    return status;
+}
+
+enum nss_status
+_nss_nonlocal_getgrent_r(struct group *grp, char *buffer, size_t buflen,
+			 int *errnop)
+{
+    enum nss_status status;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    if (grent_nip == NULL) {
+	status = _nss_nonlocal_setgrent(0);
+	if (status != NSS_STATUS_SUCCESS)
+	    return status;
+    }
+    do {
+	if (grent_fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else {
+	    int nonlocal_errno;
+	    do
+		status = DL_CALL_FCT(grent_fct.l, (grp, buffer, buflen, errnop));
+	    while (status == NSS_STATUS_SUCCESS &&
+		   check_nonlocal_group("(unknown)", grp, &nonlocal_errno) != NSS_STATUS_SUCCESS);
+	}
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    return status;
+
+	if (status == NSS_STATUS_SUCCESS)
+	    return NSS_STATUS_SUCCESS;
+    } while (__nss_next(&grent_nip, grent_fct_name, &grent_fct.ptr, status, 0) == 0);
+
+    grent_nip = NULL;
+    return NSS_STATUS_NOTFOUND;
+}
+
+
+enum nss_status
+_nss_nonlocal_getgrnam_r(const char *name, struct group *grp,
+			 char *buffer, size_t buflen, int *errnop)
+{
+    static const char *fct_name = "getgrnam_r";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *name, struct group *grp,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    nip = nss_group_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (name, grp, buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (strcmp(name, grp->gr_name) != 0) {
+	syslog(LOG_ERR, "nss_nonlocal: discarding group %s from lookup for group %s\n", grp->gr_name, name);
+	return NSS_STATUS_NOTFOUND;
+    }
+
+    return check_nonlocal_group(name, grp, errnop);
+}
+
+enum nss_status
+_nss_nonlocal_getgrgid_r(gid_t gid, struct group *grp,
+			 char *buffer, size_t buflen, int *errnop)
+{
+    static const char *fct_name = "getgrgid_r";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(gid_t gid, struct group *grp,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    nip = nss_group_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (gid, grp, buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (gid != grp->gr_gid) {
+	syslog(LOG_ERR, "nss_nonlocal: discarding gid %d from lookup for gid %d\n", grp->gr_gid, gid);
+	return NSS_STATUS_NOTFOUND;
+    }
+
+    return check_nonlocal_group(grp->gr_name, grp, errnop);
+}
+
+enum nss_status
+_nss_nonlocal_initgroups_dyn(const char *user, gid_t group, long int *start,
+			     long int *size, gid_t **groupsp, long int limit,
+			     int *errnop)
+{
+    static const char *fct_name = "initgroups_dyn";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *user, gid_t group, long int *start,
+			     long int *size, gid_t **groupsp, long int limit,
+			     int *errnop);
+	void *ptr;
+    } fct;
+
+    struct group local_users_group, nonlocal_users_group;
+    gid_t local_users_gid, gid;
+    int is_local = 0;
+    char *buffer;
+    int old_errno;
+    int in, out, i;
+
+    /* Check that the user is a nonlocal user before adding any groups. */
+    status = check_nonlocal_user(user, errnop);
+    if (status == NSS_STATUS_TRYAGAIN)
+	return status;
+    else if (status != NSS_STATUS_SUCCESS)
+	is_local = 1;
+
+    old_errno = errno;
+
+    status = get_local_group(MAGIC_LOCAL_GROUPNAME,
+			     &local_users_group, &buffer, errnop);
+    if (status == NSS_STATUS_SUCCESS) {
+	local_users_gid = local_users_group.gr_gid;
+	free(buffer);
+    } else if (status == NSS_STATUS_TRYAGAIN) {
+	return status;
+    } else {
+	syslog(LOG_WARNING, "nss_nonlocal: Group %s does not exist locally!",
+	       MAGIC_LOCAL_GROUPNAME);
+	local_users_gid = -1;
+    }
+
+    if (is_local) {
+	gid = local_users_gid;
+    } else {
+ 	status = get_local_group(MAGIC_NONLOCAL_GROUPNAME,
+				 &nonlocal_users_group, &buffer, errnop);
+	if (status == NSS_STATUS_SUCCESS) {
+	    gid = nonlocal_users_group.gr_gid;
+	    free(buffer);
+	} else if (status == NSS_STATUS_TRYAGAIN) {
+	    return status;
+	} else {
+	    syslog(LOG_WARNING, "nss_nonlocal: Group %s does not exist locally!",
+		   MAGIC_NONLOCAL_GROUPNAME);
+	    gid = -1;
+	}
+    }
+
+    if (gid != -1) {
+	int i;
+	for (i = 0; i < *start; ++i)
+	    if ((*groupsp)[i] == gid)
+		break;
+	if (i >= *start) {
+	    if (*start + 1 > *size) {
+		gid_t *newgroups;
+		long int newsize = 2 * *size;
+		if (limit > 0) {
+		    if (*size >= limit)
+			return NSS_STATUS_SUCCESS;
+		    if (newsize > limit)
+			newsize = limit;
+		}
+		newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0]));
+		if (newgroups == NULL) {
+		    *errnop = ENOMEM;
+		    errno = old_errno;
+		    return NSS_STATUS_TRYAGAIN;
+		}
+		*groupsp = newgroups;
+		*size = newsize;
+	    }
+	    (*groupsp)[(*start)++] = gid;
+	}
+    }
+
+    if (is_local)
+	return NSS_STATUS_SUCCESS;
+
+    in = out = *start;
+
+    nip = nss_group_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (user, group, start, size, groupsp, limit, errnop));
+        if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+            break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+        return status;
+
+    for (; in < *start; ++in) {
+	int nonlocal_errno = *errnop;
+
+	for (i = 0; i < out; ++i)
+	    if ((*groupsp)[i] == (*groupsp)[in])
+		break;
+	if (i < out)
+	    continue;
+
+	/* Don't let users get into MAGIC_LOCAL_GROUPNAME from nonlocal reasons. */
+	if (local_users_gid == (*groupsp)[in]) {
+	    syslog(LOG_WARNING, "nss_nonlocal: Nonlocal user %s removed from special local users group %s",
+		   user, MAGIC_LOCAL_GROUPNAME);
+	    continue;
+	}
+
+	status = check_nonlocal_gid(user, (*groupsp)[in], &nonlocal_errno);
+	if (status == NSS_STATUS_SUCCESS) {
+	    (*groupsp)[out++] = (*groupsp)[in];
+	} else if (status == NSS_STATUS_TRYAGAIN) {
+	    *start = out;
+	    *errnop = nonlocal_errno;
+	    return status;
+	}
+    }
+
+    *start = out;
+    return NSS_STATUS_SUCCESS;
+}
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-passwd.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-passwd.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-passwd.c	(revision 1803)
@@ -0,0 +1,412 @@
+/*
+ * nonlocal-passwd.c
+ * passwd database for nss_nonlocal proxy.
+ *
+ * Copyright © 2007–2010 Anders Kaseorg <andersk@mit.edu> and Tim
+ * Abbott <tabbott@mit.edu>
+ *
+ * This file is part of nss_nonlocal.
+ *
+ * nss_nonlocal is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * nss_nonlocal is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with nss_nonlocal; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+#include <nss.h>
+#include "nsswitch-internal.h"
+#include "nonlocal.h"
+
+
+enum nss_status
+_nss_nonlocal_getpwuid_r(uid_t uid, struct passwd *pwd,
+			 char *buffer, size_t buflen, int *errnop);
+enum nss_status
+_nss_nonlocal_getpwnam_r(const char *name, struct passwd *pwd,
+			 char *buffer, size_t buflen, int *errnop);
+
+
+static service_user *
+nss_passwd_nonlocal_database(void)
+{
+    static service_user *nip = NULL;
+    if (nip == NULL)
+	__nss_database_lookup("passwd_nonlocal", NULL, "", &nip);
+
+    return nip;
+}
+
+
+enum nss_status
+check_nonlocal_uid(const char *user, uid_t uid, int *errnop)
+{
+    static const char *fct_name = "getpwuid_r";
+    static service_user *startp = NULL;
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(uid_t uid, struct passwd *pwd,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    struct passwd pwbuf;
+    int old_errno = errno;
+
+    size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
+    char *buf = malloc(buflen);
+    if (buf == NULL) {
+	*errnop = ENOMEM;
+	errno = old_errno;
+	return NSS_STATUS_TRYAGAIN;
+    }
+
+    if (fct_start == NULL &&
+	__nss_passwd_lookup(&startp, fct_name, &fct_start) != 0) {
+	free(buf);
+	return NSS_STATUS_UNAVAIL;
+    }
+    nip = startp;
+    fct.ptr = fct_start;
+    do {
+    morebuf:
+	if (fct.l == _nss_nonlocal_getpwuid_r)
+	    status = NSS_STATUS_NOTFOUND;
+	else
+	    status = DL_CALL_FCT(fct.l, (uid, &pwbuf, buf, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) {
+	    free(buf);
+	    buflen *= 2;
+	    buf = malloc(buflen);
+	    if (buf == NULL) {
+		*errnop = ENOMEM;
+		errno = old_errno;
+		return NSS_STATUS_TRYAGAIN;
+	    }
+	    goto morebuf;
+	}
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+
+    if (status == NSS_STATUS_SUCCESS) {
+	syslog(LOG_ERR, "nss_nonlocal: possible spoofing attack: non-local user %s has same UID as local user %s!\n", user, pwbuf.pw_name);
+	status = NSS_STATUS_NOTFOUND;
+    } else if (status != NSS_STATUS_TRYAGAIN) {
+	status = NSS_STATUS_SUCCESS;
+    }
+
+    free(buf);
+    return status;
+}
+
+enum nss_status
+check_nonlocal_passwd(const char *user, struct passwd *pwd, int *errnop)
+{
+    enum nss_status status = NSS_STATUS_SUCCESS;
+    int old_errno = errno;
+    char *end;
+    unsigned long uid;
+
+    errno = 0;
+    uid = strtoul(pwd->pw_name, &end, 10);
+    if (errno == 0 && *end == '\0' && (uid_t)uid == uid)
+	status = check_nonlocal_uid(user, uid, errnop);
+    errno = old_errno;
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    return check_nonlocal_uid(user, pwd->pw_uid, errnop);
+}
+
+enum nss_status
+check_nonlocal_user(const char *user, int *errnop)
+{
+    static const char *fct_name = "getpwnam_r";
+    static service_user *startp = NULL;
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *name, struct passwd *pwd,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    struct passwd pwbuf;
+    int old_errno = errno;
+
+    size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
+    char *buf = malloc(buflen);
+    if (buf == NULL) {
+	*errnop = ENOMEM;
+	errno = old_errno;
+	return NSS_STATUS_TRYAGAIN;
+    }
+
+    if (fct_start == NULL &&
+	__nss_passwd_lookup(&startp, fct_name, &fct_start) != 0) {
+	free(buf);
+	return NSS_STATUS_UNAVAIL;
+    }
+    nip = startp;
+    fct.ptr = fct_start;
+    do {
+    morebuf:
+	if (fct.l == _nss_nonlocal_getpwnam_r)
+	    status = NSS_STATUS_NOTFOUND;
+	else
+	    status = DL_CALL_FCT(fct.l, (user, &pwbuf, buf, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) {
+	    free(buf);
+	    buflen *= 2;
+	    buf = malloc(buflen);
+	    if (buf == NULL) {
+		*errnop = ENOMEM;
+		errno = old_errno;
+		return NSS_STATUS_TRYAGAIN;
+	    }
+	    goto morebuf;
+	}
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+
+    if (status == NSS_STATUS_SUCCESS)
+	status = NSS_STATUS_NOTFOUND;
+    else if (status != NSS_STATUS_TRYAGAIN)
+	status = NSS_STATUS_SUCCESS;
+
+    free(buf);
+    return status;
+}
+
+
+static service_user *pwent_nip = NULL;
+static void *pwent_fct_start;
+static union {
+    enum nss_status (*l)(struct passwd *pwd, char *buffer, size_t buflen,
+			 int *errnop);
+    void *ptr;
+} pwent_fct;
+static const char *pwent_fct_name = "getpwent_r";
+
+enum nss_status
+_nss_nonlocal_setpwent(int stayopen)
+{
+    static const char *fct_name = "setpwent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(int stayopen);
+	void *ptr;
+    } fct;
+
+    nip = nss_passwd_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (stayopen));
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    pwent_nip = nip;
+    if (pwent_fct_start == NULL)
+	pwent_fct_start = __nss_lookup_function(nip, pwent_fct_name);
+    pwent_fct.ptr = pwent_fct_start;
+    return NSS_STATUS_SUCCESS;
+}
+
+enum nss_status
+_nss_nonlocal_endpwent(void)
+{
+    static const char *fct_name = "endpwent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(void);
+	void *ptr;
+    } fct;
+
+    pwent_nip = NULL;
+
+    nip = nss_passwd_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, ());
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    return status;
+}
+
+enum nss_status
+_nss_nonlocal_getpwent_r(struct passwd *pwd, char *buffer, size_t buflen,
+			 int *errnop)
+{
+    enum nss_status status;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    if (pwent_nip == NULL) {
+	status = _nss_nonlocal_setpwent(0);
+	if (status != NSS_STATUS_SUCCESS)
+	    return status;
+    }
+    do {
+	if (pwent_fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else {
+	    int nonlocal_errno;
+	    do
+		status = DL_CALL_FCT(pwent_fct.l, (pwd, buffer, buflen, errnop));
+	    while (status == NSS_STATUS_SUCCESS &&
+		   check_nonlocal_passwd(pwd->pw_name, pwd, &nonlocal_errno) != NSS_STATUS_SUCCESS);
+	}
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    return status;
+
+	if (status == NSS_STATUS_SUCCESS)
+	    return NSS_STATUS_SUCCESS;
+    } while (__nss_next(&pwent_nip, pwent_fct_name, &pwent_fct.ptr, status, 0) == 0);
+
+    pwent_nip = NULL;
+    return NSS_STATUS_NOTFOUND;
+}
+
+
+enum nss_status
+_nss_nonlocal_getpwnam_r(const char *name, struct passwd *pwd,
+			 char *buffer, size_t buflen, int *errnop)
+{
+    static const char *fct_name = "getpwnam_r";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *name, struct passwd *pwd,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    int group_errno;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    nip = nss_passwd_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (name, pwd, buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (strcmp(name, pwd->pw_name) != 0) {
+	syslog(LOG_ERR, "nss_nonlocal: discarding user %s from lookup for user %s\n", pwd->pw_name, name);
+	return NSS_STATUS_NOTFOUND;
+    }
+
+    status = check_nonlocal_passwd(name, pwd, errnop);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (check_nonlocal_gid(name, pwd->pw_gid, &group_errno) !=
+	NSS_STATUS_SUCCESS)
+	pwd->pw_gid = 65534 /* nogroup */;
+    return NSS_STATUS_SUCCESS;
+}
+
+enum nss_status
+_nss_nonlocal_getpwuid_r(uid_t uid, struct passwd *pwd,
+			 char *buffer, size_t buflen, int *errnop)
+{
+    static const char *fct_name = "getpwuid_r";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(uid_t uid, struct passwd *pwd,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+    int group_errno;
+
+    char *nonlocal_ignore = getenv(NONLOCAL_IGNORE_ENV);
+    if (nonlocal_ignore != NULL && nonlocal_ignore[0] != '\0')
+	return NSS_STATUS_UNAVAIL;
+
+    nip = nss_passwd_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (uid, pwd, buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (uid != pwd->pw_uid) {
+	syslog(LOG_ERR, "nss_nonlocal: discarding uid %d from lookup for uid %d\n", pwd->pw_uid, uid);
+	return NSS_STATUS_NOTFOUND;
+    }
+
+    status = check_nonlocal_passwd(pwd->pw_name, pwd, errnop);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (check_nonlocal_gid(pwd->pw_name, pwd->pw_gid, &group_errno) !=
+	NSS_STATUS_SUCCESS)
+	pwd->pw_gid = 65534 /* nogroup */;
+    return NSS_STATUS_SUCCESS;
+}
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-shadow.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-shadow.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal-shadow.c	(revision 1803)
@@ -0,0 +1,189 @@
+/*
+ * nonlocal-shadow.c
+ * shadow database for nss_nonlocal proxy.
+ *
+ * Copyright © 2007–2010 Anders Kaseorg <andersk@mit.edu>
+ *
+ * This file is part of nss_nonlocal.
+ *
+ * nss_nonlocal is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * nss_nonlocal is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with nss_nonlocal; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301  USA
+ */
+
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <errno.h>
+#include <shadow.h>
+#include <nss.h>
+
+#include "nsswitch-internal.h"
+#include "nonlocal.h"
+
+
+static service_user *
+nss_shadow_nonlocal_database(void)
+{
+    static service_user *nip = NULL;
+    if (nip == NULL)
+        __nss_database_lookup("shadow_nonlocal", NULL, "", &nip);
+
+    return nip;
+}
+
+
+static service_user *spent_nip = NULL;
+static void *spent_fct_start;
+static union {
+    enum nss_status (*l)(struct spwd *pwd, char *buffer, size_t buflen,
+			 int *errnop);
+    void *ptr;
+} spent_fct;
+static const char *spent_fct_name = "getspent_r";
+
+enum nss_status
+_nss_nonlocal_setspent(int stayopen)
+{
+    static const char *fct_name = "setspent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(int stayopen);
+	void *ptr;
+    } fct;
+
+    nip = nss_shadow_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (stayopen));
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    spent_nip = nip;
+    if (spent_fct_start == NULL)
+	spent_fct_start = __nss_lookup_function(nip, spent_fct_name);
+    spent_fct.ptr = spent_fct_start;
+    return NSS_STATUS_SUCCESS;
+}
+
+enum nss_status
+_nss_nonlocal_endspent(void)
+{
+    static const char *fct_name = "endspent";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(void);
+	void *ptr;
+    } fct;
+
+    spent_nip = NULL;
+
+    nip = nss_shadow_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, ());
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    return status;
+}
+
+enum nss_status
+_nss_nonlocal_getspent_r(struct spwd *pwd, char *buffer, size_t buflen,
+			 int *errnop)
+{
+    enum nss_status status;
+    if (spent_nip == NULL) {
+	status = _nss_nonlocal_setspent(0);
+	if (status != NSS_STATUS_SUCCESS)
+	    return status;
+    }
+    do {
+	if (spent_fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(spent_fct.l, (pwd, buffer, buflen, errnop));	
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    return status;
+
+	if (status == NSS_STATUS_SUCCESS)
+	    return NSS_STATUS_SUCCESS;
+    } while (__nss_next(&spent_nip, spent_fct_name, &spent_fct.ptr, status, 0) == 0);
+
+    spent_nip = NULL;
+    return NSS_STATUS_NOTFOUND;
+}
+
+
+enum nss_status
+_nss_nonlocal_getspnam_r(const char *name, struct spwd *pwd,
+			 char *buffer, size_t buflen, int *errnop)
+{
+    static const char *fct_name = "getspnam_r";
+    static void *fct_start = NULL;
+    enum nss_status status;
+    service_user *nip;
+    union {
+	enum nss_status (*l)(const char *name, struct spwd *pwd,
+			     char *buffer, size_t buflen, int *errnop);
+	void *ptr;
+    } fct;
+
+    nip = nss_shadow_nonlocal_database();
+    if (nip == NULL)
+	return NSS_STATUS_UNAVAIL;
+    if (fct_start == NULL)
+	fct_start = __nss_lookup_function(nip, fct_name);
+    fct.ptr = fct_start;
+    do {
+	if (fct.ptr == NULL)
+	    status = NSS_STATUS_UNAVAIL;
+	else
+	    status = DL_CALL_FCT(fct.l, (name, pwd, buffer, buflen, errnop));
+	if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
+	    break;
+    } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0);
+    if (status != NSS_STATUS_SUCCESS)
+	return status;
+
+    if (strcmp(name, pwd->sp_namp) != 0) {
+	syslog(LOG_ERR, "nss_nonlocal: discarding shadow %s from lookup for shadow %s\n", pwd->sp_namp, name);
+	return NSS_STATUS_NOTFOUND;
+    }
+
+    return NSS_STATUS_SUCCESS;
+}
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal.h
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal.h	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/nonlocal.h	(revision 1803)
@@ -0,0 +1,12 @@
+#ifndef NONLOCAL_H
+#define NONLOCAL_H
+
+#include "config.h"
+
+enum nss_status check_nonlocal_uid(const char *user, uid_t uid, int *errnop);
+enum nss_status check_nonlocal_gid(const char *user, gid_t gid, int *errnop);
+enum nss_status check_nonlocal_user(const char *user, int *errnop);
+
+#define NONLOCAL_IGNORE_ENV "NSS_NONLOCAL_IGNORE"
+
+#endif /* NON_LOCAL_H */
Index: branches/fc15-dev/server/common/oursrc/nss_nonlocal/nsswitch-internal.h
===================================================================
--- branches/fc15-dev/server/common/oursrc/nss_nonlocal/nsswitch-internal.h	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/nss_nonlocal/nsswitch-internal.h	(revision 1803)
@@ -0,0 +1,34 @@
+/*
+ * nsswitch_internal.h
+ * Prototypes for some internal glibc functions that we use.  Shhh.
+ */
+
+#ifndef NSSWITCH_INTERNAL_H
+#define NSSWITCH_INTERNAL_H
+
+#include "config.h"
+
+/* glibc/config.h.in */
+#if defined USE_REGPARMS && !defined PROF && !defined __BOUNDED_POINTERS__
+# define internal_function __attribute__ ((regparm (3), stdcall))
+#else
+# define internal_function
+#endif
+
+/* glibc/nss/nsswitch.h */
+typedef struct service_user service_user;
+
+extern int __nss_next (service_user **ni, const char *fct_name, void **fctp,
+		       int status, int all_values);
+extern int __nss_database_lookup (const char *database,
+				  const char *alternative_name,
+				  const char *defconfig, service_user **ni);
+extern void *__nss_lookup_function (service_user *ni, const char *fct_name);
+
+/* glibc/nss/XXX-lookup.c */
+extern int __nss_passwd_lookup (service_user **ni, const char *fct_name,
+				void **fctp) internal_function;
+extern int __nss_group_lookup (service_user **ni, const char *fct_name,
+			        void **fctp) internal_function;
+
+#endif /* NSSWITCH_INTERNAL_H */
Index: branches/fc15-dev/server/common/oursrc/php_scripts/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/php_scripts/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/php_scripts/Makefile.in	(revision 1803)
@@ -0,0 +1,22 @@
+CC = @CC@
+CFLAGS = @CFLAGS@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+MODS = scripts
+
+all-local: $(patsubst %,.libs/%.so,$(MODS))
+
+.libs/%.so: %.c
+	$(CC) $(CFLAGS) -c $<
+
+install:
+	install -p -m755 -D .libs/scripts.so $(DESTDIR)/usr/lib64/php/modules/scripts.so
+
+clean:
+	rm -f $(MODS:=.so) $(MODS:=.o) $(MODS:=.la) $(MODS:=.lo) $(MODS:=.slo) $(MODS:=.lai)
+	rm -rf .libs modules
+
+distclean: clean
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/php_scripts/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/php_scripts/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/php_scripts/mrproper	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm -f scripts.so
+rm -f configure config.* Makefile
+rm -rf auto*.cache
+rm -rf .libs
Index: branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts-config.m4
===================================================================
--- branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts-config.m4	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts-config.m4	(revision 1803)
@@ -0,0 +1,7 @@
+PHP_ARG_ENABLE(scripts, whether to enable scripts.mit.edu support,
+[ --enable-scripts   Enable scripts.mit.edu support])
+
+if test "$PHP_SCRIPTS" != "no"; then
+  AC_DEFINE(HAVE_SCRIPTS, 1, [Whether you have scripts.mit.edu support])
+  PHP_NEW_EXTENSION(scripts, php_scripts.c, $ext_shared)
+fi
Index: branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.c
===================================================================
--- branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.c	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.c	(revision 1803)
@@ -0,0 +1,85 @@
+/***
+ * scripts.mit.edu PHP enhancement extension
+ *
+ * Joe Presbrey <presbrey@mit.edu>
+ * 2008-06-19
+ *
+ ***/
+
+#include "php.h"
+#include "zend_extensions.h"
+
+#include "php_scripts.h"
+
+#ifndef ZEND_EXT_API
+#define ZEND_EXT_API    ZEND_DLEXPORT
+#endif
+ZEND_EXTENSION();
+
+ZEND_MODULE_STARTUP_D(scripts)
+{
+	return SUCCESS;
+}
+
+ZEND_MODULE_SHUTDOWN_D(scripts)
+{
+}
+
+ZEND_MODULE_ACTIVATE_D(scripts)
+{
+    // replace error handler callback with our own
+    old_error_cb = zend_error_cb;
+    new_error_cb = scripts_error_cb;
+    zend_error_cb = new_error_cb;
+
+	return SUCCESS;
+}
+
+ZEND_MODULE_DEACTIVATE_D(scripts)
+{
+    // restore original error handler callback
+    zend_error_cb = old_error_cb;
+}
+
+void scripts_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args)
+{
+    char *buffer;
+    const char *user = php_get_current_user();
+
+    // enhance the log message
+    spprintf(&buffer, 0, "(%s) %s", user, format);
+
+    // pass through to builtin error callback
+    if (strncmp(format, "Module '%s' already loaded", 26)==0) {
+        // demote from E_CORE_WARNING
+        old_error_cb(E_NOTICE, error_filename, error_lineno, buffer, args);
+    } else {
+        old_error_cb(type, error_filename, error_lineno, buffer, args);
+    }
+
+    efree(buffer);
+}
+
+ZEND_DLEXPORT zend_extension zend_extension_entry = {
+    PHP_SCRIPTS_EXTNAME,
+    PHP_SCRIPTS_VERSION,
+    PHP_SCRIPTS_AUTHOR,
+    PHP_SCRIPTS_URL,
+    PHP_SCRIPTS_YEAR,
+    ZEND_MODULE_STARTUP_N(scripts),		/* startup_func_t */
+    ZEND_MODULE_SHUTDOWN_N(scripts),	/* shutdown_func_t */
+    ZEND_MODULE_ACTIVATE_N(scripts),	/* activate_func_t */
+    ZEND_MODULE_DEACTIVATE_N(scripts),	/* deactivate_func_t */
+    NULL,           					/* message_handler_func_t */
+    NULL,           					/* op_array_handler_func_t */
+    NULL,           					/* statement_handler_func_t */
+    NULL,           					/* fcall_begin_handler_func_t */
+    NULL,           					/* fcall_end_handler_func_t */
+    NULL,           					/* op_array_ctor_func_t */
+    NULL,           					/* op_array_dtor_func_t */
+    STANDARD_ZEND_EXTENSION_PROPERTIES
+};
+
+#ifdef COMPILE_DL_SCRIPTS
+ZEND_GET_MODULE(scripts)
+#endif
Index: branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.h
===================================================================
--- branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.h	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/php_scripts/php_scripts.h	(revision 1803)
@@ -0,0 +1,51 @@
+/***
+ * scripts.mit.edu PHP extension
+ *
+ * Joe Presbrey <presbrey@mit.edu>
+ * 2008-06-19
+ *
+ ***/
+
+#ifndef PHP_SCRIPTS_H
+#define PHP_SCRIPTS_H 1
+
+#define PHP_SCRIPTS_VERSION "1.0"
+#define PHP_SCRIPTS_EXTNAME "scripts"
+#define PHP_SCRIPTS_AUTHOR "presbrey@mit.edu"
+#define PHP_SCRIPTS_URL "http://scripts.mit.edu/"
+#define PHP_SCRIPTS_YEAR "2008"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+extern zend_module_entry scripts_module_entry;
+#define phpext_scripts_ptr &scripts_module_entry
+
+/* error callback repalcement functions */
+void (*old_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
+void (*new_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
+void scripts_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
+
+static function_entry scripts_functions[] = {
+    {NULL, NULL, NULL}
+};
+
+zend_module_entry scripts_module_entry = {
+#if ZEND_MODULE_API_NO >= 20010901
+    STANDARD_MODULE_HEADER,
+#endif
+    PHP_SCRIPTS_EXTNAME,
+    scripts_functions,
+    NULL, //PHP_MINIT(scripts),
+    NULL, //PHP_MSHUTDOWN(scripts),
+    NULL,
+    NULL,
+    NULL,
+#if ZEND_MODULE_API_NO >= 20010901
+    PHP_SCRIPTS_VERSION,
+#endif
+    STANDARD_MODULE_PROPERTIES
+};
+
+#endif
Index: branches/fc15-dev/server/common/oursrc/python-routefs/routefs/__init__.py
===================================================================
--- branches/fc15-dev/server/common/oursrc/python-routefs/routefs/__init__.py	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/python-routefs/routefs/__init__.py	(revision 1803)
@@ -0,0 +1,219 @@
+"""
+RouteFS is a base class for developing read-only FUSE filesystems that
+lets you focus on the directory tree instead of the system calls.
+
+RouteFS uses the Routes library developed for Pylons. URLs were
+inspired by filesystems, and now you can have filesystems inspired by
+URLs.
+
+When developing a descendent of RouteFS, any methods defined in that
+class are considered "controllers", and receive any other parameters
+specified by the URL as keyword arguments.
+"""
+
+import fuse
+import routes
+import errno
+import stat
+
+fuse.fuse_python_api = (0, 2)
+
+class RouteStat(fuse.Stat):
+    """
+    RouteStat is a descendent of fuse.Stat, defined to make sure that
+    all of the necessary attributes are always defined
+    """
+    def __init__(self):
+        self.st_mode = 0
+        self.st_ino = 0
+        self.st_dev = 0
+        self.st_nlink = 0
+        self.st_uid = 0
+        self.st_gid = 0
+        self.st_size = 0
+        self.st_atime = 0
+        self.st_mtime = 0
+        self.st_ctime = 0
+
+class RouteMeta(type):
+    """
+    Metaclass to calculate controller methods
+    
+    Routes needs to be pre-seeded with a list of "controllers". For
+    all descendents of RouteFS, the list of controllers is defined to
+    be any non-private methods of the class that were not in the
+    RouteFS class.
+    """
+    def __init__(cls, classname, bases, dict_):
+        super(RouteMeta, cls).__init__(classname, bases, dict_)
+        if bases != (fuse.Fuse,):
+            new_funcs = set(dict_.keys()).difference(dir(RouteFS))
+            cls.controllers([func for func in new_funcs \
+                                 if not func.startswith('_')])
+
+class RouteFS(fuse.Fuse):
+    """
+    RouteFS: Web 2.0 for filesystems
+    """
+    __metaclass__ = RouteMeta
+    def __init__(self, *args, **kwargs):
+        super(RouteFS, self).__init__(*args, **kwargs)
+        
+        self.map = self.make_map()
+        self.map.create_regs(self.controller_list)
+        
+    def make_map(self):
+        """
+        This method should be overridden by descendents of RouteFS to
+        define the routing for the filesystem
+        """
+        m = routes.Mapper()
+        
+        m.connect(':controller')
+        
+        return m
+    
+    @classmethod
+    def controllers(cls, lst):
+        cls.controller_list = lst
+    
+    def _get_file(self, path):
+        """
+        Find the filesystem entry object for a given path
+        """
+        match = self.map.match(path)
+        if match is None:
+            return NoEntry()
+        controller = match.pop('controller')
+        result = getattr(self, controller)(**match)
+        if type(result) is str:
+            result = File(result)
+        if type(result) is list:
+            result = Directory(result)
+        return result
+    
+    def readdir(self, path, offset):
+        """
+        If the path referred to is a directory, return the elements of
+        that diectory
+        """
+        return self._get_file(path).readdir(offset)
+    
+    def getattr(self, path):
+        """
+        Return the stat information for a path
+        
+        The stat information for a directory, symlink, or file is
+        predetermined based on which it is.
+        """
+        return self._get_file(path).getattr()
+    
+    def read(self, path, length, offset):
+        """
+        If the path specified is a file, return the requested portion
+        of the file
+        """
+        return self._get_file(path).read(length, offset)
+    
+    def readlink(self, path):
+        """
+        If the path specified is a symlink, return the target
+        """
+        return self._get_file(path).readlink()
+
+class TreeKey(object):
+    def getattr(self):
+        return -errno.EINVAL
+    def readdir(self, offset):
+        return -errno.EINVAL
+    def read(self, length, offset):
+        return -errno.EINVAL
+    def readlink(self):
+        return -errno.EINVAL
+
+class NoEntry(TreeKey):
+    def getattr(self):
+        return -errno.ENOENT
+    def readdir(self, offset):
+        return -errno.ENOENT
+    def read(self, length, offset):
+        return -errno.ENOENT
+    def readlink(self):
+        return -errno.ENOENT
+
+class TreeEntry(TreeKey):
+    default_mode = 0444
+    
+    def __new__(cls, contents, mode=None):
+        return super(TreeEntry, cls).__new__(cls, contents)
+    
+    def __init__(self, contents, mode=None):
+        if mode is None:
+            self.mode = self.default_mode
+        else:
+            self.mode = mode
+        
+        super(TreeEntry, self).__init__(contents)
+
+class Directory(TreeEntry, list):
+    """
+    A dummy class representing a filesystem entry that should be a
+    directory
+    """
+    default_mode = 0555
+
+    def getattr(self):
+        st = RouteStat()
+        st.st_mode = stat.S_IFDIR | self.mode
+        st.st_nlink = 2
+        return st
+
+    def readdir(self, offset):
+        for member in ['.', '..'] + self:
+            yield fuse.Direntry(str(member))
+
+class Symlink(TreeEntry, str):
+    """
+    A dummy class representing something that should be a symlink
+    """
+    default_mode = 0777
+
+    def getattr(self):
+        st = RouteStat()
+        st.st_mode = stat.S_IFLNK | self.mode
+        st.st_nlink = 1
+        st.st_size = len(self)
+        return st
+
+    def readlink(self):
+        return self
+
+class File(TreeEntry, str):
+    """
+    A dummy class representing something that should be a file
+    """
+    default_mode = 0444
+
+    def getattr(self):
+        st = RouteStat()
+        st.st_mode = stat.S_IFREG | self.mode
+        st.st_nlink = 1
+        st.st_size = len(self)
+        return st
+
+    def read(self, length, offset):
+        return self[offset:offset + length]
+
+def main(cls):
+    """
+    A convenience function for initializing a RouteFS filesystem
+    """
+    server = cls(version="%prog " + fuse.__version__,
+                 usage=fuse.Fuse.fusage,
+                 dash_s_do='setsingle')
+    server.parse(values=server, errex=1)
+    server.main()
+
+from dictfs import DictFS
+
+__all__ = ['RouteFS', 'DictFS', 'Symlink', 'Directory', 'File', 'main']
Index: branches/fc15-dev/server/common/oursrc/python-routefs/routefs/dictfs.py
===================================================================
--- branches/fc15-dev/server/common/oursrc/python-routefs/routefs/dictfs.py	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/python-routefs/routefs/dictfs.py	(revision 1803)
@@ -0,0 +1,48 @@
+"""
+DictFS allows you to easily create read-only filesystems when the
+file tree is known in advance.
+
+To create your own DictFS descendent, simply override the files
+property, which can be created either using the property
+decorator, or just a simple assignment.
+
+A dictionary represents a directory, with keys corresponding to
+file names and the values corresponding to the file contents.
+"""
+
+import routefs
+from routes import Mapper
+import os
+
+class DictFS(routefs.RouteFS):
+    @property
+    def files(self):
+        """
+        This property should be overridden in your DictFS descendant
+        """
+        return dict()
+    
+    def make_map(self):
+        m = Mapper()
+        
+        m.connect('*path', controller='handler')
+        
+        return m
+    
+    def handler(self, path, **kwargs):
+        if path != '':
+            elements = path.split(os.path.sep)
+        else:
+            elements = []
+        
+        try:
+            tree = self.files
+            for elt in elements:
+                tree = tree[elt]
+        except KeyError:
+            return
+        
+        if type(tree) is dict:
+            return tree.keys()
+        else:
+            return tree
Index: branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/dictexfs.py
===================================================================
--- branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/dictexfs.py	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/dictexfs.py	(revision 1803)
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+
+import routefs
+
+class DictExFS(routefs.DictFS):
+    files = dict(Hello='World',
+                 Directory=dict(a='a', b='b', c=routefs.Symlink('a')))
+
+if __name__ == '__main__':
+    routefs.main(DictExFS)
Index: branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/pyhesiodfs.py
===================================================================
--- branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/pyhesiodfs.py	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/python-routefs/routefs/examples/pyhesiodfs.py	(revision 1803)
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+
+import hesiod
+import routefs
+from routes import Mapper
+
+class PyHesiodFS(routefs.RouteFS):
+    def __init__(self, *args, **kwargs):
+        super(PyHesiodFS, self).__init__(*args, **kwargs)
+        self.fuse_args.add("allow_other", True)
+        
+        self.cache = {}
+    
+    def make_map(self):
+        m = Mapper()
+        m.connect('', controller='getList')
+        m.connect('README.txt', controller='getReadme')
+        m.connect(':action', controller='getLocker')
+        return m
+    
+    def getLocker(self, action, **kwargs):
+        if action in self.cache:
+            return routefs.Symlink(self.cache[action])
+        
+        try:
+            filsys = hesiod.FilsysLookup(action).filsys[0]
+            if filsys['type'] == 'AFS':
+                self.cache[action] = filsys['location']
+                return routefs.Symlink(self.cache[action])
+        except (TypeError, KeyError, IndexError):
+            return
+    
+    def getList(self, **kwargs):
+        return self.cache.keys() + ['README.txt']
+    
+    def getReadme(self, **kwargs):
+        return """
+This is the pyHesiodFS FUSE automounter. To access a Hesiod filsys,
+just access /mit/name.
+
+If you're using the Finder, try pressing Cmd+Shift+G and then entering
+/mit/name
+"""
+
+if __name__ == '__main__':
+    routefs.main(PyHesiodFS)
Index: branches/fc15-dev/server/common/oursrc/python-routefs/setup.py
===================================================================
--- branches/fc15-dev/server/common/oursrc/python-routefs/setup.py	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/python-routefs/setup.py	(revision 1803)
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+
+from setuptools import setup, find_packages
+
+setup(
+    name="RouteFS",
+    version="0.0.1",
+    description="RouteFS: A FUSE API wrapper based on URL routing",
+    author="Evan Broder",
+    author_email="broder@mit.edu",
+    #url="http://ebroder.net/code/RouteFS",
+    license="MIT",
+    packages=find_packages(),
+    install_requires=['fuse_python>=0.2a', 'Routes>=1.7']
+)
Index: branches/fc15-dev/server/common/oursrc/scripts-python-path/00scripts-home.pth
===================================================================
--- branches/fc15-dev/server/common/oursrc/scripts-python-path/00scripts-home.pth	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/scripts-python-path/00scripts-home.pth	(revision 1803)
@@ -0,0 +1,1 @@
+import site, os.path; site.addsitedir(os.path.expanduser("~/lib/python2.5/site-packages"))
Index: branches/fc15-dev/server/common/oursrc/scripts-static-cat/Setup.hs
===================================================================
--- branches/fc15-dev/server/common/oursrc/scripts-static-cat/Setup.hs	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/scripts-static-cat/Setup.hs	(revision 1803)
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
Index: branches/fc15-dev/server/common/oursrc/scripts-static-cat/StaticCat.hs
===================================================================
--- branches/fc15-dev/server/common/oursrc/scripts-static-cat/StaticCat.hs	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/scripts-static-cat/StaticCat.hs	(revision 1803)
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveDataTypeable, ViewPatterns #-}
+{-# OPTIONS_GHC -O2 -Wall #-}
+
+import Prelude hiding (catch)
+import Control.Applicative
+import Control.Monad
+import Control.Monad.CatchIO
+import qualified Data.ByteString.Lazy as B
+import Data.Char
+import Data.Dynamic
+import Data.Int
+import qualified Data.Map as M
+import Data.Time.Clock.POSIX
+import Data.Time.Format
+import Network.CGI
+import Numeric
+import System.FilePath
+import System.IO
+import System.IO.Error (isDoesNotExistError, isPermissionError)
+import System.IO.Unsafe
+import System.Locale
+import System.Posix
+import System.Posix.Handle
+
+encodings :: M.Map String String
+encodings = M.fromList [
+             (".bz2", "bzip2"),
+             (".gz", "gzip"),
+             (".z", "compress")
+            ]
+
+types :: M.Map String String
+types = M.fromList [
+         (".avi", "video/x-msvideo"),
+         (".css", "text/css"),
+         (".doc", "application/msword"),
+         (".gif", "image/gif"),
+         (".htm", "text/html"),
+         (".html", "text/html"),
+         (".ico", "image/vnd.microsoft.icon"),
+         (".il", "application/octet-stream"),
+         (".jar", "application/java-archive"),
+         (".jpeg", "image/jpeg"),
+         (".jpg", "image/jpeg"),
+         (".js", "application/x-javascript"),
+         (".mid", "audio/midi"),
+         (".midi", "audio/midi"),
+         (".mov", "video/quicktime"),
+         (".mp3", "audio/mpeg"),
+         (".mpeg", "video/mpeg"),
+         (".mpg", "video/mpeg"),
+         (".otf", "application/octet-stream"),
+         (".pdf", "application/pdf"),
+         (".png", "image/png"),
+         (".ppt", "application/vnd.ms-powerpoint"),
+         (".ps", "application/postscript"),
+         (".svg", "image/svg+xml"),
+         (".swf", "application/x-shockwave-flash"),
+         (".tar", "application/x-tar"),
+         (".tgz", "application/x-gzip"),
+         (".tif", "image/tiff"),
+         (".tiff", "image/tiff"),
+         (".ttf", "application/octet-stream"),
+         (".wav", "audio/x-wav"),
+         (".wmv", "video/x-ms-wmv"),
+         (".xaml", "application/xaml+xml"),
+         (".xap", "application/x-silverlight-app"),
+         (".xhtml", "application/xhtml+xml"),
+         (".xls", "application/vnd.ms-excel"),
+         (".xml", "text/xml"),
+         (".xsl", "text/xml"),
+         (".zip", "application/zip")
+        ]
+
+data MyError = NotModified | Forbidden | NotFound | BadMethod | BadRange
+    deriving (Show, Typeable)
+
+instance Exception MyError
+
+outputMyError :: MyError -> CGI CGIResult
+outputMyError NotModified = setStatus 304 "Not Modified" >> outputNothing
+outputMyError Forbidden = outputError 403 "Forbidden" []
+outputMyError NotFound = outputError 404 "Not Found" []
+outputMyError BadMethod = outputError 405 "Method Not Allowed" []
+outputMyError BadRange = outputError 416 "Requested Range Not Satisfiable" []
+
+checkExtension :: FilePath -> CGI ()
+checkExtension file = do
+  let (base, ext) = splitExtension file
+  ext' <- case M.lookup (map toLower ext) encodings of
+            Nothing -> return ext
+            Just e -> do
+              setHeader "Content-Encoding" e
+              return $ takeExtension base
+
+  case M.lookup (map toLower ext') types of
+    Nothing -> throw Forbidden
+    Just t -> setHeader "Content-Type" t
+
+checkMethod :: CGI CGIResult -> CGI CGIResult
+checkMethod rOutput = do
+  m <- requestMethod
+  case m of
+    "HEAD" -> rOutput >> outputNothing
+    "GET" -> rOutput
+    "POST" -> rOutput
+    _ -> throw BadMethod
+
+httpDate :: String
+httpDate = "%a, %d %b %Y %H:%M:%S %Z"
+formatHTTPDate :: EpochTime -> String
+formatHTTPDate = formatTime defaultTimeLocale httpDate .
+                 posixSecondsToUTCTime . realToFrac
+parseHTTPDate :: String -> Maybe EpochTime
+parseHTTPDate = (fromInteger . floor . utcTimeToPOSIXSeconds <$>) .
+                parseTime defaultTimeLocale httpDate
+
+checkModified :: EpochTime -> CGI ()
+checkModified mTime = do
+  setHeader "Last-Modified" $ formatHTTPDate mTime
+  (requestHeader "If-Modified-Since" >>=) $ maybe (return ()) $ \ims ->
+      when (parseHTTPDate ims >= Just mTime) $ throw NotModified
+
+checkIfRange :: EpochTime -> CGI (Maybe ())
+checkIfRange mTime = do
+  (requestHeader "If-Range" >>=) $ maybe (return $ Just ()) $ \ir ->
+      return $ if parseHTTPDate ir == Just mTime then Just () else Nothing
+
+parseRange :: String -> FileOffset -> Maybe (FileOffset, FileOffset)
+parseRange (splitAt 6 -> ("bytes=", '-':(readDec -> [(len, "")]))) size =
+    Just (max 0 (size - len), size - 1)
+parseRange (splitAt 6 -> ("bytes=", readDec -> [(a, "-")])) size =
+    Just (a, size - 1)
+parseRange (splitAt 6 -> ("bytes=", readDec -> [(a, '-':(readDec -> [(b, "")]))])) size =
+    Just (a, min (size - 1) b)
+parseRange _ _ = Nothing
+
+checkRange :: EpochTime -> FileOffset -> CGI (Maybe (FileOffset, FileOffset))
+checkRange mTime size = do
+  setHeader "Accept-Ranges" "bytes"
+  (requestHeader "Range" >>=) $ maybe (return Nothing) $ \range -> do
+  (checkIfRange mTime >>=) $ maybe (return Nothing) $ \() -> do
+    case parseRange range size of
+      Just (a, b) | a <= b -> return $ Just (a, b)
+      Just _ -> throw BadRange
+      Nothing -> return Nothing
+
+outputAll :: Handle -> FileOffset -> CGI CGIResult
+outputAll h size = do
+  setHeader "Content-Length" $ show size
+  outputFPS =<< liftIO (B.hGetContents h)
+
+-- | Lazily read a given number of bytes from the handle into a
+-- 'ByteString', then close the handle.
+hGetClose :: Handle -> Int64 -> IO B.ByteString
+hGetClose h len = do
+  contents <- B.hGetContents h
+  end <- unsafeInterleaveIO (hClose h >> return B.empty)
+  return (B.append (B.take len contents) end)
+
+outputRange :: Handle -> FileOffset -> Maybe (FileOffset, FileOffset) -> CGI CGIResult
+outputRange h size Nothing = outputAll h size
+outputRange h size (Just (a, b)) = do
+  let len = b - a + 1
+
+  setStatus 206 "Partial Content"
+  setHeader "Content-Range" $
+   "bytes " ++ show a ++ "-" ++ show b ++ "/" ++ show size
+  setHeader "Content-Length" $ show len
+  liftIO $ hSeek h AbsoluteSeek (fromIntegral a)
+  outputFPS =<< liftIO (hGetClose h (fromIntegral len))
+
+serveFile :: FilePath -> CGI CGIResult
+serveFile file = (`catch` outputMyError) $ do
+  checkExtension file
+
+  checkMethod $ do
+
+  let handleOpenError e =
+          if isDoesNotExistError e then throw NotFound
+          else if isPermissionError e then throw Forbidden
+          else throw e
+  h <- liftIO (openBinaryFile file ReadMode) `catch` handleOpenError
+  (`onException` liftIO (hClose h)) $ do
+
+  status <- liftIO $ hGetStatus h
+  let mTime = modificationTime status
+      size = fileSize status
+  checkModified mTime
+
+  range <- checkRange mTime size
+  outputRange h size range
+
+main :: IO ()
+main = runCGI $ handleErrors $ serveFile =<< pathTranslated
Index: branches/fc15-dev/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal
===================================================================
--- branches/fc15-dev/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal	(revision 1803)
@@ -0,0 +1,23 @@
+Name:		scripts-static-cat
+Version:	0.0
+Cabal-Version:	>= 1.2
+Build-Type:	Simple
+License:	GPL
+Copyright:	© 2010, Anders Kaseorg
+Author:		Anders Kaseorg <andersk@mit.edu>
+Maintainer:	scripts@mit.edu
+
+Executable		static-cat
+  Main-Is:		StaticCat.hs
+  GHC-Options:		-Wall -O2
+  Build-Depends:
+    base >= 4,
+    bytestring,
+    cgi >= 3001.1.8,
+    containers,
+    filepath,
+    MonadCatchIO-mtl,
+    old-locale,
+    time,
+    unix,
+    unix-handle
Index: branches/fc15-dev/server/common/oursrc/sql-signup/Makefile
===================================================================
--- branches/fc15-dev/server/common/oursrc/sql-signup/Makefile	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/sql-signup/Makefile	(revision 1803)
@@ -0,0 +1,12 @@
+install:
+	install -Dpm 644 sql-signup-capps ${DESTDIR}/etc/security/console.apps/sql-signup
+	install -Dpm 644 sql-signup-pam ${DESTDIR}/etc/pam.d/sql-signup
+	install -DpT sql-signup-sbin ${DESTDIR}/usr/sbin/sql-signup
+	mkdir -p ${DESTDIR}/usr/bin
+	ln -nfs /usr/bin/consolehelper ${DESTDIR}/usr/bin/sql-signup
+
+clean:
+	rm -f ${DESTDIR}/usr/bin/sql-signup
+	rm -f ${DESTDIR}/usr/sbin/sql-signup
+	rm -f ${DESTDIR}/etc/pam.d/sql-signup
+	rm -f ${DESTDIR}/etc/security/console.apps/sql-signup
Index: branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-capps
===================================================================
--- branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-capps	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-capps	(revision 1803)
@@ -0,0 +1,1 @@
+PROGRAM=/usr/sbin/sql-signup
Index: branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-pam
===================================================================
--- branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-pam	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-pam	(revision 1803)
@@ -0,0 +1,5 @@
+#%PAM-1.0
+auth		sufficient	pam_succeed_if.so uid >= 500 quiet
+auth		include		config-util
+account		include		config-util
+session		include		config-util
Index: branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-sbin
===================================================================
--- branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-sbin	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/sql-signup/sql-signup-sbin	(revision 1803)
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+
+from pwd import getpwuid
+from os import getenv, setuid, setgid, execv
+from sys import exit
+
+SQLUID = 537704221
+SQLGID = 537704221
+SQLBIN = '/afs/athena.mit.edu/contrib/sql/web_scripts/main/batch/signup.php'
+
+caller = int(getenv('USERHELPER_UID'))
+if caller is None or caller == 0:
+	exit('No user specified.')
+else:
+	pw = getpwuid(caller)
+	(user_name, user_uid, user_gid) = (pw[0], pw[2], pw[3])
+
+	if len(user_name) and user_uid > 1000:
+		setgid(SQLGID)
+		setuid(SQLUID)
+		execv(SQLBIN, [SQLBIN, str(user_name), str(user_uid), str(user_gid)])
+	else:
+		print 'Invalid UID:', user_uid
Index: branches/fc15-dev/server/common/oursrc/tokensys/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/tokensys/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/tokensys/Makefile.in	(revision 1803)
@@ -0,0 +1,16 @@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+
+all:
+
+install:
+	mkdir -p $(DESTDIR)$(libdir)
+	install -m a=rx,u+w -p renew $(DESTDIR)$(libdir)/
+
+clean:
+	rm -f renew
+
+distclean: clean
+	rm -f configure config.* Makefile
+	rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/tokensys/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/tokensys/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/tokensys/configure.in	(revision 1803)
@@ -0,0 +1,27 @@
+AC_INIT()
+
+AC_DEFUN(REQUIRE_PATH,[
+AC_SUBST($1_path)
+if test "[$]$1_path" = ""; then
+        AC_ERROR(Cannot find $1)
+fi
+])
+
+AC_ARG_WITH(kinit,
+[  --with-kinit[=PATH]       kinit is located at PATH],[
+  if test "$withval" != "no" -a "$withval" != "yes"; then
+    kinit_path="$withval"
+  fi
+])
+REQUIRE_PATH(kinit)
+
+AC_ARG_WITH(aklog,
+[  --with-aklog[=PATH]       aklog is located at PATH],[
+  if test "$withval" != "no" -a "$withval" != "yes"; then
+    aklog_path="$withval"
+  fi
+])
+REQUIRE_PATH(aklog)
+
+AC_OUTPUT(Makefile)
+AC_OUTPUT(renew)
Index: branches/fc15-dev/server/common/oursrc/tokensys/crontab
===================================================================
--- branches/fc15-dev/server/common/oursrc/tokensys/crontab	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/tokensys/crontab	(revision 1803)
@@ -0,0 +1,2 @@
+@reboot	afsagent /home/afsagent/renew
+0 */3 * * * afsagent /home/afsagent/renew
Index: branches/fc15-dev/server/common/oursrc/tokensys/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/tokensys/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/tokensys/mrproper	(revision 1803)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+rm -f renew
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/tokensys/renew.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/tokensys/renew.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/tokensys/renew.in	(revision 1803)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# This script renews afsagent's tickets and tokens.
+# It is called by afsagent's crontab every 8 hours.
+
+export KRB5CCNAME=/home/afsagent/krb5cc
+export KRBTKFILE=/home/afsagent/tkt
+
+# Option #1: invoke kinit with a password
+#echo "password" | @kinit_path@ >/dev/null daemon/scripts.mit.edu
+
+# Option #2: invoke kinit with a keytab
+@kinit_path@ -k -t /etc/daemon.keytab daemon/scripts.mit.edu
+
+# Obtain AFS tokens
+@aklog_path@
+@aklog_path@ -c sipb
+@aklog_path@ -c csail
Index: branches/fc15-dev/server/common/oursrc/whoisd/Makefile.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/whoisd/Makefile.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/whoisd/Makefile.in	(revision 1803)
@@ -0,0 +1,7 @@
+install:
+	install -Dpm 644 whoisd.tac ${DESTDIR}@libexecdir@/whoisd.tac
+	install -Dpm 644 crontab ${DESTDIR}/etc/cron.d/whoisd
+
+clean:
+	rm -f ${DESTDIR}@libexecdir@/whoisd.tac
+	rm -f ${DESTDIR}/etc/cron.d/whoisd
Index: branches/fc15-dev/server/common/oursrc/whoisd/configure.in
===================================================================
--- branches/fc15-dev/server/common/oursrc/whoisd/configure.in	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/whoisd/configure.in	(revision 1803)
@@ -0,0 +1,2 @@
+AC_INIT()
+AC_OUTPUT(Makefile)
Index: branches/fc15-dev/server/common/oursrc/whoisd/crontab
===================================================================
--- branches/fc15-dev/server/common/oursrc/whoisd/crontab	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/whoisd/crontab	(revision 1803)
@@ -0,0 +1,1 @@
+@reboot root /usr/bin/twistd -l /var/log/scripts-whoisd.log --pidfile /var/run/whoisd.pid -y /usr/local/libexec/whoisd.tac
Index: branches/fc15-dev/server/common/oursrc/whoisd/mrproper
===================================================================
--- branches/fc15-dev/server/common/oursrc/whoisd/mrproper	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/whoisd/mrproper	(revision 1803)
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+rm -f configure config.* Makefile
+rm -rf auto*.cache
Index: branches/fc15-dev/server/common/oursrc/whoisd/whoisd.tac
===================================================================
--- branches/fc15-dev/server/common/oursrc/whoisd/whoisd.tac	(revision 1803)
+++ branches/fc15-dev/server/common/oursrc/whoisd/whoisd.tac	(revision 1803)
@@ -0,0 +1,109 @@
+from twisted.application import internet, service
+from twisted.internet import protocol, reactor, defer
+from twisted.protocols import basic
+import ldap, ldap.filter
+import os, sys, pwd, glob
+
+class WhoisProtocol(basic.LineReceiver):
+    def lineReceived(self, hostname):
+    	(key, hostname) = hostname.split('=',2)
+	if key != self.factory.key:
+            self.transport.write("Unauthorized to use whois"+"\r\n")
+	    self.transport.loseConnection()
+	else:
+            self.factory.getWhois(hostname
+            ).addErrback(lambda _: "Internal error in server"
+            ).addCallback(lambda m:
+                          (self.transport.write(m+"\r\n"),
+                           self.transport.loseConnection()))
+class WhoisFactory(protocol.ServerFactory):
+    protocol = WhoisProtocol
+    def __init__(self, vhostDir, ldap_URL, ldap_base, keyFile):
+        self.vhostDir = vhostDir
+        self.ldap_URL = ldap_URL
+        self.ldap = ldap.initialize(self.ldap_URL)
+        self.ldap_base = ldap_base
+        self.vhosts = {}
+        if vhostDir:
+            self.rescanVhosts()
+        self.key = file(keyFile).read()
+    def rescanVhosts(self):
+        newVhosts = {}
+        for f in glob.iglob(os.path.join(self.vhostDir, "*.conf")):
+            locker = os.path.splitext(os.path.basename(f))[0]
+            newVhosts.update(self.parseApacheConf(file(f)))
+        self.vhosts = newVhosts
+        self.vhostTime = os.stat(self.vhostDir).st_mtime
+    def parseApacheConf(self, f):
+        vhosts = {}
+        hostnames = []
+        locker = None
+        docroot = None
+        for l in f:
+            parts = l.split()
+            if not parts: continue
+            command = parts.pop(0)
+            if command in ("ServerName", "ServerAlias"):
+                hostnames.extend(parts)
+            elif command in ("SuExecUserGroup",):
+                locker = parts[0]
+            elif command in ("DocumentRoot",):
+                docroot = parts[0]
+            elif command == "</VirtualHost>":
+                d = {'locker': locker, 'apacheDocumentRoot': docroot, 'apacheServerName': hostnames[0]}
+                for h in hostnames: vhosts[h] = d
+                hostnames = []
+                locker = None
+                docroot = None
+        return vhosts
+    def canonicalize(self, vhost):
+        vhost = vhost.lower().rstrip(".")
+        return vhost
+#        if vhost.endswith(".mit.edu"):
+#            return vhost
+#        else:
+#            return vhost + ".mit.edu"
+    def searchLDAP(self, vhost):
+        results = self.ldap.search_st(self.ldap_base, ldap.SCOPE_SUBTREE,
+            ldap.filter.filter_format(
+                '(|(apacheServername=%s)(apacheServerAlias=%s))', (vhost,)*2),
+                timeout=5)
+        if len(results) >= 1:
+            result = results[0]
+            attrs = result[1]
+            for attr in ('apacheServerName','apacheDocumentRoot', 'apacheSuexecUid', 'apacheSuexecGid'):
+                attrs[attr] = attrs[attr][0]
+            user = pwd.getpwuid(int(attrs['apacheSuexecUid']))
+            if user:
+                attrs['locker'] = user.pw_name
+            else:
+                attrs['locker'] = None
+            return attrs
+        else:
+            return None
+    def getWhois(self, vhost):
+        vhost = self.canonicalize(vhost)
+        info = self.vhosts.get(vhost)
+        tries = 0
+        while (tries < 3) and not info:
+            tries += 1
+            try:
+                info = self.searchLDAP(vhost)
+                break
+            except (ldap.TIMEOUT, ldap.SERVER_DOWN):
+                self.ldap.unbind()
+                self.ldap = ldap.initialize(self.ldap_URL)
+        if info:
+            ret = "Hostname: %s\nAlias: %s\nLocker: %s\nDocument Root: %s" % \
+                (info['apacheServerName'], vhost, info['locker'], info['apacheDocumentRoot'])
+        elif tries == 3:
+            ret = "The whois server is experiencing problems looking up LDAP records.\nPlease contact scripts@mit.edu for help if this problem persists."
+        else:
+            ret = "No such hostname"
+        return defer.succeed(ret)
+
+application = service.Application('whois', uid=99, gid=99)
+factory = WhoisFactory(None,
+    "ldap://localhost", "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu", "/etc/whoisd-password")
+internet.TCPServer(43, factory).setServiceParent(
+    service.IServiceCollection(application))
Index: branches/fc15-dev/server/common/patches/389-ds-base-fix-changelog-paths.patch
===================================================================
--- branches/fc15-dev/server/common/patches/389-ds-base-fix-changelog-paths.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/389-ds-base-fix-changelog-paths.patch	(revision 1803)
@@ -0,0 +1,67 @@
+diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c
+index b7c7229..59ef8be 100644
+--- a/ldap/servers/plugins/replication/cl5_api.c
++++ b/ldap/servers/plugins/replication/cl5_api.c
+@@ -657,7 +657,7 @@ int cl5DeleteDBSync (Object *replica)
+         file = (CL5DBFile*)object_get_data (obj);
+         PR_ASSERT (file);
+ 
+-        PR_snprintf (fName, MAXPATHLEN, "%s/%s", s_cl5Desc.dbDir, file->name);
++        PR_snprintf (fName, MAXPATHLEN, "%s", file->name);
+         
+         _cl5DBDeleteFile (obj);
+ 
+@@ -1894,6 +1894,7 @@ static int _cl5DBOpen ()
+                 slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5DBOpen: "
+                           "file %s has no matching replica; removing\n", entry->name);
+ 
++                PR_snprintf(fullpathname, MAXPATHLEN, "%s/%s", s_cl5Desc.dbDir, entry->name);
+                 rc = s_cl5Desc.dbEnv->dbremove(s_cl5Desc.dbEnv,
+                                                0, fullpathname, 0, 0);
+                 if (rc != 0)
+@@ -5528,7 +5529,6 @@ done:
+ static void _cl5DBCloseFile (void **data)
+ { 
+ 	CL5DBFile *file;
+-    char fullpathname[MAXPATHLEN];
+                 				
+ 	PR_ASSERT (data);
+ 
+@@ -5537,7 +5537,7 @@ static void _cl5DBCloseFile (void **data)
+ 	PR_ASSERT (file);
+ 
+ 	slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5DBCloseFile: "
+-					"Closing database %s/%s\n", s_cl5Desc.dbDir, file->name);
++					"Closing database %s\n", file->name);
+ 
+ 	/* close the file */
+ 	/* if this is normal close or close after import, update entry count */	
+@@ -5553,7 +5553,7 @@ static void _cl5DBCloseFile (void **data)
+ 	if (file->db) {
+ 	    file->db->close(file->db, 0);
+ 	    slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5DBCloseFile: "
+-						"Closed the changelog database handle for %s/%s\n", s_cl5Desc.dbDir, file->name);
++						"Closed the changelog database handle for %s\n", file->name);
+ 	    file->db = NULL;
+ 	}
+ 
+@@ -5562,16 +5562,15 @@ static void _cl5DBCloseFile (void **data)
+ 		int rc = 0;
+ 		/* We need to use the libdb API to delete the files, otherwise we'll
+ 		 * run into problems when we try to checkpoint transactions later. */
+-		PR_snprintf(fullpathname, MAXPATHLEN, "%s/%s", s_cl5Desc.dbDir, file->name);
+-		rc = s_cl5Desc.dbEnv->dbremove(s_cl5Desc.dbEnv, 0, fullpathname, 0, 0);
++		rc = s_cl5Desc.dbEnv->dbremove(s_cl5Desc.dbEnv, 0, file->name, 0, 0);
+ 		if (rc != 0)
+ 		{
+ 			slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5DBCloseFile: "
+ 							"failed to remove (%s) file; libdb error - %d (%s)\n", 
+-							fullpathname, rc, db_strerror(rc));
++							file->name, rc, db_strerror(rc));
+ 		} else {
+ 			slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5DBCloseFile: "
+-							"Deleted the changelog database file %s/%s\n", s_cl5Desc.dbDir, file->name);
++							"Deleted the changelog database file %s\n", file->name);
+ 
+         }
+ 	}
Index: branches/fc15-dev/server/common/patches/httpd-2.2.x-304.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-2.2.x-304.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-2.2.x-304.patch	(revision 1803)
@@ -0,0 +1,14 @@
+--- httpd-2.2.10/server/util_script.c.orig	2006-09-15 09:19:25.000000000 -0400
++++ httpd-2.2.10/server/util_script.c	2009-03-28 14:33:17.000000000 -0400
+@@ -482,6 +482,11 @@
+             if ((cgi_status == HTTP_UNSET) && (r->method_number == M_GET)) {
+                 cond_status = ap_meets_conditions(r);
+             }
++            else if ((cgi_status == HTTP_NO_CONTENT) ||
++                     (cgi_status == HTTP_NOT_MODIFIED) ||
++                     ap_is_HTTP_INFO(cgi_status)) {
++                r->header_only = 1; /* discard any body */
++            }
+             apr_table_overlap(r->err_headers_out, merge,
+                 APR_OVERLAP_TABLES_MERGE);
+             if (!apr_is_empty_table(cookie_table)) {
Index: branches/fc15-dev/server/common/patches/httpd-2.2.x-log-docroot.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-2.2.x-log-docroot.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-2.2.x-log-docroot.patch	(revision 1803)
@@ -0,0 +1,13 @@
+--- httpd-2.2.8/server/log.c.orig	2009-02-20 01:48:06.000000000 -0500
++++ httpd-2.2.8/server/log.c	2009-02-20 01:55:40.000000000 -0500
+@@ -621,6 +621,10 @@
+         len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
+                             "[client %s] ", c->remote_ip);
+     }
++    if (r) { // Extract the document root and print it
++      len += apr_sprintf(errstr + len, MAX_STRING_LEN - len,
++			 "[docroot %s] ", ap_document_root(r));
++    }
+     if (status != 0) {
+         if (status < APR_OS_START_EAIERR) {
+             len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
Index: branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_ssl-sessioncaching.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_ssl-sessioncaching.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_ssl-sessioncaching.patch	(revision 1803)
@@ -0,0 +1,176 @@
+Index: httpd-2.2.x/modules/ssl/ssl_private.h
+===================================================================
+--- httpd-2.2.x/modules/ssl/ssl_private.h	(revision 833672)
++++ httpd-2.2.x/modules/ssl/ssl_private.h	(working copy)
+@@ -395,6 +395,9 @@ typedef struct {
+ #if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
+     const char     *szCryptoDevice;
+ #endif
++#ifndef OPENSSL_NO_TLSEXT
++    ssl_enabled_t  session_tickets_enabled;
++#endif
+     struct {
+         void *pV1, *pV2, *pV3, *pV4, *pV5, *pV6, *pV7, *pV8, *pV9, *pV10;
+     } rCtx;
+@@ -547,6 +550,7 @@ const char  *ssl_cmd_SSLRequire(cmd_parm
+ const char  *ssl_cmd_SSLRenegBufferSize(cmd_parms *cmd, void *dcfg, const char *arg);
+ const char  *ssl_cmd_SSLStrictSNIVHostCheck(cmd_parms *cmd, void *dcfg, int flag);
+ const char *ssl_cmd_SSLInsecureRenegotiation(cmd_parms *cmd, void *dcfg, int flag);
++const char  *ssl_cmd_SSLSessionTicketExtension(cmd_parms *cmd, void *cdfg, int flag);
+ 
+ const char  *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag);
+ const char  *ssl_cmd_SSLProxyProtocol(cmd_parms *, void *, const char *);
+Index: httpd-2.2.x/modules/ssl/ssl_engine_init.c
+===================================================================
+--- httpd-2.2.x/modules/ssl/ssl_engine_init.c	(revision 833672)
++++ httpd-2.2.x/modules/ssl/ssl_engine_init.c	(working copy)
+@@ -382,6 +382,15 @@ static void ssl_init_ctx_tls_extensions(
+         ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s);
+         ssl_die();
+     }
++
++    /*
++     * Session tickets (stateless resumption)
++     */
++    if ((myModConfig(s))->session_tickets_enabled == SSL_ENABLED_FALSE) {
++        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++                     "Disabling TLS session ticket support");
++        SSL_CTX_set_options(mctx->ssl_ctx, SSL_OP_NO_TICKET);
++    }
+ }
+ #endif
+ 
+@@ -1018,6 +1027,11 @@ void ssl_init_CheckServers(server_rec *b
+ 
+     BOOL conflict = FALSE;
+ 
++#if !defined(OPENSSL_NO_TLSEXT) && OPENSSL_VERSION_NUMBER < 0x009080d0
++    unsigned char *tlsext_tick_keys = NULL;
++    long tick_keys_len;
++#endif
++
+     /*
+      * Give out warnings when a server has HTTPS configured
+      * for the HTTP port or vice versa
+@@ -1042,6 +1056,25 @@ void ssl_init_CheckServers(server_rec *b
+                          ssl_util_vhostid(p, s),
+                          DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT);
+         }
++
++#if !defined(OPENSSL_NO_TLSEXT) && OPENSSL_VERSION_NUMBER < 0x009080d0
++        /*
++         * When using OpenSSL versions 0.9.8f through 0.9.8l, configure
++         * the same ticket encryption parameters for every SSL_CTX (workaround
++         * for SNI+SessionTicket extension interoperability issue in these versions)
++         */
++        if ((sc->enabled == SSL_ENABLED_TRUE) ||
++            (sc->enabled == SSL_ENABLED_OPTIONAL)) {
++            if (!tlsext_tick_keys) {
++                tick_keys_len = SSL_CTX_ctrl((sc->server->ssl_ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,
++                                                               (-1),(NULL));
++                tlsext_tick_keys = (unsigned char *)apr_palloc(p, tick_keys_len);
++                RAND_bytes(tlsext_tick_keys, tick_keys_len);
++            }
++            SSL_CTX_ctrl((sc->server->ssl_ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,
++                                           (tick_keys_len),(tlsext_tick_keys));
++        }
++#endif
+     }
+ 
+     /*
+Index: httpd-2.2.x/modules/ssl/ssl_engine_config.c
+===================================================================
+--- httpd-2.2.x/modules/ssl/ssl_engine_config.c	(revision 833672)
++++ httpd-2.2.x/modules/ssl/ssl_engine_config.c	(working copy)
+@@ -75,6 +75,9 @@ SSLModConfigRec *ssl_config_global_creat
+ #if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
+     mc->szCryptoDevice         = NULL;
+ #endif
++#ifndef OPENSSL_NO_TLSEXT
++    mc->session_tickets_enabled = SSL_ENABLED_UNSET;
++#endif
+ 
+     memset(mc->pTmpKeys, 0, sizeof(mc->pTmpKeys));
+ 
+@@ -1471,6 +1474,26 @@ const char  *ssl_cmd_SSLStrictSNIVHostCh
+ #endif
+ }
+ 
++const char *ssl_cmd_SSLSessionTicketExtension(cmd_parms *cmd, void *dcfg, int flag)
++{
++#ifndef OPENSSL_NO_TLSEXT
++    const char *err;
++    SSLModConfigRec *mc = myModConfig(cmd->server);
++
++    if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) {
++        return err;
++    }
++
++    mc->session_tickets_enabled = flag ? SSL_ENABLED_TRUE : SSL_ENABLED_FALSE;
++
++    return NULL;
++#else
++    return "SSLSessionTicketExtension failed; OpenSSL is not built with support "
++           "for TLS extensions. Refer to the documentation, and build "
++           "a compatible version of OpenSSL.";
++#endif
++}
++
+ void ssl_hook_ConfigTest(apr_pool_t *pconf, server_rec *s)
+ {
+     if (!ap_exists_config_define("DUMP_CERTS")) {
+Index: httpd-2.2.x/modules/ssl/ssl_engine_kernel.c
+===================================================================
+--- httpd-2.2.x/modules/ssl/ssl_engine_kernel.c	(revision 833672)
++++ httpd-2.2.x/modules/ssl/ssl_engine_kernel.c	(working copy)
+@@ -29,6 +29,7 @@
+                                   time I was too famous.''
+                                             -- Unknown                */
+ #include "ssl_private.h"
++#include "util_md5.h"
+ 
+ static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn);
+ #ifndef OPENSSL_NO_TLSEXT
+@@ -2010,6 +2011,7 @@ static int ssl_find_vhost(void *serverna
+     apr_array_header_t *names;
+     int i;
+     SSLConnRec *sslcon;
++    char *sid_ctx;
+ 
+     /* check ServerName */
+     if (!strcasecmp(servername, s->server_hostname)) {
+@@ -2074,6 +2076,21 @@ static int ssl_find_vhost(void *serverna
+             SSL_set_verify(ssl, SSL_CTX_get_verify_mode(ssl->ctx),
+                            SSL_CTX_get_verify_callback(ssl->ctx));
+         }
++        /*
++         * Adjust the session id context. ssl_init_ssl_connection()
++         * always picks the configuration of the first vhost when
++         * calling SSL_new(), but we want to tie the session to the
++         * vhost we have just switched to. Again, we have to make sure
++         * that we're not overwriting a session id context which was
++         * possibly set in ssl_hook_Access(), before triggering
++         * a renegotation.
++         */
++        if (!SSL_num_renegotiations(ssl)) {
++            sid_ctx = ap_md5_binary(c->pool, (unsigned char*)sc->vhost_id,
++                                    sc->vhost_id_len);
++            SSL_set_session_id_context(ssl, (unsigned char *)sid_ctx,
++                                       APR_MD5_DIGESTSIZE*2);
++        }
+ 
+         /*
+          * Save the found server into our SSLConnRec for later
+Index: httpd-2.2.x/modules/ssl/mod_ssl.c
+===================================================================
+--- httpd-2.2.x/modules/ssl/mod_ssl.c	(revision 833672)
++++ httpd-2.2.x/modules/ssl/mod_ssl.c	(working copy)
+@@ -92,6 +92,8 @@ static const command_rec ssl_config_cmds
+     SSL_CMD_SRV(RandomSeed, TAKE23,
+                 "SSL Pseudo Random Number Generator (PRNG) seeding source "
+                 "(`startup|connect builtin|file:/path|exec:/path [bytes]')")
++    SSL_CMD_SRV(SessionTicketExtension, FLAG,
++                "TLS Session Ticket extension support")
+ 
+     /*
+      * Per-server context configuration directives
Index: branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_status-security.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_status-security.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-2.2.x-mod_status-security.patch	(revision 1803)
@@ -0,0 +1,70 @@
+Prevents mod_status from taking effect in .htaccess files, by requiring
+a directive that's only permitted in directory context.
+
+Signed-off-by: Quentin Smith <quentin@mit.edu>
+Signed-off-by: Geoffrey Thomas <geofft@mit.edu>
+--- a/modules/generators/mod_status.c	2008-01-02 04:43:52.000000000 -0500
++++ b/modules/generators/mod_status.c	2008-08-06 01:31:26.000000000 -0400
+@@ -115,6 +115,10 @@
+ static pid_t child_pid;
+ #endif
+ 
++typedef struct {
++  int permit_status_handler;
++} status_config_rec;
++
+ /*
+  * command-related code. This is here to prevent use of ExtendedStatus
+  * without status_module included.
+@@ -139,6 +143,13 @@
+     return NULL;
+ }
+ 
++static void *create_status_dir_config(apr_pool_t *p, char *d)
++{
++  status_config_rec *conf = apr_pcalloc(p, sizeof(*conf));
++  conf->permit_status_handler = 0;
++  return conf;
++}
++
+ 
+ static const command_rec status_module_cmds[] =
+ {
+@@ -147,6 +158,11 @@
+     AP_INIT_FLAG("SeeRequestTail", set_reqtail, NULL, RSRC_CONF,
+       "For verbose requests, \"On\" to see the last 63 chars of the request, "
+       "\"Off\" (default) to see the first 63 in extended status display"),
++    AP_INIT_FLAG("PermitStatusHandler", ap_set_flag_slot,
++		 (void *)APR_OFFSETOF(status_config_rec, permit_status_handler),
++		 ACCESS_CONF,
++      "As a security measure, only permit status handlers where this flag "
++      "is set. Only legal in directory context, not .htaccess."),
+     {NULL}
+ };
+ 
+@@ -247,9 +263,13 @@
+     pid_t *pid_buffer, worker_pid;
+     clock_t tu, ts, tcu, tcs;
+     ap_generation_t worker_generation;
+-
+-    if (strcmp(r->handler, STATUS_MAGIC_TYPE) &&
+-        strcmp(r->handler, "server-status")) {
++    
++    status_config_rec *conf = ap_get_module_config(r->per_dir_config,
++                                                      &status_module);
++
++    if ((strcmp(r->handler, STATUS_MAGIC_TYPE) &&
++         strcmp(r->handler, "server-status")) ||
++	!conf->permit_status_handler) {
+         return DECLINED;
+     }
+ 
+@@ -871,7 +891,7 @@
+ module AP_MODULE_DECLARE_DATA status_module =
+ {
+     STANDARD20_MODULE_STUFF,
+-    NULL,                       /* dir config creater */
++    create_status_dir_config,   /* dir config creater */
+     NULL,                       /* dir merger --- default is to override */
+     NULL,                       /* server config */
+     NULL,                       /* merge server config */
Index: branches/fc15-dev/server/common/patches/httpd-fixup-vhost.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-fixup-vhost.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-fixup-vhost.patch	(revision 1803)
@@ -0,0 +1,98 @@
+commit 3b081163d6250d893838d69d9a83f217c341d657
+Author: Greg Brockman <gdb@mit.edu>
+Date:   Fri Aug 6 23:19:15 2010 -0400
+
+    Add method to merge virtual host with a main server_rec
+
+diff --git a/include/http_config.h b/include/http_config.h
+index 5e9fd51..8e6f247 100644
+--- a/include/http_config.h
++++ b/include/http_config.h
+@@ -827,6 +827,16 @@ AP_DECLARE(void) ap_register_hooks(module *m, apr_pool_t *p);
+ AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, 
+                                         server_rec *main_server);
+ 
++/**
++ * Setup a single virtual host by merging the main server_rec into it.
++ * @param p The pool to allocate from
++ * @param main_server The server_rec with which to merge
++ * @param virt The virtual host server_rec with some set of directives to override already set
++ */
++AP_DECLARE(void) ap_fixup_virtual_host(apr_pool_t *p,
++				       server_rec *main_server,
++				       server_rec *virt);
++
+ /* For http_request.c... */
+ 
+ /**
+diff --git a/server/config.c b/server/config.c
+index 101d0e4..ef0f2ba 100644
+--- a/server/config.c
++++ b/server/config.c
+@@ -1902,38 +1902,43 @@ AP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p,
+ }
+ 
+ 
+-AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
++AP_DECLARE(void) ap_fixup_virtual_host(apr_pool_t *p, server_rec *main_server,
++                                       server_rec *virt)
+ {
+-    server_rec *virt;
++    merge_server_configs(p, main_server->module_config,
++                         virt->module_config);
+ 
+-    for (virt = main_server->next; virt; virt = virt->next) {
+-        merge_server_configs(p, main_server->module_config,
+-                             virt->module_config);
++    virt->lookup_defaults =
++        ap_merge_per_dir_configs(p, main_server->lookup_defaults,
++                                 virt->lookup_defaults);
+ 
+-        virt->lookup_defaults =
+-            ap_merge_per_dir_configs(p, main_server->lookup_defaults,
+-                                     virt->lookup_defaults);
++    if (virt->server_admin == NULL)
++        virt->server_admin = main_server->server_admin;
+ 
+-        if (virt->server_admin == NULL)
+-            virt->server_admin = main_server->server_admin;
++    if (virt->timeout == 0)
++        virt->timeout = main_server->timeout;
+ 
+-        if (virt->timeout == 0)
+-            virt->timeout = main_server->timeout;
++    if (virt->keep_alive_timeout == 0)
++        virt->keep_alive_timeout = main_server->keep_alive_timeout;
+ 
+-        if (virt->keep_alive_timeout == 0)
+-            virt->keep_alive_timeout = main_server->keep_alive_timeout;
++    if (virt->keep_alive == -1)
++        virt->keep_alive = main_server->keep_alive;
+ 
+-        if (virt->keep_alive == -1)
+-            virt->keep_alive = main_server->keep_alive;
++    if (virt->keep_alive_max == -1)
++        virt->keep_alive_max = main_server->keep_alive_max;
+ 
+-        if (virt->keep_alive_max == -1)
+-            virt->keep_alive_max = main_server->keep_alive_max;
++    /* XXX: this is really something that should be dealt with by a
++     * post-config api phase
++     */
++    ap_core_reorder_directories(p, virt);
++}
+ 
+-        /* XXX: this is really something that should be dealt with by a
+-         * post-config api phase
+-         */
+-        ap_core_reorder_directories(p, virt);
+-    }
++AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server)
++{
++    server_rec *virt;
++
++    for (virt = main_server->next; virt; virt = virt->next)
++        ap_fixup_virtual_host(p, main_server, virt);
+ 
+     ap_core_reorder_directories(p, main_server);
+ }
Index: branches/fc15-dev/server/common/patches/httpd-suexec-cloexec.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-suexec-cloexec.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-suexec-cloexec.patch	(revision 1803)
@@ -0,0 +1,52 @@
+From: Stefan Fritsch <sf@apache.org>
+Date: Sat, 3 Oct 2009 13:46:48 +0000
+Subject: suexec: Allow to log an error if exec fails by setting FD_CLOEXEC on the log file instead of closing it.
+
+PR: 10744
+Submitted by: Nicolas Rachinsky
+Reviewed by: Stefan Fritsch
+
+Origin: upstream, http://svn.apache.org/viewvc?rev=821321&view=rev
+Bug: https://issues.apache.org/bugzilla/show_bug.cgi?id=10744
+---
+ support/suexec.c |   18 +++++++++---------
+ 1 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/support/suexec.c b/support/suexec.c
+index cb4e85f..85e1318 100644
+--- a/support/suexec.c
++++ b/support/suexec.c
+@@ -49,6 +49,7 @@
+ #include <stdio.h>
+ #include <stdarg.h>
+ #include <stdlib.h>
++#include <fcntl.h>
+ #include <selinux/selinux.h>
+ 
+ #ifdef HAVE_PWD_H
+@@ -714,17 +715,16 @@ TRUSTED_DIRECTORY:
+ #endif /* AP_SUEXEC_UMASK */
+ 
+     /*
+-     * Be sure to close the log file so the CGI can't
+-     * mess with it.  If the exec fails, it will be reopened
+-     * automatically when log_err is called.  Note that the log
+-     * might not actually be open if AP_LOG_EXEC isn't defined.
+-     * However, the "log" cell isn't ifdef'd so let's be defensive
+-     * and assume someone might have done something with it
+-     * outside an ifdef'd AP_LOG_EXEC block.
++     * ask fcntl(2) to set the FD_CLOEXEC flag on the log file,
++     * so it'll be automagically closed if the exec() call succeeds.
+      */
+     if (log != NULL) {
+-        fclose(log);
+-        log = NULL;
++        fflush(log);
++        setbuf(log,NULL);
++        if ((fcntl(fileno(log), F_SETFD, FD_CLOEXEC) == -1)) {
++            log_err("error: can't set close-on-exec flag");
++            exit(122);
++        }
+     }
+ 
+     /*
Index: branches/fc15-dev/server/common/patches/httpd-suexec-scripts.patch
===================================================================
--- branches/fc15-dev/server/common/patches/httpd-suexec-scripts.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/httpd-suexec-scripts.patch	(revision 1803)
@@ -0,0 +1,302 @@
+# scripts.mit.edu httpd suexec patch
+# Copyright (C) 2006, 2007, 2008  Jeff Arnold <jbarnold@mit.edu>,
+#                                 Joe Presbrey <presbrey@mit.edu>,
+#                                 Anders Kaseorg <andersk@mit.edu>,
+#                                 Geoffrey Thomas <geofft@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# See /COPYRIGHT in this repository for more information.
+#
+--- httpd-2.2.2/support/Makefile.in.old	2005-07-06 19:15:34.000000000 -0400
++++ httpd-2.2.2/support/Makefile.in	2007-01-20 17:12:51.000000000 -0500
+@@ -60,7 +60,7 @@
+
+ suexec_OBJECTS = suexec.lo
+ suexec: $(suexec_OBJECTS)
+-	$(LINK) $(suexec_OBJECTS)
++	$(LINK) -lselinux $(suexec_OBJECTS)
+
+ htcacheclean_OBJECTS = htcacheclean.lo
+ htcacheclean: $(htcacheclean_OBJECTS)
+--- httpd-2.2.2/configure.in.old	2007-07-17 10:48:25.000000000 -0400
++++ httpd-2.2.2/configure.in	2008-08-29 08:15:41.000000000 -0400
+@@ -559,6 +559,10 @@
+ APACHE_HELP_STRING(--with-suexec-userdir,User subdirectory),[
+   AC_DEFINE_UNQUOTED(AP_USERDIR_SUFFIX, "$withval", [User subdirectory] ) ] )
+ 
++AC_ARG_WITH(suexec-trusteddir,
++APACHE_HELP_STRING(--with-suexec-trusteddir,Trusted SuExec directory),[
++  AC_DEFINE_UNQUOTED(AP_TRUSTED_DIRECTORY, "$withval", [Trusted SuExec directory] ) ] )
++
+ AC_ARG_WITH(suexec-docroot,
+ APACHE_HELP_STRING(--with-suexec-docroot,SuExec root directory),[
+   AC_DEFINE_UNQUOTED(AP_DOC_ROOT, "$withval", [SuExec root directory] ) ] )
+--- httpd-2.2.11/support/suexec.c.old	2008-11-30 10:47:31.000000000 -0500
++++ httpd-2.2.11/support/suexec.c	2009-06-08 09:02:17.000000000 -0400
+@@ -30,6 +30,9 @@
+  *
+  */
+ 
++#define STATIC_CAT_PATH "/usr/bin/static-cat"
++#define PHP_PATH "/usr/bin/php-cgi"
++
+ #include "apr.h"
+ #include "ap_config.h"
+ #include "suexec.h"
+@@ -46,6 +49,7 @@
+ #include <stdio.h>
+ #include <stdarg.h>
+ #include <stdlib.h>
++#include <selinux/selinux.h>
+ 
+ #ifdef HAVE_PWD_H
+ #include <pwd.h>
+@@ -95,6 +99,7 @@
+ {
+     /* variable name starts with */
+     "HTTP_",
++    "HTTPS_",
+     "SSL_",
+ 
+     /* variable name is */
+@@ -245,9 +250,71 @@
+     environ = cleanenv;
+ }
+ 
++static const char *static_extensions[] = {
++    "html",
++    "css",
++    "gif",
++    "jpg",
++    "png",
++    "htm",
++    "jpeg",
++    "js",
++    "ico",
++    "xml",
++    "xsl",
++    "tiff",
++    "tif",
++    "tgz",
++    "tar",
++    "jar",
++    "zip",
++    "pdf",
++    "ps",
++    "doc",
++    "xls",
++    "ppt",
++    "swf",
++    "mp3",
++    "mov",
++    "wmv",
++    "mpg",
++    "mpeg",
++    "avi",
++    "il",
++    "xhtml",
++    "svg",
++    "xaml",
++    "xap",
++    "wav",
++    "mid",
++    "midi",
++    "ttf",
++    "otf",
++    NULL
++};
++
++static int is_static_extension(const char *file)
++{
++    const char *extension = strrchr(file, '.');
++    const char **p;
++    if (extension == NULL) return 0;
++    for (p = static_extensions; *p; ++p) {
++        if (strcasecmp(extension + 1, *p) == 0) return 1;
++    }
++    return 0;
++}
++
++static int is_php_extension(const char *file)
++{
++    const char *extension = strrchr(file, '.');
++    if (extension == NULL) return 0;
++    return strcmp(extension + 1, "php") == 0;
++}
++
+ int main(int argc, char *argv[])
+ {
+     int userdir = 0;        /* ~userdir flag             */
++    int trusteddir = 0;     /* TRUSTED_DIRECTORY flag    */
+     uid_t uid;              /* user information          */
+     gid_t gid;              /* target group placeholder  */
+     char *target_uname;     /* target user name          */
+@@ -268,6 +331,7 @@
+      * Start with a "clean" environment
+      */
+     clean_env();
++    setenv("JAVA_TOOL_OPTIONS", "-Xmx128M", 1); /* scripts.mit.edu local hack */
+ 
+     prog = argv[0];
+     /*
+@@ -350,6 +414,20 @@
+ #endif /*_OSD_POSIX*/
+ 
+     /*
++     * First check if this is an absolute path to the directory
++     * of trusted executables. These are supposed to be security
++     * audited to check parameters and validity on their own...
++     */
++    if (strstr(cmd, AP_TRUSTED_DIRECTORY) == cmd) {
++        if (strstr(cmd, "/../") != NULL) {
++            log_err("invalid command (%s)\n", cmd);
++            exit(104);
++        }
++        trusteddir = 1;
++        goto TRUSTED_DIRECTORY;
++    }
++
++    /*
+      * Check for a leading '/' (absolute path) in the command to be executed,
+      * or attempts to back up out of the current directory,
+      * to protect against attacks.  If any are
+@@ -371,6 +449,7 @@
+         userdir = 1;
+     }
+ 
++TRUSTED_DIRECTORY:
+     /*
+      * Error out if the target username is invalid.
+      */
+@@ -452,7 +531,7 @@
+      * Error out if attempt is made to execute as root or as
+      * a UID less than AP_UID_MIN.  Tsk tsk.
+      */
+-    if ((uid == 0) || (uid < AP_UID_MIN)) {
++    if ((uid == 0) || (uid < AP_UID_MIN && uid != 102)) { /* uid 102 = signup  */
+         log_err("cannot run as forbidden uid (%d/%s)\n", uid, cmd);
+         exit(107);
+     }
+@@ -484,6 +563,7 @@
+         log_err("failed to setuid (%ld: %s)\n", uid, cmd);
+         exit(110);
+     }
++    setenv("HOME", target_homedir, 1);
+ 
+     /*
+      * Get the current working directory, as well as the proper
+@@ -506,6 +600,21 @@
+             log_err("cannot get docroot information (%s)\n", target_homedir);
+             exit(112);
+         }
++        size_t expected_len = strlen(target_homedir)+1+strlen(AP_USERDIR_SUFFIX)+1;
++        char *expected = malloc(expected_len);
++        snprintf(expected, expected_len, "%s/%s", target_homedir, AP_USERDIR_SUFFIX);
++        if (strncmp(cwd, expected, expected_len-1) != 0) {
++            log_err("error: file's directory not a subdirectory of user's home directory (%s, %s)\n", cwd, expected);
++            exit(114);
++        }
++    }
++    else if (trusteddir) {
++        if (((chdir(AP_TRUSTED_DIRECTORY)) != 0) ||
++            ((getcwd(dwd, AP_MAXPATH)) == NULL) |
++            ((chdir(cwd)) != 0)) {
++            log_err("cannot get docroot information (%s)\n", AP_TRUSTED_DIRECTORY);
++            exit(112);
++        }
+     }
+     else {
+         if (((chdir(AP_DOC_ROOT)) != 0) ||
+@@ -532,15 +641,17 @@
+     /*
+      * Error out if cwd is writable by others.
+      */
++#if 0
+     if ((dir_info.st_mode & S_IWOTH) || (dir_info.st_mode & S_IWGRP)) {
+         log_err("directory is writable by others: (%s)\n", cwd);
+         exit(116);
+     }
++#endif
+ 
+     /*
+      * Error out if we cannot stat the program.
+      */
+-    if (((lstat(cmd, &prg_info)) != 0) || (S_ISLNK(prg_info.st_mode))) {
++    if (((lstat(cmd, &prg_info)) != 0) /*|| (S_ISLNK(prg_info.st_mode))*/) {
+         log_err("cannot stat program: (%s)\n", cmd);
+         exit(117);
+     }
+@@ -548,10 +659,12 @@
+     /*
+      * Error out if the program is writable by others.
+      */
++#if 0
+     if ((prg_info.st_mode & S_IWOTH) || (prg_info.st_mode & S_IWGRP)) {
+         log_err("file is writable by others: (%s/%s)\n", cwd, cmd);
+         exit(118);
+     }
++#endif
+ 
+     /*
+      * Error out if the file is setuid or setgid.
+@@ -565,6 +678,7 @@
+      * Error out if the target name/group is different from
+      * the name/group of the cwd or the program.
+      */
++#if 0
+     if ((uid != dir_info.st_uid) ||
+         (gid != dir_info.st_gid) ||
+         (uid != prg_info.st_uid) ||
+@@ -576,12 +690,14 @@
+                 prg_info.st_uid, prg_info.st_gid);
+         exit(120);
+     }
++#endif
+     /*
+      * Error out if the program is not executable for the user.
+      * Otherwise, she won't find any error in the logs except for
+      * "[error] Premature end of script headers: ..."
+      */
+-    if (!(prg_info.st_mode & S_IXUSR)) {
++    if (!is_static_extension(cmd) && !is_php_extension(cmd) &&
++        !(prg_info.st_mode & S_IXUSR)) {
+         log_err("file has no execute permission: (%s/%s)\n", cwd, cmd);
+         exit(121);
+     }
+@@ -614,6 +730,23 @@
+     /*
+      * Execute the command, replacing our image with its own.
+      */
++    if (is_static_extension(cmd)) {
++        if (setenv("PATH_TRANSLATED", cmd, 1) != 0) {
++            log_err("setenv failed\n");
++            exit(255);
++        }
++        execl(STATIC_CAT_PATH, STATIC_CAT_PATH, (const char *)NULL);
++        log_err("(%d)%s: static-cat exec failed (%s)\n", errno, strerror(errno), STATIC_CAT_PATH);
++        exit(255);
++    }
++    if (is_php_extension(cmd)) {
++        setenv("PHPRC", ".", 1);
++        argv[1] = PHP_PATH;
++        argv[2] = "-f";
++        execv(PHP_PATH, &argv[1]);
++        log_err("(%d)%s: php exec failed (%s)\n", errno, strerror(errno), argv[1]);
++        exit(255);
++    }
+ #ifdef NEED_HASHBANG_EMUL
+     /* We need the #! emulation when we want to execute scripts */
+     {
Index: branches/fc15-dev/server/common/patches/krb5-kuserok-scripts.patch
===================================================================
--- branches/fc15-dev/server/common/patches/krb5-kuserok-scripts.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/krb5-kuserok-scripts.patch	(revision 1803)
@@ -0,0 +1,125 @@
+# scripts.mit.edu krb5 kuserok patch
+# Copyright (C) 2006  Tim Abbott <tabbott@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# See /COPYRIGHT in this repository for more information.
+#
+--- krb5-1.6.3/src/lib/krb5/os/kuserok.c.old	2009-04-08 06:17:06.000000000 -0400
++++ krb5-1.6.3/src/lib/krb5/os/kuserok.c	2009-04-08 06:17:18.000000000 -0400
+@@ -31,6 +31,7 @@
+ #if !defined(_WIN32)		/* Not yet for Windows */
+ #include <stdio.h>
+ #include <pwd.h>
++#include <sys/wait.h>
+ 
+ #if defined(_AIX) && defined(_IBMR2)
+ #include <sys/access.h>
+@@ -71,7 +72,6 @@
+ {
+     struct stat sbuf;
+     struct passwd *pwd;
+-    char pbuf[MAXPATHLEN];
+     krb5_boolean isok = FALSE;
+     FILE *fp;
+     char kuser[MAX_USERNAME];
+@@ -79,71 +79,35 @@
+     char linebuf[BUFSIZ];
+     char *newline;
+     int gobble;
++    int pid, status;
+ 
+     /* no account => no access */
+     char pwbuf[BUFSIZ];
+     struct passwd pwx;
+     if (k5_getpwnam_r(luser, &pwx, pwbuf, sizeof(pwbuf), &pwd) != 0)
+ 	return(FALSE);
+-    (void) strncpy(pbuf, pwd->pw_dir, sizeof(pbuf) - 1);
+-    pbuf[sizeof(pbuf) - 1] = '\0';
+-    (void) strncat(pbuf, "/.k5login", sizeof(pbuf) - 1 - strlen(pbuf));
+-
+-    if (access(pbuf, F_OK)) {	 /* not accessible */
+-	/*
+-	 * if he's trying to log in as himself, and there is no .k5login file,
+-	 * let him.  To find out, call
+-	 * krb5_aname_to_localname to convert the principal to a name
+-	 * which we can string compare. 
+-	 */
+-	if (!(krb5_aname_to_localname(context, principal,
+-				      sizeof(kuser), kuser))
+-	    && (strcmp(kuser, luser) == 0)) {
+-	    return(TRUE);
+-	}
+-    }
+     if (krb5_unparse_name(context, principal, &princname))
+ 	return(FALSE);			/* no hope of matching */
+ 
+-    /* open ~/.k5login */
+-    if ((fp = fopen(pbuf, "r")) == NULL) {
+-	free(princname);
+-	return(FALSE);
+-    }
+-    set_cloexec_file(fp);
+-    /*
+-     * For security reasons, the .k5login file must be owned either by
+-     * the user himself, or by root.  Otherwise, don't grant access.
+-     */
+-    if (fstat(fileno(fp), &sbuf)) {
+-	fclose(fp);
+-	free(princname);
+-	return(FALSE);
++    if ((pid = fork()) == -1) {
++       free(princname);
++       return(FALSE);
+     }
+-    if (sbuf.st_uid != pwd->pw_uid && !FILE_OWNER_OK(sbuf.st_uid)) {
+-	fclose(fp);
+-	free(princname);
+-	return(FALSE);
++    if (pid == 0) {
++       char *args[4];
++#define ADMOF_PATH "/usr/local/sbin/ssh-admof"
++       args[0] = ADMOF_PATH;
++       args[1] = (char *) luser;
++       args[2] = princname;
++       args[3] = NULL;
++       execv(ADMOF_PATH, args);
++       exit(1);
+     }
+-
+-    /* check each line */
+-    while (!isok && (fgets(linebuf, BUFSIZ, fp) != NULL)) {
+-	/* null-terminate the input string */
+-	linebuf[BUFSIZ-1] = '\0';
+-	newline = NULL;
+-	/* nuke the newline if it exists */
+-	if ((newline = strchr(linebuf, '\n')))
+-	    *newline = '\0';
+-	if (!strcmp(linebuf, princname)) {
+-	    isok = TRUE;
+-	    continue;
+-	}
+-	/* clean up the rest of the line if necessary */
+-	if (!newline)
+-	    while (((gobble = getc(fp)) != EOF) && gobble != '\n');
++    if (waitpid(pid, &status, 0) > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 33) {
++       isok=TRUE;
+     }
++    
+     free(princname);
+-    fclose(fp);
+     return(isok);
+ }
+ 
Index: branches/fc15-dev/server/common/patches/moira-fix-manpage-paths.patch
===================================================================
--- branches/fc15-dev/server/common/patches/moira-fix-manpage-paths.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/moira-fix-manpage-paths.patch	(revision 1803)
@@ -0,0 +1,40 @@
+Index: moira/man/update_server.8
+===================================================================
+--- moira.orig/man/update_server.8     2010-01-04 21:12:54.000000000 -0500
++++ moira/man/update_server.8  2010-01-04 22:03:58.000000000 -0500
+@@ -14,7 +14,7 @@
+ it is needed.
+ .SH OPTIONS
+ While there are no command line options, a configuration file
+-.I /etc/athena/moira.conf
++.I /etc/moira.conf
+ may specify a number of options.  This file may contain blank lines,
+ comments preceeded by hash marks, boolean options, or string options.
+ A boolean option is set by just putting the name of the option on a
+@@ -48,7 +48,7 @@
+ .B sms
+ in the local realm is assumed.
+ .SH FILES
+-/etc/athena/moira.conf \- For configuration variables.
+-/etc/athena/srvtab \- It must be able to get rcmd Kerberos tickets.
++/etc/moira.conf \- For configuration variables.
++/etc/srvtab \- It must be able to get rcmd Kerberos tickets.
+ .SH "SEE ALSO"
+ The Project Athena Technical Plan section on Moira.
+Index: moira/man/moira.3
+===================================================================
+--- moira.orig/man/moira.3     2010-01-04 22:04:05.000000000 -0500
++++ moira/man/moira.3  2010-01-04 22:04:20.000000000 -0500
+@@ -239,9 +239,9 @@
+ except that it uses strcmp on the elements rather than comparing the
+ addresses directly.
+ .SH FILES
+-/usr/athena/include/moira.h
++/usr/include/moira/moira.h
+ .br
+-/usr/athena/include/mr_et.h
++/usr/include/moira/mr_et.h
+ .br
+ /tmp/tkt###
+ .SH "SEE ALSO"
+
Index: branches/fc15-dev/server/common/patches/moira-update-server.rc.patch
===================================================================
--- branches/fc15-dev/server/common/patches/moira-update-server.rc.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/moira-update-server.rc.patch	(revision 1803)
@@ -0,0 +1,131 @@
+--- /dev/null	2009-12-25 01:17:35.868011025 -0500
++++ moira-update-server.init	2009-12-26 22:31:51.000000000 -0500
+@@ -0,0 +1,128 @@
++#! /bin/sh
++# Stolen from Debathena
++
++### BEGIN INIT INFO
++# Provides:          moira-update-server
++# Required-Start:    $local_fs $remote_fs
++# Required-Stop:     $local_fs $remote_fs
++# Default-Start:     2 3 4 5
++# Default-Stop:      0 1 6
++# Short-Description: Moira update_server
++# Description:       The moira update_server program for taking updates from
++#                    moira
++### END INIT INFO
++
++# Original Author: Evan Broder <broder@mit.edu>
++# Modified for Fedora by Greg Brockman <gdb@mit.edu>
++
++# Do NOT "set -e"
++
++# PATH should only include /usr/* if it runs after the mountnfs.sh script
++
++prog=update_server
++exec=/usr/sbin/update_server
++config=/etc/athena/moira.conf
++
++# From Debathena
++PATH=/usr/sbin:/usr/bin:/sbin:/bin
++DESC="Moira update_server"
++DAEMON_ARGS=""
++SCRIPTNAME=/etc/rc.d/init.d/$NAME
++
++# Exit if the package is not installed
++[ -x "$exec" ] || exit 0
++
++# Read configuration variable file if it is present
++[ -r /etc/default/$prog ] && . /etc/default/$prog
++
++# Load the VERBOSE setting and other rcS variables
++[ -f /etc/default/rcS ] && . /etc/default/rcS
++
++# Define LSB log_* functions.
++# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
++. /lib/lsb/init-functions
++# End from Debathena
++
++# Source function library.
++. /etc/rc.d/init.d/functions
++
++[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
++
++lockfile=/var/lock/subsys/$prog
++
++start() {
++    [ -x $exec ] || exit 5
++    [ -f $config ] || exit 6
++    echo -n $"Starting $prog: "
++    # if not running, start it up here, usually something like "daemon $exec"
++    daemon $exec
++    retval=$?
++    echo
++    [ $retval -eq 0 ] && touch $lockfile
++    return $retval
++}
++
++stop() {
++    echo -n $"Stopping $prog: "
++    # stop it here, often "killproc $prog"
++    killproc $prog
++    retval=$?
++    echo
++    [ $retval -eq 0 ] && rm -f $lockfile
++    return $retval
++}
++
++restart() {
++    stop
++    start
++}
++
++reload() {
++    restart
++}
++
++force_reload() {
++    restart
++}
++
++rh_status() {
++    # run checks to determine if the service is running or use generic status
++    status $prog
++}
++
++rh_status_q() {
++    rh_status >/dev/null 2>&1
++}
++
++
++case "$1" in
++    start)
++        rh_status_q && exit 0
++        $1
++        ;;
++    stop)
++        rh_status_q || exit 0
++        $1
++        ;;
++    restart)
++        $1
++        ;;
++    reload)
++        rh_status_q || exit 7
++        $1
++        ;;
++    force-reload)
++        force_reload
++        ;;
++    status)
++        rh_status
++        ;;
++    condrestart|try-restart)
++        rh_status_q || exit 0
++        restart
++        ;;
++    *)
++        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
++        exit 2
++esac
++exit $?
Index: branches/fc15-dev/server/common/patches/openafs-localcsdb.patch
===================================================================
--- branches/fc15-dev/server/common/patches/openafs-localcsdb.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/openafs-localcsdb.patch	(revision 1803)
@@ -0,0 +1,11 @@
+--- openafs-1.4/src/packaging/RedHat/openafs-client.init.orig	2009-04-14 04:28:32.000000000 -0400
++++ openafs-1.4/src/packaging/RedHat/openafs-client.init	2009-04-14 04:27:08.000000000 -0400
+@@ -14,7 +14,7 @@
+ 
+ start() {
+         echo -n $"Updating CellServDB: "
+-        cat /usr/vice/etc/CellServDB.local /usr/vice/etc/CellServDB.dist > \
++        cat /usr/vice/etc/CellServDB.local > \
+                /usr/vice/etc/CellServDB
+         chmod 644 /usr/vice/etc/CellServDB
+         echo
Index: branches/fc15-dev/server/common/patches/openafs-numsysnames.patch
===================================================================
--- branches/fc15-dev/server/common/patches/openafs-numsysnames.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/openafs-numsysnames.patch	(revision 1803)
@@ -0,0 +1,11 @@
+--- openafs-1.4.10/src/afs/afs.h.orig	2009-06-06 21:02:53.000000000 -0400
++++ openafs-1.4.10/src/afs/afs.h	2009-06-06 21:03:28.000000000 -0400
+@@ -75,7 +75,7 @@
+ #define	PIGGYSIZE	1350	/* max piggyback size */
+ #define	MAXVOLS		128	/* max vols we can store */
+ #define	MAXSYSNAME	128	/* max sysname (i.e. @sys) size */
+-#define MAXNUMSYSNAMES	16	/* max that current constants allow */
++#define MAXNUMSYSNAMES	32	/* max that current constants allow */
+ #define	NOTOKTIMEOUT	(2*3600)	/* time after which to timeout conns sans tokens */
+ #define	NOPAG		0xffffffff
+ #define AFS_NCBRS	300	/* max # of call back return entries */
Index: branches/fc15-dev/server/common/patches/openafs-scripts.patch
===================================================================
--- branches/fc15-dev/server/common/patches/openafs-scripts.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/openafs-scripts.patch	(revision 1803)
@@ -0,0 +1,262 @@
+# scripts.mit.edu openafs patch
+# Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+# with modifications by Joe Presbrey <presbrey@mit.edu>
+# and Anders Kaseorg <andersk@mit.edu>
+# and Edward Z. Yang <ezyang@mit.edu>
+#
+# This file is available under both the MIT license and the GPL.
+#
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+# 
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# See /COPYRIGHT in this repository for more information.
+#
+diff -ur openafs-1.4/src/afs/afs_analyze.c openafs-1.4+scripts/src/afs/afs_analyze.c
+--- openafs-1.4/src/afs/afs_analyze.c
++++ openafs-1.4+scripts/src/afs/afs_analyze.c
+@@ -585,7 +585,7 @@
+ 			 (afid ? afid->Fid.Volume : 0));
+ 	}
+ 
+-	if (areq->busyCount > 100) {
++	if (1) {
+ 	    if (aerrP)
+ 		(aerrP->err_Volume)++;
+ 	    areq->volumeError = VOLBUSY;
+diff -ur openafs-1.4/src/afs/LINUX/osi_vnodeops.c openafs-1.4+scripts/src/afs/LINUX/osi_vnodeops.c
+--- openafs-1.4/src/afs/LINUX/osi_vnodeops.c
++++ openafs-1.4+scripts/src/afs/LINUX/osi_vnodeops.c
+@@ -896,6 +896,28 @@
+ 	/* should we always update the attributes at this point? */
+ 	/* unlikely--the vcache entry hasn't changed */
+ 
++	/* [scripts] This code makes hardlinks work correctly.
++	 *
++	 * We want Apache to be able to read a file with hardlinks
++	 * named .htaccess and foo to be able to read it via .htaccess
++	 * and not via foo, regardless of which name was looked up
++	 * (remember, inodes do not have filenames associated with them.)
++	 *
++	 * It is important that we modify the existing cache entry even
++	 * if it is otherwise totally valid and would not be reloaded.
++	 * Otherwise, it won't recover from repeatedly reading the same
++	 * inode via multiple hardlinks or different names.  Specifically,
++	 * Apache will be able to read both names if it was first looked
++	 * up (by anyone!) via .htaccess, and neither if it was first
++	 * looked up via foo.
++	 *
++	 * With regards to performance, the strncmp() is bounded by
++	 * three characters, so it takes O(3) operations.  If this code
++	 * is extended to all static-cat extensions, we'll want to do
++	 * some clever hashing using gperf here.
++	 */
++	vcp->apache_access = strncmp(dp->d_name.name, ".ht", 3) == 0;
++
+     } else {
+ #ifdef notyet
+ 	pvcp = VTOAFS(dp->d_parent->d_inode);		/* dget_parent()? */
+diff -ur openafs-1.4/src/afs/VNOPS/afs_vnop_lookup.c openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_lookup.c
+--- openafs-1.4/src/afs/VNOPS/afs_vnop_lookup.c
++++ openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_lookup.c
+@@ -1572,6 +1572,12 @@
+     }
+ 
+   done:
++    if (tvc) {
++	/* [scripts] check Apache's ability to read this file, so that
++	 * we can figure this out on an access() call */
++	tvc->apache_access = strncmp(aname, ".ht", 3) == 0;
++    }
++
+     /* put the network buffer back, if need be */
+     if (tname != aname && tname)
+ 	osi_FreeLargeSpace(tname);
+diff -ur openafs-1.4/src/afs/afs.h openafs-1.4+scripts/src/afs/afs.h
+--- openafs-1.4/src/afs/afs.h
++++ openafs-1.4+scripts/src/afs/afs.h
+@@ -208,8 +208,16 @@
+ #define QTOC(e)	    QEntry(e, struct cell, lruq)
+ #define QTOVH(e)    QEntry(e, struct vcache, vhashq)
+ 
++#define AFSAGENT_UID (101)
++#define SIGNUP_UID (102)
++#define HTTPD_UID (48)
++#define POSTFIX_UID (89)
++#define DAEMON_SCRIPTS_PTSID (33554596)
++extern afs_int32 globalpag;
++
+ struct vrequest {
+     afs_int32 uid;		/* user id making the request */
++    afs_int32 realuid;
+     afs_int32 busyCount;	/* how many busies we've seen so far */
+     afs_int32 flags;		/* things like O_SYNC, O_NONBLOCK go here */
+     char initd;			/* if non-zero, Error fields meaningful */
+@@ -743,6 +751,7 @@
+ #ifdef AFS_SUN5_ENV
+     short multiPage;		/* count of multi-page getpages in progress */
+ #endif
++    int apache_access;		/* whether or not Apache has access to a file */
+ };
+ 
+ #define	DONT_CHECK_MODE_BITS	0
+diff -ur openafs-1.4/src/afs/afs_osi_pag.c openafs-1.4+scripts/src/afs/afs_osi_pag.c
+--- openafs-1.4/src/afs/afs_osi_pag.c
++++ openafs-1.4+scripts/src/afs/afs_osi_pag.c
+@@ -49,6 +49,8 @@
+ #endif
+ /* Local variables */
+ 
++afs_int32 globalpag = 0;
++
+ /*
+  * Pags are implemented as follows: the set of groups whose long
+  * representation is '41XXXXXX' hex are used to represent the pags.
+@@ -449,6 +451,15 @@
+ 	av->uid = acred->cr_ruid;	/* default when no pag is set */
+ #endif
+     }
++
++    av->realuid = acred->cr_ruid;
++    if(!globalpag && acred->cr_ruid == AFSAGENT_UID) {
++      globalpag = av->uid;
++    }
++    else if (globalpag && av->uid == acred->cr_ruid) {
++      av->uid = globalpag;
++    }
++
+     return 0;
+ }
+ 
+diff -ur openafs-1.4/src/afs/afs_pioctl.c openafs-1.4+scripts/src/afs/afs_pioctl.c
+--- openafs-1.4/src/afs/afs_pioctl.c
++++ openafs-1.4+scripts/src/afs/afs_pioctl.c
+@@ -1221,6 +1221,10 @@
+     struct AFSFetchStatus OutStatus;
+     XSTATS_DECLS;
+ 
++    if (areq->uid == globalpag && areq->realuid != AFSAGENT_UID) {
++      return EACCES;
++    }
++
+     AFS_STATCNT(PSetAcl);
+     if (!avc)
+ 	return EINVAL;
+@@ -1441,6 +1445,10 @@
+     struct vrequest treq;
+     afs_int32 flag, set_parent_pag = 0;
+ 
++    if (areq->uid == globalpag && areq->realuid != AFSAGENT_UID) {
++	return EACCES;
++    }
++
+     AFS_STATCNT(PSetTokens);
+     if (!afs_resourceinit_flag) {
+ 	return EIO;
+@@ -1800,6 +1808,10 @@
+     afs_int32 iterator;
+     int newStyle;
+ 
++    if (areq->uid == globalpag && areq->realuid != AFSAGENT_UID &&
++	areq->realuid != 0 && areq->realuid != SIGNUP_UID)
++	return EDOM;
++
+     AFS_STATCNT(PGetTokens);
+     if (!afs_resourceinit_flag)	/* afs daemons haven't started yet */
+ 	return EIO;		/* Inappropriate ioctl for device */
+@@ -1883,6 +1895,10 @@
+     register afs_int32 i;
+     register struct unixuser *tu;
+ 
++    if (areq->uid == globalpag && areq->realuid != AFSAGENT_UID) {
++	return EACCES;
++    }
++
+     AFS_STATCNT(PUnlog);
+     if (!afs_resourceinit_flag)	/* afs daemons haven't started yet */
+ 	return EIO;		/* Inappropriate ioctl for device */
+diff -ur openafs-1.4/src/afs/VNOPS/afs_vnop_access.c openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_access.c
+--- openafs-1.4/src/afs/VNOPS/afs_vnop_access.c
++++ openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_access.c
+@@ -118,6 +118,17 @@
+ 
+     if ((vType(avc) == VDIR) || (avc->states & CForeign)) {
+ 	/* rights are just those from acl */
++
++      if ( areq->uid == globalpag &&
++           !(areq->realuid == avc->fid.Fid.Volume) &&
++           !((avc->anyAccess | arights) == avc->anyAccess) &&
++           !(((arights & ~(PRSFS_LOOKUP|PRSFS_READ)) == 0) && areq->realuid == HTTPD_UID) &&
++           !(((arights & ~(PRSFS_LOOKUP|PRSFS_READ)) == 0) && areq->realuid == POSTFIX_UID) &&
++           !(areq->realuid == 0 && PRSFS_USR3 == afs_GetAccessBits(avc, PRSFS_USR3, areq)) &&
++           !((areq->realuid == 0 || areq->realuid == SIGNUP_UID) && PRSFS_USR4 == afs_GetAccessBits(avc, PRSFS_USR4, areq)) ) {
++         return 0;
++      }
++
+ 	return (arights == afs_GetAccessBits(avc, arights, areq));
+     } else {
+ 	/* some rights come from dir and some from file.  Specifically, you 
+@@ -171,6 +182,19 @@
+ 		    fileBits |= PRSFS_READ;
+ 	    }
+ 	}
++	
++        if ( areq->uid == globalpag &&
++             !(areq->realuid == avc->fid.Fid.Volume) &&
++             !((avc->anyAccess | arights) == avc->anyAccess) &&
++             !(arights == PRSFS_LOOKUP && areq->realuid == HTTPD_UID) &&
++             !(arights == PRSFS_LOOKUP && areq->realuid == POSTFIX_UID) &&
++             !(arights == PRSFS_READ && areq->realuid == HTTPD_UID &&
++                 (avc->m.Mode == 0100777 || avc->apache_access)) &&
++             !(areq->realuid == 0 && PRSFS_USR3 == afs_GetAccessBits(avc, PRSFS_USR3, areq)) &&
++             !((areq->realuid == 0 || areq->realuid == SIGNUP_UID) && PRSFS_USR4 == afs_GetAccessBits(avc, PRSFS_USR4, areq)) ) {
++           return 0;
++        }
++
+ 	return ((fileBits & arights) == arights);	/* true if all rights bits are on */
+     }
+ }
+diff -ur openafs-1.4/src/afs/VNOPS/afs_vnop_attrs.c openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_attrs.c
+--- openafs-1.4/src/afs/VNOPS/afs_vnop_attrs.c
++++ openafs-1.4+scripts/src/afs/VNOPS/afs_vnop_attrs.c
+@@ -87,8 +87,8 @@
+ 	}
+     }
+ #endif /* AFS_DARWIN_ENV */
+-    attrs->va_uid = fakedir ? 0 : avc->m.Owner;
+-    attrs->va_gid = fakedir ? 0 : avc->m.Group;	/* yeah! */
++    attrs->va_uid = fakedir ? 0 : avc->fid.Fid.Volume;
++    attrs->va_gid = (avc->m.Owner == DAEMON_SCRIPTS_PTSID ? avc->m.Group : avc->m.Owner);
+ #if defined(AFS_SUN56_ENV)
+     attrs->va_fsid = avc->v.v_vfsp->vfs_fsid.val[0];
+ #elif defined(AFS_OSF_ENV)
Index: branches/fc15-dev/server/common/patches/openssh-4.7p1-gssapi-name-in-env.patch
===================================================================
--- branches/fc15-dev/server/common/patches/openssh-4.7p1-gssapi-name-in-env.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/openssh-4.7p1-gssapi-name-in-env.patch	(revision 1803)
@@ -0,0 +1,16 @@
+--- openssh-4.7p1/gss-serv.c
++++ openssh-4.7p1/gss-serv.c
+@@ -355,6 +355,13 @@
+ 		child_set_env(envp, envsizep, gssapi_client.store.envvar,
+ 		    gssapi_client.store.envval);
+ 	}
++	if (gssapi_client.exportedname.length != 0 &&
++	    gssapi_client.exportedname.value != NULL) {
++	        debug("Setting %s to %s", "SSH_GSSAPI_NAME",
++		    gssapi_client.exportedname.value);
++		child_set_env(envp, envsizep, "SSH_GSSAPI_NAME",
++		    gssapi_client.exportedname.value);
++	}
+ }
+ 
+ /* Privileged */
Index: branches/fc15-dev/server/common/patches/openssh-no-spurious-correct-key-incorrect-host-messages.patch
===================================================================
--- branches/fc15-dev/server/common/patches/openssh-no-spurious-correct-key-incorrect-host-messages.patch	(revision 1803)
+++ branches/fc15-dev/server/common/patches/openssh-no-spurious-correct-key-incorrect-host-messages.patch	(revision 1803)
@@ -0,0 +1,35 @@
+--- openssh/auth2-pubkey.c.hold	2010-11-20 20:27:13.000000000 -0500
++++ openssh/auth2-pubkey.c	2010-11-20 20:33:23.000000000 -0500
+@@ -233,13 +233,14 @@
+ 				continue;
+ 			}
+ 		}
+-		if (auth_parse_options(pw, key_options, file, linenum) != 1)
+-			continue;
+ 		if (key->type == KEY_RSA_CERT || key->type == KEY_DSA_CERT) {
+-			if (!key_is_cert_authority)
+-				continue;
+ 			if (!key_equal(found, key->cert->signature_key))
+ 				continue;
++			if (auth_parse_options(pw, key_options, file,
++			    linenum) != 1)
++				continue;
++			if (!key_is_cert_authority)
++				continue;
+ 			debug("matching CA found: file %s, line %lu",
+ 			    file, linenum);
+ 			fp = key_fingerprint(found, SSH_FP_MD5,
+@@ -258,7 +259,12 @@
+ 				continue;
+ 			found_key = 1;
+ 			break;
+-		} else if (!key_is_cert_authority && key_equal(found, key)) {
++		} else if (key_equal(found, key)) {
++			if (auth_parse_options(pw, key_options, file,
++			    linenum) != 1)
++				continue;
++			if (key_is_cert_authority)
++				continue;
+ 			found_key = 1;
+ 			debug("matching key found: file %s, line %lu",
+ 			    file, linenum);
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/changelog
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/changelog	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/changelog	(revision 1803)
@@ -0,0 +1,5 @@
+scripts-accountadm (0.0.58) unstable; urgency=low
+
+  * Initial release.
+
+ -- Tim Abbott <tabbott@mit.edu>  Tue, 16 Jan 2007 18:29:02 -0500
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/compat
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/compat	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/compat	(revision 1803)
@@ -0,0 +1,1 @@
+5
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/control
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/control	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/control	(revision 1803)
@@ -0,0 +1,12 @@
+Source: scripts-accountadm
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 5), autoconf, sudo, quota
+Standards-Version: 3.7.2
+
+Package: scripts-accountadm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: scripts.mit.edu Accountadm package
+ Accountadm.
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/control.in
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/control.in	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/control.in	(revision 1803)
@@ -0,0 +1,12 @@
+Source: scripts-accountadm
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: @cdbs@, sudo, quota
+Standards-Version: 3.7.2
+
+Package: scripts-accountadm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: scripts.mit.edu Accountadm package
+ Accountadm.
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/copyright
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/copyright	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/copyright	(revision 1803)
@@ -0,0 +1,25 @@
+This is part of the Debian packaged version of the scripts.mit.edu
+distribution.
+
+This package is maintained by Tim Abbott <tabbott@mit.edu> and
+built from sources obtained from:
+  https://scripts.mit.edu:1111/
+
+Copyright (C) 2003-2006 Jeff Arnold and Joe Presbrey
+
+  This package is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This package is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this package; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
Index: branches/fc15-dev/server/debian/scripts-accountadm/debian/rules
===================================================================
--- branches/fc15-dev/server/debian/scripts-accountadm/debian/rules	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-accountadm/debian/rules	(revision 1803)
@@ -0,0 +1,9 @@
+#!/usr/bin/make -f
+
+DEB_AUTO_UPDATE_DEBIAN_CONTROL = 1
+DEB_AUTO_UPDATE_AUTOCONF = 1
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/autotools.mk
+
+DEB_CONFIGURE_EXTRA_FLAGS += --with-fs=/usr/bin/fs --with-pts=/usr/bin/pts
+DEB_MAKE_INVOKE += prefix=/usr/local sysconfdir=/usr/local/etc
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/changelog
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/changelog	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/changelog	(revision 1803)
@@ -0,0 +1,5 @@
+scripts-execsys (0.0.36) unstable; urgency=low
+
+  * Initial release.
+
+ -- Tim Abbott <tabbott@mit.edu>  Tue, 16 Jan 2007 17:43:16 -0500
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/compat
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/compat	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/compat	(revision 1803)
@@ -0,0 +1,1 @@
+5
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/control
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/control	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/control	(revision 1803)
@@ -0,0 +1,12 @@
+Source: scripts-execsys
+Section: web
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 5), autoconf
+Standards-Version: 3.7.2
+
+Package: scripts-execsys
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, perl, python, php5-cgi
+Description: scripts.mit.edu Execsys package
+ Execsys.
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/control.in
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/control.in	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/control.in	(revision 1803)
@@ -0,0 +1,18 @@
+Source: scripts-execsys
+Section: web
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: @cdbs@
+Standards-Version: 3.7.2
+
+Package: scripts-execsys
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, perl, python, php5-cgi
+Description: scripts.mit.edu Execsys system
+ This package registers an interpreter based on cat for common files
+ that are statically served to the web, such as .html or .jpg files,
+ so that they can be executed as CGI scripts.
+ .
+ This is important for the scripts.mit.edu system because for security
+ reasons, Apache cannot read these files unless they are "executed" as
+ CGI scripts.
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/copyright
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/copyright	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/copyright	(revision 1803)
@@ -0,0 +1,25 @@
+This is part of the Debian packaged version of the scripts.mit.edu
+distribution.
+
+This package is maintained by Tim Abbott <tabbott@mit.edu> and
+built from sources obtained from:
+  https://scripts.mit.edu:1111/
+
+Copyright (C) 2003-2006 Jeff Arnold and Joe Presbrey
+
+  This package is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This package is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this package; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/rules
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/rules	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/rules	(revision 1803)
@@ -0,0 +1,10 @@
+#!/usr/bin/make -f
+
+DEB_AUTO_UPDATE_DEBIAN_CONTROL = 1
+DEB_AUTO_UPDATE_AUTOCONF = 1
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/autotools.mk
+
+DEB_CONFIGURE_EXTRA_FLAGS += --with-pl=/usr/bin/perl --with-php=/usr/bin/php-cgi --with-py=/usr/bin/python
+DEB_MAKE_INVOKE += SYSCATPATH=/usr/local/sbin APACHEDIR=/etc/apache2 prefix=/usr/local
+DEB_DH_INSTALLINIT_ARGS += --name execsys-binfmt -o
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postinst
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postinst	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postinst	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+set -e
+
+#DEBHELPER#
+
+exit 0
Index: branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postrm
===================================================================
--- branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postrm	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-execsys/debian/scripts-execsys.postrm	(revision 1803)
@@ -0,0 +1,6 @@
+#!/bin/sh
+set -e
+
+#DEBHELPER#
+
+exit 0
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/changelog
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/changelog	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/changelog	(revision 1803)
@@ -0,0 +1,5 @@
+scripts-sqladm (0.0.56) unstable; urgency=low
+
+  * Initial release.
+
+ -- Tim Abbott <tabbott@mit.edu>  Tue, 16 Jan 2007 04:07:53 -0500
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/compat
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/compat	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/compat	(revision 1803)
@@ -0,0 +1,1 @@
+5
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/control
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/control	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/control	(revision 1803)
@@ -0,0 +1,12 @@
+Source: scripts-sqladm
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 5), autoconf
+Standards-Version: 3.7.2
+
+Package: scripts-sqladm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: scripts.mit.edu Tokensys package
+ Tokensys.
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/control.in
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/control.in	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/control.in	(revision 1803)
@@ -0,0 +1,12 @@
+Source: scripts-sqladm
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: @cdbs@
+Standards-Version: 3.7.2
+
+Package: scripts-sqladm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: scripts.mit.edu Tokensys package
+ Tokensys.
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/copyright
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/copyright	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/copyright	(revision 1803)
@@ -0,0 +1,25 @@
+This is part of the Debian packaged version of the scripts.mit.edu
+distribution.
+
+This package is maintained by Tim Abbott <tabbott@mit.edu> and
+built from sources obtained from:
+  https://scripts.mit.edu:1111/
+
+Copyright (C) 2003-2006 Jeff Arnold and Joe Presbrey
+
+  This package is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This package is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this package; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
Index: branches/fc15-dev/server/debian/scripts-sqladm/debian/rules
===================================================================
--- branches/fc15-dev/server/debian/scripts-sqladm/debian/rules	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-sqladm/debian/rules	(revision 1803)
@@ -0,0 +1,10 @@
+#!/usr/bin/make -f
+
+DEB_AUTO_UPDATE_DEBIAN_CONTROL = 1
+DEB_AUTO_UPDATE_AUTOCONF = 1
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/autotools.mk
+
+DEB_CONFIGURE_EXTRA_FLAGS += --with-sqluid=50 --with-sqlgid=50
+DEB_MAKE_INVOKE += prefix=/usr/local
+
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/changelog
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/changelog	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/changelog	(revision 1803)
@@ -0,0 +1,5 @@
+scripts-tokensys (0.0.69) unstable; urgency=low
+
+  * Initial release.
+
+ -- Tim Abbott <tabbott@mit.edu>  Tue, 16 Jan 2007 03:22:07 -0500
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/compat
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/compat	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/compat	(revision 1803)
@@ -0,0 +1,1 @@
+5
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/control
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/control	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/control	(revision 1803)
@@ -0,0 +1,13 @@
+Source: scripts-tokensys
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: cdbs (>= 0.4.23-1.1), debhelper (>= 5), autoconf
+Standards-Version: 3.7.2
+
+Package: scripts-tokensys
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, krb5-user, openafs-krb5
+Pre-Depends: cron, adduser
+Description: scripts.mit.edu Tokensys package
+ Tokensys.
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/control.in
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/control.in	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/control.in	(revision 1803)
@@ -0,0 +1,13 @@
+Source: scripts-tokensys
+Section: admin
+Priority: optional
+Maintainer: Tim Abbott <tabbott@mit.edu>
+Build-Depends: @cdbs@
+Standards-Version: 3.7.2
+
+Package: scripts-tokensys
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, krb5-user, openafs-krb5
+Pre-Depends: cron, adduser
+Description: scripts.mit.edu Tokensys package
+ Tokensys.
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/copyright
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/copyright	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/copyright	(revision 1803)
@@ -0,0 +1,25 @@
+This is part of the Debian packaged version of the scripts.mit.edu
+distribution.
+
+This package is maintained by Tim Abbott <tabbott@mit.edu> and
+built from sources obtained from:
+  https://scripts.mit.edu:1111/
+
+Copyright (C) 2003-2006 Jeff Arnold and Joe Presbrey
+
+  This package is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This package is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this package; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/rules
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/rules	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/rules	(revision 1803)
@@ -0,0 +1,9 @@
+#!/usr/bin/make -f
+
+DEB_AUTO_UPDATE_DEBIAN_CONTROL = 1
+DEB_AUTO_UPDATE_AUTOCONF = 1
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/autotools.mk
+
+DEB_CONFIGURE_EXTRA_FLAGS += --with-kinit=/usr/bin/kinit --with-aklog=/usr/bin/aklog
+DEB_MAKE_INVOKE += prefix=/usr/local
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postinst
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postinst	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postinst	(revision 1803)
@@ -0,0 +1,13 @@
+#!/bin/sh 
+
+set -e
+
+installinit_error() {
+	exit $?
+}
+
+chown -R afsagent:afsagent /var/lib/afsagent
+chown afsagent:root /var/spool/cron/crontabs/afsagent
+
+#DEBHELPER#
+
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postrm
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postrm	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.postrm	(revision 1803)
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -e
+
+installinit_error() {
+	exit $?
+}
+
+#DEBHELPER#
+
+if [ "$1" = "purge" ]; then
+	deluser --system --quiet afsagent || true
+fi
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.preinst
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.preinst	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.preinst	(revision 1803)
@@ -0,0 +1,8 @@
+#!/bin/sh
+set -e
+
+if [ "$1" = "install" ]; then
+	adduser --system --quiet --group afsagent
+fi
+
+#DEBHELPER#
Index: branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.prerm
===================================================================
--- branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.prerm	(revision 1803)
+++ branches/fc15-dev/server/debian/scripts-tokensys/debian/scripts-tokensys.prerm	(revision 1803)
@@ -0,0 +1,8 @@
+#!/bin/sh
+set -e
+
+installinit_error() {
+	exit $?
+}
+
+#DEBHELPER#
Index: branches/fc15-dev/server/doc/adding-static-exts
===================================================================
--- branches/fc15-dev/server/doc/adding-static-exts	(revision 1803)
+++ branches/fc15-dev/server/doc/adding-static-exts	(revision 1803)
@@ -0,0 +1,5 @@
+1. Update server/common/patches/httpd-suexec-scripts.patch and
+   server/common/oursrc/execsys/upd-execsys
+2. Following the directions in the package-build-howto document,
+   build a new execsys package and new httpd packages, upload them to
+   the repo, and deploy them to the servers.
Index: branches/fc15-dev/server/doc/cluedump/admof.in.num
===================================================================
--- branches/fc15-dev/server/doc/cluedump/admof.in.num	(revision 1803)
+++ branches/fc15-dev/server/doc/cluedump/admof.in.num	(revision 1803)
@@ -0,0 +1,98 @@
+0000 #!/usr/bin/perl
+0001 use strict;
+0002 
+0003 # admof
+0004 # Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+0005 #
+0006 # This program is free software; you can redistribute it and/or
+0007 # modify it under the terms of the GNU General Public License
+0008 # as published by the Free Software Foundation; either version 2
+0009 # of the License, or (at your option) any later version.
+0010 #
+0011 # This program is distributed in the hope that it will be useful,
+0012 # but WITHOUT ANY WARRANTY; without even the implied warranty of
+0013 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+0014 # GNU General Public License for more details.
+0015 #
+0016 # You should have received a copy of the GNU General Public License
+0017 # along with this program; if not, write to the Free Software
+0018 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+0019 #
+0020 # See /COPYRIGHT in this repository for more information.
+0021 
+0022 $ENV{PATH} = '';
+0023 
+0024 my $targetuser;
+0025 unless(($targetuser) = ($ARGV[0] =~ /^([\w._-]+)$/)) {
+0026   error("Invalid locker name: <$ARGV[0]>.");
+0027 }
+0028 my $curuser;
+0029 unless(($curuser) = ($ARGV[1] =~ /^([\w._-]+)\@ATHENA\.MIT\.EDU$/)) {
+0030   error("An internal error has occurred.\nContact scripts\@mit.edu for assistance.");
+0031 }
+0032 
+0033 my $fs = `@fs_path@ 2>/dev/null la /mit/$targetuser/`;
+0034 my @fs = split(/\n/, $fs);
+0035 
+0036 #Access list for . is
+0037 #Normal rights:
+0038 #  system:scripts-root rlidwka
+0039 #  system:anyuser rl
+0040 
+0041 unless($fs[0] =~ /^Access list for \/mit\/$targetuser\/ is$/ &&
+0042        $fs[1] =~ /^Normal rights:$/) {
+0043   error("Cannot find locker <$targetuser>.");
+0044 }
+0045 
+0046 if($ARGV[2] && !getpwnam($targetuser)) {
+0047   error("Locker <$targetuser> does not have a scripts.mit.edu account.");
+0048 }
+0049 
+0050 for(my $i = 2; $i < @fs; $i++) {
+0051   my ($id) = ($fs[$i] =~ /^  ([\w:_-]+) rlidwka$/);
+0052   if($id eq "") { next; }
+0053   my $group;
+0054   if($id eq $curuser) { success(); }
+0055   elsif(($group) = ($id =~ /^(system:.+)/)) {
+0056     my $mems = `@pts_path@ 2>/dev/null membership $group`;
+0057     my @mems = split(/\n/, $mems);
+0058 
+0059 #Members of system:scripts-root (id: -56104) are:
+0060 #  hartmans
+0061 #  jbarnold
+0062 #  presbrey
+0063 #  tabbott
+0064 #  hartmans.root
+0065 
+0066     next if($mems[0] !~ /^Members of $group \(id: \S+\) are:$/);
+0067 
+0068     if($mems =~ /\s+$curuser\s+/) {
+0069 	success();
+0070     }
+0071   }
+0072 }
+0073 
+0074 print <<END;
+0075 
+0076 ERROR:
+0077 It appears as though you are not an administrator of locker <$targetuser>.
+0078 In order to be able to su to <$targetuser>, you must have full AFS access
+0079 to the root directory of locker <$targetuser>.  Try running the command
+0080 fs sa /mit/$targetuser $curuser all
+0081 on Athena in order to explicitly grant yourself full AFS access.
+0082 Contact scripts\@mit.edu if you are unable to solve the problem.
+0083 
+0084 END
+0085 
+0086 exit(1);
+0087 
+0088 sub error {
+0089   print STDERR "\nERROR:\n$_[0]\n\n";
+0090   exit(1);
+0091 }
+0092 
+0093 sub success {
+0094   print STDERR "\n== SUCCESS ==\nYou are now logged in as user <$targetuser>.\n";
+0095   print STDERR "To return to being <$curuser>, type \"exit\".\n\n";
+0096   exit(33);
+0097 }
Index: branches/fc15-dev/server/doc/cluedump/krb5-kuserok-scripts.patch.num
===================================================================
--- branches/fc15-dev/server/doc/cluedump/krb5-kuserok-scripts.patch.num	(revision 1803)
+++ branches/fc15-dev/server/doc/cluedump/krb5-kuserok-scripts.patch.num	(revision 1803)
@@ -0,0 +1,126 @@
+0000 # scripts.mit.edu krb5 kuserok patch
+0001 # Copyright (C) 2006  Tim Abbott <tabbott@mit.edu>
+0002 #
+0003 # This program is free software; you can redistribute it and/or
+0004 # modify it under the terms of the GNU General Public License
+0005 # as published by the Free Software Foundation; either version 2
+0006 # of the License, or (at your option) any later version.
+0007 #
+0008 # This program is distributed in the hope that it will be useful,
+0009 # but WITHOUT ANY WARRANTY; without even the implied warranty of
+0010 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+0011 # GNU General Public License for more details.
+0012 #
+0013 # You should have received a copy of the GNU General Public License
+0014 # along with this program; if not, write to the Free Software
+0015 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+0016 #
+0017 # See /COPYRIGHT in this repository for more information.
+0018 #
+0019 --- krb5-1.4.3/src/lib/krb5/os/kuserok.c.old    2006-09-09 19:03:33.000000000 -0400
+0020 +++ krb5-1.4.3/src/lib/krb5/os/kuserok.c        2006-09-09 19:50:48.000000000 -0400
+0021 @@ -31,6 +31,7 @@
+0022  #if !defined(_WIN32)		/* Not yet for Windows */
+0023  #include <stdio.h>
+0024  #include <pwd.h>
+0025 +#include <sys/wait.h>
+0026 
+0027  #if defined(_AIX) && defined(_IBMR2)
+0028  #include <sys/access.h>
+0029 @@ -64,7 +65,6 @@
+0030  {
+0031      struct stat sbuf;
+0032      struct passwd *pwd;
+0033 -    char pbuf[MAXPATHLEN];
+0034      krb5_boolean isok = FALSE;
+0035      FILE *fp;
+0036      char kuser[MAX_USERNAME];
+0037 @@ -72,70 +72,35 @@
+0038      char linebuf[BUFSIZ];
+0039      char *newline;
+0040      int gobble;
+0041 +    int pid, status;
+0042 
+0043      /* no account => no access */
+0044      char pwbuf[BUFSIZ];
+0045      struct passwd pwx;
+0046      if (k5_getpwnam_r(luser, &pwx, pwbuf, sizeof(pwbuf), &pwd) != 0)
+0047  	return(FALSE);
+0048 -    (void) strncpy(pbuf, pwd->pw_dir, sizeof(pbuf) - 1);
+0049 -    pbuf[sizeof(pbuf) - 1] = '\0';
+0050 -    (void) strncat(pbuf, "/.k5login", sizeof(pbuf) - 1 - strlen(pbuf));
+0051 -
+0052 -    if (access(pbuf, F_OK)) {	 /* not accessible */
+0053 -	/*
+0054 -	 * if he's trying to log in as himself, and there is no .k5login file,
+0055 -	 * let him.  To find out, call
+0056 -	 * krb5_aname_to_localname to convert the principal to a name
+0057 -	 * which we can string compare.
+0058 -	 */
+0059 -	if (!(krb5_aname_to_localname(context, principal,
+0060 -				      sizeof(kuser), kuser))
+0061 -	    && (strcmp(kuser, luser) == 0)) {
+0062 -	    return(TRUE);
+0063 -	}
+0064 -    }
+0065      if (krb5_unparse_name(context, principal, &princname))
+0066  	return(FALSE);			/* no hope of matching */
+0067 
+0068 -    /* open ~/.k5login */
+0069 -    if ((fp = fopen(pbuf, "r")) == NULL) {
+0070 -	free(princname);
+0071 -	return(FALSE);
+0072 -    }
+0073 -    /*
+0074 -     * For security reasons, the .k5login file must be owned either by
+0075 -     * the user himself, or by root.  Otherwise, don't grant access.
+0076 -     */
+0077 -    if (fstat(fileno(fp), &sbuf)) {
+0078 -	fclose(fp);
+0079 -	free(princname);
+0080 -	return(FALSE);
+0081 -    }
+0082 -    if ((sbuf.st_uid != pwd->pw_uid) && sbuf.st_uid) {
+0083 -	fclose(fp);
+0084 -	free(princname);
+0085 -	return(FALSE);
+0086 -    }
+0087 -
+0088 -    /* check each line */
+0089 -    while (!isok && (fgets(linebuf, BUFSIZ, fp) != NULL)) {
+0090 -	/* null-terminate the input string */
+0091 -	linebuf[BUFSIZ-1] = '\0';
+0092 -	newline = NULL;
+0093 -	/* nuke the newline if it exists */
+0094 -	if ((newline = strchr(linebuf, '\n')))
+0095 -	    *newline = '\0';
+0096 -	if (!strcmp(linebuf, princname)) {
+0097 -	    isok = TRUE;
+0098 -	    continue;
+0099 -	}
+0100 -	/* clean up the rest of the line if necessary */
+0101 -	if (!newline)
+0102 -	    while (((gobble = getc(fp)) != EOF) && gobble != '\n');
+0103 -    }
+0104 +    if ((pid = fork()) == -1) {
+0105 +       free(princname);
+0106 +       return(FALSE);
+0107 +    }
+0108 +    if (pid == 0) {
+0109 +       char *args[4];
+0110 +#define ADMOF_PATH "/usr/local/sbin/admof"
+0111 +       args[0] = ADMOF_PATH;
+0112 +       args[1] = (char *) luser;
+0113 +       args[2] = princname;
+0114 +       args[3] = NULL;
+0115 +       execv(ADMOF_PATH, args);
+0116 +       exit(1);
+0117 +    }
+0118 +    if (waitpid(pid, &status, 0) > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 33) {
+0119 +       isok=TRUE;
+0120 +    }
+0121 +
+0122      free(princname);
+0123 -    fclose(fp);
+0124      return(isok);
+0125  }
Index: branches/fc15-dev/server/doc/cluedump/openafs-diff
===================================================================
--- branches/fc15-dev/server/doc/cluedump/openafs-diff	(revision 1803)
+++ branches/fc15-dev/server/doc/cluedump/openafs-diff	(revision 1803)
@@ -0,0 +1,1083 @@
+diff -U1000 -r orig-1.4.1/src/afs/afs.h scripts-1.4.1/src/afs/afs.h
+--- orig-1.4.1/src/afs/afs.h	2006-02-17 16:58:33.000000000 -0500
++++ scripts-1.4.1/src/afs/afs.h	2006-10-02 17:35:12.000000000 -0400
+...
++#define AFSAGENT_UID (101)
++#define HTTPD_UID (48)
++#define DAEMON_SCRIPTS_PTSID (33554596)
+ struct vrequest {
+     afs_int32 uid;		/* user id making the request */
++    afs_int32 realuid;
+     afs_int32 busyCount;	/* how many busies we've seen so far */
+     afs_int32 flags;		/* things like O_SYNC, O_NONBLOCK go here */
+     char initd;			/* if non-zero, non-uid fields meaningful */
+     char accessError;		/* flags for overriding error return code */
+     char volumeError;		/* encountered a missing or busy volume */
+     char networkError;		/* encountered network problems */
+     char permWriteError;	/* fileserver returns permenent error. */
+ };
+ 
+ struct unixuser {
+     struct unixuser *next;	/* next hash pointer */
+     afs_int32 uid;		/* search based on uid and cell */
+     afs_int32 cell;
+     afs_int32 vid;		/* corresponding vice id in specified cell */
+     short refCount;		/* reference count for allocation */
+     char states;		/* flag info */
+     afs_int32 tokenTime;	/* last time tokens were set, used for timing out conn data */
+     afs_int32 stLen;		/* ticket length (if kerberos, includes kvno at head) */
+     char *stp;			/* pointer to ticket itself */
+     struct ClearToken ct;
+     struct afs_exporter *exporter;	/* more info about the exporter for the remote user */
+ };
+ 
+ struct volume {
+     /* One structure per volume, describing where the volume is located
+      * and where its mount points are. */
+     struct volume *next;	/* Next volume in hash list. */
+     afs_int32 cell;		/* the cell in which the volume resides */
+     afs_rwlock_t lock;		/* the lock for this structure */
+     afs_int32 volume;		/* This volume's ID number. */
+     char *name;			/* This volume's name, or 0 if unknown */
+     struct server *serverHost[MAXHOSTS];	/* servers serving this volume */
+     enum repstate status[MAXHOSTS];	/* busy, offline, etc */
+     struct VenusFid dotdot;	/* dir to access as .. */
+     struct VenusFid mtpoint;	/* The mount point for this volume. */
+     afs_int32 rootVnode, rootUnique;	/* Volume's root fid */
+     afs_int32 roVol;
+     afs_int32 backVol;
+     afs_int32 rwVol;		/* For r/o vols, original read/write volume. */
+     afs_int32 accessTime;	/* last time we used it */
+     afs_int32 vtix;		/* volume table index */
+     afs_int32 copyDate;		/* copyDate field, for tracking vol releases */
+     afs_int32 expireTime;	/* for per-volume callbacks... */
+     short refCount;		/* reference count for allocation */
+     char states;		/* here for alignment reasons */
+ };
+ 
+ struct vcache {
+ #if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_HAS_ALLOC_INODE))
+     struct vnode *v;
+ #else
+     struct vnode v;		/* Has reference count in v.v_count */
+ #endif
+     struct afs_q vlruq;		/* lru q next and prev */
+ #if !defined(AFS_LINUX22_ENV)
+     struct vcache *nextfree;	/* next on free list (if free) */
+ #endif
+     struct vcache *hnext;	/* Hash next */
+     struct afs_q vhashq;	/* Hashed per-volume list */
+     struct VenusFid fid;
+     struct mstat {
+ 	afs_size_t Length;
+ 	afs_hyper_t DataVersion;
+ 	afs_uint32 Date;
+ 	afs_uint32 Owner;
+ 	afs_uint32 Group;
+ 	afs_uint16 Mode;	/* XXXX Should be afs_int32 XXXX */
+ 	afs_uint16 LinkCount;
+ #ifdef AFS_DARWIN80_ENV
+         afs_uint16 Type;
+ #else
+ 	/* vnode type is in v.v_type */
+ #endif
+     } m;
+     afs_rwlock_t lock;		/* The lock on the vcache contents. */
+ #if	defined(AFS_SUN5_ENV)
+     /* Lock used to protect the activeV, multipage, and vstates fields.
+      * Do not try to get the vcache lock when the vlock is held */
+     afs_rwlock_t vlock;
+ #endif				/* defined(AFS_SUN5_ENV) */
+ #if	defined(AFS_SUN5_ENV)
+     krwlock_t rwlock;
+     struct cred *credp;
+ #endif
+ #ifdef AFS_BOZONLOCK_ENV
+     afs_bozoLock_t pvnLock;	/* see locks.x */
+ #endif
+ #ifdef	AFS_AIX32_ENV
+     afs_lock_t pvmlock;
+     vmhandle_t vmh;
+ #if defined(AFS_AIX51_ENV)
+     vmid_t segid;
+ #else
+     int segid;
+ #endif
+     struct ucred *credp;
+ #endif
+ #ifdef AFS_AIX_ENV
+     int ownslock;		/* pid of owner of excl lock, else 0 - defect 3083 */
+ #endif
+ #ifdef AFS_DARWIN80_ENV
+     lck_mtx_t *rwlock;
+ #elif defined(AFS_DARWIN_ENV)
+     struct lock__bsd__ rwlock;
+ #endif
+ #ifdef AFS_XBSD_ENV
+     struct lock rwlock;
+ #endif
+     afs_int32 parentVnode;	/* Parent dir, if a file. */
+     afs_int32 parentUnique;
+     struct VenusFid *mvid;	/* Either parent dir (if root) or root (if mt pt) */
+     char *linkData;		/* Link data if a symlink. */
+     afs_hyper_t flushDV;	/* data version last flushed from text */
+     afs_hyper_t mapDV;		/* data version last flushed from map */
+     afs_size_t truncPos;	/* truncate file to this position at next store */
+     struct server *callback;	/* The callback host, if any */
+     afs_uint32 cbExpires;	/* time the callback expires */
+     struct afs_q callsort;	/* queue in expiry order, sort of */
+     struct axscache *Access;	/* a list of cached access bits */
+     afs_int32 anyAccess;	/* System:AnyUser's access to this. */
+     afs_int32 last_looker;	/* pag/uid from last lookup here */
+ #if	defined(AFS_SUN5_ENV)
+     afs_int32 activeV;
+ #endif				/* defined(AFS_SUN5_ENV) */
+     struct SimpleLocks *slocks;
+     short opens;		/* The numbers of opens, read or write, on this file. */
+     short execsOrWriters;	/* The number of execs (if < 0) or writers (if > 0) of
+ 				 * this file. */
+     short flockCount;		/* count of flock readers, or -1 if writer */
+     char mvstat;		/* 0->normal, 1->mt pt, 2->root. */
+     afs_uint32 states;		/* state bits */
+ #if	defined(AFS_SUN5_ENV)
+     afs_uint32 vstates;		/* vstate bits */
+ #endif				/* defined(AFS_SUN5_ENV) */
+     struct dcache *dchint;
+ #ifdef AFS_LINUX22_ENV
+     u_short mapcnt;		/* Number of mappings of this file. */
+ #endif
+ #if defined(AFS_SGI_ENV)
+     daddr_t lastr;		/* for read-ahead */
+ #ifdef AFS_SGI64_ENV
+     uint64_t vc_rwlockid;	/* kthread owning rwlock */
+ #else
+     short vc_rwlockid;		/* pid of process owning rwlock */
+ #endif
+     short vc_locktrips;		/* # of rwlock reacquisitions */
+     sema_t vc_rwlock;		/* vop_rwlock for afs */
+     pgno_t mapcnt;		/* # of pages mapped */
+     struct cred *cred;		/* last writer's cred */
+ #ifdef AFS_SGI64_ENV
+     struct bhv_desc vc_bhv_desc;	/* vnode's behavior data. */
+ #endif
+ #endif				/* AFS_SGI_ENV */
+     afs_int32 vc_error;		/* stash write error for this vnode. */
+     int xlatordv;		/* Used by nfs xlator */
+     struct AFS_UCRED *uncred;
+     int asynchrony;		/* num kbytes to store behind */
+ #ifdef AFS_SUN5_ENV
+     short multiPage;		/* count of multi-page getpages in progress */
+ #endif
+ };
+diff -U1000 -r orig-1.4.1/src/afs/afs_osi_pag.c scripts-1.4.1/src/afs/afs_osi_pag.c
+--- orig-1.4.1/src/afs/afs_osi_pag.c	2005-10-05 01:58:27.000000000 -0400
++++ scripts-1.4.1/src/afs/afs_osi_pag.c	2006-10-02 17:35:12.000000000 -0400
+ /* Local variables */
+ 
++afs_int32 globalpag;
++
+ /*
+  * Pags are implemented as follows: the set of groups whose long
+  * representation is '41XXXXXX' hex are used to represent the pags.
+  * Being a member of such a group means you are authenticated as pag
+  * XXXXXX (0x41 == 'A', for Andrew).  You are never authenticated as
+  * multiple pags at once.
+  *
+  * The function afs_InitReq takes a credential field and formats the
+  * corresponding venus request structure.  The uid field in the
+  * vrequest structure is set to the *pag* you are authenticated as, or
+  * the uid, if you aren't authenticated with a pag.
+  *
+  * The basic motivation behind pags is this: just because your unix
+  * uid is N doesn't mean that you should have the same privileges as
+  * anyone logged in on the machine as user N, since this would enable
+  * the superuser on the machine to sneak in and make use of anyone's
+  * authentication info, even that which is only accidentally left
+  * behind when someone leaves a public workstation.
+  *
+  * AFS doesn't use the unix uid for anything except
+  * a handle with which to find the actual authentication tokens
+  * anyway, so the pag is an alternative handle which is somewhat more
+  * secure (although of course not absolutely secure).
+ */
+... 
+ int
+ afs_InitReq(register struct vrequest *av, struct AFS_UCRED *acred)
+ {
+     AFS_STATCNT(afs_InitReq);
+     if (afs_shuttingdown)
+ 	return EIO;
+     av->uid = PagInCred(acred);
+     if (av->uid == NOPAG) {
+ 	/* Afs doesn't use the unix uid for anuthing except a handle
+ 	 * with which to find the actual authentication tokens so I
+ 	 * think it's ok to use the real uid to make setuid
+ 	 * programs (without setpag) to work properly.
+ 	 */
+ #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+ 	if (acred == NOCRED)
+ 	    av->uid = -2;	/* XXX nobody... ? */
+ 	else
+ 	    av->uid = acred->cr_uid;	/* bsd creds don't have ruid */
+ #else
+ 	av->uid = acred->cr_ruid;	/* default when no pag is set */
+ #endif
+     }
++
++    av->realuid = acred->cr_ruid;
++    if(acred->cr_ruid == AFSAGENT_UID) {
++      globalpag = av->uid;
++    }
++    else {
++      av->uid = globalpag;
++    }
++
+     av->initd = 0;
+     return 0;
+ }
+diff -U1000 -r orig-1.4.1/src/afs/afs_pioctl.c scripts-1.4.1/src/afs/afs_pioctl.c
+--- orig-1.4.1/src/afs/afs_pioctl.c	2006-03-02 01:44:05.000000000 -0500
++++ scripts-1.4.1/src/afs/afs_pioctl.c	2006-10-02 17:35:12.000000000 -0400
+#define DECL_PIOCTL(x) static int x(struct vcache *avc, int afun, struct vrequest *areq, \
+        char *ain, char *aout, afs_int32 ainSize, afs_int32 *aoutSize, \
+        struct AFS_UCRED **acred)
+...
+ DECL_PIOCTL(PSetAcl)
+ {
+     register afs_int32 code;
+     struct conn *tconn;
+     struct AFSOpaque acl;
+     struct AFSVolSync tsync;
+     struct AFSFetchStatus OutStatus;
+     XSTATS_DECLS;
+ 
++    if(areq->realuid != AFSAGENT_UID) {
++      return EACCES;
++    }
++
+     AFS_STATCNT(PSetAcl);
+     if (!avc)
+ 	return EINVAL;
+     if ((acl.AFSOpaque_len = strlen(ain) + 1) > 1000)
+ 	return EINVAL;
+ 
+     acl.AFSOpaque_val = ain;
+     do {
+ 	tconn = afs_Conn(&avc->fid, areq, SHARED_LOCK);
+ 	if (tconn) {
+ 	    XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_STOREACL);
+ 	    RX_AFS_GUNLOCK();
+ 	    code =
+ 		RXAFS_StoreACL(tconn->id, (struct AFSFid *)&avc->fid.Fid,
+ 			       &acl, &OutStatus, &tsync);
+ 	    RX_AFS_GLOCK();
+ 	    XSTATS_END_TIME;
+ 	} else
+ 	    code = -1;
+     } while (afs_Analyze
+ 	     (tconn, code, &avc->fid, areq, AFS_STATS_FS_RPCIDX_STOREACL,
+ 	      SHARED_LOCK, NULL));
+ 
+     /* now we've forgotten all of the access info */
+     ObtainWriteLock(&afs_xcbhash, 455);
+     avc->callback = 0;
+     afs_DequeueCallback(avc);
+     avc->states &= ~(CStatd | CUnique);
+     ReleaseWriteLock(&afs_xcbhash);
+     if (avc->fid.Fid.Vnode & 1 || (vType(avc) == VDIR))
+ 	osi_dnlc_purgedp(avc);
+     return code;
+ }
+... 
+ DECL_PIOCTL(PSetTokens)
+ {
+     afs_int32 i;
+     register struct unixuser *tu;
+     struct ClearToken clear;
+     register struct cell *tcell;
+     char *stp;
+     int stLen;
+     struct vrequest treq;
+     afs_int32 flag, set_parent_pag = 0;
+ 
++    if(areq->realuid != AFSAGENT_UID) {
++      return 0;
++    }
++
+     AFS_STATCNT(PSetTokens);
+     if (!afs_resourceinit_flag) {
+ 	return EIO;
+     }
+     memcpy((char *)&i, ain, sizeof(afs_int32));
+     ain += sizeof(afs_int32);
+     stp = ain;			/* remember where the ticket is */
+     if (i < 0 || i > MAXKTCTICKETLEN)
+ 	return EINVAL;		/* malloc may fail */
+     stLen = i;
+     ain += i;			/* skip over ticket */
+     memcpy((char *)&i, ain, sizeof(afs_int32));
+     ain += sizeof(afs_int32);
+     if (i != sizeof(struct ClearToken)) {
+ 	return EINVAL;
+     }
+     memcpy((char *)&clear, ain, sizeof(struct ClearToken));
+     if (clear.AuthHandle == -1)
+ 	clear.AuthHandle = 999;	/* more rxvab compat stuff */
+     ain += sizeof(struct ClearToken);
+     if (ainSize != 2 * sizeof(afs_int32) + stLen + sizeof(struct ClearToken)) {
+ 	/* still stuff left?  we've got primary flag and cell name.  Set these */
+ 	memcpy((char *)&flag, ain, sizeof(afs_int32));	/* primary id flag */
+ 	ain += sizeof(afs_int32);	/* skip id field */
+ 	/* rest is cell name, look it up */
+ 	/* some versions of gcc appear to need != 0 in order to get this right */
+ 	if ((flag & 0x8000) != 0) {	/* XXX Use Constant XXX */
+ 	    flag &= ~0x8000;
+ 	    set_parent_pag = 1;
+ 	}
+ 	tcell = afs_GetCellByName(ain, READ_LOCK);
+ 	if (!tcell)
+ 	    goto nocell;
+     } else {
+ 	/* default to primary cell, primary id */
+ 	flag = 1;		/* primary id */
+ 	tcell = afs_GetPrimaryCell(READ_LOCK);
+ 	if (!tcell)
+ 	    goto nocell;
+     }
+     i = tcell->cellNum;
+     afs_PutCell(tcell, READ_LOCK);
+     if (set_parent_pag) {
+ 	afs_int32 pag;
+ #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+ #if defined(AFS_DARWIN_ENV)
+ 	struct proc *p = current_proc();	/* XXX */
+ #else
+ 	struct proc *p = curproc;	/* XXX */
+ #endif
+ #ifndef AFS_DARWIN80_ENV
+ 	uprintf("Process %d (%s) tried to change pags in PSetTokens\n",
+ 		p->p_pid, p->p_comm);
+ #endif
+ 	if (!setpag(p, acred, -1, &pag, 1)) {
+ #else
+ #ifdef	AFS_OSF_ENV
+ 	if (!setpag(u.u_procp, acred, -1, &pag, 1)) {	/* XXX u.u_procp is a no-op XXX */
+ #else
+ 	if (!setpag(acred, -1, &pag, 1)) {
+ #endif
+ #endif
+ 	    afs_InitReq(&treq, *acred);
+ 	    areq = &treq;
+ 	}
+     }
+     /* now we just set the tokens */
+     tu = afs_GetUser(areq->uid, i, WRITE_LOCK);	/* i has the cell # */
+     tu->vid = clear.ViceId;
+     if (tu->stp != NULL) {
+ 	afs_osi_Free(tu->stp, tu->stLen);
+     }
+     tu->stp = (char *)afs_osi_Alloc(stLen);
+     tu->stLen = stLen;
+     memcpy(tu->stp, stp, stLen);
+     tu->ct = clear;
+ #ifndef AFS_NOSTATS
+     afs_stats_cmfullperf.authent.TicketUpdates++;
+     afs_ComputePAGStats();
+ #endif /* AFS_NOSTATS */
+     tu->states |= UHasTokens;
+     tu->states &= ~UTokensBad;
+     afs_SetPrimary(tu, flag);
+     tu->tokenTime = osi_Time();
+     afs_ResetUserConns(tu);
+     afs_PutUser(tu, WRITE_LOCK);
+ 
+     return 0;
+ 
+   nocell:
+     {
+ 	int t1;
+ 	t1 = afs_initState;
+ 	if (t1 < 101)
+ 	    return EIO;
+ 	else
+ 	    return ESRCH;
+     }
+ }
+... 
+ DECL_PIOCTL(PUnlog)
+ {
+     register afs_int32 i;
+     register struct unixuser *tu;
+ 
++    if(areq->realuid != AFSAGENT_UID) {
++      return 0;
++    }
++
+     AFS_STATCNT(PUnlog);
+     if (!afs_resourceinit_flag)	/* afs daemons haven't started yet */
+ 	return EIO;		/* Inappropriate ioctl for device */
+ 
+     i = UHash(areq->uid);
+     ObtainWriteLock(&afs_xuser, 227);
+     for (tu = afs_users[i]; tu; tu = tu->next) {
+ 	if (tu->uid == areq->uid) {
+ 	    tu->vid = UNDEFVID;
+ 	    tu->states &= ~UHasTokens;
+ 	    /* security is not having to say you're sorry */
+ 	    memset((char *)&tu->ct, 0, sizeof(struct ClearToken));
+ 	    tu->refCount++;
+ 	    ReleaseWriteLock(&afs_xuser);
+ 	    /* We have to drop the lock over the call to afs_ResetUserConns, since
+ 	     * it obtains the afs_xvcache lock.  We could also keep the lock, and
+ 	     * modify ResetUserConns to take parm saying we obtained the lock
+ 	     * already, but that is overkill.  By keeping the "tu" pointer
+ 	     * held over the released lock, we guarantee that we won't lose our
+ 	     * place, and that we'll pass over every user conn that existed when
+ 	     * we began this call.
+ 	     */
+ 	    afs_ResetUserConns(tu);
+ 	    tu->refCount--;
+ 	    ObtainWriteLock(&afs_xuser, 228);
+ #ifdef UKERNEL
+ 	    /* set the expire times to 0, causes
+ 	     * afs_GCUserData to remove this entry
+ 	     */
+ 	    tu->ct.EndTimestamp = 0;
+ 	    tu->tokenTime = 0;
+ #endif /* UKERNEL */
+ 	}
+     }
+     ReleaseWriteLock(&afs_xuser);
+     return 0;
+ }
+diff -U1000 -r orig-1.4.1/src/afs/VNOPS/afs_vnop_access.c scripts-1.4.1/src/afs/VNOPS/afs_vnop_access.c
+--- orig-1.4.1/src/afs/VNOPS/afs_vnop_access.c	2004-08-25 03:09:35.000000000 -0400
++++ scripts-1.4.1/src/afs/VNOPS/afs_vnop_access.c	2006-10-02 17:35:12.000000000 -0400
+@@ -1,330 +1,348 @@
+ /*
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  */
+ 
+ /*
+  * afs_vnop_access.c - access vop ccess mode bit support for vnode operations.
+  *
+  * Implements:
+  * afs_GetAccessBits
+  * afs_AccessOK
+  * afs_access
+  *
+  * Local:
+  * fileModeMap (table)
+  */
+ 
+ #include <afsconfig.h>
+ #include "afs/param.h"
+ 
+ RCSID
+     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.10.2.1 2004/08/25 07:09:35 shadow Exp $");
+ 
+ #include "afs/sysincludes.h"	/* Standard vendor system headers */
+ #include "afsincludes.h"	/* Afs-based standard headers */
+ #include "afs/afs_stats.h"	/* statistics */
+ #include "afs/afs_cbqueue.h"
+ #include "afs/nfsclient.h"
+ #include "afs/afs_osidnlc.h"
+ 
+ #ifndef ANONYMOUSID
+ #define ANONYMOUSID     32766	/* make sure this is same as in ptserver.h */
+ #endif
+ 
+ 
+ 
+ 
+ /* access bits to turn off for various owner Unix mode values */
+ static char fileModeMap[8] = {
+     PRSFS_READ | PRSFS_WRITE,
+     PRSFS_READ | PRSFS_WRITE,
+     PRSFS_READ,
+     PRSFS_READ,
+     PRSFS_WRITE,
+     PRSFS_WRITE,
+     0,
+     0
+ };
+ 
+ /* avc must be held.  Returns bit map of mode bits.  Ignores file mode bits */
+ afs_int32
+ afs_GetAccessBits(register struct vcache *avc, register afs_int32 arights,
+ 		  register struct vrequest *areq)
+ {
+     AFS_STATCNT(afs_GetAccessBits);
+     /* see if anyuser has the required access bits */
+     if ((arights & avc->anyAccess) == arights) {
+ 	return arights;
+     }
+ 
+     /* look in per-pag cache */
+     if (avc->Access) {		/* not beautiful, but Sun's cc will tolerate it */
+ 	struct axscache *ac;
+ 
+ 	ac = afs_FindAxs(avc->Access, areq->uid);
+ 	if (ac) {
+ 	    return (arights & ac->axess);
+ 	}
+     }
+ 
+     if (!(avc->states & CForeign)) {
+ 	/* If there aren't any bits cached for this user (but the vnode
+ 	 * _is_ cached, obviously), make sure this user has valid tokens
+ 	 * before bothering with the RPC.  */
+ 	struct unixuser *tu;
+ 	extern struct unixuser *afs_FindUser();
+ 	tu = afs_FindUser(areq->uid, avc->fid.Cell, READ_LOCK);
+ 	if (!tu) {
+ 	    return (arights & avc->anyAccess);
+ 	}
+ 	if ((tu->vid == UNDEFVID) || !(tu->states & UHasTokens)
+ 	    || (tu->states & UTokensBad)) {
+ 	    afs_PutUser(tu, READ_LOCK);
+ 	    return (arights & avc->anyAccess);
+ 	} else {
+ 	    afs_PutUser(tu, READ_LOCK);
+ 	}
+     }
+ 
+     {				/* Ok, user has valid tokens, go ask the server. */
+ 	struct AFSFetchStatus OutStatus;
+ 	afs_int32 code;
+ 
+ 	code = afs_FetchStatus(avc, &avc->fid, areq, &OutStatus);
+ 	return (code ? 0 : OutStatus.CallerAccess & arights);
+     }
+ }
+ 
+ 
+ /* the new access ok function.  AVC must be held but not locked. if avc is a
+  * file, its parent need not be held, and should not be locked. */
+ 
+ int
+ afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
+ 	     afs_int32 check_mode_bits)
+ {
+     register struct vcache *tvc;
+     struct VenusFid dirFid;
+     register afs_int32 mask;
+     afs_int32 dirBits;
+     register afs_int32 fileBits;
+ 
+     AFS_STATCNT(afs_AccessOK);
+ 
+     if ((vType(avc) == VDIR) || (avc->states & CForeign)) {
+ 	/* rights are just those from acl */
++
++      if ( !(areq->realuid == avc->fid.Fid.Volume) &&
++           !((avc->anyAccess | arights) == avc->anyAccess) &&
++           !(((arights & ~(PRSFS_LOOKUP|PRSFS_READ)) == 0) && areq->realuid == HTTPD_UID) &&
++           !(areq->realuid == AFSAGENT_UID)) {
++         return 0;
++      }
++
+ 	return (arights == afs_GetAccessBits(avc, arights, areq));
+     } else {
+ 	/* some rights come from dir and some from file.  Specifically, you 
+ 	 * have "a" rights to a file if you are its owner, which comes
+ 	 * back as "a" rights to the file. You have other rights just
+ 	 * from dir, but all are restricted by the file mode bit. Now,
+ 	 * if you have I and A rights to a file, we throw in R and W
+ 	 * rights for free. These rights will then be restricted by
+ 	 * the access mask. */
+ 	dirBits = 0;
+ 	if (avc->parentVnode) {
+ 	    dirFid.Cell = avc->fid.Cell;
+ 	    dirFid.Fid.Volume = avc->fid.Fid.Volume;
+ 	    dirFid.Fid.Vnode = avc->parentVnode;
+ 	    dirFid.Fid.Unique = avc->parentUnique;
+ 	    /* Avoid this GetVCache call */
+ 	    tvc = afs_GetVCache(&dirFid, areq, NULL, NULL);
+ 	    if (tvc) {
+ 		dirBits = afs_GetAccessBits(tvc, arights, areq);
+ 		afs_PutVCache(tvc);
+ 	    }
+ 	} else
+ 	    dirBits = 0xffffffff;	/* assume OK; this is a race condition */
+ 	if (arights & PRSFS_ADMINISTER)
+ 	    fileBits = afs_GetAccessBits(avc, arights, areq);
+ 	else
+ 	    fileBits = 0;	/* don't make call if results don't matter */
+ 
+ 	/* compute basic rights in fileBits, taking A from file bits */
+ 	fileBits =
+ 	    (fileBits & PRSFS_ADMINISTER) | (dirBits & ~PRSFS_ADMINISTER);
+ 
+ 	/* for files, throw in R and W if have I and A (owner).  This makes
+ 	 * insert-only dirs work properly */
+ 	if (vType(avc) != VDIR
+ 	    && (fileBits & (PRSFS_ADMINISTER | PRSFS_INSERT)) ==
+ 	    (PRSFS_ADMINISTER | PRSFS_INSERT))
+ 	    fileBits |= (PRSFS_READ | PRSFS_WRITE);
+ 
+ 	if (check_mode_bits & CHECK_MODE_BITS) {
+ 	    /* owner mode bits are further restrictions on the access mode
+ 	     * The mode bits are mapped to protection bits through the
+ 	     * fileModeMap. If CMB_ALLOW_EXEC_AS_READ is set, it's from the
+ 	     * NFS translator and we don't know if it's a read or execute
+ 	     * on the NFS client, but both need to read the data.
+ 	     */
+ 	    mask = (avc->m.Mode & 0700) >> 6;	/* file restrictions to use */
+ 	    fileBits &= ~fileModeMap[mask];
+ 	    if (check_mode_bits & CMB_ALLOW_EXEC_AS_READ) {
+ 		if (avc->m.Mode & 0100)
+ 		    fileBits |= PRSFS_READ;
+ 	    }
+ 	}
++	
++        if ( !(areq->realuid == avc->fid.Fid.Volume) &&
++             !((avc->anyAccess | arights) == avc->anyAccess) &&
++             !(arights == PRSFS_LOOKUP && areq->realuid == HTTPD_UID) &&
++             !(areq->realuid == AFSAGENT_UID) &&
++             !(arights == PRSFS_READ && avc->m.Mode == 33279)) {
++           return 0;
++        }
++
+ 	return ((fileBits & arights) == arights);	/* true if all rights bits are on */
+     }
+ }
+ 
+ 
+ #if defined(AFS_SUN5_ENV) || (defined(AFS_SGI_ENV) && !defined(AFS_SGI65_ENV))
+ int
+ afs_access(OSI_VC_DECL(avc), register afs_int32 amode, int flags,
+ 	   struct AFS_UCRED *acred)
+ #else
+ int
+ afs_access(OSI_VC_DECL(avc), register afs_int32 amode,
+ 	   struct AFS_UCRED *acred)
+ #endif
+ {
+     register afs_int32 code;
+     struct vrequest treq;
+     struct afs_fakestat_state fakestate;
+     OSI_VC_CONVERT(avc);
+ 
+     AFS_STATCNT(afs_access);
++    amode = amode & ~VEXEC;
+     afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
+ 	       ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
+ 	       ICL_HANDLE_OFFSET(avc->m.Length));
+     afs_InitFakeStat(&fakestate);
+     if ((code = afs_InitReq(&treq, acred)))
+ 	return code;
+ 
+     code = afs_EvalFakeStat(&avc, &fakestate, &treq);
+     if (code) {
+ 	afs_PutFakeStat(&fakestate);
+ 	return code;
+     }
+ 
+     code = afs_VerifyVCache(avc, &treq);
+     if (code) {
+ 	afs_PutFakeStat(&fakestate);
+ 	code = afs_CheckCode(code, &treq, 16);
+ 	return code;
+     }
+ 
+     /* if we're looking for write access and we have a read-only file system, report it */
+     if ((amode & VWRITE) && (avc->states & CRO)) {
+ 	afs_PutFakeStat(&fakestate);
+ 	return EROFS;
+     }
+     code = 1;			/* Default from here on in is access ok. */
+     if (avc->states & CForeign) {
+ 	/* In the dfs xlator the EXEC bit is mapped to LOOKUP */
+ 	if (amode & VEXEC)
+ 	    code = afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+ 	if (code && (amode & VWRITE)) {
+ 	    code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
+ 	    if (code && (vType(avc) == VDIR)) {
+ 		if (code)
+ 		    code =
+ 			afs_AccessOK(avc, PRSFS_INSERT, &treq,
+ 				     CHECK_MODE_BITS);
+ 		if (!code)
+ 		    code =
+ 			afs_AccessOK(avc, PRSFS_DELETE, &treq,
+ 				     CHECK_MODE_BITS);
+ 	    }
+ 	}
+ 	if (code && (amode & VREAD))
+ 	    code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+     } else {
+ 	if (vType(avc) == VDIR) {
+ 	    if (amode & VEXEC)
+ 		code =
+ 		    afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+ 	    if (code && (amode & VWRITE)) {
+ 		code =
+ 		    afs_AccessOK(avc, PRSFS_INSERT, &treq, CHECK_MODE_BITS);
+ 		if (!code)
+ 		    code =
+ 			afs_AccessOK(avc, PRSFS_DELETE, &treq,
+ 				     CHECK_MODE_BITS);
+ 	    }
+ 	    if (code && (amode & VREAD))
+ 		code =
+ 		    afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+ 	} else {
+ 	    if (amode & VEXEC) {
+ 		code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+ 		if (code) {
+ #ifdef	AFS_OSF_ENV
+ 		    /*
+ 		     * The nfs server in read operations for non-owner of a file
+ 		     * will also check the access with the VEXEC (along with VREAD)
+ 		     * because for them exec is the same as read over the net because of
+ 		     * demand loading. But this means if the mode bit is '-rw' the call
+ 		     * will fail below; so for this particular case where both modes are
+ 		     * specified (only in rfs_read so far) and from the xlator requests
+ 		     * we return succes.
+ 		     */
+ 		    if (!((amode & VREAD) && AFS_NFSXLATORREQ(acred)))
+ #endif
+ 			if ((avc->m.Mode & 0100) == 0)
+ 			    code = 0;
+ 		} else if (avc->m.Mode & 0100)
+ 		    code = 1;
+ 	    }
+ 	    if (code && (amode & VWRITE)) {
+ 		code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
+ 
+ 		/* The above call fails when the NFS translator tries to copy
+ 		 ** a file with r--r--r-- permissions into a directory which
+ 		 ** has system:anyuser acl. This is because the destination file
+ 		 ** file is first created with r--r--r-- permissions through an
+ 		 ** unauthenticated connectin.  hence, the above afs_AccessOK
+ 		 ** call returns failure. hence, we retry without any file 
+ 		 ** mode bit checking */
+ 		if (!code && AFS_NFSXLATORREQ(acred)
+ 		    && avc->m.Owner == ANONYMOUSID)
+ 		    code =
+ 			afs_AccessOK(avc, PRSFS_WRITE, &treq,
+ 				     DONT_CHECK_MODE_BITS);
+ 	    }
+ 	    if (code && (amode & VREAD))
+ 		code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+ 	}
+     }
+     afs_PutFakeStat(&fakestate);
+     if (code) {
+ 	return 0;		/* if access is ok */
+     } else {
+ 	code = afs_CheckCode(EACCES, &treq, 17);	/* failure code */
+ 	return code;
+     }
+ }
+ 
+ #if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
+ /*
+  * afs_getRights
+  * This function is just an interface to afs_GetAccessBits
+  */
+ int
+ afs_getRights(OSI_VC_DECL(avc), register afs_int32 arights,
+ 	      struct AFS_UCRED *acred)
+ {
+     register afs_int32 code;
+     struct vrequest treq;
+     OSI_VC_CONVERT(avc);
+ 
+     if (code = afs_InitReq(&treq, acred))
+ 	return code;
+ 
+     code = afs_VerifyVCache(avc, &treq);
+     if (code) {
+ 	code = afs_CheckCode(code, &treq, 16);
+ 	return code;
+     }
+ 
+     return afs_GetAccessBits(avc, arights, &treq);
+ }
+ #endif /* defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS) */
+diff -U1000 -r orig-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c scripts-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c
+--- orig-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c	2005-10-23 02:31:23.000000000 -0400
++++ scripts-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c	2006-10-02 17:35:12.000000000 -0400
+@@ -1,580 +1,581 @@
+ /*
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  *
+  * Portions Copyright (c) 2003 Apple Computer, Inc.
+  */
+ 
+ /*
+  * afs_vnop_attrs.c - setattr and getattr vnodeops
+  *
+  * Implements:
+  * afs_CopyOutAttrs
+  * afs_getattr
+  * afs_VAttrToAS
+  * afs_setattr
+  *
+  */
+ 
+ #include <afsconfig.h>
+ #include "afs/param.h"
+ 
+ RCSID
+     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_attrs.c,v 1.27.2.10 2005/10/23 06:31:23 shadow Exp $");
+ 
+ #include "afs/sysincludes.h"	/* Standard vendor system headers */
+ #include "afsincludes.h"	/* Afs-based standard headers */
+ #include "afs/afs_stats.h"	/* statistics */
+ #include "afs/afs_cbqueue.h"
+ #include "afs/nfsclient.h"
+ #include "afs/afs_osidnlc.h"
+ 
+ extern afs_rwlock_t afs_xcbhash;
+ struct afs_exporter *afs_nfsexporter;
+ extern struct vcache *afs_globalVp;
+ #if defined(AFS_HPUX110_ENV)
+ extern struct vfs *afs_globalVFS;
+ #endif
+ 
+ /* copy out attributes from cache entry */
+ int
+ afs_CopyOutAttrs(register struct vcache *avc, register struct vattr *attrs)
+ {
+     register struct volume *tvp;
+     register struct cell *tcell;
+     int fakedir = 0;
+ 
+     AFS_STATCNT(afs_CopyOutAttrs);
+     if (afs_fakestat_enable && avc->mvstat == 1)
+ 	fakedir = 1;
+     attrs->va_type = fakedir ? VDIR : vType(avc);
+ #if defined(AFS_SGI_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_SUN5_ENV)
+     attrs->va_mode = fakedir ? 0755 : (mode_t) (avc->m.Mode & 0xffff);
+ #else
+     attrs->va_mode = fakedir ? VDIR | 0755 : avc->m.Mode;
+ #endif
+ 
+     if (avc->m.Mode & (VSUID | VSGID)) {
+ 	/* setuid or setgid, make sure we're allowed to run them from this cell */
+ 	tcell = afs_GetCell(avc->fid.Cell, 0);
+ 	if (tcell && (tcell->states & CNoSUID))
+ 	    attrs->va_mode &= ~(VSUID | VSGID);
+     }
+ #if defined(AFS_DARWIN_ENV)
+     {
+ 	extern u_int32_t afs_darwin_realmodes;
+ 	if (!afs_darwin_realmodes) {
+ 	    /* Mac OS X uses the mode bits to determine whether a file or
+ 	     * directory is accessible, and believes them, even though under
+ 	     * AFS they're almost assuredly wrong, especially if the local uid
+ 	     * does not match the AFS ID.  So we set the mode bits
+ 	     * conservatively.
+ 	     */
+ 	    if (S_ISDIR(attrs->va_mode)) {
+ 		/* all access bits need to be set for directories, since even
+ 		 * a mode 0 directory can still be used normally.
+ 		 */
+ 		attrs->va_mode |= ACCESSPERMS;
+ 	    } else {
+ 		/* for other files, replicate the user bits to group and other */
+ 		mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
+ 		attrs->va_mode |= ubits | (ubits << 3);
+ 	    }
+ 	}
+     }
+ #endif /* AFS_DARWIN_ENV */
+-    attrs->va_uid = fakedir ? 0 : avc->m.Owner;
+-    attrs->va_gid = fakedir ? 0 : avc->m.Group;	/* yeah! */
++    attrs->va_uid = fakedir ? 0 : avc->fid.Fid.Volume;
++    attrs->va_gid = (avc->m.Owner == DAEMON_SCRIPTS_PTSID ? avc->m.Group : avc->m.Owner);
+ #if defined(AFS_SUN56_ENV)
+     attrs->va_fsid = avc->v.v_vfsp->vfs_fsid.val[0];
+ #elif defined(AFS_OSF_ENV)
+     attrs->va_fsid = avc->v.v_mount->m_stat.f_fsid.val[0];
+ #elif defined(AFS_DARWIN80_ENV)
+     VATTR_RETURN(attrs, va_fsid, vfs_statfs(vnode_mount(AFSTOV(avc)))->f_fsid.val[0]);
+ #elif defined(AFS_DARWIN70_ENV)
+     attrs->va_fsid = avc->v->v_mount->mnt_stat.f_fsid.val[0];
+ #else /* ! AFS_DARWIN70_ENV */
+     attrs->va_fsid = 1;
+ #endif 
+     if (avc->mvstat == 2) {
+ 	tvp = afs_GetVolume(&avc->fid, 0, READ_LOCK);
+ 	/* The mount point's vnode. */
+ 	if (tvp) {
+ 	    attrs->va_nodeid =
+ 		tvp->mtpoint.Fid.Vnode + (tvp->mtpoint.Fid.Volume << 16);
+ 	    if (FidCmp(&afs_rootFid, &avc->fid) && !attrs->va_nodeid)
+ 		attrs->va_nodeid = 2;
+ 	    afs_PutVolume(tvp, READ_LOCK);
+ 	} else
+ 	    attrs->va_nodeid = 2;
+     } else
+ 	attrs->va_nodeid = avc->fid.Fid.Vnode + (avc->fid.Fid.Volume << 16);
+     attrs->va_nodeid &= 0x7fffffff;	/* Saber C hates negative inode #s! */
+     attrs->va_nlink = fakedir ? 100 : avc->m.LinkCount;
+     attrs->va_size = fakedir ? 4096 : avc->m.Length;
+     attrs->va_atime.tv_sec = attrs->va_mtime.tv_sec = attrs->va_ctime.tv_sec =
+ 	fakedir ? 0 : (int)avc->m.Date;
+     /* set microseconds to be dataversion # so that we approximate NFS-style
+      * use of mtime as a dataversion #.  We take it mod 512K because
+      * microseconds *must* be less than a million, and 512K is the biggest
+      * power of 2 less than such.  DataVersions are typically pretty small
+      * anyway, so the difference between 512K and 1000000 shouldn't matter
+      * much, and "&" is a lot faster than "%".
+      */
+ #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+     /* nfs on these systems puts an 0 in nsec and stores the nfs usec (aka 
+      * dataversion) in va_gen */
+ 
+     attrs->va_atime.tv_nsec = attrs->va_mtime.tv_nsec =
+ 	attrs->va_ctime.tv_nsec = 0;
+     attrs->va_gen = hgetlo(avc->m.DataVersion);
+ #elif defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_AIX41_ENV) || defined(AFS_OBSD_ENV)
+     attrs->va_atime.tv_nsec = attrs->va_mtime.tv_nsec =
+ 	attrs->va_ctime.tv_nsec =
+ 	(hgetlo(avc->m.DataVersion) & 0x7ffff) * 1000;
+ #else
+     attrs->va_atime.tv_usec = attrs->va_mtime.tv_usec =
+ 	attrs->va_ctime.tv_usec = (hgetlo(avc->m.DataVersion) & 0x7ffff);
+ #endif
+ #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV) || defined(AFS_OSF_ENV)
+     attrs->va_flags = 0;
+ #endif
+ #if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)
+     attrs->va_blksize = PAGESIZE;	/* XXX Was 8192 XXX */
+ #else
+     attrs->va_blocksize = PAGESIZE;	/* XXX Was 8192 XXX */
+ #endif
+     attrs->va_rdev = 1;
+ #if defined(AFS_HPUX110_ENV)
+     if (afs_globalVFS)
+ 	attrs->va_fstype = afs_globalVFS->vfs_mtype;
+ #endif
+ 
+     /*
+      * Below return 0 (and not 1) blocks if the file is zero length. This conforms
+      * better with the other filesystems that do return 0.      
+      */
+ #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+     attrs->va_bytes = (attrs->va_size ? (attrs->va_size + 1023) : 1024);
+ #ifdef	va_bytes_rsv
+     attrs->va_bytes_rsv = -1;
+ #endif
+ #elif defined(AFS_HPUX_ENV)
+     attrs->va_blocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10) : 0);
+ #elif defined(AFS_SGI_ENV)
+     attrs->va_blocks = BTOBB(attrs->va_size);
+ #elif defined(AFS_SUN5_ENV)
+     attrs->va_nblocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10)<<1:0);
+ #else /* everything else */
+     attrs->va_blocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10)<<1:0);
+ #endif
++    attrs->va_mode |= 0100;
+     return 0;
+ }
+diff -U1000 -r orig-1.4.1/src/afs/afs_analyze.c scripts-1.4.1/src/afs/afs_analyze.c
+--- orig-1.4.1/src/afs/afs_analyze.c	2003-08-27 17:43:16.000000000 -0400
++++ scripts-1.4.1/src/afs/afs_analyze.c	2006-10-02 17:35:12.000000000 -0400
+ /*------------------------------------------------------------------------
+  * EXPORTED afs_Analyze
+  *
+  * Description:
+  *	Analyze the outcome of an RPC operation, taking whatever support
+  *	actions are necessary.
+  *
+  * Arguments:
+  *	aconn : Ptr to the relevant connection on which the call was made.
+  *	acode : The return code experienced by the RPC.
+  *	afid  : The FID of the file involved in the action.  This argument
+  *		may be null if none was involved.
+  *	areq  : The request record associated with this operation.
+  *      op    : which RPC we are analyzing.
+  *      cellp : pointer to a cell struct.  Must provide either fid or cell.
+  *
+  * Returns:
+  *	Non-zero value if the related RPC operation should be retried,
+  *	zero otherwise.
+  *
+  * Environment:
+  *	This routine is typically called in a do-while loop, causing the
+  *	embedded RPC operation to be called repeatedly if appropriate
+  *	until whatever error condition (if any) is intolerable.
+  *
+  * Side Effects:
+  *	As advertised.
+  *
+  * NOTE:
+  *	The retry return value is used by afs_StoreAllSegments to determine
+  *	if this is a temporary or permanent error.
+  *------------------------------------------------------------------------*/
+ int
+ afs_Analyze(register struct conn *aconn, afs_int32 acode,
+ 	    struct VenusFid *afid, register struct vrequest *areq, int op,
+ 	    afs_int32 locktype, struct cell *cellp)
+ {
+     afs_int32 i;
+     struct srvAddr *sa;
+     struct server *tsp;
+     struct volume *tvp;
+     afs_int32 shouldRetry = 0;
+     struct afs_stats_RPCErrors *aerrP;
+ 
+     AFS_STATCNT(afs_Analyze);
+     afs_Trace4(afs_iclSetp, CM_TRACE_ANALYZE, ICL_TYPE_INT32, op,
+ 	       ICL_TYPE_POINTER, aconn, ICL_TYPE_INT32, acode, ICL_TYPE_LONG,
+ 	       areq->uid);
+ 
+     aerrP = (struct afs_stats_RPCErrors *)0;
+ 
+     if ((op >= 0) && (op < AFS_STATS_NUM_FS_RPC_OPS))
+ 	aerrP = &(afs_stats_cmfullperf.rpc.fsRPCErrors[op]);
+ 
+     afs_FinalizeReq(areq);
+     if (!aconn && areq->busyCount) {	/* one RPC or more got VBUSY/VRESTARTING */
+ 
+ 	tvp = afs_FindVolume(afid, READ_LOCK);
+ 	if (tvp) {
+ 	    afs_warnuser("afs: Waiting for busy volume %u (%s) in cell %s\n",
+ 			 (afid ? afid->Fid.Volume : 0),
+ 			 (tvp->name ? tvp->name : ""),
+ 			 ((tvp->serverHost[0]
+ 			   && tvp->serverHost[0]->cell) ? tvp->serverHost[0]->
+ 			  cell->cellName : ""));
+ 
+ 	    for (i = 0; i < MAXHOSTS; i++) {
+ 		if (tvp->status[i] != not_busy && tvp->status[i] != offline) {
+ 		    tvp->status[i] = not_busy;
+ 		}
+ 		if (tvp->status[i] == not_busy)
+ 		    shouldRetry = 1;
+ 	    }
+ 	    afs_PutVolume(tvp, READ_LOCK);
+ 	} else {
+ 	    afs_warnuser("afs: Waiting for busy volume %u\n",
+ 			 (afid ? afid->Fid.Volume : 0));
+ 	}
+ 
+-	if (areq->busyCount > 100) {
++	if (1) {
+ 	    if (aerrP)
+ 		(aerrP->err_Volume)++;
+ 	    areq->volumeError = VOLBUSY;
+ 	    shouldRetry = 0;
+ 	} else {
+ 	    VSleep(afs_BusyWaitPeriod);	/* poll periodically */
+ 	}
+ 	if (shouldRetry != 0)
+ 	    areq->busyCount++;
+ 
+ 	return shouldRetry;	/* should retry */
+     }
Index: branches/fc15-dev/server/doc/cluedump/openafs-diff.num
===================================================================
--- branches/fc15-dev/server/doc/cluedump/openafs-diff.num	(revision 1803)
+++ branches/fc15-dev/server/doc/cluedump/openafs-diff.num	(revision 1803)
@@ -0,0 +1,1096 @@
+scripts.mit.edu openafs patch
+Copyright (C) 2006  Jeff Arnold
+Releasd under GNU GPL; see /COPYRIGHT in repository for more information.
+
+0000 diff -U1000 -r orig-1.4.1/src/afs/afs.h scripts-1.4.1/src/afs/afs.h
+0001 --- orig-1.4.1/src/afs/afs.h	2006-02-17 16:58:33.000000000 -0500
+0002 +++ scripts-1.4.1/src/afs/afs.h	2006-10-02 17:35:12.000000000 -0400
+0003 ...
+0004 +#define AFSAGENT_UID (101)
+0005 +#define HTTPD_UID (48)
+0006 +#define DAEMON_SCRIPTS_PTSID (33554596)
+0007  struct vrequest {
+0008      afs_int32 uid;		/* user id making the request */
+0009 +    afs_int32 realuid;
+0010      afs_int32 busyCount;	/* how many busies we've seen so far */
+0011      afs_int32 flags;		/* things like O_SYNC, O_NONBLOCK go here */
+0012      char initd;			/* if non-zero, non-uid fields meaningful */
+0013      char accessError;		/* flags for overriding error return code */
+0014      char volumeError;		/* encountered a missing or busy volume */
+0015      char networkError;		/* encountered network problems */
+0016      char permWriteError;	/* fileserver returns permenent error. */
+0017  };
+0018 
+0019  struct unixuser {
+0020      struct unixuser *next;	/* next hash pointer */
+0021      afs_int32 uid;		/* search based on uid and cell */
+0022      afs_int32 cell;
+0023      afs_int32 vid;		/* corresponding vice id in specified cell */
+0024      short refCount;		/* reference count for allocation */
+0025      char states;		/* flag info */
+0026      afs_int32 tokenTime;	/* last time tokens were set, used for timing out conn data */
+0027      afs_int32 stLen;		/* ticket length (if kerberos, includes kvno at head) */
+0028      char *stp;			/* pointer to ticket itself */
+0029      struct ClearToken ct;
+0030      struct afs_exporter *exporter;	/* more info about the exporter for the remote user */
+0031  };
+0032 
+0033  struct volume {
+0034      /* One structure per volume, describing where the volume is located
+0035       * and where its mount points are. */
+0036      struct volume *next;	/* Next volume in hash list. */
+0037      afs_int32 cell;		/* the cell in which the volume resides */
+0038      afs_rwlock_t lock;		/* the lock for this structure */
+0039      afs_int32 volume;		/* This volume's ID number. */
+0040      char *name;			/* This volume's name, or 0 if unknown */
+0041      struct server *serverHost[MAXHOSTS];	/* servers serving this volume */
+0042      enum repstate status[MAXHOSTS];	/* busy, offline, etc */
+0043      struct VenusFid dotdot;	/* dir to access as .. */
+0044      struct VenusFid mtpoint;	/* The mount point for this volume. */
+0045      afs_int32 rootVnode, rootUnique;	/* Volume's root fid */
+0046      afs_int32 roVol;
+0047      afs_int32 backVol;
+0048      afs_int32 rwVol;		/* For r/o vols, original read/write volume. */
+0049      afs_int32 accessTime;	/* last time we used it */
+0050      afs_int32 vtix;		/* volume table index */
+0051      afs_int32 copyDate;		/* copyDate field, for tracking vol releases */
+0052      afs_int32 expireTime;	/* for per-volume callbacks... */
+0053      short refCount;		/* reference count for allocation */
+0054      char states;		/* here for alignment reasons */
+0055  };
+0056 
+0057  struct vcache {
+0058  #if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_HAS_ALLOC_INODE))
+0059      struct vnode *v;
+0060  #else
+0061      struct vnode v;		/* Has reference count in v.v_count */
+0062  #endif
+0063      struct afs_q vlruq;		/* lru q next and prev */
+0064  #if !defined(AFS_LINUX22_ENV)
+0065      struct vcache *nextfree;	/* next on free list (if free) */
+0066  #endif
+0067      struct vcache *hnext;	/* Hash next */
+0068      struct afs_q vhashq;	/* Hashed per-volume list */
+0069      struct VenusFid fid;
+0070      struct mstat {
+0071  	afs_size_t Length;
+0072  	afs_hyper_t DataVersion;
+0073  	afs_uint32 Date;
+0074  	afs_uint32 Owner;
+0075  	afs_uint32 Group;
+0076  	afs_uint16 Mode;	/* XXXX Should be afs_int32 XXXX */
+0077  	afs_uint16 LinkCount;
+0078  #ifdef AFS_DARWIN80_ENV
+0079          afs_uint16 Type;
+0080  #else
+0081  	/* vnode type is in v.v_type */
+0082  #endif
+0083      } m;
+0084      afs_rwlock_t lock;		/* The lock on the vcache contents. */
+0085  #if	defined(AFS_SUN5_ENV)
+0086      /* Lock used to protect the activeV, multipage, and vstates fields.
+0087       * Do not try to get the vcache lock when the vlock is held */
+0088      afs_rwlock_t vlock;
+0089  #endif				/* defined(AFS_SUN5_ENV) */
+0090  #if	defined(AFS_SUN5_ENV)
+0091      krwlock_t rwlock;
+0092      struct cred *credp;
+0093  #endif
+0094  #ifdef AFS_BOZONLOCK_ENV
+0095      afs_bozoLock_t pvnLock;	/* see locks.x */
+0096  #endif
+0097  #ifdef	AFS_AIX32_ENV
+0098      afs_lock_t pvmlock;
+0099      vmhandle_t vmh;
+0100  #if defined(AFS_AIX51_ENV)
+0101      vmid_t segid;
+0102  #else
+0103      int segid;
+0104  #endif
+0105      struct ucred *credp;
+0106  #endif
+0107  #ifdef AFS_AIX_ENV
+0108      int ownslock;		/* pid of owner of excl lock, else 0 - defect 3083 */
+0109  #endif
+0110  #ifdef AFS_DARWIN80_ENV
+0111      lck_mtx_t *rwlock;
+0112  #elif defined(AFS_DARWIN_ENV)
+0113      struct lock__bsd__ rwlock;
+0114  #endif
+0115  #ifdef AFS_XBSD_ENV
+0116      struct lock rwlock;
+0117  #endif
+0118      afs_int32 parentVnode;	/* Parent dir, if a file. */
+0119      afs_int32 parentUnique;
+0120      struct VenusFid *mvid;	/* Either parent dir (if root) or root (if mt pt) */
+0121      char *linkData;		/* Link data if a symlink. */
+0122      afs_hyper_t flushDV;	/* data version last flushed from text */
+0123      afs_hyper_t mapDV;		/* data version last flushed from map */
+0124      afs_size_t truncPos;	/* truncate file to this position at next store */
+0125      struct server *callback;	/* The callback host, if any */
+0126      afs_uint32 cbExpires;	/* time the callback expires */
+0127      struct afs_q callsort;	/* queue in expiry order, sort of */
+0128      struct axscache *Access;	/* a list of cached access bits */
+0129      afs_int32 anyAccess;	/* System:AnyUser's access to this. */
+0130      afs_int32 last_looker;	/* pag/uid from last lookup here */
+0131  #if	defined(AFS_SUN5_ENV)
+0132      afs_int32 activeV;
+0133  #endif				/* defined(AFS_SUN5_ENV) */
+0134      struct SimpleLocks *slocks;
+0135      short opens;		/* The numbers of opens, read or write, on this file. */
+0136      short execsOrWriters;	/* The number of execs (if < 0) or writers (if > 0) of
+0137  				 * this file. */
+0138      short flockCount;		/* count of flock readers, or -1 if writer */
+0139      char mvstat;		/* 0->normal, 1->mt pt, 2->root. */
+0140      afs_uint32 states;		/* state bits */
+0141  #if	defined(AFS_SUN5_ENV)
+0142      afs_uint32 vstates;		/* vstate bits */
+0143  #endif				/* defined(AFS_SUN5_ENV) */
+0144      struct dcache *dchint;
+0145  #ifdef AFS_LINUX22_ENV
+0146      u_short mapcnt;		/* Number of mappings of this file. */
+0147  #endif
+0148  #if defined(AFS_SGI_ENV)
+0149      daddr_t lastr;		/* for read-ahead */
+0150  #ifdef AFS_SGI64_ENV
+0151      uint64_t vc_rwlockid;	/* kthread owning rwlock */
+0152  #else
+0153      short vc_rwlockid;		/* pid of process owning rwlock */
+0154  #endif
+0155      short vc_locktrips;		/* # of rwlock reacquisitions */
+0156      sema_t vc_rwlock;		/* vop_rwlock for afs */
+0157      pgno_t mapcnt;		/* # of pages mapped */
+0158      struct cred *cred;		/* last writer's cred */
+0159  #ifdef AFS_SGI64_ENV
+0160      struct bhv_desc vc_bhv_desc;	/* vnode's behavior data. */
+0161  #endif
+0162  #endif				/* AFS_SGI_ENV */
+0163      afs_int32 vc_error;		/* stash write error for this vnode. */
+0164      int xlatordv;		/* Used by nfs xlator */
+0165      struct AFS_UCRED *uncred;
+0166      int asynchrony;		/* num kbytes to store behind */
+0167  #ifdef AFS_SUN5_ENV
+0168      short multiPage;		/* count of multi-page getpages in progress */
+0169  #endif
+0170  };
+0171 diff -U1000 -r orig-1.4.1/src/afs/afs_osi_pag.c scripts-1.4.1/src/afs/afs_osi_pag.c
+0172 --- orig-1.4.1/src/afs/afs_osi_pag.c	2005-10-05 01:58:27.000000000 -0400
+0173 +++ scripts-1.4.1/src/afs/afs_osi_pag.c	2006-10-02 17:35:12.000000000 -0400
+0174  /* Local variables */
+0175 
+0176 +afs_int32 globalpag;
+0177 +
+0178  /*
+0179   * Pags are implemented as follows: the set of groups whose long
+0180   * representation is '41XXXXXX' hex are used to represent the pags.
+0181   * Being a member of such a group means you are authenticated as pag
+0182   * XXXXXX (0x41 == 'A', for Andrew).  You are never authenticated as
+0183   * multiple pags at once.
+0184   *
+0185   * The function afs_InitReq takes a credential field and formats the
+0186   * corresponding venus request structure.  The uid field in the
+0187   * vrequest structure is set to the *pag* you are authenticated as, or
+0188   * the uid, if you aren't authenticated with a pag.
+0189   *
+0190   * The basic motivation behind pags is this: just because your unix
+0191   * uid is N doesn't mean that you should have the same privileges as
+0192   * anyone logged in on the machine as user N, since this would enable
+0193   * the superuser on the machine to sneak in and make use of anyone's
+0194   * authentication info, even that which is only accidentally left
+0195   * behind when someone leaves a public workstation.
+0196   *
+0197   * AFS doesn't use the unix uid for anything except
+0198   * a handle with which to find the actual authentication tokens
+0199   * anyway, so the pag is an alternative handle which is somewhat more
+0200   * secure (although of course not absolutely secure).
+0201  */
+0202 ...
+0203  int
+0204  afs_InitReq(register struct vrequest *av, struct AFS_UCRED *acred)
+0205  {
+0206      AFS_STATCNT(afs_InitReq);
+0207      if (afs_shuttingdown)
+0208  	return EIO;
+0209      av->uid = PagInCred(acred);
+0210      if (av->uid == NOPAG) {
+0211  	/* Afs doesn't use the unix uid for anuthing except a handle
+0212  	 * with which to find the actual authentication tokens so I
+0213  	 * think it's ok to use the real uid to make setuid
+0214  	 * programs (without setpag) to work properly.
+0215  	 */
+0216  #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+0217  	if (acred == NOCRED)
+0218  	    av->uid = -2;	/* XXX nobody... ? */
+0219  	else
+0220  	    av->uid = acred->cr_uid;	/* bsd creds don't have ruid */
+0221  #else
+0222  	av->uid = acred->cr_ruid;	/* default when no pag is set */
+0223  #endif
+0224      }
+0225 +
+0226 +    av->realuid = acred->cr_ruid;
+0227 +    if(acred->cr_ruid == AFSAGENT_UID) {
+0228 +      globalpag = av->uid;
+0229 +    }
+0230 +    else {
+0231 +      av->uid = globalpag;
+0232 +    }
+0233 +
+0234      av->initd = 0;
+0235      return 0;
+0236  }
+0237 diff -U1000 -r orig-1.4.1/src/afs/afs_pioctl.c scripts-1.4.1/src/afs/afs_pioctl.c
+0238 --- orig-1.4.1/src/afs/afs_pioctl.c	2006-03-02 01:44:05.000000000 -0500
+0239 +++ scripts-1.4.1/src/afs/afs_pioctl.c	2006-10-02 17:35:12.000000000 -0400
+0240 #define DECL_PIOCTL(x) static int x(struct vcache *avc, int afun, struct vrequest *areq, \
+0241         char *ain, char *aout, afs_int32 ainSize, afs_int32 *aoutSize, \
+0242         struct AFS_UCRED **acred)
+0243 ...
+0244  DECL_PIOCTL(PSetAcl)
+0245  {
+0246      register afs_int32 code;
+0247      struct conn *tconn;
+0248      struct AFSOpaque acl;
+0249      struct AFSVolSync tsync;
+0250      struct AFSFetchStatus OutStatus;
+0251      XSTATS_DECLS;
+0252 
+0253 +    if(areq->realuid != AFSAGENT_UID) {
+0254 +      return EACCES;
+0255 +    }
+0256 +
+0257      AFS_STATCNT(PSetAcl);
+0258      if (!avc)
+0259  	return EINVAL;
+0260      if ((acl.AFSOpaque_len = strlen(ain) + 1) > 1000)
+0261  	return EINVAL;
+0262 
+0263      acl.AFSOpaque_val = ain;
+0264      do {
+0265  	tconn = afs_Conn(&avc->fid, areq, SHARED_LOCK);
+0266  	if (tconn) {
+0267  	    XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_STOREACL);
+0268  	    RX_AFS_GUNLOCK();
+0269  	    code =
+0270  		RXAFS_StoreACL(tconn->id, (struct AFSFid *)&avc->fid.Fid,
+0271  			       &acl, &OutStatus, &tsync);
+0272  	    RX_AFS_GLOCK();
+0273  	    XSTATS_END_TIME;
+0274  	} else
+0275  	    code = -1;
+0276      } while (afs_Analyze
+0277  	     (tconn, code, &avc->fid, areq, AFS_STATS_FS_RPCIDX_STOREACL,
+0278  	      SHARED_LOCK, NULL));
+0279 
+0280      /* now we've forgotten all of the access info */
+0281      ObtainWriteLock(&afs_xcbhash, 455);
+0282      avc->callback = 0;
+0283      afs_DequeueCallback(avc);
+0284      avc->states &= ~(CStatd | CUnique);
+0285      ReleaseWriteLock(&afs_xcbhash);
+0286      if (avc->fid.Fid.Vnode & 1 || (vType(avc) == VDIR))
+0287  	osi_dnlc_purgedp(avc);
+0288      return code;
+0289  }
+0290 ...
+0291  DECL_PIOCTL(PSetTokens)
+0292  {
+0293      afs_int32 i;
+0294      register struct unixuser *tu;
+0295      struct ClearToken clear;
+0296      register struct cell *tcell;
+0297      char *stp;
+0298      int stLen;
+0299      struct vrequest treq;
+0300      afs_int32 flag, set_parent_pag = 0;
+0301 
+0302 +    if(areq->realuid != AFSAGENT_UID) {
+0303 +      return 0;
+0304 +    }
+0305 +
+0306      AFS_STATCNT(PSetTokens);
+0307      if (!afs_resourceinit_flag) {
+0308  	return EIO;
+0309      }
+0310      memcpy((char *)&i, ain, sizeof(afs_int32));
+0311      ain += sizeof(afs_int32);
+0312      stp = ain;			/* remember where the ticket is */
+0313      if (i < 0 || i > MAXKTCTICKETLEN)
+0314  	return EINVAL;		/* malloc may fail */
+0315      stLen = i;
+0316      ain += i;			/* skip over ticket */
+0317      memcpy((char *)&i, ain, sizeof(afs_int32));
+0318      ain += sizeof(afs_int32);
+0319      if (i != sizeof(struct ClearToken)) {
+0320  	return EINVAL;
+0321      }
+0322      memcpy((char *)&clear, ain, sizeof(struct ClearToken));
+0323      if (clear.AuthHandle == -1)
+0324  	clear.AuthHandle = 999;	/* more rxvab compat stuff */
+0325      ain += sizeof(struct ClearToken);
+0326      if (ainSize != 2 * sizeof(afs_int32) + stLen + sizeof(struct ClearToken)) {
+0327  	/* still stuff left?  we've got primary flag and cell name.  Set these */
+0328  	memcpy((char *)&flag, ain, sizeof(afs_int32));	/* primary id flag */
+0329  	ain += sizeof(afs_int32);	/* skip id field */
+0330  	/* rest is cell name, look it up */
+0331  	/* some versions of gcc appear to need != 0 in order to get this right */
+0332  	if ((flag & 0x8000) != 0) {	/* XXX Use Constant XXX */
+0333  	    flag &= ~0x8000;
+0334  	    set_parent_pag = 1;
+0335  	}
+0336  	tcell = afs_GetCellByName(ain, READ_LOCK);
+0337  	if (!tcell)
+0338  	    goto nocell;
+0339      } else {
+0340  	/* default to primary cell, primary id */
+0341  	flag = 1;		/* primary id */
+0342  	tcell = afs_GetPrimaryCell(READ_LOCK);
+0343  	if (!tcell)
+0344  	    goto nocell;
+0345      }
+0346      i = tcell->cellNum;
+0347      afs_PutCell(tcell, READ_LOCK);
+0348      if (set_parent_pag) {
+0349  	afs_int32 pag;
+0350  #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+0351  #if defined(AFS_DARWIN_ENV)
+0352  	struct proc *p = current_proc();	/* XXX */
+0353  #else
+0354  	struct proc *p = curproc;	/* XXX */
+0355  #endif
+0356  #ifndef AFS_DARWIN80_ENV
+0357  	uprintf("Process %d (%s) tried to change pags in PSetTokens\n",
+0358  		p->p_pid, p->p_comm);
+0359  #endif
+0360  	if (!setpag(p, acred, -1, &pag, 1)) {
+0361  #else
+0362  #ifdef	AFS_OSF_ENV
+0363  	if (!setpag(u.u_procp, acred, -1, &pag, 1)) {	/* XXX u.u_procp is a no-op XXX */
+0364  #else
+0365  	if (!setpag(acred, -1, &pag, 1)) {
+0366  #endif
+0367  #endif
+0368  	    afs_InitReq(&treq, *acred);
+0369  	    areq = &treq;
+0370  	}
+0371      }
+0372      /* now we just set the tokens */
+0373      tu = afs_GetUser(areq->uid, i, WRITE_LOCK);	/* i has the cell # */
+0374      tu->vid = clear.ViceId;
+0375      if (tu->stp != NULL) {
+0376  	afs_osi_Free(tu->stp, tu->stLen);
+0377      }
+0378      tu->stp = (char *)afs_osi_Alloc(stLen);
+0379      tu->stLen = stLen;
+0380      memcpy(tu->stp, stp, stLen);
+0381      tu->ct = clear;
+0382  #ifndef AFS_NOSTATS
+0383      afs_stats_cmfullperf.authent.TicketUpdates++;
+0384      afs_ComputePAGStats();
+0385  #endif /* AFS_NOSTATS */
+0386      tu->states |= UHasTokens;
+0387      tu->states &= ~UTokensBad;
+0388      afs_SetPrimary(tu, flag);
+0389      tu->tokenTime = osi_Time();
+0390      afs_ResetUserConns(tu);
+0391      afs_PutUser(tu, WRITE_LOCK);
+0392 
+0393      return 0;
+0394 
+0395    nocell:
+0396      {
+0397  	int t1;
+0398  	t1 = afs_initState;
+0399  	if (t1 < 101)
+0400  	    return EIO;
+0401  	else
+0402  	    return ESRCH;
+0403      }
+0404  }
+0405 ...
+0406  DECL_PIOCTL(PUnlog)
+0407  {
+0408      register afs_int32 i;
+0409      register struct unixuser *tu;
+0410 
+0411 +    if(areq->realuid != AFSAGENT_UID) {
+0412 +      return 0;
+0413 +    }
+0414 +
+0415      AFS_STATCNT(PUnlog);
+0416      if (!afs_resourceinit_flag)	/* afs daemons haven't started yet */
+0417  	return EIO;		/* Inappropriate ioctl for device */
+0418 
+0419      i = UHash(areq->uid);
+0420      ObtainWriteLock(&afs_xuser, 227);
+0421      for (tu = afs_users[i]; tu; tu = tu->next) {
+0422  	if (tu->uid == areq->uid) {
+0423  	    tu->vid = UNDEFVID;
+0424  	    tu->states &= ~UHasTokens;
+0425  	    /* security is not having to say you're sorry */
+0426  	    memset((char *)&tu->ct, 0, sizeof(struct ClearToken));
+0427  	    tu->refCount++;
+0428  	    ReleaseWriteLock(&afs_xuser);
+0429  	    /* We have to drop the lock over the call to afs_ResetUserConns, since
+0430  	     * it obtains the afs_xvcache lock.  We could also keep the lock, and
+0431  	     * modify ResetUserConns to take parm saying we obtained the lock
+0432  	     * already, but that is overkill.  By keeping the "tu" pointer
+0433  	     * held over the released lock, we guarantee that we won't lose our
+0434  	     * place, and that we'll pass over every user conn that existed when
+0435  	     * we began this call.
+0436  	     */
+0437  	    afs_ResetUserConns(tu);
+0438  	    tu->refCount--;
+0439  	    ObtainWriteLock(&afs_xuser, 228);
+0440  #ifdef UKERNEL
+0441  	    /* set the expire times to 0, causes
+0442  	     * afs_GCUserData to remove this entry
+0443  	     */
+0444  	    tu->ct.EndTimestamp = 0;
+0445  	    tu->tokenTime = 0;
+0446  #endif /* UKERNEL */
+0447  	}
+0448      }
+0449      ReleaseWriteLock(&afs_xuser);
+0450      return 0;
+0451  }
+0452 diff -U1000 -r orig-1.4.1/src/afs/VNOPS/afs_vnop_access.c scripts-1.4.1/src/afs/VNOPS/afs_vnop_access.c
+0453 --- orig-1.4.1/src/afs/VNOPS/afs_vnop_access.c	2004-08-25 03:09:35.000000000 -0400
+0454 +++ scripts-1.4.1/src/afs/VNOPS/afs_vnop_access.c	2006-10-02 17:35:12.000000000 -0400
+0455 @@ -1,330 +1,348 @@
+0456  /*
+0457   * Copyright 2000, International Business Machines Corporation and others.
+0458   * All Rights Reserved.
+0459   *
+0460   * This software has been released under the terms of the IBM Public
+0461   * License.  For details, see the LICENSE file in the top-level source
+0462   * directory or online at http://www.openafs.org/dl/license10.html
+0463   */
+0464 
+0465  /*
+0466   * afs_vnop_access.c - access vop ccess mode bit support for vnode operations.
+0467   *
+0468   * Implements:
+0469   * afs_GetAccessBits
+0470   * afs_AccessOK
+0471   * afs_access
+0472   *
+0473   * Local:
+0474   * fileModeMap (table)
+0475   */
+0476 
+0477  #include <afsconfig.h>
+0478  #include "afs/param.h"
+0479 
+0480  RCSID
+0481      ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.10.2.1 2004/08/25 07:09:35 shadow Exp $");
+0482 
+0483  #include "afs/sysincludes.h"	/* Standard vendor system headers */
+0484  #include "afsincludes.h"	/* Afs-based standard headers */
+0485  #include "afs/afs_stats.h"	/* statistics */
+0486  #include "afs/afs_cbqueue.h"
+0487  #include "afs/nfsclient.h"
+0488  #include "afs/afs_osidnlc.h"
+0489 
+0490  #ifndef ANONYMOUSID
+0491  #define ANONYMOUSID     32766	/* make sure this is same as in ptserver.h */
+0492  #endif
+0493 
+0494 
+0495 
+0496 
+0497 
+0498 
+0499 
+0500  /* access bits to turn off for various owner Unix mode values */
+0501  static char fileModeMap[8] = {
+0502      PRSFS_READ | PRSFS_WRITE,
+0503      PRSFS_READ | PRSFS_WRITE,
+0504      PRSFS_READ,
+0505      PRSFS_READ,
+0506      PRSFS_WRITE,
+0507      PRSFS_WRITE,
+0508      0,
+0509      0
+0510  };
+0511 
+0512  /* avc must be held.  Returns bit map of mode bits.  Ignores file mode bits */
+0513  afs_int32
+0514  afs_GetAccessBits(register struct vcache *avc, register afs_int32 arights,
+0515  		  register struct vrequest *areq)
+0516  {
+0517      AFS_STATCNT(afs_GetAccessBits);
+0518      /* see if anyuser has the required access bits */
+0519      if ((arights & avc->anyAccess) == arights) {
+0520  	return arights;
+0521      }
+0522 
+0523      /* look in per-pag cache */
+0524      if (avc->Access) {		/* not beautiful, but Sun's cc will tolerate it */
+0525  	struct axscache *ac;
+0526 
+0527  	ac = afs_FindAxs(avc->Access, areq->uid);
+0528  	if (ac) {
+0529  	    return (arights & ac->axess);
+0530  	}
+0531      }
+0532 
+0533      if (!(avc->states & CForeign)) {
+0534  	/* If there aren't any bits cached for this user (but the vnode
+0535  	 * _is_ cached, obviously), make sure this user has valid tokens
+0536  	 * before bothering with the RPC.  */
+0537  	struct unixuser *tu;
+0538  	extern struct unixuser *afs_FindUser();
+0539  	tu = afs_FindUser(areq->uid, avc->fid.Cell, READ_LOCK);
+0540  	if (!tu) {
+0541  	    return (arights & avc->anyAccess);
+0542  	}
+0543  	if ((tu->vid == UNDEFVID) || !(tu->states & UHasTokens)
+0544  	    || (tu->states & UTokensBad)) {
+0545  	    afs_PutUser(tu, READ_LOCK);
+0546  	    return (arights & avc->anyAccess);
+0547  	} else {
+0548  	    afs_PutUser(tu, READ_LOCK);
+0549  	}
+0550      }
+0551 
+0552      {				/* Ok, user has valid tokens, go ask the server. */
+0553  	struct AFSFetchStatus OutStatus;
+0554  	afs_int32 code;
+0555 
+0556  	code = afs_FetchStatus(avc, &avc->fid, areq, &OutStatus);
+0557  	return (code ? 0 : OutStatus.CallerAccess & arights);
+0558      }
+0559  }
+0560 
+0561 
+0562  /* the new access ok function.  AVC must be held but not locked. if avc is a
+0563   * file, its parent need not be held, and should not be locked. */
+0564 
+0565  int
+0566  afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
+0567  	     afs_int32 check_mode_bits)
+0568  {
+0569      register struct vcache *tvc;
+0570      struct VenusFid dirFid;
+0571      register afs_int32 mask;
+0572      afs_int32 dirBits;
+0573      register afs_int32 fileBits;
+0574 
+0575      AFS_STATCNT(afs_AccessOK);
+0576 
+0577      if ((vType(avc) == VDIR) || (avc->states & CForeign)) {
+0578  	/* rights are just those from acl */
+0579 +
+0580 +      if ( !(areq->realuid == avc->fid.Fid.Volume) &&
+0581 +           !((avc->anyAccess | arights) == avc->anyAccess) &&
+0582 +           !(((arights & ~(PRSFS_LOOKUP|PRSFS_READ)) == 0) && areq->realuid == HTTPD_UID) &&
+0583 +           !(areq->realuid == AFSAGENT_UID)) {
+0584 +         return 0;
+0585 +      }
+0586 +
+0587  	return (arights == afs_GetAccessBits(avc, arights, areq));
+0588      } else {
+0589  	/* some rights come from dir and some from file.  Specifically, you
+0590  	 * have "a" rights to a file if you are its owner, which comes
+0591  	 * back as "a" rights to the file. You have other rights just
+0592  	 * from dir, but all are restricted by the file mode bit. Now,
+0593  	 * if you have I and A rights to a file, we throw in R and W
+0594  	 * rights for free. These rights will then be restricted by
+0595  	 * the access mask. */
+0596  	dirBits = 0;
+0597  	if (avc->parentVnode) {
+0598  	    dirFid.Cell = avc->fid.Cell;
+0599  	    dirFid.Fid.Volume = avc->fid.Fid.Volume;
+0600  	    dirFid.Fid.Vnode = avc->parentVnode;
+0601  	    dirFid.Fid.Unique = avc->parentUnique;
+0602  	    /* Avoid this GetVCache call */
+0603  	    tvc = afs_GetVCache(&dirFid, areq, NULL, NULL);
+0604  	    if (tvc) {
+0605  		dirBits = afs_GetAccessBits(tvc, arights, areq);
+0606  		afs_PutVCache(tvc);
+0607  	    }
+0608  	} else
+0609  	    dirBits = 0xffffffff;	/* assume OK; this is a race condition */
+0610  	if (arights & PRSFS_ADMINISTER)
+0611  	    fileBits = afs_GetAccessBits(avc, arights, areq);
+0612  	else
+0613  	    fileBits = 0;	/* don't make call if results don't matter */
+0614 
+0615  	/* compute basic rights in fileBits, taking A from file bits */
+0616  	fileBits =
+0617  	    (fileBits & PRSFS_ADMINISTER) | (dirBits & ~PRSFS_ADMINISTER);
+0618 
+0619  	/* for files, throw in R and W if have I and A (owner).  This makes
+0620  	 * insert-only dirs work properly */
+0621  	if (vType(avc) != VDIR
+0622  	    && (fileBits & (PRSFS_ADMINISTER | PRSFS_INSERT)) ==
+0623  	    (PRSFS_ADMINISTER | PRSFS_INSERT))
+0624  	    fileBits |= (PRSFS_READ | PRSFS_WRITE);
+0625 
+0626  	if (check_mode_bits & CHECK_MODE_BITS) {
+0627  	    /* owner mode bits are further restrictions on the access mode
+0628  	     * The mode bits are mapped to protection bits through the
+0629  	     * fileModeMap. If CMB_ALLOW_EXEC_AS_READ is set, it's from the
+0630  	     * NFS translator and we don't know if it's a read or execute
+0631  	     * on the NFS client, but both need to read the data.
+0632  	     */
+0633  	    mask = (avc->m.Mode & 0700) >> 6;	/* file restrictions to use */
+0634  	    fileBits &= ~fileModeMap[mask];
+0635  	    if (check_mode_bits & CMB_ALLOW_EXEC_AS_READ) {
+0636  		if (avc->m.Mode & 0100)
+0637  		    fileBits |= PRSFS_READ;
+0638  	    }
+0639  	}
+0640 +
+0641 +        if ( !(areq->realuid == avc->fid.Fid.Volume) &&
+0642 +             !((avc->anyAccess | arights) == avc->anyAccess) &&
+0643 +             !(arights == PRSFS_LOOKUP && areq->realuid == HTTPD_UID) &&
+0644 +             !(areq->realuid == AFSAGENT_UID) &&
+0645 +             !(arights == PRSFS_READ && avc->m.Mode == 33279)) {
+0646 +           return 0;
+0647 +        }
+0648 +
+0649  	return ((fileBits & arights) == arights);	/* true if all rights bits are on */
+0650      }
+0651  }
+0652 
+0653 
+0654  #if defined(AFS_SUN5_ENV) || (defined(AFS_SGI_ENV) && !defined(AFS_SGI65_ENV))
+0655  int
+0656  afs_access(OSI_VC_DECL(avc), register afs_int32 amode, int flags,
+0657  	   struct AFS_UCRED *acred)
+0658  #else
+0659  int
+0660  afs_access(OSI_VC_DECL(avc), register afs_int32 amode,
+0661  	   struct AFS_UCRED *acred)
+0662  #endif
+0663  {
+0664      register afs_int32 code;
+0665      struct vrequest treq;
+0666      struct afs_fakestat_state fakestate;
+0667      OSI_VC_CONVERT(avc);
+0668 
+0669      AFS_STATCNT(afs_access);
+0670 +    amode = amode & ~VEXEC;
+0671      afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
+0672  	       ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
+0673  	       ICL_HANDLE_OFFSET(avc->m.Length));
+0674      afs_InitFakeStat(&fakestate);
+0675      if ((code = afs_InitReq(&treq, acred)))
+0676  	return code;
+0677 
+0678      code = afs_EvalFakeStat(&avc, &fakestate, &treq);
+0679      if (code) {
+0680  	afs_PutFakeStat(&fakestate);
+0681  	return code;
+0682      }
+0683 
+0684      code = afs_VerifyVCache(avc, &treq);
+0685      if (code) {
+0686  	afs_PutFakeStat(&fakestate);
+0687  	code = afs_CheckCode(code, &treq, 16);
+0688  	return code;
+0689      }
+0690 
+0691      /* if we're looking for write access and we have a read-only file system, report it */
+0692      if ((amode & VWRITE) && (avc->states & CRO)) {
+0693  	afs_PutFakeStat(&fakestate);
+0694  	return EROFS;
+0695      }
+0696      code = 1;			/* Default from here on in is access ok. */
+0697      if (avc->states & CForeign) {
+0698  	/* In the dfs xlator the EXEC bit is mapped to LOOKUP */
+0699  	if (amode & VEXEC)
+0700  	    code = afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+0701  	if (code && (amode & VWRITE)) {
+0702  	    code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
+0703  	    if (code && (vType(avc) == VDIR)) {
+0704  		if (code)
+0705  		    code =
+0706  			afs_AccessOK(avc, PRSFS_INSERT, &treq,
+0707  				     CHECK_MODE_BITS);
+0708  		if (!code)
+0709  		    code =
+0710  			afs_AccessOK(avc, PRSFS_DELETE, &treq,
+0711  				     CHECK_MODE_BITS);
+0712  	    }
+0713  	}
+0714  	if (code && (amode & VREAD))
+0715  	    code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+0716      } else {
+0717  	if (vType(avc) == VDIR) {
+0718  	    if (amode & VEXEC)
+0719  		code =
+0720  		    afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+0721  	    if (code && (amode & VWRITE)) {
+0722  		code =
+0723  		    afs_AccessOK(avc, PRSFS_INSERT, &treq, CHECK_MODE_BITS);
+0724  		if (!code)
+0725  		    code =
+0726  			afs_AccessOK(avc, PRSFS_DELETE, &treq,
+0727  				     CHECK_MODE_BITS);
+0728  	    }
+0729  	    if (code && (amode & VREAD))
+0730  		code =
+0731  		    afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+0732  	} else {
+0733  	    if (amode & VEXEC) {
+0734  		code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+0735  		if (code) {
+0736  #ifdef	AFS_OSF_ENV
+0737  		    /*
+0738  		     * The nfs server in read operations for non-owner of a file
+0739  		     * will also check the access with the VEXEC (along with VREAD)
+0740  		     * because for them exec is the same as read over the net because of
+0741  		     * demand loading. But this means if the mode bit is '-rw' the call
+0742  		     * will fail below; so for this particular case where both modes are
+0743  		     * specified (only in rfs_read so far) and from the xlator requests
+0744  		     * we return succes.
+0745  		     */
+0746  		    if (!((amode & VREAD) && AFS_NFSXLATORREQ(acred)))
+0747  #endif
+0748  			if ((avc->m.Mode & 0100) == 0)
+0749  			    code = 0;
+0750  		} else if (avc->m.Mode & 0100)
+0751  		    code = 1;
+0752  	    }
+0753  	    if (code && (amode & VWRITE)) {
+0754  		code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
+0755 
+0756  		/* The above call fails when the NFS translator tries to copy
+0757  		 ** a file with r--r--r-- permissions into a directory which
+0758  		 ** has system:anyuser acl. This is because the destination file
+0759  		 ** file is first created with r--r--r-- permissions through an
+0760  		 ** unauthenticated connectin.  hence, the above afs_AccessOK
+0761  		 ** call returns failure. hence, we retry without any file
+0762  		 ** mode bit checking */
+0763  		if (!code && AFS_NFSXLATORREQ(acred)
+0764  		    && avc->m.Owner == ANONYMOUSID)
+0765  		    code =
+0766  			afs_AccessOK(avc, PRSFS_WRITE, &treq,
+0767  				     DONT_CHECK_MODE_BITS);
+0768  	    }
+0769  	    if (code && (amode & VREAD))
+0770  		code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+0771  	}
+0772      }
+0773      afs_PutFakeStat(&fakestate);
+0774      if (code) {
+0775  	return 0;		/* if access is ok */
+0776      } else {
+0777  	code = afs_CheckCode(EACCES, &treq, 17);	/* failure code */
+0778  	return code;
+0779      }
+0780  }
+0781 
+0782  #if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
+0783  /*
+0784   * afs_getRights
+0785   * This function is just an interface to afs_GetAccessBits
+0786   */
+0787  int
+0788  afs_getRights(OSI_VC_DECL(avc), register afs_int32 arights,
+0789  	      struct AFS_UCRED *acred)
+0790  {
+0791      register afs_int32 code;
+0792      struct vrequest treq;
+0793      OSI_VC_CONVERT(avc);
+0794 
+0795      if (code = afs_InitReq(&treq, acred))
+0796  	return code;
+0797 
+0798 
+0799 
+0800      code = afs_VerifyVCache(avc, &treq);
+0801      if (code) {
+0802  	code = afs_CheckCode(code, &treq, 16);
+0803  	return code;
+0804      }
+0805 
+0806      return afs_GetAccessBits(avc, arights, &treq);
+0807  }
+0808  #endif /* defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS) */
+0809 diff -U1000 -r orig-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c scripts-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c
+0810 --- orig-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c	2005-10-23 02:31:23.000000000 -0400
+0811 +++ scripts-1.4.1/src/afs/VNOPS/afs_vnop_attrs.c	2006-10-02 17:35:12.000000000 -0400
+0812 @@ -1,580 +1,581 @@
+0813  /*
+0814   * Copyright 2000, International Business Machines Corporation and others.
+0815   * All Rights Reserved.
+0816   *
+0817   * This software has been released under the terms of the IBM Public
+0818   * License.  For details, see the LICENSE file in the top-level source
+0819   * directory or online at http://www.openafs.org/dl/license10.html
+0820   *
+0821   * Portions Copyright (c) 2003 Apple Computer, Inc.
+0822   */
+0823 
+0824  /*
+0825   * afs_vnop_attrs.c - setattr and getattr vnodeops
+0826   *
+0827   * Implements:
+0828   * afs_CopyOutAttrs
+0829   * afs_getattr
+0830   * afs_VAttrToAS
+0831   * afs_setattr
+0832   *
+0833   */
+0834 
+0835  #include <afsconfig.h>
+0836  #include "afs/param.h"
+0837 
+0838  RCSID
+0839      ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_attrs.c,v 1.27.2.10 2005/10/23 06:31:23 shadow Exp $");
+0840 
+0841  #include "afs/sysincludes.h"	/* Standard vendor system headers */
+0842  #include "afsincludes.h"	/* Afs-based standard headers */
+0843  #include "afs/afs_stats.h"	/* statistics */
+0844  #include "afs/afs_cbqueue.h"
+0845  #include "afs/nfsclient.h"
+0846  #include "afs/afs_osidnlc.h"
+0847 
+0848 
+0849 
+0850  extern afs_rwlock_t afs_xcbhash;
+0851  struct afs_exporter *afs_nfsexporter;
+0852  extern struct vcache *afs_globalVp;
+0853  #if defined(AFS_HPUX110_ENV)
+0854  extern struct vfs *afs_globalVFS;
+0855  #endif
+0856 
+0857  /* copy out attributes from cache entry */
+0858  int
+0859  afs_CopyOutAttrs(register struct vcache *avc, register struct vattr *attrs)
+0860  {
+0861      register struct volume *tvp;
+0862      register struct cell *tcell;
+0863      int fakedir = 0;
+0864 
+0865      AFS_STATCNT(afs_CopyOutAttrs);
+0866      if (afs_fakestat_enable && avc->mvstat == 1)
+0867  	fakedir = 1;
+0868      attrs->va_type = fakedir ? VDIR : vType(avc);
+0869  #if defined(AFS_SGI_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_SUN5_ENV)
+0870      attrs->va_mode = fakedir ? 0755 : (mode_t) (avc->m.Mode & 0xffff);
+0871  #else
+0872      attrs->va_mode = fakedir ? VDIR | 0755 : avc->m.Mode;
+0873  #endif
+0874 
+0875      if (avc->m.Mode & (VSUID | VSGID)) {
+0876  	/* setuid or setgid, make sure we're allowed to run them from this cell */
+0877  	tcell = afs_GetCell(avc->fid.Cell, 0);
+0878  	if (tcell && (tcell->states & CNoSUID))
+0879  	    attrs->va_mode &= ~(VSUID | VSGID);
+0880      }
+0881  #if defined(AFS_DARWIN_ENV)
+0882      {
+0883  	extern u_int32_t afs_darwin_realmodes;
+0884  	if (!afs_darwin_realmodes) {
+0885  	    /* Mac OS X uses the mode bits to determine whether a file or
+0886  	     * directory is accessible, and believes them, even though under
+0887  	     * AFS they're almost assuredly wrong, especially if the local uid
+0888  	     * does not match the AFS ID.  So we set the mode bits
+0889  	     * conservatively.
+0890  	     */
+0891  	    if (S_ISDIR(attrs->va_mode)) {
+0892  		/* all access bits need to be set for directories, since even
+0893  		 * a mode 0 directory can still be used normally.
+0894  		 */
+0895  		attrs->va_mode |= ACCESSPERMS;
+0896  	    } else {
+0897  		/* for other files, replicate the user bits to group and other */
+0898  		mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
+0899  		attrs->va_mode |= ubits | (ubits << 3);
+0900  	    }
+0901  	}
+0902      }
+0903  #endif /* AFS_DARWIN_ENV */
+0904 -    attrs->va_uid = fakedir ? 0 : avc->m.Owner;
+0905 -    attrs->va_gid = fakedir ? 0 : avc->m.Group;	/* yeah! */
+0906 +    attrs->va_uid = fakedir ? 0 : avc->fid.Fid.Volume;
+0907 +    attrs->va_gid = (avc->m.Owner == DAEMON_SCRIPTS_PTSID ? avc->m.Group : avc->m.Owner);
+0908  #if defined(AFS_SUN56_ENV)
+0909      attrs->va_fsid = avc->v.v_vfsp->vfs_fsid.val[0];
+0910  #elif defined(AFS_OSF_ENV)
+0911      attrs->va_fsid = avc->v.v_mount->m_stat.f_fsid.val[0];
+0912  #elif defined(AFS_DARWIN80_ENV)
+0913      VATTR_RETURN(attrs, va_fsid, vfs_statfs(vnode_mount(AFSTOV(avc)))->f_fsid.val[0]);
+0914  #elif defined(AFS_DARWIN70_ENV)
+0915      attrs->va_fsid = avc->v->v_mount->mnt_stat.f_fsid.val[0];
+0916  #else /* ! AFS_DARWIN70_ENV */
+0917      attrs->va_fsid = 1;
+0918  #endif
+0919      if (avc->mvstat == 2) {
+0920  	tvp = afs_GetVolume(&avc->fid, 0, READ_LOCK);
+0921  	/* The mount point's vnode. */
+0922  	if (tvp) {
+0923  	    attrs->va_nodeid =
+0924  		tvp->mtpoint.Fid.Vnode + (tvp->mtpoint.Fid.Volume << 16);
+0925  	    if (FidCmp(&afs_rootFid, &avc->fid) && !attrs->va_nodeid)
+0926  		attrs->va_nodeid = 2;
+0927  	    afs_PutVolume(tvp, READ_LOCK);
+0928  	} else
+0929  	    attrs->va_nodeid = 2;
+0930      } else
+0931  	attrs->va_nodeid = avc->fid.Fid.Vnode + (avc->fid.Fid.Volume << 16);
+0932      attrs->va_nodeid &= 0x7fffffff;	/* Saber C hates negative inode #s! */
+0933      attrs->va_nlink = fakedir ? 100 : avc->m.LinkCount;
+0934      attrs->va_size = fakedir ? 4096 : avc->m.Length;
+0935      attrs->va_atime.tv_sec = attrs->va_mtime.tv_sec = attrs->va_ctime.tv_sec =
+0936  	fakedir ? 0 : (int)avc->m.Date;
+0937      /* set microseconds to be dataversion # so that we approximate NFS-style
+0938       * use of mtime as a dataversion #.  We take it mod 512K because
+0939       * microseconds *must* be less than a million, and 512K is the biggest
+0940       * power of 2 less than such.  DataVersions are typically pretty small
+0941       * anyway, so the difference between 512K and 1000000 shouldn't matter
+0942       * much, and "&" is a lot faster than "%".
+0943       */
+0944  #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+0945      /* nfs on these systems puts an 0 in nsec and stores the nfs usec (aka
+0946       * dataversion) in va_gen */
+0947 
+0948 
+0949 
+0950      attrs->va_atime.tv_nsec = attrs->va_mtime.tv_nsec =
+0951  	attrs->va_ctime.tv_nsec = 0;
+0952      attrs->va_gen = hgetlo(avc->m.DataVersion);
+0953  #elif defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_AIX41_ENV) || defined(AFS_OBSD_ENV)
+0954      attrs->va_atime.tv_nsec = attrs->va_mtime.tv_nsec =
+0955  	attrs->va_ctime.tv_nsec =
+0956  	(hgetlo(avc->m.DataVersion) & 0x7ffff) * 1000;
+0957  #else
+0958      attrs->va_atime.tv_usec = attrs->va_mtime.tv_usec =
+0959  	attrs->va_ctime.tv_usec = (hgetlo(avc->m.DataVersion) & 0x7ffff);
+0960  #endif
+0961  #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV) || defined(AFS_OSF_ENV)
+0962      attrs->va_flags = 0;
+0963  #endif
+0964  #if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)
+0965      attrs->va_blksize = PAGESIZE;	/* XXX Was 8192 XXX */
+0966  #else
+0967      attrs->va_blocksize = PAGESIZE;	/* XXX Was 8192 XXX */
+0968  #endif
+0969      attrs->va_rdev = 1;
+0970  #if defined(AFS_HPUX110_ENV)
+0971      if (afs_globalVFS)
+0972  	attrs->va_fstype = afs_globalVFS->vfs_mtype;
+0973  #endif
+0974 
+0975      /*
+0976       * Below return 0 (and not 1) blocks if the file is zero length. This conforms
+0977       * better with the other filesystems that do return 0.
+0978       */
+0979  #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+0980      attrs->va_bytes = (attrs->va_size ? (attrs->va_size + 1023) : 1024);
+0981  #ifdef	va_bytes_rsv
+0982      attrs->va_bytes_rsv = -1;
+0983  #endif
+0984  #elif defined(AFS_HPUX_ENV)
+0985      attrs->va_blocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10) : 0);
+0986  #elif defined(AFS_SGI_ENV)
+0987      attrs->va_blocks = BTOBB(attrs->va_size);
+0988  #elif defined(AFS_SUN5_ENV)
+0989      attrs->va_nblocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10)<<1:0);
+0990  #else /* everything else */
+0991      attrs->va_blocks = (attrs->va_size ? ((attrs->va_size + 1023)>>10)<<1:0);
+0992  #endif
+0993 +    attrs->va_mode |= 0100;
+0994      return 0;
+0995  }
+0996 diff -U1000 -r orig-1.4.1/src/afs/afs_analyze.c scripts-1.4.1/src/afs/afs_analyze.c
+0997 --- orig-1.4.1/src/afs/afs_analyze.c	2003-08-27 17:43:16.000000000 -0400
+0998 +++ scripts-1.4.1/src/afs/afs_analyze.c	2006-10-02 17:35:12.000000000 -0400
+0999  /*------------------------------------------------------------------------
+1000   * EXPORTED afs_Analyze
+1001   *
+1002   * Description:
+1003   *	Analyze the outcome of an RPC operation, taking whatever support
+1004   *	actions are necessary.
+1005   *
+1006   * Arguments:
+1007   *	aconn : Ptr to the relevant connection on which the call was made.
+1008   *	acode : The return code experienced by the RPC.
+1009   *	afid  : The FID of the file involved in the action.  This argument
+1010   *		may be null if none was involved.
+1011   *	areq  : The request record associated with this operation.
+1012   *      op    : which RPC we are analyzing.
+1013   *      cellp : pointer to a cell struct.  Must provide either fid or cell.
+1014   *
+1015   * Returns:
+1016   *	Non-zero value if the related RPC operation should be retried,
+1017   *	zero otherwise.
+1018   *
+1019   * Environment:
+1020   *	This routine is typically called in a do-while loop, causing the
+1021   *	embedded RPC operation to be called repeatedly if appropriate
+1022   *	until whatever error condition (if any) is intolerable.
+1023   *
+1024   * Side Effects:
+1025   *	As advertised.
+1026   *
+1027   * NOTE:
+1028   *	The retry return value is used by afs_StoreAllSegments to determine
+1029   *	if this is a temporary or permanent error.
+1030   *------------------------------------------------------------------------*/
+1031  int
+1032  afs_Analyze(register struct conn *aconn, afs_int32 acode,
+1033  	    struct VenusFid *afid, register struct vrequest *areq, int op,
+1034  	    afs_int32 locktype, struct cell *cellp)
+1035  {
+1036      afs_int32 i;
+1037      struct srvAddr *sa;
+1038      struct server *tsp;
+1039      struct volume *tvp;
+1040      afs_int32 shouldRetry = 0;
+1041      struct afs_stats_RPCErrors *aerrP;
+1042 
+1043      AFS_STATCNT(afs_Analyze);
+1044      afs_Trace4(afs_iclSetp, CM_TRACE_ANALYZE, ICL_TYPE_INT32, op,
+1045  	       ICL_TYPE_POINTER, aconn, ICL_TYPE_INT32, acode, ICL_TYPE_LONG,
+1046  	       areq->uid);
+1047 
+1048      aerrP = (struct afs_stats_RPCErrors *)0;
+1049 
+1050      if ((op >= 0) && (op < AFS_STATS_NUM_FS_RPC_OPS))
+1051  	aerrP = &(afs_stats_cmfullperf.rpc.fsRPCErrors[op]);
+1052 
+1053      afs_FinalizeReq(areq);
+1054      if (!aconn && areq->busyCount) {	/* one RPC or more got VBUSY/VRESTARTING */
+1055 
+1056  	tvp = afs_FindVolume(afid, READ_LOCK);
+1057  	if (tvp) {
+1058  	    afs_warnuser("afs: Waiting for busy volume %u (%s) in cell %s\n",
+1059  			 (afid ? afid->Fid.Volume : 0),
+1060  			 (tvp->name ? tvp->name : ""),
+1061  			 ((tvp->serverHost[0]
+1062  			   && tvp->serverHost[0]->cell) ? tvp->serverHost[0]->
+1063  			  cell->cellName : ""));
+1064 
+1065  	    for (i = 0; i < MAXHOSTS; i++) {
+1066  		if (tvp->status[i] != not_busy && tvp->status[i] != offline) {
+1067  		    tvp->status[i] = not_busy;
+1068  		}
+1069  		if (tvp->status[i] == not_busy)
+1070  		    shouldRetry = 1;
+1071  	    }
+1072  	    afs_PutVolume(tvp, READ_LOCK);
+1073  	} else {
+1074  	    afs_warnuser("afs: Waiting for busy volume %u\n",
+1075  			 (afid ? afid->Fid.Volume : 0));
+1076  	}
+1077 
+1078 -	if (areq->busyCount > 100) {
+1079 +	if (1) {
+1080  	    if (aerrP)
+1081  		(aerrP->err_Volume)++;
+1082  	    areq->volumeError = VOLBUSY;
+1083  	    shouldRetry = 0;
+1084  	} else {
+1085  	    VSleep(afs_BusyWaitPeriod);	/* poll periodically */
+1086  	}
+1087  	if (shouldRetry != 0)
+1088  	    areq->busyCount++;
+1089 
+1090  	return shouldRetry;	/* should retry */
+1091      }
Index: branches/fc15-dev/server/doc/install-fedora
===================================================================
--- branches/fc15-dev/server/doc/install-fedora	(revision 1803)
+++ branches/fc15-dev/server/doc/install-fedora	(revision 1803)
@@ -0,0 +1,19 @@
+Installing a Scripts guest on a Xen host
+----------------------------------------
+
+You need to create the volumes to use:
+
+    lvcreate -n $MACHINE-root --size 50.00G $HOST
+    lvcreate -n $MACHINE-swap --size 10.00G $HOST
+
+We use Kickstart to to initial Fedora configuration.  Installing a new
+vanilla machine is as easy as:
+
+    xm create scripts-server machine_name=$MACHINE install=fXX && console $MACHINE
+
+The only prompt (near the beginning of the install process) should be
+for the root password, and at the end, when it asks you to reboot.
+Say yes, and the machine will power down, and then restart without
+the install parameter:
+
+    xm create scripts-server machine_name=$MACHINE && console $MACHINE
Index: branches/fc15-dev/server/doc/install-howto.sh
===================================================================
--- branches/fc15-dev/server/doc/install-howto.sh	(revision 1803)
+++ branches/fc15-dev/server/doc/install-howto.sh	(revision 1803)
@@ -0,0 +1,379 @@
+# This document is a how-to for installing a Fedora scripts.mit.edu server.
+# It is semi-vaguely in the form of a shell script, but is not really
+# runnable as it stands.
+
+set -e -x
+
+# Some commands should be run as the scripts-build user, not root.
+
+alias asbuild="sudo -u scripts-build"
+
+# Old versions of this install document advised setting
+# NSS_NONLOCAL_IGNORE=1 anytime you're setting up anything, e.g. using
+# yum, warning that useradd will query LDAP in a stupid way that makes
+# it hang forever.  As of Fedora 13, this does not seem to be a problem,
+# so it's been removed from the instructions.  If an install is hanging,
+# though, try adding NSS_NONLOCAL_IGNORE.
+
+# This is actually just "pick an active scripts server".  It can't be
+# scripts.mit.edu because our networking config points that domain
+# at localhost, and if our server is not setup at that point things
+# will break.
+source_server="cats-whiskers.mit.edu"
+
+# 'branch' is the current svn branch you are on.  You want to
+# use trunk if your just installing a new server, and branches/fcXX-dev
+# if your preparing a server on a new Fedora release.
+branch="trunk"
+
+# 'server' is the public hostname of your server, for SCP'ing files
+# to and from.
+server=YOUR-SERVER-NAME-HERE
+
+# Start with a Scripts kickstarted install of Fedora (install-fedora)
+
+# Take updates, reboot if there's a kernel update.
+    yum update -y
+
+# Get rid of network manager
+    yum remove NetworkManager
+
+# Copy over root's dotfiles from one of the other machines.
+# Perhaps a useful change is to remove the default aliases
+    cd /root
+    ls -l .bashrc
+    ls -l .ldapvirc
+    ls -l .screenrc
+    ls -l .ssh
+    ls -l .vimrc
+    ls -l .k5login
+    # Trying to scp from server to server won't work, as scp
+    # will attempt to negotiate a server-to-server connection.
+    # Instead, scp to your trusted machine as a temporary file,
+    # and then push to the other server
+scp -r root@$source_server:~/{.bashrc,.ldapvirc,.screenrc,.ssh,.vimrc,.k5login} .
+scp -r {.bashrc,.ldapvirc,.screenrc,.ssh,.vimrc,.k5login} root@$server:~
+
+# Install the initial set of credentials (to get Kerberized logins once
+# krb5 is installed).  Otherwise, SCP'ing things in will be annoying.
+#   o You probably installed the machine keytab long ago
+    ls -l /etc/krb5.keytab
+#     Use ktutil to combine the host/scripts.mit.edu and
+#     host/scripts-vhosts.mit.edu keys with host/this-server.mit.edu in
+#     the keytab.  Do not use 'k5srvutil change' on the combined keytab
+#     or you'll break the other servers. (real servers only).  Be
+#     careful about writing out the keytab: if you write it to an
+#     existing file the keys will just get appended.  The correct
+#     credential list should look like:
+#       ktutil:  l
+#       slot KVNO Principal
+#       ---- ---- ---------------------------------------------------------------------
+#          1    5 host/old-faithful.mit.edu@ATHENA.MIT.EDU
+#          2    3 host/scripts-vhosts.mit.edu@ATHENA.MIT.EDU
+#          3    2      host/scripts.mit.edu@ATHENA.MIT.EDU
+#   o Replace the ssh host keys with the ones common to all scripts servers (real servers only)
+    ls -l /etc/ssh/*key*
+#     You can do that with:
+scp root@$source_server:/etc/ssh/*key* .
+scp *key* root@$server:/etc/ssh/
+    service sshd reload
+
+# Check out the scripts /etc configuration
+    # backslash to make us not use the alias
+    cd /root
+    \cp -a etc /
+    chmod 0440 /etc/sudoers
+
+# If this is the first time you've installed this hostname, you will
+# need to update a bunch of files to add support for it. These include:
+#   o Adding all aliases to /etc/httpd/conf.d/scripts-vhost-names.conf
+#     (usually this is hostname, hostname.mit.edu, h-n, h-n.mit.edu,
+#     scriptsN, scriptsN.mit.edu, and the IP address.)
+#   o Adding routing rules for the static IP in
+#     /etc/sysconfig/network-scripts/route-eth1
+#   o Adding the IP address to the hosts file (same hosts as for
+#     scripts-vhost-names)
+#   o Update SSH config at
+#       - server/fedora/config/etc/ssh/shosts.equiv
+#       - server/fedora/config/etc/ssh/ssh_known_hosts
+#       - server/fedora/config/etc/ssh/sshd_config : DenyUsers
+#     (the last part is critical to ensure that rooting one server
+#     doesn't give you root to all the other servers)
+#   o Put the hostname information in LDAP so SVN and Git work
+#   o Set up Nagios monitoring on sipb-noc for the host
+#   o Set up the host as in the pool on r-b/r-b /etc/heartbeat/ldirectord.cf
+    XXX TODO COMMANDS
+
+# NOTE: You will have just lost DNS resolution and the ability
+# to do password SSH in.  If you managed to botch this step without
+# having named setup, you can do a quick fix by frobbing /etc/resolv.conf
+# with a non 127.0.0.1 address for the DNS server.  Be sure to revert it once
+# you have named.
+
+# NOTE: You can get password SSH back by editing /etc/ssh/sshd_config (allow
+# password auth) and /etc/pam.d/sshd (comment out the first three auth
+# lines).  However, you should have the Kerberos credentials in place
+# so as soon as you install the full set of Scripts packages, you'll get
+# Kerberized logins.
+
+# Make sure network is working.  If this is a new server name, you'll
+# need to add it to /etc/hosts and
+# /etc/sysconfig/network-scripts/route-eth1.  Kickstart should have
+# configured eth0 and eth1 correctly; use service network restart
+# to add the new routes in route-eth1.
+    service network restart
+    route
+    ifconfig
+    cat /etc/hosts
+    cat /etc/sysconfig/network-scripts/route-eth1
+
+# This is the point at which you should start updating scriptsified
+# packages for a new Fedora release.  Consult 'upgrade-tips' for more
+# information.
+    yum install -y scripts-base
+    # Some of these packages are naughty and clobber some of our files
+    cd /etc
+    svn revert resolv.conf hosts sysconfig/openafs
+
+# Replace rsyslog with syslog-ng by doing:
+    rpm -e --nodeps rsyslog
+    yum install -y syslog-ng
+    chkconfig syslog-ng on
+
+# Fix the openafs /usr/vice/etc <-> /etc/openafs mapping.
+    echo "/afs:/usr/vice/cache:10000000" > /usr/vice/etc/cacheinfo
+    echo "athena.mit.edu" > /usr/vice/etc/ThisCell
+
+# [TEST SERVER] If you're installing a test server, this needs to be
+# much smaller; the max filesize on XVM is 10GB.  Pick something like
+# 500000. Also, some of the AFS parameters are kind of retarded (and if
+# you're low on disk space, will actually exhaust our inodes).  Edit
+# these parameters in /etc/sysconfig/openafs
+
+# Test that zephyr is working
+    chkconfig zhm on
+    service zhm start
+    echo 'Test!' | zwrite -d -c scripts -i test
+
+# Install the full list of RPMs that users expect to be on the
+# scripts.mit.edu servers.
+rpm -qa --queryformat "%{Name}.%{Arch}\n" | sort > packages.txt
+# arrange for packages.txt to be passed to the server, then run:
+# --skip-broken will (usually) prevent you from having to sit through
+# several minutes of dependency resolution until it decides that
+# it can't install /one/ package.
+    yum install -y --skip-broken $(cat packages.txt)
+
+# Make sure sendmail isn't installed
+    yum remove sendmail
+
+# Check which packages are installed on your new server that are not
+# in the snapshot, and remove ones that aren't needed for some reason
+# on the new machine.  Otherwise, aside from bloat, you may end up
+# with undesirable things for security, like sendmail.
+    rpm -qa --queryformat "%{Name}.%{Arch}\n" | grep -v kernel | sort > newpackages.txt
+    diff -u packages.txt newpackages.txt | grep -v kernel | less
+    # here's a cute script that removes all extra packages
+    yum erase -y $(grep -Fxvf packages.txt newpackages.txt)
+
+# We need an upstream version of cgi which we've packaged ourselves, but
+# it doesn't work with the haskell-platform package which expects
+# explicit versions.  So temporarily rpm -e the package, and then
+# install it again after you install haskell-platform.  [Note: You
+# probably won't need this in Fedora 15 or something, when the Haskell
+# Platform gets updated.]
+    rpm -e ghc-cgi-devel ghc-cgi
+    yum install -y haskell-platform
+    yumdownloader ghc-cgi
+    yumdownloader ghc-cgi-devel
+    rpm -i ghc-cgi*1.8.1*.rpm
+
+# Check out the scripts /usr/vice/etc configuration
+    cd /root/vice
+    \cp -a etc /usr/vice
+
+# Install the full list of perl modules that users expect to be on the
+# scripts.mit.edu servers.
+    cd /root
+    export PERL_MM_USE_DEFAULT=1
+    cpan # this is interactive, enter the next two lines
+        o conf prerequisites_policy follow
+        o conf commit
+# on a reference server
+perldoc -u perllocal | grep head2 | cut -f 3 -d '<' | cut -f 1 -d '|' | sort -u | perl -ne 'chomp; print "notest install $_\n" if system("rpm -q --whatprovides \"perl($_)\" >/dev/null 2>/dev/null")' > perl-packages.txt
+# arrange for perl-packages.txt to be transferred to server
+    cat perl-packages.txt | perl -MCPAN -e shell
+
+# Install the Python eggs and Ruby gems and PEAR/PECL doohickeys that are on
+# the other scripts.mit.edu servers and do not have RPMs.
+# The general mode of operation will be to run the "list" command
+# on both servers, see what the differences are, check if those diffs
+# are packaged up as rpms, and install them (rpm if possible, native otherwise)
+# - Look at /usr/lib/python2.6/site-packages and
+#           /usr/lib64/python2.6/site-packages for Python eggs and modules.
+#   There will be a lot of gunk that was installed from packages;
+#   easy-install.pth in /usr/lib/ will tell you what was easy_installed.
+#   First use 'yum search' to see if the relevant package is now available
+#   as an RPM, and install that if it is.  If not, then use easy_install.
+#   Pass -Z to easy_install to install them unzipped, as some zipped eggs
+#   want to be able to write to ~/.python-eggs.  (Also makes sourcediving
+#   easier.)
+cat /usr/lib/python2.6/site-packages/easy-install.pth | grep "^./" | cut -c3- | cut -f1 -d- . egg.txt
+    cat egg.txt | xargs easy_install -Z
+# - Look at `gem list` for Ruby gems.
+#   Again, use 'yum search' and prefer RPMs, but failing that, 'gem install'.
+#       ezyang: rspec-rails depends on rspec, and will override the Yum
+#       package, so... don't use that RPM yet
+gem list --no-version > gem.txt
+    gem install $(gem list --no-version | grep -Fxvf - gem.txt)
+# - Look at `pear list` for Pear fruits (or whatever they're called).
+#   Yet again, 'yum search' for RPMs before resorting to 'pear install'.  Note
+#   that for things in the beta repo, you'll need 'pear install package-beta'.
+#   (you might get complaints about the php_scripts module; ignore them)
+pear list | tail -n +4 | cut -f 1 -d " " > pear.txt
+    pear config-set preferred_state beta
+    pear channel-update pear.php.net
+    pear install $(pear list | tail -n +4 | cut -f 1 -d " " | grep -Fxvf - pear.txt)
+# - Look at `pecl list` for PECL things.  'yum search', and if you must,
+#   'pecl install' needed items. If it doesn't work, try 'pear install
+#   pecl/foo' or 'pecl install foo-beta' or those two combined.
+pecl list | tail -n +4 | cut -f 1 -d " " > pecl.txt
+    pecl install --nodeps $(pecl list | tail -n +4 | cut -f 1 -d " " | grep -Fxvf - pecl.txt)
+
+# Setup some Python config
+    echo 'import site, os.path; site.addsitedir(os.path.expanduser("~/lib/python2.6/site-packages"))' > /usr/lib/python2.6/site-packages/00scripts-home.pth
+
+# Install the credentials.  There are a lot of things to remember here.
+# Be sure to make sure the permissions match up (ls -l on an existing
+# server!).
+scp root@$source_server:{/etc/{sql-mit-edu.cfg.php,daemon.keytab,pki/tls/private/scripts.key,signup-ldap-pw,whoisd-password},/home/logview/.k5login} .
+scp daemon.keytab signup-ldap-pw whoisd-password sql-mit-edu.cfg.php root@$server:/etc
+scp scripts.key root@$server:/etc/pki/tls/private
+scp .k5login root@$server:/home/logview
+    chown afsagent:afsagent /etc/daemon.keytab
+#   o The daemon.scripts keytab (will be daemon.scripts-test for test)
+    ls -l /etc/daemon.keytab
+#   o The SSL cert private key (real servers only)
+    ls -l /etc/pki/tls/private/scripts.key
+#   o The LDAP password for the signup process (real servers only)
+    ls -l /etc/signup-ldap-pw
+#   o The whoisd password (real servers only)
+    ls -l /etc/whoisd-password
+#   o Make sure logview's .k5login is correct (real servers only)
+    cat /home/logview/.k5login
+
+# Spin up OpenAFS.  This will fail if there's been a new kernel since
+# when you last tried.  In that case, you can hold on till later to
+# start OpenAFS.  This will take a little bit of time; 
+    service openafs-client start
+
+# Check that fs sysname is correct.  You should see, among others,
+# 'amd64_fedoraX_scripts' (vary X) and 'scripts'. If it's not, you
+# probably did a distro upgrade and should update /etc/sysconfig/openafs.
+    fs sysname
+
+# [TEST SERVER] If you are setting up a test server, pay attention to
+# /etc/sysconfig/network-scripts and do not bind scripts' IP address.
+# You will also need to modify:
+#   o /etc/ldap.conf
+#       add: host scripts.mit.edu
+#   o /etc/nss-ldapd.conf
+#       replace: uri *****
+#       with: uri ldap://scripts.mit.edu/
+#   o /etc/openldap/ldap.conf
+#       add: URI ldap://scripts.mit.edu/
+#            BASE dc=scripts,dc=mit,dc=edu
+#   o /etc/httpd/conf.d/vhost_ldap.conf
+#       replace: VhostLDAPUrl ****
+#       with: VhostLDAPUrl "ldap://scripts.mit.edu/ou=VirtualHosts,dc=scripts,dc=mit,dc=edu"
+#   o /etc/postfix/virtual-alias-{domains,maps}-ldap.cf
+#       replace: server_host *****
+#       with: server_host = ldap://scripts.mit.edu
+# to use scripts.mit.edu instead of localhost.
+# XXX: someone should write sed scripts to do this
+
+# [TEST SERVER] If you are setting up a test server, afsagent's cronjob
+# will attempt to be renewing with the wrong credentials
+# (daemon.scripts). Change this:
+    vim /home/afsagent/renew # replace all mentions of daemon.scripts.mit.edu
+
+# Set up replication (see ./install-ldap).
+# You'll need the LDAP keytab for this server: be sure to chown it
+# fedora-ds after you create the fedora-ds user
+    ls -l /etc/dirsrv/keytab
+    cat install-ldap
+
+# Make the services dirsrv, nslcd, nscd, postfix, and httpd start at
+# boot. Run chkconfig to make sure the set of services to be run is
+# correct.
+    service nslcd start
+    service nscd start
+    service postfix start
+    service httpd start
+    chkconfig dirsrv on
+    chkconfig nslcd on
+    chkconfig nscd on
+    chkconfig postfix on
+    chkconfig httpd on
+
+# nrpe is required for nagios alerts
+    chkconfig nrpe on
+
+# Check sql user credentials (needs to be done after LDAP is setup)
+    chown sql /etc/sql-mit-edu.cfg.php
+
+# Postfix doesn't actually deliver mail; fix this
+    cd /etc/postfix
+    postmap virtual
+
+# Munin might not be monitoring packages that were installed after it
+    munin-node-configure --suggest --shell | sh
+
+# Run fmtutil-sys --all, which does something that makes TeX work.
+# (Note: this errors on XeTeX which is ok.)
+    fmtutil-sys --all
+
+# Ensure that PHP isn't broken:
+    mkdir /tmp/sessions
+    chmod 01777 /tmp/sessions
+    # XXX: this seems to get deleted if tmp gets cleaned up, so we
+    # might need something a little better (maybe init script.)
+
+# Ensure fcgid isn't broken (should be 755)
+    ls -ld /var/run/mod_fcgid
+
+# Fix etc by making sure none of our config files got overwritten
+    cd /etc
+    svn status -q
+    # Some usual candidates for clobbering include nsswitch.conf and
+    # sysconfig/openafs
+
+# ThisCell got clobbered, replace it with athena.mit.edu
+    echo "athena.mit.edu" > /usr/vice/etc/ThisCell
+
+# Reboot the machine to restore a consistent state, in case you
+# changed anything. (Note: Starting kdump fails (this is ok))
+
+# [OPTIONAL] Your machine's hostname is baked in at install time;
+# in the rare case you need to change it: it appears to be in:
+#   o /etc/sysconfig/network
+#   o your lvm thingies; probably don't need to edit
+
+# [TEST SERVER] More stuff for test servers
+#   - You need a self-signed SSL cert.  Generate with:
+    openssl req -new -x509 -keyout /etc/pki/tls/private/scripts.key -out /etc/pki/tls/certs/scripts.cert -nodes
+#     Also make /etc/pki/tls/certs/ca.pem match up
+#   - Make (/etc/aliases) root mail go to /dev/null, so we don't spam people
+#   - Edit /etc/httpd/conf.d/scripts-vhost-names.conf to have scripts-fX-test.xvm.mit.edu
+#     be an accepted vhost name
+#   - Look at the old test server and see what config changes are floating around
+
+# XXX: our SVN checkout should be updated to use scripts.mit.edu
+# (repository and etc) once serving actually works.
+    cd /etc
+    svn switch --relocate svn://$source_server/ svn://scripts.mit.edu/
+    cd /usr/vice/etc
+    svn switch --relocate svn://$source_server/ svn://scripts.mit.edu/
+    cd /srv/repository
+    asbuild svn switch --relocate svn://$source_server/ svn://scripts.mit.edu/
+    asbuild svn up # verify scripts.mit.edu works
Index: branches/fc15-dev/server/doc/install-ldap
===================================================================
--- branches/fc15-dev/server/doc/install-ldap	(revision 1803)
+++ branches/fc15-dev/server/doc/install-ldap	(revision 1803)
@@ -0,0 +1,356 @@
+To set up a new LDAP server:
+
+- Install the RPM 389-ds-base with yum (these are installed by kickstart
+  these days, so these two steps are probably not necessary)
+  root# yum install -y 389-ds-base
+  root# yum install -y policycoreutils-python
+  root# yum install -y ldapvi
+- We want to run the directory server as its own user, so create fedora-ds
+  root# useradd -r -d /var/lib/dirsrv fedora-ds
+- Temporarily move away the existing slapd-scripts folder
+  root# mv /etc/dirsrv/slapd-scripts{,.bak}
+- root# /usr/sbin/setup-ds.pl
+    - Choose a typical install
+    - Tell it to use the fedora-ds user and group
+    - Directory server identifier: scripts
+        Needed to remove this from the config file first
+    - Suffix: dc=scripts,dc=mit,dc=edu
+    - Input directory manager password
+      (this can be found in  ~/.ldapvirc)
+- Move the schema back
+  root# cp -R /etc/dirsrv/slapd-scripts.bak/{.svn,*} /etc/dirsrv/slapd-scripts
+  root# rm -Rf /etc/dirsrv/slapd-scripts.bak
+- Turn dirsrv off: service dirsrv stop
+- Apply the following configuration changes.  If you're editing
+  dse.ldif, you don't want dirsrv to be on, otherwise it will
+  overwrite your changes. [XXX: show how to do these changes with
+  dsconf, which is the "blessed" method]
+
+# Inside cn=config.  These changes definitely require a restart.
+nsslapd-ldapifilepath: /var/run/dirsrv/slapd-scripts.socket
+nsslapd-ldapilisten: on
+nsslapd-syntaxcheck: off
+
+# Add these blocks
+
+# mapname, mapping, sasl, config
+# This is the most liberal mapping you can have for SASL: you can
+# basically add authentication for any given GSSAPI mechanism by
+# explicitly creating the UID for that SASL string.
+dn: cn=mapname,cn=mapping,cn=sasl,cn=config
+objectClass: top
+objectClass: nsSaslMapping
+cn: mapname
+nsSaslMapRegexString: \(.*\)
+nsSaslMapBaseDNTemplate: uid=\1,ou=People,dc=scripts,dc=mit,dc=edu
+nsSaslMapFilterTemplate: (objectClass=posixAccount)
+
+- Put LDAP keytab (ldap/hostname.mit.edu) in /etc/dirsrv/keytab.  Make
+  sure you chown/chgrp it to be readable by fedora-ds
+- Uncomment and modify in /etc/sysconfig/dirsrv: KRB5_KTNAME=/etc/dirsrv/keytab ; export KRB5_KTNAME
+- chown fedora-ds:fedora-ds /var/run/dirsrv
+- chown fedora-ds /etc/dirsrv/keytab
+- chmod 755 /var/run/dirsrv
+- /sbin/service dirsrv start
+- Use ldapvi -b cn=config to add these indexes (8 of them):
+
+add cn=apacheServerName, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: apacheServerName
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=apacheServerAlias, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: apacheServerAlias
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=scriptsVhostName, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: scriptsVhostName
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=scriptsVhostAlias, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: scriptsVhostAlias
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=scriptsVhostAccount, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: scriptsVhostAccount
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=memberuid, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: memberuid
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=uidnumber, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: uidnumber
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+add cn=gidnumber, cn=index, cn=userRoot, cn=ldbm database, cn=plugins, cn=config
+objectClass: top
+objectClass: nsIndex
+cn: gidnumber
+nsSystemIndex: false
+nsIndexType: eq
+nsIndexType: pres
+
+- Build the indexes for all the fields:
+
+    /usr/lib64/dirsrv/slapd-scripts/db2index.pl -D "cn=Directory Manager" -j /etc/signup-ldap-pw -n userRoot
+
+  (/etc/signup-ldap-pw is the LDAP root password, make sure it's
+  chmodded correctly and chowned to signup. Also, make sure it doesn't
+  have a trailing newline!)
+
+-  Watch for the indexing operations to finish with this command:
+
+    ldapsearch -x -y /etc/signup-ldap-pw -D 'cn=Directory Manager' -b cn=tasks,cn=config
+
+  (look for nktaskstatus)
+
+- Set up replication.
+
+  We used to tell people to go execute
+  http://directory.fedoraproject.org/sources/contrib/mmr.pl manually
+  (manually because that script assumes only two masters and we have
+  every one of our servers set up as a master.)  However, those
+  instructions are inaccurate, because we use GSSAPI, not SSL and
+  because the initializing procedure is actually prone to a race
+  condition.  Here are some better instructions.
+
+  LDAP replication is based around producers and consumers.  Producers
+  push changes in LDAP to consumers: these arrangements are called
+  "replication agreements" and the producer will hold a
+  nsDS5ReplicationAgreement object that represents this commitment,
+  as well as some extra configuration to say who consumers will accept
+  replication data from (a nsDS5Replica).
+
+  The procedure, at a high level, is this:
+
+    1. Pick an arbitrary existing master.  The current server will
+       be configured as a slave to that master.  Initialize a changelog,
+       then request a replication to populate our server with
+       information.
+
+            M1 <---> M2 ---> S
+
+    2. Configure the new server to be replicated back.
+
+            M1 <---> M2 <---> S
+
+    3. Set up the rest of the replication agreements at your leisure.
+
+                M1 <---> M2
+                ^         ^
+                |         |
+                +--> S <--+
+
+  Here's how you do it.
+
+    1. Pull open the replication part of the database. It's fairly empty
+       right now.
+
+        ldapvi -b cn=\"dc=scripts,dc=mit,dc=edu\",cn=mapping\ tree,cn=config
+
+    2. Configure the server $SLAVE (this server) to accept $MASTER
+       replications by adding the following LDAP entries:
+
+add cn=replica, cn="dc=scripts,dc=mit,dc=edu", cn=mapping tree, cn=config
+objectClass: top
+objectClass: nsDS5Replica
+cn: replica
+nsDS5ReplicaId: $REPLICA_ID
+nsDS5ReplicaRoot: dc=scripts,dc=mit,dc=edu
+nsDS5Flags: 1
+nsDS5ReplicaBindDN: uid=ldap/bees-knees.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/busy-beaver.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/cats-whiskers.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/pancake-bunny.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/whole-enchilada.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/real-mccoy.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/better-mousetrap.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/old-faithful.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindDN: uid=ldap/shining-armor.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+nsds5ReplicaPurgeDelay: 604800
+nsds5ReplicaLegacyConsumer: off
+nsDS5ReplicaType: 3
+
+        $REPLICA_ID is the scripts$N number (stella $HOSTNAME to find
+        out.)  You might wonder why we are binding to all servers;
+        weren't we going to replicate from only one server?  That is
+        correct, however, simply binding won't mean we will receive
+        updates; we have to setup the $MASTER to send data $SLAVE.
+
+    3. Although we allowed those uids to bind, that user information
+       doesn't exist on $SLAVE yet.  So you'll need to create the entry
+       for just $MASTER.
+
+add uid=ldap/$MASTER,ou=People,dc=scripts,dc=mit,dc=edu
+uid: ldap/$MASTER
+objectClass: account
+objectClass: top
+
+    4. Though our $SLAVE will not be making changes to LDAP, we need to
+       initialize the changelog because we intend to be able to do this
+       later.
+
+add cn=changelog5,cn=config
+objectclass: top
+objectclass: extensibleObject
+cn: changelog5
+nsslapd-changelogdir: /etc/dirsrv/slapd-scripts/changelogdb
+
+    5. Ok, now go to your $MASTER server that you picked (it should have
+       been one of the hosts mentioned in nsDS5ReplicaBindDN) and tell
+       it to replicate to $SLAVE.
+
+       The last line runs the replication.  This is perhaps the most
+       risky step of the process; see below for help debugging problems.
+
+       WARNING: There is a known bug doing full updates from 1.2.6 to
+       1.2.6, see https://bugzilla.redhat.com/show_bug.cgi?id=637852
+
+add cn="GSSAPI Replication to $SLAVE", cn=replica, cn="dc=scripts,dc=mit,dc=edu", cn=mapping tree, cn=config
+objectClass: top
+objectClass: nsDS5ReplicationAgreement
+cn: "GSSAPI Replication to $SLAVE"
+cn: GSSAPI Replication to $SLAVE
+nsDS5ReplicaHost: $SLAVE
+nsDS5ReplicaRoot: dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaPort: 389
+nsDS5ReplicaTransportInfo: LDAP
+nsDS5ReplicaBindDN: uid=ldap/$MASTER,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindMethod: SASL/GSSAPI
+nsDS5ReplicaUpdateSchedule: "0000-2359 0123456"
+nsDS5ReplicaTimeout: 120
+nsDS5BeginReplicaRefresh: start
+
+    5. Check that the replication is running; the status will be stored
+    in the object we've been mucking around with.
+
+    If it fails with LDAP Error 49, check /var/log/dirsrv on $MASTER
+    for more information.  It might be because fedora-ds can't read
+    /etc/dirsrv/keytab
+
+    6. Replicate in the other direction.  On $MASTER, add $SLAVE
+    as a nsDS5ReplicaBindDN in cn=replica,cn="dc=scripts,dc=mit,dc=edu",cn=mapping tree,cn=config
+    Also, add an account for $SLAVE
+
+add uid=ldap/$SLAVE,ou=People,dc=scripts,dc=mit,dc=edu
+uid: ldap/$SLAVE
+objectClass: account
+objectClass: top
+
+    On $SLAVE,
+
+add cn="GSSAPI Replication to $MASTER", cn=replica, cn="dc=scripts,dc=mit,dc=edu", cn=mapping tree, cn=config
+objectClass: top
+objectClass: nsDS5ReplicationAgreement
+cn: "GSSAPI Replication to $MASTER"
+cn: GSSAPI Replication to $MASTER
+nsDS5ReplicaHost: $MASTER
+nsDS5ReplicaRoot: dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaPort: 389
+nsDS5ReplicaTransportInfo: LDAP
+nsDS5ReplicaBindDN: uid=ldap/$SLAVE,ou=People,dc=scripts,dc=mit,dc=edu
+nsDS5ReplicaBindMethod: SASL/GSSAPI
+nsDS5ReplicaUpdateSchedule: "0000-2359 0123456"
+nsDS5ReplicaTimeout: 120
+
+    If you get a really scary internal server error, that might mean you
+    forgot to initialize the changelog.  Remove the replication
+    agreement (you'll need to turn off dirsrv), add the changelog, and
+    then try again.
+
+Troubleshooting
+===============
+
+LDAP multimaster replication can fail in a number of colorful ways;
+combine that with GSSAPI authentication and it goes exponential.
+
+If authentication is failing with LDAP error 49, check if:
+
+    * /etc/dirsrv/keytab
+    * fedora-ds is able to read /etc/dirsrv/keytab
+    * /etc/hosts has not been modified by Network Manager (you
+      /did/ uninstall it, right? Right?)
+
+If the failure is local to a single master, usually you can recover
+by asking another master to refresh that master with:
+
+nsDS5BeginReplicaRefresh: start
+
+In practice, we've also had problems with this technique.  Some of them
+include:
+
+* Something like https://bugzilla.redhat.com/show_bug.cgi?id=547503
+  on Fedora 11 ns-slapd, where replication is turned off to do the
+  replication, but then it wedges and you need to forcibly kill the
+  process.
+
+* Failed LDAP authentication because another master attempted to do
+  an incremental update.
+
+* Repropagation of the error because the corrupt master thinks it still
+  should push updates.
+
+So the extremely safe method to bring up a crashed master is as follows:
+
+1. Disable all incoming and outgoing replication agreements by editing
+   /etc/dirsrv/slapd-scripts/dse.ldif. You'll need to munge:
+
+   nsDS5ReplicaBindDN in cn=replica,cn=dc\3Dscripts\2Cdc\3Dmit\2Cdc\3Dedu,cn=mapping tree,cn=config
+
+   and all of the push agreements.  Deleting them outright works, but
+   means you'll have to reconstruct all of the agreements from scratch.
+
+2. Bring up the server.
+
+3. Accept incoming replication data from a single server.
+
+4. Initiate a full update from that server.
+
+5. Finish setting up replication as described above.
+
+If your database gets extremely fucked, other servers may not be able
+to authenticate because your authentication information has gone missing.
+In that case, the minimal set of entries you need is:
+
+add dc=scripts,dc=mit,dc=edu
+objectClass: top
+objectClass: domain
+dc: scripts
+
+add ou=People,dc=scripts,dc=mit,dc=edu
+objectClass: top
+objectClass: organizationalunit
+ou: People
+
+add uid=ldap/whole-enchilada.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+objectClass: account
+objectClass: top
+uid: ldap/whole-enchilada.mit.edu
Index: branches/fc15-dev/server/doc/install-xen
===================================================================
--- branches/fc15-dev/server/doc/install-xen	(revision 1803)
+++ branches/fc15-dev/server/doc/install-xen	(revision 1803)
@@ -0,0 +1,48 @@
+# install Hardy
+# this involves complicated partitioning (with lvm)
+# the popular version of Grub doesn't cope with this.
+# Thus, we need a boot partition not under LVM
+# allocate about 1G for /root ext3 filesystem
+# partition the two disks the same way
+# that means you have two disks, each with a 1G partition and
+# a "rest-of-the-space"G partition
+# now, combine the two 1G partitions into a RAID 1 (as /boot ext3)
+# take the two other partitions, another RAID 1 (set up as lvm)
+# create one volume group the same as the host
+# in that volume group, create two lvs one of them named root (ext3)
+# and one named swap (copy sizes, 10G root and 2G swap)
+# F11 will suggest ext4, DON'T USE IT.
+#   - New filesystem, so it's scary
+#   - The hosts can't mount it
+#   - Grub can't cope with it
+
+# enable backports (because Xen 3.3 is in hardy backports)
+    apt-get update
+    apt-get dist-upgrade
+# install Xen
+    apt-get install ubuntu-xen-server
+# download Debathena archive key, verify
+    apt-key add ...
+# add Debathena repos to etc/apt.d/sources.list
+# install Debathena software
+    apt-get install debathena-clients
+# compare packages with another server
+dpkg -l
+# reconfigure so that we can get an MTA, although we don't
+# want the hosts to accept mail (smart host, does not take mail)
+# outgoing.mit.edu
+    dpkg reconfigure xm4-config
+        # answer questions properly
+# change root alias in /etc/aliases to be the same as scripts server
+# reload it
+    newaliases
+# ssh key for host...
+# install host keytab
+# copy conserver config (we need to version this)
+# clone the xen config (/etc/xen)
+    git clone ssh://scripts@scripts.mit.edu/mit/scripts/git/xen.git /etc/xen
+
+# setup conserver
+    cat /etc/conserver/console.cf # add the correct entires here
+    visudo # add conservr to sudoers list with:
+        conservr ALL=(ALL) NOPASSWD: /usr/sbin/xm console *
Index: branches/fc15-dev/server/doc/install-xvm
===================================================================
--- branches/fc15-dev/server/doc/install-xvm	(revision 1803)
+++ branches/fc15-dev/server/doc/install-xvm	(revision 1803)
@@ -0,0 +1,48 @@
+Installing a test scripts server on XVM
+=======================================
+
+It's useful to have a less secure scripts server for testing
+purposes.  Here's what you have to do:
+
+1. Creating the VM
+------------------
+
+To authenticate to xvm.mit.edu with root tickets, you need
+a browser that suppors SPNEGO;  Firefox is one such browser and
+the following instructions will assume it.  Browse to about:config
+and modify the key 'network.negotiate-auth.trusted-uris' to be
+
+    https://xvm.mit.edu:442/*
+
+Then, with active root tickets on your system, navigate to
+
+    https://xvm.mit.edu:442/
+
+You should be logged in as root, and if you are on scripts-root
+you should be able to assign ownership to scripts.
+
+[XXX: there should be a way to do this with remctl too]
+
+2. Spin up
+----------
+
+These instructions are mostly the same as the latter part of
+install-fedora, with the following changes:
+
+VNC
+---
+
+You will not need to sketchily forward VNC, because XVM has a built
+in VNC console.
+
+Password
+--------
+
+Do NOT use the scripts-root password.  Pick something else.
+
+Disks
+-----
+
+The standard Scripts setup has separate LVM partitions for root and
+swap, as well as a non-LVM partition for boot.  You will not have this
+for XVM, so the Fedora defaults mostly work.  Don't use ext4 though.
Index: branches/fc15-dev/server/doc/kernel-build-howto
===================================================================
--- branches/fc15-dev/server/doc/kernel-build-howto	(revision 1803)
+++ branches/fc15-dev/server/doc/kernel-build-howto	(revision 1803)
@@ -0,0 +1,34 @@
+<Build kernel>
+
+[root@old-faithful ~]# su - scripts-build
+[scripts-build@old-faithful ~]$ wget -N http://download.fedora.redhat.com/pub/fedora/linux/updates/testing/7/SRPMS/kernel-2.6.23.1-28.fc7.src.rpm
+[scripts-build@old-faithful ~]$ rpm -i kernel-2.6.23.1-28.fc7.src.rpm
+[scripts-build@old-faithful ~]$ cd rpmbuild/SOURCES
+[scripts-build@old-faithful SOURCES]$ wget -N http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.tar.bz2
+[scripts-build@old-faithful SOURCES]$ wget -N http://kernel.org/pub/linux/kernel/v2.6/patch-2.6.23.8.bz2
+[scripts-build@old-faithful SOURCES]$ rename 2.6.23.1 2.6.23.8 kernel-2.6.23.1-*.config
+[scripts-build@old-faithful SOURCES]$ cd ../SPECS
+[scripts-build@old-faithful SPECS]$ emacs kernel-2.6.spec
+ change:
+ %define build_id .scripts1
+ %define base_sublevel 23
+ %define stable_update 8
+[scripts-build@old-faithful SPECS]$ rpmbuild --with baseonly --with vanilla -bb kernel-2.6.spec
+[scripts-build@old-faithful ~]$ logout
+[root@old-faithful ~]# cp -a /home/scripts-build/rpmbuild/RPMS/x86_64/kernel-vanilla*-2.6.23.8-28.scripts1.fc7.x86_64.rpm .
+[root@old-faithful ~]# rpm -ivh kernel-vanilla{,-devel}-2.6.23.8-28.scripts1.fc7.x86_64.rpm
+
+You can build kernel-firmware, which is a bunch of binary blobs for
+hardware, by running the mock build with --arch=noarch.
+
+<Build kmod-openafs>
+
+[root@old-faithful ~]# su scripts-build -
+[scripts-build@old-faithful ~]$ cd repository
+[scripts-build@old-faithful repository]$ svn up
+[scripts-build@old-faithful repository]$ cd server/fedora
+[scripts-build@old-faithful fedora]$ make openafs-kernel kernvers=2.6.23.8-28.scripts1.fc7
+[scripts-build@old-faithful fedora]$ logout
+[root@old-faithful ~]# cp -a /home/scripts-build/rpmbuild/RPMS/x86_64/kmod-openafs-1.4.5-1.2.6.23.8_28.scripts1.fc7.x86_64.rpm .
+[root@old-faithful ~]# rpm -ivh kmod-openafs-1.4.5-1.2.6.23.8_28.scripts1.fc7.x86_64.rpm
+
Index: branches/fc15-dev/server/doc/ldap-kerberos-replication.txt
===================================================================
--- branches/fc15-dev/server/doc/ldap-kerberos-replication.txt	(revision 1803)
+++ branches/fc15-dev/server/doc/ldap-kerberos-replication.txt	(revision 1803)
@@ -0,0 +1,93 @@
+How to migrate from SSL authentication to GSSAPI authentication
+===============================================================
+
+    :author: Edward Z. Yang <ezyang>
+    :author: Geoffrey Thomas <geofft>
+
+NOTE: This document is strictly for HISTORICAL purposes.  It may
+come in handy if you ever need to migrate from SSL to GSSAPI on
+another LDAP setup, though!  This assumes that ldap service keytabs
+are setup properly on all hosts involved.
+
+----
+
+On $CONSUMER (e.g. real-mccoy.mit.edu)
+
+To cn=replica,cn="dc=scripts,dc=mit,dc=edu",cn=mapping tree,cn=config:
+Add nsDS5ReplicaBindDN: uid=ldap/$PRODUCER,ou=People,dc=scripts,dc=mit,dc=edu
+    This tells the CONSUMER to accept replication pushes from PRODUCER.
+    However, PRODUCER is not configured yet, so you should keep
+    the cn=repman,cn=config entry which is old style.
+
+Create uid=ldap/$PRODUCER,ou=People,dc=scripts,dc=mit,dc=edu
+uid: ldap/$PRODUCER
+objectClass: account
+objectClass: top
+    This creates the LDAP user entry for GSSAPI authentication via the
+    service keytab of LDAP replication.  This information /is/
+    replicated, so if you felt like it you could create entries for all
+    PRODUCERS (which, in full multimaster replication, is all servers.)
+
+----
+
+On $PRODUCER (e.g. cats-whiskers.mit.edu)
+    You will destroy and recreate a replication agreement (well,
+    actually, ldapvi will attempt to create and then destroy the old
+    agreement).
+
+To cn="SSL Replication to $CONSUMER",cn=replica,cn="dc=scripts,dc=mit,dc=edu",cn=mapping tree,cn=config
+Replace all instances of "SSL Replication" to "GSSAPI Replication"
+Replace the number on the entry with 'add'; to indicate destroy/recreate
+Replace nsDS5ReplicaBindDN: uid=ldap/cats-whiskers.mit.edu,ou=People,dc=scripts,dc=mit,dc=edu
+    (instead of cn=repman,cn=config)
+Replace nsDS5ReplicaTransportInfo: LDAP
+    (instead of SSL)
+Replace nsDS5ReplicaPort: 389
+    (instead of 636)
+Replace nsDS5ReplicaBindMethod: SASL/GSSAPI
+    (instead of simple)
+Remove nsDS5ReplicaCredentials
+
+Here are some search-replace lines that will probably do what you want,
+but be sure to double check how many substitutions were made. '<,'> lines
+should exclude the cn=replica section.
+
+    # n = NUMBER OF SERVERS - 1 = 4
+    # n*3 substitutions
+    :%s/SSL Replication/GSSAPI Replication/g
+    # n substitutions
+    :'<,'>s/cn=repman,cn=config/uid=ldap\/$HOST,ou=People,dc=scripts,dc=mit,dc=edu/g
+    :%s/simple/SASL\/GSSAPI/
+    :%s/nsDS5ReplicaPort: 636/nsDS5ReplicaPort: 389/
+    :%s/SSL/LDAP/g
+    :%s/^nsDS5ReplicaCredentials.\+\n//g
+    :'<,'>s/^nsds5replicareapactive: 0\n//g
+    :%s/^[1-9] /add /g   # fix if more than 9 servers
+
+There is some cleanup that needs to happen after these values change;
+I had luck forcibly rebooting the servers and making LDAP cleanup
+after an unclean shutdown.  You can tell if this cleanup is necessary
+if LDAP refuses to start replication sessions.  This issue is known to
+clear up after several reboots or by destroying and recreating all
+replicas.
+
+----
+
+Once everything is on the new replication and you verify it's working
+correctly, you should then clean out the SSL configuration (most
+notably, turn nsslapd-security off. Despite its ominous name, it only
+controls SSL authentication, not GSSAPI authentication.)  You will need
+to take the server offline to do that; edit
+/etc/dirsrv/slapd-scripts/dse.ldif
+
+When that's gone, there may be some vestigial SSL configuration left.
+Scripts specifically had the following sections that needed to be
+cleaned up:
+
+    cn=RSA,cn=encryption,cn=config
+        (whole thing)
+    cn=encryption,cn=config
+        nsSSL3: on [change to off]
+        nsSSL3Ciphers: +rsa_rc4_128_md5 [delete]
+    cn=config
+        nsslapd-sslclientauth: on [change to off]
Index: branches/fc15-dev/server/doc/package-build-howto
===================================================================
--- branches/fc15-dev/server/doc/package-build-howto	(revision 1803)
+++ branches/fc15-dev/server/doc/package-build-howto	(revision 1803)
@@ -0,0 +1,161 @@
+This document is a how-to for building new packaages for scripts.mit.edu.
+
+Prerequisites
+=============
+
+  * A trusted scripts.mit.edu server
+  * A scripts-build account on that server (but that was created when it
+    was installed, or something's wrong)
+  * A set of personal credentials for the scripts svn repo
+
+Directions
+==========
+
+  * Log into the server as root
+
+  * /bin/su scripts-build # It's a bad idea to build as root.  This is
+                          # less urgent than it used to be, because you'll
+			  # be building using mock in a chroot, but it's
+			  # still good habit.  Also, if you work in
+			  # /srv/repository as root, scripts-build won't
+			  # be able to change some of the resulting files
+
+  * cd /srv/repository
+
+  * svn up  # Important both to build with current code, and because the
+            # svn revision becomes part of the package release number,
+	    # and you can infer whether changes in the code were made
+	    # before or after a particular build by looking at the package
+	    # and svn release/revision.
+
+  * cd server/fedora
+
+  * # Look in the .dload directory.  If you want to build with a newer
+    # version of any upstream packages that are there, then
+    * rm .dload/[OLD-PACKAGES].src.rpm # It's fine to delete all SRPMs here
+    * rm download_stamp
+
+  * make [PACKAGE-YOU-WANT] # e.g. 'make httpd' builds Apache with our patches
+    # Note that openafs-devel is a build-dependency of accountadm, so if
+    # this is a new Fedora release being bootstrapped, you'll have to
+    # build openafs and install its -devel package before building accountadm
+
+  * # If the build succeeds, the mock logs, build log, binary and SRPMs
+    # will be in /var/lib/mock/fedora-[RELEASE]-{x86_64|i386}/result (note that
+    # this will be cleared out each time you start a new build, so if
+    # you're building several packages in succession, copy the results
+    # somewhere safe after each build to preserve them)
+    # Add the packages to the repository by using a trusted machine and
+    krootscp root@[BUILD-SERVER]:/var/lib/mock/fedora-[RELEASE]-{x86_64|i386}/result /mit/scripts/rpm-fc[RELEASE]
+
+  * # Rebuild the repo metadata to include the new packages.
+    cd /mit/scripts/rpm-fc[RELEASE]
+    # If you have a trusted machine:
+    createrepo .
+    # Otherwise, on a scripts server, as root:
+    mkdir /root/repodata-YYYYMMDD # Or any suitable temp directory
+    createrepo -o /root/repodata-YYYYMMDD .
+    # Then from your trusted machine
+    krootscp -r root@[BUILD-SERVER]:/root/repodata-YYYYMMDD /mit/scripts/rpm-fc[RELEASE]
+    # Sanity check the files, and then replace the current repodata directory
+    # with the one in repodata-YYYYMMDD.
+
+Patching packages
+=================
+
+  * To make changes to the packages that we are the upstream maintainers
+    of (that is, the packages that the Scripts Team wrote):
+    * The authoritative source lives in server/common/oursrc/[PACKAGE]
+    * The RPM spec file is server/fedora/specs/[PACAKGE].spec
+    * You directly make the relevant changes to those files, commit to
+      svn, and then rebuild the package as above to include the new changes.
+
+  * To make changes to the upstream packages that we "scriptsify":
+
+    * If we haven't previously scriptsified this package, you'll need
+      to add it to the upstream_yum line in SVN/server/fedora/Makefile,
+      and remove the download_stamp file so that it gets fetched next
+      time you run 'make [PACKAGE]'.
+
+    * The authoritative upstream source comes from the SRPM in the upstream
+      yum repo, or in odd cases like openafs, from some other URL.  When
+      you 'make [PACKAGE]' in SVN/server/fedora, if download_stamp has
+      been removed, the SRPMs are all refetched into
+      SVN/server/fedora/.dload, and then installed with 'rpm -i'.  This
+      results in the source patches, and tarballs landing in ~/rpmbuild/SOURCES
+      and the spec files landing in ~/rpmbuild/SPECS.  You can also
+      manually get individual SRPMs for a package by doing this (these
+      steps work fine as a mortal user, including the 'rpm -i'):
+      * yumdownloader --source [PACKAGE]
+        # That deposits [PACKAGE]-[VER]-[RELEASE].src.rpm in the current dir
+      * rpm -i [PACAKGE]-[VER]-[RELEASE].src.rpm
+        # That unpacks the SRPM, placing the source tarball and patches in
+	# ~/rpmbuild/SOURCES and the spec file in ~/rpmbuild/SPECS; it
+	# does *not* globally install anything, and doesn't require root
+      If you prefer to not install the file, you can simply extract it
+      into a directory by running:
+      * /mit/ghudson/scripts/rpmx [PACKAGE]-[VER]-[RELEASE].src.rpm
+
+    * If you develop a patch to the upstream source, you should save a
+      diff with your changes and add it to the repo as
+      SVN/server/common/patches/[PACKAGE]-[SHORT_DESCRIPTIVE_STRING].patch
+
+    * To cause your patch to be applied when the package is built, you
+      will need to save a copy of the original spec file for the upstream
+      package, then modify it to add a line like:
+        Patch[NUM]: [PACKAGE]-[SHORT_DESCRIPTOVE_STRING].patch
+	# This should generally go after the last existing Patch line
+	# in the file, and [NUM] should be significantly larger than
+	# the upstream Fedora patches, to avoid conflicts later.  This
+	# line tells rpmbuild where the contents of the patch live.
+      You also add a line like:
+        %patch[NUM] -p1 -b .[SHORT_DESCRIPTIVE_STRING]
+	# This should generally go after the last existing %patch line
+	# in the file, [NUM] should be the same as in the Patch line, and
+	# tells rpmbuild that this is the point at which to actually apply
+	# the patch
+
+    * The Release tag in the spec file should have ".scripts.%{scriptsversion}
+      inserted into it just before %{?dist}, or at the end of the release
+      if %{?dist} is unused.
+      # e.g.          Release: 1%{?dist}
+      # changes to    Release: 1.scripts.%{scriptsversion}%{?dist}
+      This causes the package version to include the string "scripts"
+      and our SVN revision number (which is set by the Makefile) for
+      easy identification (this version will also be greater than the
+      upstream version, so the system will prefer to update to it).
+
+    * If the scriptsified version of the package needs to be installed
+      on the servers, and a new upstream version would break scripts
+      without our changes, add a line like this:
+        Provides: scripts-[PACKAGE]
+      and correspondingly, add "scripts-[PACKAGE]" to the Requires line
+      in SVN/server/fedora/specs/scripts-base.spec (and remember to
+      build, upload, and deploy a new scripts-base package)
+
+    * Though we're not always good about it, do feel encouraged to add
+      an entry at the top of the %changelog section near the bottom of
+      the spec file explaining your modifications
+
+    * When you're finished with the updates to the upstream spec file,
+      create a diff from the upstream spec file to your new version,
+      and add it to the SVN repo as
+        SVN/server/fedora/specs/[PACKAGE].spec.patch
+      Make sure to copy it there before you try to build the package,
+      since if you don't mock will use the original specfile (and
+      overwrite any changes you made in place).
+
+Replacing the source of packages
+===============================
+
+    * Patch the specfile to have an alternate Source0 (or SourceX) URL
+      pointing to the updated source of the package.  You will then
+      need to add a spectool line to the Makefile to ensure this new
+      source gets downloaded on build:
+        spectool -g -R $(specs)/PACKAGE-NAME.spec
+
+Tips
+====
+
+    * Don't try to build a 32-bit package without building the 64-bit
+      package as well.
Index: branches/fc15-dev/server/doc/rpm
===================================================================
--- branches/fc15-dev/server/doc/rpm	(revision 1803)
+++ branches/fc15-dev/server/doc/rpm	(revision 1803)
@@ -0,0 +1,3 @@
+In order to transfer rpms from one machine to another:
+
+rpm -qa --queryformat "%{Name}.%{Arch}\n" | sort
Index: branches/fc15-dev/server/doc/rpm_snapshot
===================================================================
--- branches/fc15-dev/server/doc/rpm_snapshot	(revision 1803)
+++ branches/fc15-dev/server/doc/rpm_snapshot	(revision 1803)
@@ -0,0 +1,1353 @@
+a2ps.x86_64
+a52dec.x86_64
+accountadm.x86_64
+acl.x86_64
+acpid.x86_64
+adns.x86_64
+alsa-lib.i386
+alsa-lib.x86_64
+anacron.x86_64
+antlr.x86_64
+apr-devel.i386
+apr-devel.x86_64
+apr.i386
+apr-util-devel.i386
+apr-util-devel.x86_64
+apr-util.i386
+apr-util.x86_64
+apr.x86_64
+aspell-devel.x86_64
+aspell-en.x86_64
+aspell.i386
+aspell.x86_64
+athena-lprng.i386
+atk-devel.x86_64
+atk.i386
+atk.x86_64
+atlas.x86_64
+attr.x86_64
+at.x86_64
+audiofile.x86_64
+audit-libs-devel.i386
+audit-libs-devel.x86_64
+audit-libs.i386
+audit-libs-python.x86_64
+audit-libs.x86_64
+audit.x86_64
+authconfig.x86_64
+autoconf.noarch
+autofs.x86_64
+automake.noarch
+avahi-glib.x86_64
+avahi.x86_64
+basesystem.noarch
+bash-completion.noarch
+bash.x86_64
+bc.x86_64
+beecrypt-devel.x86_64
+beecrypt.x86_64
+bind-libs.x86_64
+bind-utils.x86_64
+bind.x86_64
+binutils.x86_64
+bison.x86_64
+bitstream-vera-fonts.noarch
+blas.x86_64
+bluez-gnome.x86_64
+bluez-hcidump.x86_64
+bluez-libs.x86_64
+boost.x86_64
+busybox.x86_64
+bwidget.noarch
+byacc.x86_64
+bzip2-devel.x86_64
+bzip2-libs.x86_64
+bzip2.x86_64
+caching-nameserver.x86_64
+cadaver.x86_64
+cairo-devel.x86_64
+cairo.i386
+cairo.x86_64
+ccid.x86_64
+checkpolicy.x86_64
+chkconfig.x86_64
+chkfontpath.x86_64
+chkrootkit.x86_64
+clearsilver.x86_64
+compat-db.x86_64
+compat-readline43.i386
+compat-readline43.x86_64
+ConsoleKit-libs.x86_64
+ConsoleKit.x86_64
+coolkey.i386
+coolkey.x86_64
+coreutils.x86_64
+cpan2rpm.noarch
+cpio.x86_64
+cpp.x86_64
+cpuspeed.x86_64
+cracklib-dicts.x86_64
+cracklib.i386
+cracklib.x86_64
+crash.x86_64
+crontabs.noarch
+cryptsetup-luks.i386
+cryptsetup-luks.x86_64
+cups-libs.i386
+cups-libs.x86_64
+cups.x86_64
+curl-devel.x86_64
+curl.i386
+curl.x86_64
+cvs.x86_64
+cyrus-sasl-devel.x86_64
+cyrus-sasl-gssapi.x86_64
+cyrus-sasl-lib.i386
+cyrus-sasl-lib.x86_64
+cyrus-sasl-md5.x86_64
+cyrus-sasl-plain.x86_64
+cyrus-sasl.x86_64
+db4-devel.x86_64
+db4.i386
+db4-java.x86_64
+db4.x86_64
+dbus-glib.x86_64
+dbus.i386
+dbus-python.x86_64
+dbus.x86_64
+desktop-file-utils.x86_64
+device-mapper-libs.i386
+device-mapper-libs.x86_64
+device-mapper-multipath.x86_64
+device-mapper.x86_64
+dhcdbd.x86_64
+dhclient.x86_64
+dhcpv6_client.x86_64
+dialog.x86_64
+diffstat.x86_64
+diffutils.x86_64
+distcache-devel.i386
+distcache-devel.x86_64
+distcache.i386
+distcache.x86_64
+Django.noarch
+dmidecode.x86_64
+dmraid.x86_64
+docbook-dtds.noarch
+docbook-style-dsssl.noarch
+docbook-style-xsl.noarch
+docbook-utils.noarch
+dos2unix.x86_64
+dosfstools.x86_64
+dump.x86_64
+e2fsprogs-devel.x86_64
+e2fsprogs-libs.i386
+e2fsprogs-libs.x86_64
+e2fsprogs.x86_64
+eclipse-ecj.x86_64
+ed.x86_64
+eject.x86_64
+elfutils-devel-static.x86_64
+elfutils-devel.x86_64
+elfutils-libelf-devel-static.x86_64
+elfutils-libelf-devel.x86_64
+elfutils-libelf.i386
+elfutils-libelf.x86_64
+elfutils-libs.x86_64
+elfutils.x86_64
+elinks.x86_64
+emacs-common.x86_64
+emacs.x86_64
+enscript.x86_64
+esound-libs.x86_64
+esound.x86_64
+ethtool.x86_64
+execsys.x86_64
+exiv2.x86_64
+exo.x86_64
+expat-devel.i386
+expat-devel.x86_64
+expat.i386
+expat.x86_64
+expect-devel.x86_64
+expect.x86_64
+faac.x86_64
+faad2.x86_64
+fakeroot.x86_64
+fbida.x86_64
+fbset.x86_64
+fedora-ds-base.x86_64
+fedora-logos.noarch
+fedora-release.noarch
+fedora-release-notes.noarch
+fedora-usermgmt-core.noarch
+fedora-usermgmt-default-fedora-setup.noarch
+fedora-usermgmt.noarch
+fedora-usermgmt-shadow-utils.noarch
+fetchmail.x86_64
+ffmpeg.x86_64
+file-libs.x86_64
+filesystem.x86_64
+file.x86_64
+findutils.x86_64
+finger.x86_64
+firstboot-tui.noarch
+flex.x86_64
+fontconfig-devel.x86_64
+fontconfig.i386
+fontconfig.x86_64
+foomatic.x86_64
+freeglut.x86_64
+freetype-devel.x86_64
+freetype.i386
+freetype.x86_64
+freshrpms-release.noarch
+ftp.x86_64
+gamin.x86_64
+gawk.x86_64
+gcc-c++.x86_64
+gcc-java.x86_64
+gcc.x86_64
+GConf2.x86_64
+gc.x86_64
+gdbm-devel.i386
+gdbm-devel.x86_64
+gdbm.i386
+gdbm.x86_64
+gdb.x86_64
+gd-devel.x86_64
+gd.i386
+gd.x86_64
+genisoimage.x86_64
+gettext-devel.x86_64
+gettext.x86_64
+ghostscript-fonts.noarch
+ghostscript.x86_64
+giflib.x86_64
+glib2-devel.x86_64
+glib2.i386
+glib2.x86_64
+glibc-common.x86_64
+glibc-devel.x86_64
+glibc-headers.x86_64
+glibc.i686
+glibc.x86_64
+glib.x86_64
+gmp-devel.x86_64
+gmp.i386
+gmp.x86_64
+gnome-keyring.x86_64
+gnome-mime-data.noarch
+gnome-mount.x86_64
+gnome-themes.noarch
+gnome-vfs2.x86_64
+gnupg.x86_64
+gnuplot.x86_64
+gnutls.i386
+gnutls.x86_64
+gpg-pubkey.(none)
+gpg-pubkey.(none)
+gpg-pubkey.(none)
+gpm.i386
+gpm.x86_64
+graphviz-devel.x86_64
+graphviz-graphs.x86_64
+graphviz-guile.x86_64
+graphviz-java.x86_64
+graphviz-ocaml.x86_64
+graphviz-perl.x86_64
+graphviz-python.x86_64
+graphviz-ruby.x86_64
+graphviz-sharp.x86_64
+graphviz-tcl.x86_64
+graphviz.x86_64
+grep.x86_64
+groff-perl.x86_64
+groff.x86_64
+grub.x86_64
+gsl.x86_64
+gsm.x86_64
+gtk2-devel.i386
+gtk2-devel.x86_64
+gtk2-engines.x86_64
+gtk2.i386
+gtk2.x86_64
+guile.x86_64
+gzip.x86_64
+hal-info.noarch
+hal-libs.i386
+hal-libs.x86_64
+hal.x86_64
+hardlink.x86_64
+hdparm.x86_64
+heartbeat.x86_64
+hesinfo.x86_64
+hesiod-devel.i386
+hesiod-devel.x86_64
+hesiod.i386
+hesiod.x86_64
+hicolor-icon-theme.noarch
+highlight.x86_64
+htmlview.noarch
+httpd-devel.i386
+httpd-devel.x86_64
+httpd-manual.x86_64
+httpdmods.x86_64
+httpd.x86_64
+hwdata.noarch
+ifd-egate.x86_64
+iftop.x86_64
+ImageMagick.x86_64
+imake.x86_64
+imlib2.x86_64
+info.x86_64
+initscripts.x86_64
+iproute.x86_64
+ipsec-tools.x86_64
+iptables-ipv6.x86_64
+iptables.x86_64
+iptraf.x86_64
+iptstate.x86_64
+iputils.x86_64
+ipvsadm.x86_64
+ipython.noarch
+irda-utils.x86_64
+irqbalance.x86_64
+isdn4k-utils.x86_64
+java-1.5.0-gcj-devel.x86_64
+java-1.5.0-gcj.x86_64
+java-1.6.0-sun-devel.x86_64
+java-1.6.0-sun-src.x86_64
+java-1.6.0-sun.x86_64
+java_cup.x86_64
+jhead.x86_64
+jpackage-utils.noarch
+jwhois.x86_64
+kakasi.x86_64
+kbd.x86_64
+kernel-devel.x86_64
+kernel-devel.x86_64
+kernel-headers.x86_64
+kernel-vanilla-devel.x86_64
+kernel-vanilla.x86_64
+kernel.x86_64
+kexec-tools.x86_64
+keyutils-libs-devel.i386
+keyutils-libs-devel.x86_64
+keyutils-libs.i386
+keyutils-libs.x86_64
+kmod-openafs.x86_64
+kmod-openafs.x86_64
+kpartx.x86_64
+krb5-devel.x86_64
+krb5-libs.i386
+krb5-libs.x86_64
+krb5-workstation.x86_64
+ksh.x86_64
+kudzu.x86_64
+lame.x86_64
+lcms.x86_64
+ldirectord.x86_64
+less.x86_64
+lftp.x86_64
+libacl.x86_64
+libaio.x86_64
+libart_lgpl.x86_64
+libattr.x86_64
+libavc1394.x86_64
+libbonoboui.x86_64
+libbonobo.x86_64
+libcap.i386
+libcap.x86_64
+libc-client2006.i386
+libc-client2006.x86_64
+libcdio.x86_64
+libcroco.x86_64
+libdaemon.x86_64
+libdhcp4client.x86_64
+libdhcp6client.x86_64
+libdhcp.x86_64
+libdrm.x86_64
+libdv.x86_64
+libevent.x86_64
+libexif.x86_64
+libfontenc.x86_64
+libFS.x86_64
+libgcc.i386
+libgcc.x86_64
+libgcj-devel.x86_64
+libgcj.i386
+libgcj-src.x86_64
+libgcj.x86_64
+libgcrypt-devel.x86_64
+libgcrypt.i386
+libgcrypt.x86_64
+libgdiplus.x86_64
+libgfortran.x86_64
+libglade2.x86_64
+libgnomecanvas.x86_64
+libgnomeui.x86_64
+libgnome.x86_64
+libgomp.x86_64
+libgpg-error-devel.x86_64
+libgpg-error.i386
+libgpg-error.x86_64
+libgsf.x86_64
+libgssapi.x86_64
+libICE.i386
+libICE.x86_64
+libicu.x86_64
+libid3tag.x86_64
+libIDL.x86_64
+libidn-devel.x86_64
+libidn.i386
+libidn.x86_64
+libjpeg-devel.i386
+libjpeg-devel.x86_64
+libjpeg.i386
+libjpeg.x86_64
+libmng.x86_64
+libmp4v2.x86_64
+libnetfilter_conntrack.x86_64
+libnfnetlink.x86_64
+libnl.x86_64
+libnotify.x86_64
+libogg-devel.x86_64
+libogg.i386
+libogg.x86_64
+libpcap.x86_64
+libpng-devel.x86_64
+libpng.i386
+libpng.x86_64
+libraw1394.x86_64
+librsvg2.x86_64
+libselinux-devel.i386
+libselinux-devel.x86_64
+libselinux.i386
+libselinux-python.x86_64
+libselinux.x86_64
+libsemanage.x86_64
+libsepol-devel.x86_64
+libsepol.i386
+libsepol.x86_64
+libsigsegv.x86_64
+libsmbios-libs.x86_64
+libSM.i386
+libSM.x86_64
+libstatgrab.x86_64
+libstdc++-devel.x86_64
+libstdc++.i386
+libstdc++.x86_64
+libsysfs.x86_64
+libtermcap-devel.x86_64
+libtermcap.i386
+libtermcap.x86_64
+libthai.i386
+libthai.x86_64
+libtheora-devel.i386
+libtheora-devel.x86_64
+libtheora.i386
+libtheora.x86_64
+libtiff.i386
+libtiff.x86_64
+libtirpc.x86_64
+libtool-ltdl.x86_64
+libtool.x86_64
+libusb.x86_64
+libuser.i386
+libuser.x86_64
+libutempter.i386
+libutempter.x86_64
+libvolume_id.x86_64
+libvorbis-devel.i386
+libvorbis-devel.x86_64
+libvorbis.i386
+libvorbis.x86_64
+libwmf.x86_64
+libwnck.x86_64
+libwvstreams.x86_64
+libX11-devel.x86_64
+libX11.i386
+libX11.x86_64
+libXau-devel.x86_64
+libXau.i386
+libXau.x86_64
+libXaw.x86_64
+libXcursor-devel.x86_64
+libXcursor.i386
+libXcursor.x86_64
+libXdmcp-devel.x86_64
+libXdmcp.i386
+libXdmcp.x86_64
+libXext-devel.x86_64
+libXext.i386
+libXext.x86_64
+libxfce4mcs.x86_64
+libxfce4util.x86_64
+libxfcegui4.x86_64
+libXfixes-devel.x86_64
+libXfixes.i386
+libXfixes.x86_64
+libXfontcache.x86_64
+libXfont.x86_64
+libXft-devel.x86_64
+libXft.i386
+libXft.x86_64
+libXi-devel.x86_64
+libXi.i386
+libXinerama-devel.x86_64
+libXinerama.i386
+libXinerama.x86_64
+libXi.x86_64
+libxkbfile.x86_64
+libxml2-devel.x86_64
+libxml2.i386
+libxml2-python.x86_64
+libxml2.x86_64
+libXmu.x86_64
+libXp.i386
+libXpm-devel.x86_64
+libXpm.i386
+libXpm.x86_64
+libXp.x86_64
+libXrandr-devel.x86_64
+libXrandr.i386
+libXrandr.x86_64
+libXrender-devel.x86_64
+libXrender.i386
+libXrender.x86_64
+libXres.x86_64
+libxslt-devel.x86_64
+libxslt.i386
+libxslt.x86_64
+libXt.i386
+libXTrap.x86_64
+libXtst.i386
+libXtst.x86_64
+libXt.x86_64
+libXxf86misc.x86_64
+libXxf86vm.x86_64
+lm_sensors-devel.x86_64
+lm_sensors.x86_64
+lockdev.x86_64
+logrotate.x86_64
+logview.x86_64
+logwatch.noarch
+lrzsz.x86_64
+lsof.x86_64
+ltrace.x86_64
+lvm2.x86_64
+lynx.x86_64
+lzo.x86_64
+m4.x86_64
+mailcap.noarch
+mailx.x86_64
+MAKEDEV.x86_64
+make.x86_64
+man-pages.noarch
+man.x86_64
+mcelog.x86_64
+mcstrans.x86_64
+mdadm.x86_64
+mesa-libGL-devel.x86_64
+mesa-libGLU.x86_64
+mesa-libGL.x86_64
+mgetty.x86_64
+microcode_ctl.x86_64
+mikmod.x86_64
+mingetty.x86_64
+minicom.x86_64
+mit-lprng.x86_64
+mit-zephyr.i386
+mkbootdisk.x86_64
+mkinitrd.x86_64
+mktemp.x86_64
+mlocate.x86_64
+mod_auth_kerb.x86_64
+mod_dav_svn.x86_64
+mod_fcgid.x86_64
+mod_perl.x86_64
+mod_python.x86_64
+mod_ssl.x86_64
+module-init-tools.x86_64
+mono-core.x86_64
+mono-data.x86_64
+mono-web.x86_64
+mono-winforms.x86_64
+mozldap-tools.x86_64
+mozldap.x86_64
+mtools.x86_64
+mtr.x86_64
+munin-node.noarch
+mutt.x86_64
+mx.x86_64
+mysqlclient10-devel.x86_64
+mysqlclient10.x86_64
+mysqlclient14-devel.x86_64
+mysqlclient14.x86_64
+mysql-devel.x86_64
+mysql-libs.i386
+mysql-libs.x86_64
+MySQL-python.x86_64
+mysql.x86_64
+nagios-plugins-disk.x86_64
+nagios-plugins-load.x86_64
+nagios-plugins-procs.x86_64
+nagios-plugins-users.x86_64
+nagios-plugins.x86_64
+nail.x86_64
+nano.x86_64
+nash.x86_64
+ncurses-devel.i386
+ncurses-devel.x86_64
+ncurses.i386
+ncurses.x86_64
+nc.x86_64
+neon-devel.x86_64
+neon.i386
+neon.x86_64
+netpbm-progs.x86_64
+netpbm.x86_64
+net-snmp-devel.x86_64
+net-snmp-libs.x86_64
+net-snmp-utils.x86_64
+net-snmp.x86_64
+net-tools.x86_64
+NetworkManager.x86_64
+newt.x86_64
+nfs-utils-lib.x86_64
+nfs-utils.x86_64
+nmap.x86_64
+notification-daemon.x86_64
+nrpe.x86_64
+nscd.x86_64
+nspr.i386
+nspr.x86_64
+nss_db.x86_64
+nss.i386
+nss_ldap.i386
+nss_ldap.x86_64
+nss-tools.x86_64
+nss.x86_64
+ntp.x86_64
+ntsysv.x86_64
+numactl.x86_64
+numpy.x86_64
+ocaml.x86_64
+openafs-client.x86_64
+openafs-devel.x86_64
+openafs-krb5.x86_64
+openafs.x86_64
+openjade.x86_64
+openldap-clients.x86_64
+openldap-devel.x86_64
+openldap.i386
+openldap.x86_64
+opensp.x86_64
+openssh-clients.x86_64
+openssh-server.x86_64
+openssh.x86_64
+openssl097a.x86_64
+openssl-devel.i386
+openssl-devel.x86_64
+openssl.i686
+openssl.x86_64
+ORBit2.x86_64
+pam_ccreds.i386
+pam_ccreds.x86_64
+pam-devel.i386
+pam-devel.x86_64
+pam.i386
+pam_krb5.i386
+pam_krb5.x86_64
+pam_passwdqc.i386
+pam_passwdqc.x86_64
+pam_pkcs11.i386
+pam_pkcs11.x86_64
+pam_smb.i386
+pam_smb.x86_64
+pam.x86_64
+pango-devel.x86_64
+pango.i386
+pango.x86_64
+paps-libs.x86_64
+paps.x86_64
+parted.i386
+parted.x86_64
+passivetex.noarch
+passwd.i386
+passwd.x86_64
+patch.i386
+patchutils.x86_64
+patch.x86_64
+pax.i386
+pax.x86_64
+pciutils.x86_64
+pcmciautils.x86_64
+pcre-devel.i386
+pcre-devel.x86_64
+pcre.i386
+pcre.x86_64
+pcsc-lite-libs.x86_64
+pcsc-lite.x86_64
+pdfjam.noarch
+perl-Algorithm-Dependency.noarch
+perl-Algorithm-Diff.noarch
+perl-Apache-LogRegex.noarch
+perl-Apache-Session.noarch
+perl-Apache-Session-Wrapper.noarch
+perl-AppConfig.noarch
+perl-Archive-Tar.noarch
+perl-Archive-Zip.noarch
+perl-Array-Compare.noarch
+perl-Authen-SASL.noarch
+perl-BerkeleyDB.x86_64
+perl-Bit-Vector.x86_64
+perl-BSD-Resource.x86_64
+perl-Business-Hours.noarch
+perl-Cache-Cache.noarch
+perl-Cache-Simple-TimedExpiry.noarch
+perl-capitalization.noarch
+perl-Carp-Assert-More.noarch
+perl-Carp-Assert.noarch
+perl-Carp-Clan.noarch
+perl-CGI-FastTemplate.noarch
+perl-CGI-FormBuilder.noarch
+perl-CGI-Simple.noarch
+perl-CGI-Untaint-date.noarch
+perl-CGI-Untaint.noarch
+perl-Class-Accessor-Chained.noarch
+perl-Class-Accessor.noarch
+perl-Class-Autouse.noarch
+perl-Class-Container.noarch
+perl-Class-Data-Inheritable.noarch
+perl-Class-DBI-AbstractSearch.noarch
+perl-Class-DBI-AsForm.noarch
+perl-Class-DBI-FromCGI.noarch
+perl-Class-DBI-Loader.noarch
+perl-Class-DBI-Loader-Relationship.noarch
+perl-Class-DBI-mysql.noarch
+perl-Class-DBI.noarch
+perl-Class-DBI-Pager.noarch
+perl-Class-DBI-Pg.noarch
+perl-Class-DBI-Plugin.noarch
+perl-Class-DBI-Plugin-RetrieveAll.noarch
+perl-Class-DBI-Plugin-Type.noarch
+perl-Class-DBI-SQLite.noarch
+perl-Class-ErrorHandler.noarch
+perl-Class-Inspector.noarch
+perl-Class-MethodMaker.x86_64
+perl-Class-ReturnValue.noarch
+perl-Class-Singleton.noarch
+perl-Class-Trigger.noarch
+perl-Class-Whitehole.noarch
+perl-clearsilver.x86_64
+perl-Clone.x86_64
+perl-Compress-Bzip2.x86_64
+perl-Compress-Zlib.x86_64
+perl-Config-General.noarch
+perl-Config-IniFiles.noarch
+perl-Config-Record.noarch
+perl-Config-Tiny.noarch
+perl-Convert-ASN1.noarch
+perl-Convert-BinHex.noarch
+perl-Convert-TNEF.noarch
+perl-Convert-UUlib.x86_64
+perl-CPAN.x86_64
+perl-Crypt-Blowfish.x86_64
+perl-Crypt-CBC.noarch
+perl-Crypt-DES.x86_64
+perl-Crypt-DH.noarch
+perl-Crypt-SSLeay.x86_64
+perl-Data-Buffer.noarch
+perl-Data-Page.noarch
+perl-Date-Calc.x86_64
+perl-DateManip.noarch
+perl-Date-Simple.x86_64
+perl-DateTime-Format-Mail.noarch
+perl-DateTime-Format-W3CDTF.noarch
+perl-DateTime.x86_64
+perl-DBD-MySQL.x86_64
+perl-DBD-Pg.x86_64
+perl-DBD-SQLite2.x86_64
+perl-DBD-SQLite.x86_64
+perl-DBI.x86_64
+perl-DBIx-ContextualFetch.noarch
+perl-DBIx-DBSchema.noarch
+perl-DBIx-SearchBuilder.noarch
+perl-Devel-Cycle.noarch
+perl-Devel-StackTrace.noarch
+perl-Devel-Symdump.noarch
+perl-devel.x86_64
+perl-Digest-BubbleBabble.noarch
+perl-Digest-HMAC.noarch
+perl-Digest-MD2.x86_64
+perl-Digest-MD4.x86_64
+perl-Digest-Nilsimsa.x86_64
+perl-Digest-SHA1.x86_64
+perl-Error.noarch
+perl-Exception-Class.noarch
+perl-Exporter-Lite.noarch
+perl-ExtUtils-AutoInstall.noarch
+perl-ExtUtils-CBuilder.noarch
+perl-ExtUtils-Depends.noarch
+perl-ExtUtils-Embed.x86_64
+perl-ExtUtils-MakeMaker.x86_64
+perl-ExtUtils-ParseXS.noarch
+perl-ExtUtils-PkgConfig.noarch
+perl-ExtUtils-XSBuilder.noarch
+perl-File-BOM.noarch
+perl-File-chmod.noarch
+perl-File-Find-Rule.noarch
+perl-File-Flat.noarch
+perl-FileHandle-Unget.noarch
+perl-File-HomeDir.noarch
+perl-File-MMagic.noarch
+perl-File-NCopy.noarch
+perl-File-Remove.noarch
+perl-File-Slurp.noarch
+perl-File-Tail.noarch
+perl-Font-AFM.noarch
+perl-FreezeThaw.noarch
+perl-Frontier-RPC.noarch
+perl-gettext.x86_64
+perl-Glib.x86_64
+perl-GnuPG-Interface.noarch
+perl-GSSAPI.x86_64
+perl-Hook-LexWrap.noarch
+perl-HTML-Format.noarch
+perl-HTML-Mason.noarch
+perl-HTML-Parser.x86_64
+perl-HTML-Scrubber.noarch
+perl-HTML-Tagset.noarch
+perl-HTML-Template-Expr.noarch
+perl-HTML-Template.noarch
+perl-HTML-Tree.noarch
+perl-HTTP-Server-Simple-Mason.noarch
+perl-HTTP-Server-Simple.noarch
+perl-Ima-DBI.noarch
+perl-Image-Base.noarch
+perl-Image-Xbm.noarch
+perl-Image-Xpm.noarch
+perl-Inline.noarch
+perl-IO-CaptureOutput.noarch
+perl-IO-Multiplex.noarch
+perl-IO-Socket-INET6.noarch
+perl-IO-Socket-SSL.noarch
+perl-IO-String.noarch
+perl-IO-stringy.noarch
+perl-IO-Tty.x86_64
+perl-IO-Zlib.noarch
+perl-IPC-Run.noarch
+perl-IPC-Shareable.noarch
+perl-IPC-SharedCache.noarch
+perl-IPC-ShareLite.x86_64
+perl-Jcode.noarch
+perl-LDAP.noarch
+perl-libintl.x86_64
+perl-libs.i386
+perl-libs.x86_64
+perl-libwww-perl.noarch
+perl-libxml-perl.noarch
+perl-Lingua-EN-Inflect.noarch
+perl-Lingua-EN-Inflect-Number.noarch
+perl-Locale-Maketext-Fuzzy.noarch
+perl-Locale-Maketext-Lexicon.noarch
+perl-Log-Dispatch.noarch
+perl-Mail-Alias.noarch
+perl-Mail-GnuPG.noarch
+perl-Mail-Mbox-MessageParser.noarch
+perl-Mail-Sender.noarch
+perl-Mail-Sendmail.noarch
+perl-Mail-SPF-Query.noarch
+perl-MailTools.noarch
+perl-MIME-Lite.noarch
+perl-MIME-tools.noarch
+perl-MIME-Types.noarch
+perl-MLDBM.noarch
+perl-Module-Build.noarch
+perl-Module-CoreList.noarch
+perl-Module-Install.noarch
+perl-Module-Refresh.noarch
+perl-Module-ScanDeps.noarch
+perl-Module-Signature.noarch
+perl-Module-Versions-Report.noarch
+perl-Mozilla-LDAP.x86_64
+perl-Net-CIDR-Lite.noarch
+perl-Net-DNS.x86_64
+perl-Net-IP-CMatch.x86_64
+perl-Net-IP.noarch
+perl-Net-Netmask.noarch
+perl-Net-Patricia.x86_64
+perl-Net-SCP.noarch
+perl-Net-Server.noarch
+perl-Net-SNMP.noarch
+perl-Net-SSH.noarch
+perl-Net-SSLeay.x86_64
+perl-Net-Telnet.noarch
+perl-NKF.x86_64
+perl-Number-Compare.noarch
+perl-OLE-Storage_Lite.noarch
+perl-PadWalker.x86_64
+perl-Params-Util.noarch
+perl-Params-Validate.x86_64
+perl-PAR-Dist.noarch
+perl-Parse-RecDescent.noarch
+perl-Parse-Yapp.noarch
+perl-PatchReader.noarch
+perl-PDL.x86_64
+perl-pmtools.noarch
+perl-Pod-Coverage.noarch
+perl-Pod-Escapes.noarch
+perl-Pod-POM.noarch
+perl-Pod-Readme.noarch
+perl-Pod-Simple.noarch
+perl-Pod-Tests.noarch
+perl-prefork.noarch
+perl-Razor-Agent.x86_64
+perl-Readonly.noarch
+perl-Readonly-XS.x86_64
+perl-Regexp-Common.noarch
+perl-RPM-Specfile.noarch
+perl-Set-IntSpan.noarch
+perl-SGMLSpm.noarch
+perl-SNMP_Session.noarch
+perl-SOAP-Lite.noarch
+perl-Socket6.x86_64
+perl-Sort-Versions.noarch
+perl-Spiffy.noarch
+perl-Spreadsheet-WriteExcel.noarch
+perl-SQL-Abstract-Limit.noarch
+perl-SQL-Abstract.noarch
+perl-SQL-Statement.noarch
+perl-String-CRC32.x86_64
+perl-String-Ediff.x86_64
+perl-String-ShellQuote.noarch
+perl-Sub-Uplevel.noarch
+perl-suidperl.x86_64
+perl-Template-Toolkit.x86_64
+perl-TermReadKey.x86_64
+perl-Test-Base.noarch
+perl-Test-ClassAPI.noarch
+perl-Test-Exception.noarch
+perl-Test-Harness.x86_64
+perl-Test-Inline.noarch
+perl-Test-LongString.noarch
+perl-Test-Manifest.noarch
+perl-Test-Memory-Cycle.noarch
+perl-Test-MockModule.noarch
+perl-Test-MockObject.noarch
+perl-Test-Pod-Coverage.noarch
+perl-Test-Pod.noarch
+perl-Test-Portability-Files.noarch
+perl-Test-Simple.x86_64
+perl-Test-Taint.x86_64
+perl-Test-Warn.noarch
+perl-Test-WWW-Mechanize.noarch
+perl-TeX-Hyphen.noarch
+perl-Text-Autoformat.noarch
+perl-Text-CSV_XS.x86_64
+perl-Text-Diff.noarch
+perl-Text-Glob.noarch
+perl-Text-Iconv.x86_64
+perl-Text-Kakasi.x86_64
+perl-Text-Quoted.noarch
+perl-Text-Reform.noarch
+perl-Text-Template.noarch
+perl-Text-WikiFormat.noarch
+perl-Text-Wrapper.noarch
+perl-Tie-DBI.noarch
+perl-Tie-IxHash.noarch
+perl-TimeDate.noarch
+perl-Time-modules.noarch
+perl-Time-Piece-MySQL.noarch
+perl-Time-Piece.x86_64
+perl-Tree-DAG_Node.noarch
+perl-Tree-Simple.noarch
+perl-udunits.x86_64
+perl-Unicode-Map8.x86_64
+perl-Unicode-MapUTF8.noarch
+perl-Unicode-Map.x86_64
+perl-Unicode-String.x86_64
+perl-UNIVERSAL-can.noarch
+perl-UNIVERSAL-exports.noarch
+perl-UNIVERSAL-isa.noarch
+perl-UNIVERSAL-moniker.noarch
+perl-UNIVERSAL-require.noarch
+perl-Unix-Statgrab.x86_64
+perl-Unix-Syslog.x86_64
+perl-URI.noarch
+perl-version.x86_64
+perl-Want.x86_64
+perl-WWW-Mechanize.noarch
+perl-X11-Protocol.noarch
+perl.x86_64
+perl-XML-DOM.noarch
+perl-XML-Dumper.noarch
+perl-XML-Grove.noarch
+perl-XML-LibXML-Common.x86_64
+perl-XML-LibXML.x86_64
+perl-XML-LibXSLT.x86_64
+perl-XML-NamespaceSupport.noarch
+perl-XML-Parser.x86_64
+perl-XML-RegExp.noarch
+perl-XML-RSS.noarch
+perl-XML-SAX.noarch
+perl-XML-SAX.noarch
+perl-XML-Simple.noarch
+perl-XML-Twig.noarch
+perl-XML-XPath.noarch
+perl-YAML.noarch
+php-adodb.noarch
+php-bcmath.x86_64
+php-cli.x86_64
+php-common.x86_64
+php-dba.x86_64
+php-devel.x86_64
+php-gd.x86_64
+php-imap.x86_64
+php-ldap.x86_64
+php-mbstring.x86_64
+php-mysql.x86_64
+php-ncurses.x86_64
+php-odbc.x86_64
+php-pdo.x86_64
+php-pear-Auth-SASL.noarch
+php-pear-Image-GraphViz.noarch
+php-pear-Net-SMTP.noarch
+php-pear-Net-Socket.noarch
+php-pear.noarch
+php-pecl-Fileinfo.x86_64
+php-pecl-mailparse.x86_64
+php-pgsql.x86_64
+php-Smarty.noarch
+php-snmp.x86_64
+php-soap.x86_64
+php.x86_64
+php-xmlrpc.x86_64
+php-xml.x86_64
+pils.x86_64
+pinfo.x86_64
+pkgconfig.x86_64
+plt-scheme.x86_64
+pm-utils.x86_64
+pnm2ppa.x86_64
+policycoreutils-newrole.x86_64
+policycoreutils.x86_64
+poppler-utils.x86_64
+poppler.x86_64
+popt.i386
+popt.x86_64
+postfix.x86_64
+postgresql-devel.x86_64
+postgresql-libs.i386
+postgresql-libs.x86_64
+postgresql-python.x86_64
+postgresql.x86_64
+ppp.x86_64
+prelink.x86_64
+procmail.x86_64
+procps.x86_64
+proj.x86_64
+psacct.x86_64
+psmisc.x86_64
+psutils.x86_64
+pycairo.x86_64
+pygobject2.x86_64
+pygtk2.x86_64
+pyOpenSSL.x86_64
+python-4Suite-XML.x86_64
+python-adns.x86_64
+python-amara.noarch
+python-basemap-data.noarch
+python-basemap.x86_64
+python-bibtex.x86_64
+python-cheetah.x86_64
+python-cherrypy.noarch
+python-cherrytemplate.noarch
+python-clearsilver.x86_64
+python-clientform.noarch
+python-configobj.noarch
+python-crypto.x86_64
+python-dateutil.noarch
+python-decoratortools.noarch
+python-devel.i386
+python-devel.x86_64
+python-dialog.noarch
+python-dns.noarch
+python-docs.noarch
+python-durus.x86_64
+python-exo.x86_64
+python-feedparser.noarch
+python-formencode.noarch
+python-fpconst.noarch
+python-goopy.noarch
+python-HTMLgen.noarch
+python-imaging.x86_64
+python-inotify.x86_64
+python-irclib.noarch
+python-json.noarch
+python-kid.noarch
+python-krbV.x86_64
+python-lcms.x86_64
+python-ldap.x86_64
+python-libs.i386
+python-libs.x86_64
+python-logilab-astng.noarch
+python-logilab-common.noarch
+python-lxml.x86_64
+python-matplotlib.x86_64
+python-mechanize.noarch
+python-myghty.noarch
+python-nose.noarch
+python-numarray.x86_64
+python-numeric.x86_64
+python-paste-deploy.noarch
+python-paste.noarch
+python-paste-script.noarch
+python-pgsql.x86_64
+python-protocols.x86_64
+python-psycopg2.x86_64
+python-psycopg.x86_64
+python-pycurl.x86_64
+python-pydns.noarch
+python-pyspf.noarch
+python-quixote.x86_64
+python-ruledispatch.x86_64
+python-setuptools.noarch
+python-simplejson.x86_64
+python-simpy-doc.noarch
+python-sqlalchemy.noarch
+python-sqlite2.x86_64
+python-sqlobject.noarch
+python-tag.x86_64
+python-TestGears.noarch
+python-tgfastdata.noarch
+python-turbocheetah.noarch
+python-turbojson.noarch
+python-turbokid.noarch
+python-twisted-conch.x86_64
+python-twisted-core-doc.x86_64
+python-twisted-core.x86_64
+python-twisted-lore.x86_64
+python-twisted-mail.x86_64
+python-twisted-names.x86_64
+python-twisted-news.x86_64
+python-twisted.noarch
+python-twisted-runner.x86_64
+python-twisted-web.x86_64
+python-twisted-words.x86_64
+python-urlgrabber.noarch
+python-urljr.noarch
+python.x86_64
+python-xmpp.noarch
+python-yadis.noarch
+python-zope-interface.x86_64
+pytz.noarch
+pyxf86config.x86_64
+PyXML.x86_64
+quota.x86_64
+radeontool.x86_64
+raptor-devel.i386
+raptor-devel.x86_64
+raptor.i386
+raptor.x86_64
+rasqal-devel.x86_64
+rasqal.i386
+rasqal.x86_64
+rcs.x86_64
+rdate.x86_64
+rdist.x86_64
+readahead.x86_64
+readline-devel.i386
+readline-devel.x86_64
+readline.i386
+readline.x86_64
+recode.x86_64
+redhat-artwork.x86_64
+redhat-lsb.x86_64
+redhat-menus.noarch
+redhat-rpm-config.noarch
+redland-devel.i386
+redland-devel.x86_64
+redland.i386
+redland.x86_64
+rhpl.x86_64
+rmt.x86_64
+rng-utils.x86_64
+rootfiles.noarch
+rpcbind.x86_64
+rpm-build.x86_64
+rpm-devel.x86_64
+rpmdevtools.noarch
+rpm-libs.x86_64
+rpm-python.x86_64
+rpm.x86_64
+rp-pppoe.x86_64
+rrdtool-php.x86_64
+rrdtool-python.x86_64
+rrdtool.x86_64
+rsh.x86_64
+rsync.x86_64
+ruby-devel.x86_64
+ruby-docs.x86_64
+rubygems.noarch
+ruby-irb.x86_64
+ruby-libs.x86_64
+ruby-mode.x86_64
+ruby-mysql.x86_64
+ruby-rdoc.x86_64
+ruby-sqlite3.x86_64
+ruby.x86_64
+samba-common.x86_64
+samba.x86_64
+screen.x86_64
+SDL.x86_64
+sed.x86_64
+selinux-doc.noarch
+selinux-policy-devel.noarch
+selinux-policy.noarch
+selinux-policy-strict.noarch
+selinux-policy-targeted.noarch
+setarch.x86_64
+setools-console.x86_64
+setools-gui.x86_64
+setools-libs.x86_64
+setools.x86_64
+setserial.x86_64
+setup.noarch
+setuptool.x86_64
+sgml-common.noarch
+shadow-utils.x86_64
+shapelib.x86_64
+shared-mime-info.x86_64
+sinjdoc.x86_64
+slang.x86_64
+slrn.x86_64
+smartmontools.x86_64
+SOAPpy.noarch
+socat.x86_64
+spamassassin.x86_64
+specspo.noarch
+sqlite2-devel.x86_64
+sqlite2.x86_64
+sqlite-devel.x86_64
+sqlite.i386
+sqlite.x86_64
+sql-signup.x86_64
+startup-notification.x86_64
+statserial.x86_64
+stonith.x86_64
+strace.x86_64
+stunnel.x86_64
+subversion.i386
+subversion.x86_64
+sudo.x86_64
+svrcore.x86_64
+swig.x86_64
+symlinks.x86_64
+sysklogd.x86_64
+syslinux.x86_64
+sysreport.noarch
+sysstat.x86_64
+system-config-network-tui.noarch
+system-config-securitylevel-tui.x86_64
+sysvinit.x86_64
+taglib.x86_64
+talk.x86_64
+tar.x86_64
+tcl-devel.i386
+tcl-devel.x86_64
+tcl.i386
+tcl.x86_64
+tcpdump.x86_64
+tcp_wrappers-devel.i386
+tcp_wrappers-devel.x86_64
+tcp_wrappers-libs.i386
+tcp_wrappers-libs.x86_64
+tcp_wrappers.x86_64
+tcsh.x86_64
+telnet.x86_64
+termcap.noarch
+tetex-dvips.x86_64
+tetex-fonts.x86_64
+tetex-latex.x86_64
+tetex-unicode.noarch
+tetex.x86_64
+texinfo-tex.x86_64
+texinfo.x86_64
+time.x86_64
+tix-devel.i386
+tix-devel.x86_64
+tix.i386
+tix.x86_64
+tk-devel.i386
+tk-devel.x86_64
+tk.i386
+tk.x86_64
+tmpwatch.x86_64
+tokensys.x86_64
+traceroute.x86_64
+trac.noarch
+tree.x86_64
+ttmkfdir.x86_64
+TurboGears.noarch
+tzdata.noarch
+udev.x86_64
+udunits.x86_64
+units.x86_64
+unix2dos.x86_64
+unixODBC-devel.x86_64
+unixODBC.x86_64
+unzip.x86_64
+urlview.x86_64
+urw-fonts.noarch
+usbutils.x86_64
+usermode.x86_64
+util-linux.x86_64
+uw-imap-devel.i386
+uw-imap-devel.x86_64
+vbetool.x86_64
+vconfig.x86_64
+vim-common.x86_64
+vim-enhanced.x86_64
+vim-minimal.x86_64
+vixie-cron.x86_64
+w3m.x86_64
+wget.x86_64
+which.x86_64
+wireless-tools.i386
+wireless-tools.x86_64
+words.noarch
+wpa_supplicant.x86_64
+wvdial.x86_64
+x264.x86_64
+Xaw3d.x86_64
+xinetd.x86_64
+xml-common.noarch
+xmltex.noarch
+xmlto.x86_64
+xorg-x11-apps.x86_64
+xorg-x11-filesystem.noarch
+xorg-x11-fonts-ISO8859-1-100dpi.noarch
+xorg-x11-fonts-ISO8859-1-75dpi.noarch
+xorg-x11-font-utils.x86_64
+xorg-x11-proto-devel.x86_64
+xorg-x11-server-utils.x86_64
+xorg-x11-xauth.x86_64
+xorg-x11-xfs.x86_64
+xvidcore.x86_64
+ypbind.x86_64
+yp-tools.x86_64
+yum-fastestmirror.noarch
+yum-fedorakmod.noarch
+yum-metadata-parser.x86_64
+yum.noarch
+yum-updatesd.noarch
+yum-utils.noarch
+zip.x86_64
+zlib-devel.i386
+zlib-devel.x86_64
+zlib.i386
+zlib.x86_64
+zziplib.x86_64
Index: branches/fc15-dev/server/doc/upgrade-tips
===================================================================
--- branches/fc15-dev/server/doc/upgrade-tips	(revision 1803)
+++ branches/fc15-dev/server/doc/upgrade-tips	(revision 1803)
@@ -0,0 +1,198 @@
+Upgrading Scripts for a new Fedora distribution
+===============================================
+
+1. Gather knowledge
+-------------------
+
+You should read the Release Notes for all of the intervening
+releases.  For example, here are the Fedora 13 release notes:
+
+    http://docs.fedoraproject.org/en-US/Fedora/13/html/Release_Notes/
+
+Because we sometimes skip releases, you should read any skipped
+release's report notes.
+
+Example:
+
+    In Fedora 12, i586 was deprecated in favor of i686; this meant
+    that any parts of Scripts that referenced i586 explicitly had to
+    changed to i686.
+
+2. Update the Scripts build environment
+---------------------------------------
+
+A large amount of the Scripts source repository is Fedora Release
+specific, so when you are ramping up the new release, you will want
+a new branch to do development on, before merging back upon the
+official release.  You can do this with:
+
+    svn cp svn://scripts.mit.edu/trunk \
+           svn://scripts.mit.edu/branches/fcXX-dev
+
+On the new branch, there are a number of files you will have to
+update:
+
+2.1 Mock
+
+Mock needs to be setup for the new environment.  The first thing to do
+is to update the Makefile by substituting
+s/scripts-fcOLD/scripts-fcNEW/g on the /usr/bin/mock invocations.
+After that, you need to go to /etc/mock and create the new cfg file
+for the new scripts-fcXX-ARCH configurations (where ARCH is x86_64 and
+i386).  You can base the new cfg off of the older version's, however
+you will want to make the following changes:
+
+    * Update all references to the old Fedora release to the new
+      Fedora release.  This includes root, dist, mirrorlist, baseurl
+
+    * Temporarily disabling the web.mit.edu Scripts RPM repository
+      and the local RPM repository by setting enabled=0 (it's there for
+      a reason!)  However, the local RPM repository is fairly painless
+      to create and will come in handy when you start attempting to
+      build packages that have dependencies on other scriptsified
+      packages: you can set one up as scripts-build with:
+
+        mkdir ~/mock-local
+        createrepo ~/mock-local
+
+3. Rebuild Scripts packages
+---------------------------
+
+In order to support specific extra functionality, we have scriptsified
+a variety of Fedora packages.  When the base packages get upgrades,
+we need to upgrade the scriptsification.  Some of the following topics
+are covered in 'package-build-howto', but a new Fedora release tends
+to also result in somewhat rarer situations.
+
+As you finish building packages, you'll want to place them somewhere
+so they don't get blown away on a successive mock build.  ~/mock-local
+is a good choice.  The Mock RPMs will be created in:
+
+    /var/lib/mock/$MOCK_ENV/result/
+
+Here are some of the common troubles you'll have to deal with:
+
+3.1 Spec patches are no longer necessary
+
+When a Fedora release gets EOL'ed, we may continue to backport
+patches for CVE's manually.  When we upgrade to a non-EOL'd release,
+those patches will generally become unnecessary and can be dropped.
+
+You can drop a modified specfile from the repository simply by
+`svn rm`ing:
+
+    * The spec patch in server/fedora/specs,
+    * The source code patch in server/common/patches, and
+    * The upstream_yum entry in server/fedora/Makefile
+
+If a specfile merely bumps the version field, there may be no extra
+patch (this indicates that the maintainer rebuilt the package simply
+by manually dropping the new source tarball in rpmbuild/SOURCES,
+which is kind of sketchy but works.  See -c 1586 for an example.)
+
+3.2 Spec patches no longer apply
+
+Symptom:
+
+    $ make patch-specs
+    patching file openssh.spec
+    Hunk #1 succeeded at 74 with fuzz 2 (offset 11 lines).
+    Hunk #2 failed at 88.
+    Hunk #3 succeeded at 177 (offset 14 lines).
+    Hunk #4 succeeded at 270 with fuzz 2 (offset 36 lines).
+    1 out of 4 hunks failed--saving rejects to openssh.spec.rej
+
+Fix:
+
+    The main thing to remember is where the generated files live
+    they are placed in rpmbuild/SPECS/openssh.spec{.rej,.orig}.
+    A workflow for fixing them might look like:
+
+        1. Inspect the rejects file.
+        2. As much as possible, manually fix the original diff
+           file in /srv/repository/server/fedora/specs
+        3. If absolutely necessary, edit the rpmbuild/SPECS/openssh.spec
+           file with any final changes (this is dangerous because
+           this file is blown away on a successive make)
+        4. Generate a new unified diff:
+             diff -u openssh.spec.orig openssh.spec > \
+                 /srv/repository/server/fedora/specs\openssh.spec.patch
+
+3.3 Mock fails with no error message
+
+Fix: You forgot to add scripts-build to the mock group.  See
+     https://bugzilla.redhat.com/show_bug.cgi?id=630791
+     [XXX: remove this entry when this bug is fixed]
+
+3.4 Source patches no longer apply
+
+Symptoms:
+
+    Generally, you will see these error messages after Mock starts
+    building (if they occur before Mock, that means it's a bug in the
+    spec patch, not a source patch that the spec patch references.)
+
+Fix:
+
+    The error message will be from within a schroot that Mock is using.
+    As a result, it's not immediately obvious where the files live.
+
+    The easiest approach is to use rpmbuild to manually reapply the
+    patches.
+
+        rpmbuild -bp path/to/foo.spec
+
+    If this fails complaining about a dependency, you should install
+    the dependency and add it to the Makefile.
+
+    Once you've fixed the patch, you can rerun rpmbuild after running
+
+        make setup
+
+    (This is useful if you can't do a full make due to another mock
+    process running.)
+
+4. "Officializing" everything
+-----------------------------
+
+web.mit.edu scripts repository (/mit/scripts/rpm-fcXX and
+/mit/scripts/rpm-fcXX-testing) needs to be made.  It's quite simple;
+all you need to do is copy the RPMs from the build server to there
+(probably going through a trusted machine, since you don't want to
+put your root tickets on a server.)  When you're done, run `createrepo`
+on the directory.
+
+Note that if you do a successive rebuild without bumping the Subversion
+revision (via a `svn up`), the new package will have the *same* version
+and yum will probably insist on using the old cached version.  You can
+use `yum clean all` to reset your cache and force yum to get the latest
+version.
+
+5. Update fs sysname
+--------------------
+
+Update /etc/sysconfig/openafs with an extra amd64_fedoraX_scripts and
+amd64_fedoraX sysname.  The format should be evident from the existing
+entries.  [XXX There might be other things you want]
+
+6. Testing critical infrastructure
+----------------------------------
+
+There are some important Scripts maintained applications you should test
+and ensure run on the new platform.  They include:
+
+    - http://scripts.mit.edu
+    - http://scripts.mit.edu/wiki
+    - http://scripts.mit.edu/trac
+    - http://scripts.mit.edu/whois/
+    - http://pony.scripts.mit.edu
+
+7. Extra stuff
+--------------
+
+Fedora occasionally updates the architecture name for 32-bit; the last
+such update was in Fedora 12, when i586 became i686.  Fixing this
+usually just involves replacing i586 with i686 in the appropriate places
+(Makefile, specfiles, /etc/mock configuration).  Note that for
+hysterical raisins we still refer to our 32-bit builds as i386.
+[XXX: Maybe this should change]
Index: branches/fc15-dev/server/fedora/Makefile
===================================================================
--- branches/fc15-dev/server/fedora/Makefile	(revision 1803)
+++ branches/fc15-dev/server/fedora/Makefile	(revision 1803)
@@ -0,0 +1,209 @@
+# Makefile for building scripts.mit.edu Fedora packages
+# Copyright (C) 2006  Jeff Arnold <jbarnold@mit.edu>
+#                and  Joe Presbrey <presbrey@mit.edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# See /COPYRIGHT in this repository for more information.
+
+upstream_yum	= krb5 krb5.i686 httpd openssh 389-ds-base
+hackage		= MonadCatchIO-mtl-0.3.0.1 cgi-3001.1.8.1 unix-handle-0.0.0
+upstream_hackage = ghc-MonadCatchIO-mtl ghc-cgi ghc-unix-handle
+upstream	= openafs $(upstream_yum) $(upstream_hackage) moira cluster-glue heartbeat pacemaker zephyr zephyr.i686 python-zephyr
+oursrc		= execsys tokensys accountadm httpdmods logview sql-signup nss_nonlocal nss_nonlocal.i686 whoisd athrun php_scripts scripts-wizard scripts-base scripts-static-cat
+allsrc		= $(upstream) $(oursrc)
+oursrcdir	= ${PWD}/../common/oursrc
+patches		= ${PWD}/../common/patches
+specs		= ${PWD}/specs
+
+topdir		= ${HOME}/rpmbuild
+tmp_build	= $(topdir)/BUILD
+tmp_specs	= $(topdir)/SPECS
+tmp_src		= $(topdir)/SOURCES
+out_rpms	= $(topdir)/RPMS
+out_srpms	= $(topdir)/SRPMS
+out_sbin	= $(topdir)/sbin
+
+dload		= ${PWD}/.dload
+server_url	= "http://web.mit.edu/scripts/src"
+server_arch	= "fedora.stable"
+#openafs_url	= "http://dl.openafs.org/dl/openafs/1.4.12/openafs-1.4.12-1.1.2.src.rpm"
+openafs_url	= "http://web.mit.edu/~scripts/rpm-fc13/openafs-1.4.12.1-1.0.pre3.src.rpm"
+clusterglue_url	= "http://kojipkgs.fedoraproject.org/packages/cluster-glue/1.0/0.11.b79635605337.hg.fc12/src/cluster-glue-1.0-0.11.b79635605337.hg.fc12.src.rpm"
+heartbeat_url	= "http://kojipkgs.fedoraproject.org/packages/heartbeat/3.0.0/0.5.0daab7da36a8.hg.fc12/src/heartbeat-3.0.0-0.5.0daab7da36a8.hg.fc12.src.rpm"
+pacemaker_url	= "http://kojipkgs.fedoraproject.org/packages/pacemaker/1.0.5/5.fc12/src/pacemaker-1.0.5-5.fc12.src.rpm"
+zephyr_url	= "http://zephyr.1ts.org/export/HEAD/distribution/zephyr-3.0.tar.gz"
+
+PKG		= $(patsubst %.i686,%,$@)
+
+.PHONY: minimal-clean
+
+info:
+	@echo "The following packages are available:"; \
+	echo "$(allsrc)"; \
+	echo "Run 'make all' to build all packages."
+
+minimal-clean:
+	rm -rf $(topdir) $(dload)
+
+clean: minimal-clean
+	rm -rf $(out_rpms) $(out_srpms) $(out_sbin)
+	rm -f download_stamp
+
+mkdir-tree:
+	@rpmdev-setuptree
+	mkdir -p $(out_sbin)
+	ln -sTf $(topdir) rpmbuild
+
+download: download_stamp
+download_stamp:
+	@mkdir -p $(dload); \
+	#wget -qO- -nv $(server_url)/$(server_arch) | xargs make
+	cd $(dload) && yumdownloader --disablerepo=scripts --source $(upstream_yum)
+	wget -P $(dload) $(openafs_url)
+	wget -P $(dload) $(clusterglue_url)
+	wget -P $(dload) $(heartbeat_url)
+	wget -P $(dload) $(pacemaker_url)
+	wget -P $(dload) $(zephyr_url)
+	cd $(tmp_src) && wget -nd -r -l1 -np -A.orig.tar.gz http://debathena.mit.edu/apt/pool/debathena/d/debathena-moira/
+	cabal update
+	cabal fetch $(hackage)
+	cp -a $(hackage:%=~/.cabal/packages/*/*/*/%.tar.gz) $(tmp_src)
+	spectool -g -R $(specs)/python-zephyr.spec
+	touch download_stamp
+
+%.src.rpm:
+	wget -q -nv -N -B $(server_url) -nd -nH -P $(dload) $(server_url)/$*.src.rpm
+
+copy-patches: mkdir-tree
+	@cp $(patches)/*.patch $(tmp_src); \
+	cd $(tmp_src);
+
+install-srpms: mkdir-tree download
+	rpm $(rpm_args) -i $(dload)/*.src.rpm 2>/dev/null;
+
+copy-specs: mkdir-tree
+	cp ${specs}/*.spec $(tmp_specs)
+
+patch-specs: install-srpms
+	@cd ${tmp_specs}; \
+	list=`ls ${specs}/*.spec.patch`; \
+	for i in $$list; do \
+		patch < $$i; \
+	done; \
+	list2=`svn ls ${oursrcdir}`; \
+	for i in $$list2; do \
+		base=`basename $$i`; \
+		version=`svnversion ${oursrcdir}/$$i`; \
+		version=$${version//:/_}; \
+		echo "$$i version $$version"; \
+		sed --in-place \
+			-e "s/SVNVERSION_TO_UPDATE/$${version}/" \
+		${tmp_specs}/$$base.spec; \
+	done;
+
+# 1. use the package's Makefile to delete leftover files and run autoconf
+# 2. create a tarball (we want it to contain the autoconf output)
+tarballs: mkdir-tree
+	@cd ${oursrcdir}; \
+	list=`find -mindepth 1 -maxdepth 1 -type d | grep -v ".svn"`; \
+	for i in $$list; do \
+		pushd $$i; \
+		if [ -x ./mrproper ]; then \
+			./mrproper; \
+			autoconf; \
+		fi; \
+		popd; \
+		tar -czf $(tmp_src)/$$i.tar.gz $$i; \
+	done;
+
+#setup: install-srpms copy-patches copy-specs patch-specs tarballs
+setup: copy-patches copy-specs patch-specs tarballs
+
+oursrc:
+	make $(oursrc)
+
+upstream: mkdir-tree download
+	make $(upstream)
+
+all:
+	make $(allsrc)
+
+$(oursrc): rpmbuild_args += --define 'scriptsversion $(shell svnversion ${oursrcdir}/$** | tr ':' '_' | sed -e 's/-.*/0.uncommitted/')'
+
+$(filter %.i686,$(oursrc)): %.i686: setup
+	PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" \
+	rpmbuild ${rpmbuild_args} -bs ${tmp_specs}/${PKG}.spec
+	/usr/bin/mock -r scripts-fc13-i386 --arch=i686 ${rpmbuild_args} --define="_lib lib" -v --rebuild `ls -t ${out_srpms}/${PKG}-[0-9]*.src.rpm | head -1`
+
+$(filter-out %.i686,$(oursrc)): %: setup
+	PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" \
+	rpmbuild ${rpmbuild_args} -bs ${tmp_specs}/${PKG}.spec
+	/usr/bin/mock -r scripts-fc13-`uname -m` ${rpmbuild_args} -v --rebuild `ls -t ${out_srpms}/${PKG}-[0-9]*.src.rpm | head -1`
+
+$(upstream) openafs-kernel: rpmbuild_args += --define 'scriptsversion $(shell svnversion ${patches} | tr ':' '_')'
+
+$(filter %.i686,$(upstream)): %.i686: setup patch-specs
+	rpmbuild ${rpmbuild_args} -bs ${tmp_specs}/${PKG}.spec
+	/usr/bin/mock -r scripts-fc13-i386 --arch=i686 ${rpmbuild_args} -v --rebuild `ls -t ${out_srpms}/${PKG}-[0-9]*.src.rpm | head -1`
+
+$(filter-out %.i686,$(upstream)): %: setup patch-specs
+	rpmbuild ${rpmbuild_args} -bs ${tmp_specs}/${PKG}.spec
+	/usr/bin/mock -r scripts-fc13-`uname -m` ${rpmbuild_args} -v --rebuild `ls -t ${out_srpms}/${PKG}-[0-9]*.src.rpm | head -1`
+
+openafs-kernel: setup
+	PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" \
+	rpmbuild ${rpmbuild_args} -bs ${tmp_specs}/openafs*.spec
+	/usr/bin/mock -r scripts-fc13-`uname -m` ${rpmbuild_args} -v --rebuild `ls -t ${out_srpms}/openafs*.src.rpm | head -1`
+
+#sort -n sorts "2.6.25-1" later than "2.6.25.1-1", so it's Wrong
+#kernvers = $(shell rpm -q --qf "%{Version}-%{Release}\n" --whatprovides kernel | sort -n | tail -n1)
+kernvers = $(shell uname -r | sed "s/\(.*\)[.].*/\1/")
+kvariants = ''
+openafs_rpmbuild_args = --define "fedorakmod 1" --define "kvariants $(kvariants)" --define "kernvers $(kernvers)"
+openafs: rpmbuild_args += $(openafs_rpmbuild_args)
+openafs-kernel: rpmbuild_args += $(openafs_rpmbuild_args) --define "build_userspace 0" --define "build_modules 1"
+
+frob-openafs:
+	@if [ ! -d "/etc/openafs/" ]; then \
+	echo "/etc/openafs does not exist"; \
+	exit 1; \
+	else \
+	ln -nfs /etc/openafs/* /usr/vice/etc/; \
+	fi
+
+# The following packages are needed for our packages
+basic-deps	= kernel-devel rpm-build rpmdevtools mock gcc autoconf patch krb5-workstation glibc-devel.i686 glibc-devel libtool libgcc.i686
+oursrc-deps	= hesinfo openldap-clients openldap-devel.i686 php-devel
+httpdmods-deps	= httpd-devel
+httpd-deps	= xmlto db4-devel expat-devel zlib-devel libselinux-devel apr-devel apr-util-devel pcre-devel openssl-devel distcache-devel
+krb5-deps	= bison ncurses-devel texinfo keyutils-libs-devel texinfo-tex texlive-latex libss-devel rsh
+openafs-deps	= pam-devel automake
+moira-deps      = e2fsprogs-devel
+zephyr-deps	= hesiod-devel libss-devel krb5-devel readline-devel
+openssh-deps	= gtk2-devel libX11-devel autoconf automake openssl-devel perl zlib-devel audit-libs-devel util-linux groff man pam-devel tcp_wrappers-devel krb5-devel libselinux-devel audit-libs xauth pango-devel cairo-devel libedit-devel nss-devel fipscheck-devel
+php-deps	= bzip2-devel curl-devel gmp-devel libstdc++-devel sqlite-devel gcc-c++ libc-client-devel mysql-devel postgresql-devel unixODBC-devel libxml2-devel net-snmp-devel libxslt-devel libxml2-devel libXpm-devel libjpeg-devel t1lib-devel libmcrypt-devel mhash-devel libtidy-devel freetds-devel aspell-devel recode-devel
+haskell-deps	= cabal-install
+install-deps:
+	yum -y install $(basic-deps) $(oursrc-deps) $(httpdmods-deps) $(httpd-deps) $(krb5-deps) $(openafs-deps) $(moira-deps) $(zephyr-deps) $(openssh-deps) $(php-deps) $(haskell-deps)
+# XXX: We need to figure out what's going on with compat-readline43
+#	rpm -ivh http://kojipkgs.fedoraproject.org/packages/compat-readline43/4.3/3/i386/compat-readline43-4.3-3.i386.rpm
+#	rpm -ivh http://download.fedora.redhat.com/pub/fedora/linux/core/6/i386/os/Fedora/RPMS/compat-readline43-4.3-3.i386.rpm
+
+fedora:
+	make install-deps
+	make upstream
+	rpm -ivh $(out_rpms)/`uname -m`/openafs-devel*.rpm
+	make oursrc
Index: branches/fc15-dev/server/fedora/config/etc/aliases
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/aliases	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/aliases	(revision 1803)
@@ -0,0 +1,101 @@
+#
+#  Aliases in this file will NOT be expanded in the header from
+#  Mail, but WILL be visible over networks or from /bin/mail.
+#
+#	>>>>>>>>>>	The program "newaliases" must be run after
+#	>> NOTE >>	this file is updated for any changes to
+#	>>>>>>>>>>	show through to sendmail.
+#
+
+# Basic system aliases -- these MUST be present.
+mailer-daemon:	postmaster
+postmaster:	root
+
+# General redirections for pseudo accounts.
+bin:		root
+daemon:		root
+adm:		root
+lp:		root
+sync:		root
+shutdown:	root
+halt:		root
+mail:		root
+news:		root
+uucp:		root
+operator:	root
+games:		root
+gopher:		root
+ftp:		root
+nobody:		root
+radiusd:	root
+nut:		root
+dbus:		root
+vcsa:		root
+canna:		root
+wnn:		root
+rpm:		root
+nscd:		root
+pcap:		root
+apache:		root
+webalizer:	root
+dovecot:	root
+fax:		root
+quagga:		root
+radvd:		root
+pvm:		root
+amanda:		root
+privoxy:	root
+ident:		root
+named:		root
+xfs:		root
+gdm:		root
+mailnull:	root
+postgres:	root
+sshd:		root
+smmsp:		root
+postfix:	root
+netdump:	root
+ldap:		root
+squid:		root
+ntp:		root
+mysql:		root
+desktop:	root
+rpcuser:	root
+rpc:		root
+nfsnobody:	root
+
+ingres:		root
+system:		root
+toor:		root
+manager:	root
+dumper:		root
+abuse:		root
+
+newsadm:	news
+newsadmin:	news
+usenet:		news
+ftpadm:		ftp
+ftpadmin:	ftp
+ftp-adm:	ftp
+ftp-admin:	ftp
+www:		webmaster
+webmaster:	root
+noc:		root
+security:	root
+hostmaster:	root
+
+# trap decode to catch security attacks
+decode:		root
+
+# Person who should get root's mail
+root:		andersk@mit.edu, quentin@mit.edu, geofft+root@mit.edu, mitchb@mit.edu, ezyang@mit.edu, xavid@mit.edu, adehnert-sipb@mit.edu
+
+scripts:	root
+signup:		root
+afsagent:	root
+logview:	root
+scripts-build:	root
+
+# People who are abusing or otherwise causing problems with the mail system
+# Put "/dev/null" as the target of their alias
+srimano:	/dev/null	# has a phpBB generating a lot of backscatter
Index: branches/fc15-dev/server/fedora/config/etc/auto.master
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/auto.master	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/auto.master	(revision 1803)
@@ -0,0 +1,1 @@
+/mit hesiod:hesiod
Index: branches/fc15-dev/server/fedora/config/etc/cron.d/scripts-cron_status
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/cron.d/scripts-cron_status	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/cron.d/scripts-cron_status	(revision 1803)
@@ -0,0 +1,1 @@
+* * * * * scripts touch /afs/athena.mit.edu/contrib/scripts/cron_scripts/cron_status_flag/$(hostname -f) > /dev/null 2>&1
Index: branches/fc15-dev/server/fedora/config/etc/cron.d/slapdagent
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/cron.d/slapdagent	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/cron.d/slapdagent	(revision 1803)
@@ -0,0 +1,3 @@
+KRB5CCNAME=/var/run/dirsrv/krb5cc
+MAILTO=scripts-root@mit.edu
+0 */3 * * * fedora-ds /usr/kerberos/bin/kinit -k -t /etc/dirsrv/keytab ldap/$(hostname)
Index: branches/fc15-dev/server/fedora/config/etc/cron.d/whoisd
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/cron.d/whoisd	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/cron.d/whoisd	(revision 1803)
@@ -0,0 +1,1 @@
+@reboot root /usr/bin/twistd -l /var/log/scripts-whoisd.log --pidfile /var/run/whoisd.pid -y /usr/local/libexec/whoisd.tac
Index: branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/98scripts-vhost.ldif
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/98scripts-vhost.ldif	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/98scripts-vhost.ldif	(revision 1803)
@@ -0,0 +1,26 @@
+#
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+# 
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+# 
+# Copyright (C) 2008 Geoffrey Thomas
+# END COPYRIGHT BLOCK
+#
+#
+# Schema for representing a version control repository location
+#
+dn: cn=schema
+attributeTypes: ( 1.2.840.113554.4.2.1.1 NAME 'scriptsVhostName' DESC 'Canonical server name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'scripts.mit.edu' )
+attributeTypes: ( 1.2.840.113554.4.2.1.2 NAME 'scriptsVhostAlias' DESC 'Other server names' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'scripts.mit.edu' )
+attributeTypes: ( 1.2.840.113554.4.2.1.3 NAME 'scriptsVhostDirectory' DESC 'Directory under $HOME/Scripts/$service for the root of this service' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'scripts.mit.edu' )
+attributeTypes: ( 1.2.840.113554.4.2.1.4 NAME 'scriptsVhostAccount' DESC 'User account for finding home direcory and suexec uid/gid' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'scripts.mit.edu' )
+objectClasses: ( 1.2.840.113554.4.2.2.1 NAME 'scriptsVhost' DESC 'Configuration for a scripts virtual host' SUP top AUXILIARY MUST ( scriptsVhostName $ scriptsVhostDirectory $ scriptsVhostAccount ) MAY ( scriptsVhostAlias ) X-ORIGIN 'scripts.mit.edu' )
Index: branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/99mod_vhost_ldap.ldif
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/99mod_vhost_ldap.ldif	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/dirsrv/slapd-scripts/schema/99mod_vhost_ldap.ldif	(revision 1803)
@@ -0,0 +1,107 @@
+#
+################################################################################
+#
+dn: cn=schema
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.2
+  NAME 'apacheServerName'
+  DESC 'mod_vhost_ldap: Apache ServerName'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.3
+  NAME 'apacheServerAlias'
+  DESC 'mod_vhost_ldap: Apache ServerAlias'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.4
+  NAME 'apacheDocumentRoot'
+  DESC 'mod_vhost_ldap: Apache DocumentRoot'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.5
+  NAME 'apacheServerAdmin'
+  DESC 'mod_vhost_ldap: Apache ServerAdmin'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.14287.1.1.6
+  NAME 'apacheScriptAlias'
+  DESC 'mod_cfg_ldap: Apache ScriptAlias'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.7
+  NAME 'apacheSuexecUid'
+  DESC 'mod_vhost_ldap: Apache SuexecUid'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+attributeTypes: (
+  1.3.6.1.4.1.8387.1.1.8
+  NAME 'apacheSuexecGid'
+  DESC 'mod_vhost_ldap: Apache SuexecGid'
+  SUP name
+  EQUALITY caseIgnoreMatch
+  SUBSTR caseIgnoreSubstringsMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256}
+  SINGLE-VALUE
+  )
+#
+################################################################################
+#
+objectClasses: (
+  1.3.6.1.4.1.8387.1.2.1
+  NAME 'apacheConfig'
+  SUP 'top'
+  MUST ( apacheServerName $ apacheDocumentRoot )
+  MAY ( apacheServerAlias $ apacheServerAdmin $ apacheScriptAlias $ apacheSuexecUid $ apacheSuexecGid )
+  )
+#
+################################################################################
+#
Index: branches/fc15-dev/server/fedora/config/etc/environment
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/environment	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/environment	(revision 1803)
@@ -0,0 +1,1 @@
+JAVA_TOOL_OPTIONS="-Xmx128M -XX:MaxPermSize=64M"
Index: branches/fc15-dev/server/fedora/config/etc/environment.cron
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/environment.cron	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/environment.cron	(revision 1803)
@@ -0,0 +1,1 @@
+SELINUX_ROLE_TYPE="user_u:user_r:user_t"
Index: branches/fc15-dev/server/fedora/config/etc/freshclam.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/freshclam.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/freshclam.conf	(revision 1803)
@@ -0,0 +1,175 @@
+##
+## Example config file for freshclam
+## Please read the freshclam.conf(5) manual before editing this file.
+##
+
+
+# Comment or remove the line below.
+#Example
+
+# Path to the database directory.
+# WARNING: It must match clamd.conf's directive!
+# Default: hardcoded (depends on installation options)
+DatabaseDirectory /var/lib/clamav
+
+# Path to the log file (make sure it has proper permissions)
+# Default: disabled
+UpdateLogFile /var/log/freshclam.log
+
+# Maximum size of the log file.
+# Value of 0 disables the limit.
+# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes)
+# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes).
+# in bytes just don't use modifiers.
+# Default: 1M
+#LogFileMaxSize 2M
+
+# Log time with each message.
+# Default: no
+#LogTime yes
+
+# Enable verbose logging.
+# Default: no
+#LogVerbose yes
+
+# Use system logger (can work together with UpdateLogFile).
+# Default: no
+#LogSyslog yes
+
+# Specify the type of syslog messages - please refer to 'man syslog'
+# for facility names.
+# Default: LOG_LOCAL6
+#LogFacility LOG_MAIL
+
+# This option allows you to save the process identifier of the daemon
+# Default: disabled
+#PidFile /var/run/freshclam.pid
+
+# By default when started freshclam drops privileges and switches to the
+# "clamav" user. This directive allows you to change the database owner.
+# Default: clamav (may depend on installation options)
+#DatabaseOwner clamav
+
+# Initialize supplementary group access (freshclam must be started by root).
+# Default: no
+#AllowSupplementaryGroups yes
+
+# Use DNS to verify virus database version. Freshclam uses DNS TXT records
+# to verify database and software versions. With this directive you can change
+# the database verification domain.
+# WARNING: Do not touch it unless you're configuring freshclam to use your
+# own database verification domain.
+# Default: current.cvd.clamav.net
+#DNSDatabaseInfo current.cvd.clamav.net
+
+# Uncomment the following line and replace XY with your country
+# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list.
+#DatabaseMirror db.XY.clamav.net
+
+# database.clamav.net is a round-robin record which points to our most 
+# reliable mirrors. It's used as a fall back in case db.XY.clamav.net is 
+# not working. DO NOT TOUCH the following line unless you know what you
+# are doing.
+DatabaseMirror database.clamav.net
+
+# How many attempts to make before giving up.
+# Default: 3 (per mirror)
+#MaxAttempts 5
+
+# With this option you can control scripted updates. It's highly recommended
+# to keep it enabled.
+# Default: yes
+#ScriptedUpdates yes
+
+# By default freshclam will keep the local databases (.cld) uncompressed to
+# make their handling faster. With this option you can enable the compression;
+# the change will take effect with the next database update.
+# Default: no
+#CompressLocalDatabase no
+
+# Number of database checks per day.
+# Default: 12 (every two hours)
+#Checks 24
+
+# Proxy settings
+# Default: disabled
+#HTTPProxyServer myproxy.com
+#HTTPProxyPort 1234
+#HTTPProxyUsername myusername
+#HTTPProxyPassword mypass
+
+# If your servers are behind a firewall/proxy which applies User-Agent
+# filtering you can use this option to force the use of a different
+# User-Agent header.
+# Default: clamav/version_number
+#HTTPUserAgent SomeUserAgentIdString
+
+# Use aaa.bbb.ccc.ddd as client address for downloading databases. Useful for
+# multi-homed systems.
+# Default: Use OS'es default outgoing IP address.
+#LocalIPAddress aaa.bbb.ccc.ddd
+
+# Send the RELOAD command to clamd.
+# Default: no
+#NotifyClamd /path/to/clamd.conf
+
+# Run command after successful database update.
+# Default: disabled
+#OnUpdateExecute command
+
+# Run command when database update process fails.
+# Default: disabled
+#OnErrorExecute command
+
+# Run command when freshclam reports outdated version.
+# In the command string %v will be replaced by the new version number.
+# Default: disabled
+#OnOutdatedExecute command
+
+# Don't fork into background.
+# Default: no
+#Foreground yes
+
+# Enable debug messages in libclamav.
+# Default: no
+#Debug yes
+
+# Timeout in seconds when connecting to database server.
+# Default: 30
+#ConnectTimeout 60
+
+# Timeout in seconds when reading from database server.
+# Default: 30
+#ReceiveTimeout 60
+
+# When enabled freshclam will submit statistics to the ClamAV Project about
+# the latest virus detections in your environment. The ClamAV maintainers
+# will then use this data to determine what types of malware are the most
+# detected in the field and in what geographic area they are.
+# This feature requires LogTime and LogFile to be enabled in clamd.conf.
+# Default: no
+#SubmitDetectionStats /path/to/clamd.conf
+
+# Country of origin of malware/detection statistics (for statistical
+# purposes only). The statistics collector at ClamAV.net will look up
+# your IP address to determine the geographical origin of the malware
+# reported by your installation. If this installation is mainly used to
+# scan data which comes from a different location, please enable this
+# option and enter a two-letter code (see http://www.iana.org/domains/root/db/)
+# of the country of origin.
+# Default: disabled
+#DetectionStatsCountry country-code
+
+# This option enables support for Google Safe Browsing. When activated for
+# the first time, freshclam will download a new database file (safebrowsing.cvd)
+# which will be automatically loaded by clamd and clamscan during the next
+# reload, provided that the heuristic phishing detection is turned on. This
+# database includes information about websites that may be phishing sites or
+# possible sources of malware. When using this option, it's mandatory to run
+# freshclam at least every 30 minutes.
+# Freshclam uses the ClamAV's mirror infrastructure to distribute the
+# database and its updates but all the contents are provided under Google's
+# terms of use. See http://code.google.com/support/bin/answer.py?answer=70015
+# and http://safebrowsing.clamav.net for more information.
+# Default: disabled
+#SafeBrowsing yes
Index: branches/fc15-dev/server/fedora/config/etc/fuse.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/fuse.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/fuse.conf	(revision 1803)
@@ -0,0 +1,1 @@
+user_allow_other
Index: branches/fc15-dev/server/fedora/config/etc/ha.d/ha.cf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ha.d/ha.cf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ha.d/ha.cf	(revision 1803)
@@ -0,0 +1,9 @@
+logfacility	local0
+udpport	695
+bcast	eth0
+mcast eth0 225.0.0.1 695 1 0
+auto_failback off
+node	old-faithful
+node	better-mousetrap
+respawn hacluster /usr/lib64/heartbeat/ipfail
+apiauth ipfail gid=haclient uid=hacluster
Index: branches/fc15-dev/server/fedora/config/etc/ha.d/haresources
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ha.d/haresources	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ha.d/haresources	(revision 1803)
@@ -0,0 +1,1 @@
+old-faithful crond
Index: branches/fc15-dev/server/fedora/config/etc/hesiod.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/hesiod.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/hesiod.conf	(revision 1803)
@@ -0,0 +1,2 @@
+rhs=.ATHENA.MIT.EDU
+lhs=.ns
Index: branches/fc15-dev/server/fedora/config/etc/hosts
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/hosts	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/hosts	(revision 1803)
@@ -0,0 +1,30 @@
+# Do not remove the following line, or various programs
+# that require network functionality will fail.
+127.0.0.1	localhost.localdomain localhost
+::1		localhost.localdomain localhost
+
+18.181.0.43	scripts.mit.edu scripts
+18.181.0.46	scripts-vhosts.mit.edu scripts-vhosts
+18.181.0.50	scripts-cert.mit.edu scripts-cert
+18.181.0.52	sql.mit.edu sql
+18.181.0.229	scripts-test.mit.edu scripts-test
+
+18.181.0.57	better-mousetrap.mit.edu better-mousetrap scripts1.mit.edu scripts1
+18.181.0.53	old-faithful.mit.edu old-faithful scripts2.mit.edu scripts2
+18.181.0.167	bees-knees.mit.edu bees-knees sx-blade-4.mit.edu sx-blade-4 scripts3.mit.edu scripts3
+18.181.0.228	cats-whiskers.mit.edu cats-whiskers scripts4.mit.edu scripts4
+18.181.0.236	whole-enchilada.mit.edu whole-enchilada scripts5.mit.edu scripts5
+18.181.0.237	pancake-bunny.mit.edu pancake-bunny scripts6.mit.edu scripts6
+18.181.0.234	busy-beaver.mit.edu busy-beaver scripts7.mit.edu scripts7
+18.181.0.235	real-mccoy.mit.edu real-mccoy scripts8.mit.edu scripts8
+18.181.0.135	shining-armor.mit.edu shining-armor # scripts9.mit.edu scripts9
+
+172.21.0.57	better-mousetrap.mit.edu
+172.21.0.53	old-faithful.mit.edu
+172.21.0.167	bees-knees.mit.edu
+172.21.0.228	cats-whiskers.mit.edu
+172.21.0.236	whole-enchilada.mit.edu
+172.21.0.237	pancake-bunny.mit.edu
+172.21.0.234	busy-beaver.mit.edu
+172.21.0.235	real-mccoy.mit.edu
+172.21.0.135	shining-armor.mit.edu
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/auth_sslcert.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/auth_sslcert.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/auth_sslcert.conf	(revision 1803)
@@ -0,0 +1,8 @@
+LoadModule auth_sslcert_module modules/mod_auth_sslcert.so
+LoadModule authz_afsgroup_module modules/mod_authz_afsgroup.so
+LoadModule auth_optional_module modules/mod_auth_optional.so
+
+<Directory />
+AuthSSLCertVar		SSL_CLIENT_S_DN_Email
+AuthSSLCertStripSuffix	"@MIT.EDU"
+</Directory>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-special.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-special.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-special.conf	(revision 1803)
@@ -0,0 +1,42 @@
+Alias /__scripts/heartbeat /afs/athena.mit.edu/contrib/scripts/web_scripts/heartbeat
+Alias /__scripts/django/media /usr/lib/python2.6/site-packages/django/contrib/admin/media
+Alias /__scripts /afs/athena.mit.edu/contrib/scripts/www
+
+<Directory /afs/athena.mit.edu/contrib/scripts/www>
+    <Files *>
+	SetHandler none
+    </Files>
+</Directory>
+
+<Directory /usr/lib/python2.6/site-packages/django/contrib/admin/media>
+    <Files *>
+	SetHandler none
+    </Files>
+</Directory>
+
+<Location /__scripts/needcerts>
+    RewriteEngine On
+
+    RewriteCond %{HTTP_HOST} !:444$
+    RewriteCond %{SERVER_NAME} ^(.*\.)?scripts$
+    RewriteCond %{THE_REQUEST} ^[^\ ]*\ (.*)\ .*
+    RewriteRule ^ https://%{SERVER_NAME}.mit.edu:444%1 [L,R]
+
+    RewriteCond %{HTTP_HOST} !:444$
+    RewriteCond %{SERVER_NAME} !=scripts-cert.mit.edu
+    RewriteCond %{SERVER_NAME} !=scripts-cert
+    RewriteCond %{THE_REQUEST} ^[^\ ]*\ (.*)\ .*
+    RewriteRule ^ https://%{SERVER_NAME}:444%1 [L,R]
+
+    RewriteCond %{HTTP_USER_AGENT} Mac\ OS\ X.*AppleWebKit
+    RewriteRule /afs/athena.mit.edu/contrib/scripts/www/needcerts(.*) /__scripts/safarihack$1 [L]
+
+    RewriteRule /afs/athena.mit.edu/contrib/scripts/www/needcerts(.+) $1 [L]
+    RewriteRule /afs/athena.mit.edu/contrib/scripts/www/needcerts /__scripts/unauthorized.html [L]
+</Location>
+
+<Location /__scripts/safarihack>
+    SSLVerifyClient require
+    RewriteRule /afs/athena.mit.edu/contrib/scripts/www/safarihack(.+) $1 [L]
+    RewriteRule /afs/athena.mit.edu/contrib/scripts/www/safarihack /__scripts/unauthorized.html [L]
+</Location>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost-names.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost-names.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost-names.conf	(revision 1803)
@@ -0,0 +1,2 @@
+ServerName scripts.mit.edu
+ServerAlias scripts 18.181.0.43 scripts-vhosts.mit.edu scripts-vhosts 18.181.0.46 scripts-test.mit.edu scripts-test 18.181.0.229 better-mousetrap.mit.edu better-mousetrap b-m.mit.edu b-m scripts1.mit.edu scripts1 18.181.0.57 old-faithful.mit.edu old-faithful o-f.mit.edu o-f scripts2.mit.edu scripts2 18.181.0.53 bees-knees.mit.edu bees-knees b-k.mit.edu b-k sx-blade-4.mit.edu sx-blade-4 scripts3.mit.edu scripts3 18.181.0.167 cats-whiskers.mit.edu cats-whiskers c-w.mit.edu c-w scripts4.mit.edu scripts4 18.181.0.228 whole-enchilada.mit.edu whole-enchilada w-e.mit.edu w-e scripts5.mit.edu scripts5 18.181.0.236 pancake-bunny.mit.edu pancake-bunny p-b.mit.edu p-b scripts6.mit.edu scripts6 18.181.0.237 busy-beaver.mit.edu busy-beaver b-b.mit.edu b-b scripts7.mit.edu scripts7 18.181.0.234 real-mccoy.mit.edu real-mccoy r-m.mit.edu r-m scripts8.mit.edu scripts8 18.181.0.235 shining-armor.mit.edu shining-armor s-a.mit.edu s-a scripts9.mit.edu scripts9 18.181.0.135 localhost 127.0.0.1 ::1
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/scripts-vhost.conf	(revision 1803)
@@ -0,0 +1,29 @@
+DocumentRoot /afs/athena.mit.edu/contrib/scripts/web_scripts/home
+SuExecUserGroup scripts users
+UserDir web_scripts
+# Comment the following line out to take the machine out of the LVS pool
+# You'll also need to prevent it from listening on 443 or 444
+Alias /heartbeat /afs/athena.mit.edu/contrib/scripts/web_scripts/heartbeat
+Alias /src /afs/athena.mit.edu/contrib/scripts/src
+Redirect /sql https://scripts.mit.edu/~sql
+
+<IfModule mod_status.c>
+    <Location "/server-status">
+        AuthType Basic
+        AuthName "scripts status"
+        AuthBasicProvider file
+        AuthUserFile /etc/munin/apache-htpasswd
+        Require valid-user
+        SetHandler server-status
+        PermitStatusHandler on
+    </Location>
+</IfModule>
+
+<Location ~ "/(robots\.txt|favicon\.ico)">
+    RewriteEngine On
+    RewriteBase /~scripts
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule .*(favicon\.ico) $1 [L,NS]
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule .*(robots\.txt) $1 [L,NS]
+</Location>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhost_ldap.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhost_ldap.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhost_ldap.conf	(revision 1803)
@@ -0,0 +1,12 @@
+#
+# mod_vhost_ldap allows you to keep your virtual host configuration
+# in an LDAP directory and update it in nearly realtime.
+#
+
+### NOTE ###
+### mod_vhost_ldap depends on mod_ldap ###
+### you have to enable mod_ldap as well ###
+
+VhostLDAPEnabled on
+VhostLDAPUrl "ldap://127.0.0.1/ou=VirtualHosts,dc=scripts,dc=mit,dc=edu"
+VhostLDAPFallback notfound.example.com
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl-cert.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl-cert.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl-cert.conf	(revision 1803)
@@ -0,0 +1,4 @@
+# This file will be included inside VirtualHost blocks that use
+# certificate auth.
+
+SSLVerifyClient optional
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common-ssl.conf	(revision 1803)
@@ -0,0 +1,3 @@
+# This file will be included inside each <VirtualHost *:443> block.
+
+SSLEngine on
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf.d/vhosts-common.conf	(revision 1803)
@@ -0,0 +1,2 @@
+# This file will be included inside each <VirtualHost *:80> block.
+
Index: branches/fc15-dev/server/fedora/config/etc/httpd/conf/httpd.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/conf/httpd.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/conf/httpd.conf	(revision 1803)
@@ -0,0 +1,411 @@
+ServerRoot /etc/httpd
+PidFile run/httpd.pid
+Timeout 300
+KeepAlive On
+MaxKeepAliveRequests 1000
+KeepAliveTimeout 15
+
+<IfModule mpm_prefork_module>
+    MinSpareServers 5
+    MaxSpareServers 50
+    StartServers 8
+    ServerLimit 512
+    MaxClients 512
+    MaxRequestsPerChild 10000
+</IfModule>
+
+<IfModule mpm_worker_module>
+    StartServers 3
+    MinSpareThreads 75
+    MaxSpareThreads 250
+    ServerLimit 64
+    ThreadsPerChild 32
+    MaxClients 1024
+    MaxRequestsPerChild 10000
+</IfModule>
+
+<IfModule mpm_event_module>
+    StartServers 3
+    MinSpareThreads 75
+    MaxSpareThreads 250
+    ServerLimit 64
+    ThreadsPerChild 32
+    MaxClients 2048
+    MaxRequestsPerChild 10000
+</IfModule>
+
+LoadModule auth_basic_module modules/mod_auth_basic.so
+LoadModule auth_digest_module modules/mod_auth_digest.so
+LoadModule authn_file_module modules/mod_authn_file.so
+LoadModule authn_alias_module modules/mod_authn_alias.so
+LoadModule authn_anon_module modules/mod_authn_anon.so
+#LoadModule authn_dbm_module modules/mod_authn_dbm.so
+LoadModule authn_default_module modules/mod_authn_default.so
+LoadModule authz_host_module modules/mod_authz_host.so
+LoadModule authz_user_module modules/mod_authz_user.so
+LoadModule authz_owner_module modules/mod_authz_owner.so
+LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
+#LoadModule authz_dbm_module modules/mod_authz_dbm.so
+LoadModule authz_default_module modules/mod_authz_default.so
+LoadModule ldap_module modules/mod_ldap.so
+#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
+LoadModule include_module modules/mod_include.so
+LoadModule log_config_module modules/mod_log_config.so
+#LoadModule logio_module modules/mod_logio.so
+LoadModule env_module modules/mod_env.so
+LoadModule ext_filter_module modules/mod_ext_filter.so
+#LoadModule mime_magic_module modules/mod_mime_magic.so
+LoadModule expires_module modules/mod_expires.so
+LoadModule deflate_module modules/mod_deflate.so
+LoadModule headers_module modules/mod_headers.so
+#LoadModule usertrack_module modules/mod_usertrack.so
+LoadModule setenvif_module modules/mod_setenvif.so
+LoadModule mime_module modules/mod_mime.so
+#LoadModule dav_module modules/mod_dav.so
+LoadModule status_module modules/mod_status.so
+LoadModule autoindex_module modules/mod_autoindex.so
+#LoadModule info_module modules/mod_info.so
+#LoadModule dav_fs_module modules/mod_dav_fs.so
+#LoadModule vhost_alias_module modules/mod_vhost_alias.so
+LoadModule negotiation_module modules/mod_negotiation.so
+LoadModule dir_module modules/mod_dir.so
+LoadModule actions_module modules/mod_actions.so
+#LoadModule speling_module modules/mod_speling.so
+LoadModule userdir_module modules/mod_userdir.so
+LoadModule alias_module modules/mod_alias.so
+LoadModule rewrite_module modules/mod_rewrite.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
+#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
+#LoadModule proxy_connect_module modules/mod_proxy_connect.so
+#LoadModule cache_module modules/mod_cache.so
+LoadModule suexec_module modules/mod_suexec.so
+#LoadModule disk_cache_module modules/mod_disk_cache.so
+#LoadModule file_cache_module modules/mod_file_cache.so
+#LoadModule mem_cache_module modules/mod_mem_cache.so
+LoadModule cgi_module modules/mod_cgi.so
+LoadModule ssl_module modules/mod_ssl.so
+LoadModule vhost_ldap_module modules/mod_vhost_ldap.so
+
+User apache
+Group apache
+
+#ErrorDocument  403  /403-404.html
+#ErrorDocument  404  /403-404.html
+#ErrorDocument  500  /script_error.html
+
+UserDir disabled
+
+<Directory />
+    AllowOverride None
+    Options FollowSymLinks IncludesNoExec
+</Directory>
+
+<Directory /afs/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/*/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+<Directory /afs/*/*/*/*/*/*/*/*/web_scripts>
+    AllowOverride All
+</Directory>
+
+<IfModule mod_dir.c>
+    DirectoryIndex index index.html index.htm index.cgi index.pl index.php index.py index.shtml index.exe index.fcgi
+</IfModule>
+
+AccessFileName .htaccess
+
+<Files ~ "^\.ht">
+    Order Allow,Deny
+    Deny from all
+</Files>
+
+UseCanonicalName Off
+TypesConfig /etc/mime.types
+DefaultType text/plain
+#MIMEMagicFile conf/magic
+
+HostnameLookups Off
+ErrorLog "/home/logview/error_log"
+LogLevel warn
+LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+LogFormat "%h %l %u %t \"%r\" %>s %b" common
+LogFormat "%a %V %U" statistics
+#CustomLog /var/log/httpd/access_log combined
+#CustomLog "|/etc/httpd/statistics_log_mitonly.sh" statistics
+ServerSignature Off
+ServerAdmin scripts@mit.edu
+ServerTokens Prod
+
+<IfModule mod_autoindex.c>
+    Alias /__scripts/icons /var/www/icons
+    <Directory /var/www/icons>
+        Options Indexes
+        AllowOverride None
+        <Files ~ "\.(gif|png)$">
+            SetHandler default-handler
+        </Files>
+    </Directory>
+
+    IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable
+
+    AddIconByEncoding (CMP,/__scripts/icons/compressed.gif) x-compress x-gzip
+
+    AddIconByType (TXT,/__scripts/icons/text.gif) text/*
+    AddIconByType (IMG,/__scripts/icons/image2.gif) image/*
+    AddIconByType (SND,/__scripts/icons/sound2.gif) audio/*
+    AddIconByType (VID,/__scripts/icons/movie.gif) video/*
+
+    AddIcon /__scripts/icons/binary.gif .bin .exe
+    AddIcon /__scripts/icons/binhex.gif .hqx
+    AddIcon /__scripts/icons/tar.gif .tar
+    AddIcon /__scripts/icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
+    AddIcon /__scripts/icons/compressed.gif .Z .z .tgz .gz .zip
+    AddIcon /__scripts/icons/a.gif .ps .ai .eps
+    AddIcon /__scripts/icons/layout.gif .html .shtml .htm .pdf
+    AddIcon /__scripts/icons/text.gif .txt
+    AddIcon /__scripts/icons/c.gif .c
+    AddIcon /__scripts/icons/p.gif .pl .py
+    AddIcon /__scripts/icons/f.gif .for
+    AddIcon /__scripts/icons/dvi.gif .dvi
+    AddIcon /__scripts/icons/uuencoded.gif .uu
+    AddIcon /__scripts/icons/script.gif .conf .sh .shar .csh .ksh .tcl
+    AddIcon /__scripts/icons/tex.gif .tex
+    AddIcon /__scripts/icons/bomb.gif core
+
+    AddIcon /__scripts/icons/back.gif ..
+    AddIcon /__scripts/icons/hand.right.gif README
+    AddIcon /__scripts/icons/folder.gif ^^DIRECTORY^^
+    AddIcon /__scripts/icons/blank.gif ^^BLANKICON^^
+
+    DefaultIcon /__scripts/icons/unknown.gif
+
+    ReadmeName README
+    HeaderName HEADER
+    
+    IndexIgnore .??* *~ *# RCS CVS *,v *,t
+</IfModule>
+
+<IfModule mod_mime.c>
+    AddType application/xhtml+xml         .xhtml
+    AddType application/http-index-format .hti
+    AddType text/html                     .html
+    AddType text/css                      .css
+    AddType text/xsl                      .xslt
+    AddType application/x-javascript      .js
+    AddType application/xml               .xml
+    AddType image/svg+xml                 .svg
+    AddType application/vnd.mozilla.xul+xml .xul
+    AddType application/rdf+xml             .rdf
+    AddType application/x-xpinstall         .xpi
+    AddType text/xml .xsl
+    AddType text/html .shtml
+    AddHandler server-parsed .shtml
+
+    AddEncoding x-compress Z
+    AddEncoding x-gzip gz tgz
+
+    AddLanguage da .dk
+    AddLanguage nl .nl
+    AddLanguage en .en
+    AddLanguage et .ee
+    AddLanguage fr .fr
+    AddLanguage de .de
+    AddLanguage el .el
+    AddLanguage it .it
+    AddLanguage ja .ja
+    AddCharset ISO-2022-JP .jis
+    AddLanguage pl .po
+    AddCharset ISO-8859-2 .iso-pl
+    AddLanguage pt .pt
+    AddLanguage pt-br .pt-br
+    AddLanguage ltz .lu
+    AddLanguage ca .ca
+    AddLanguage es .es
+    AddLanguage sv .se
+    AddLanguage cz .cz
+
+    <IfModule mod_negotiation.c>
+        LanguagePriority en da nl et fr de el it ja pl pt pt-br ltz ca es sv
+    </IfModule>
+
+    AddType application/x-tar .tgz
+    AddType image/bmp .bmp
+
+    AddType text/x-hdml .hdml
+</IfModule>
+
+<IfModule mod_setenvif.c>
+    BrowserMatch "Mozilla/2" nokeepalive
+    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
+    BrowserMatch "RealPlayer 4\.0" force-response-1.0
+    BrowserMatch "Java/1\.0" force-response-1.0
+    BrowserMatch "JDK/1\.0" force-response-1.0
+    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
+</IfModule>
+
+Listen 80
+
+RLimitCPU 300 300
+RLimitMEM 1610612736 1610612736
+RLimitNPROC 4096 4096
+
+NameVirtualHost *:80
+NameVirtualHost *:443
+NameVirtualHost *:444
+NameVirtualHost 18.181.0.50:80
+NameVirtualHost 18.181.0.50:443
+NameVirtualHost 18.181.0.50:444
+
+ServerName localhost
+DocumentRoot /afs/athena.mit.edu/contrib/scripts/www
+
+ExtendedStatus On
+RewriteEngine Off
+
+ProxyRequests Off
+
+<Location /robots.txt>
+    ErrorDocument 404 "No robots.txt.
+</Location>
+<Location /favicon.ico>
+    ErrorDocument 404 "No favicon.ico.
+</Location>
+
+<VirtualHost 18.181.0.50:80>
+    ServerName scripts-cert.mit.edu
+    ServerAlias scripts-cert
+    Include conf.d/scripts-vhost.conf
+    Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+# LDAP vhost, w00t w00t
+<VirtualHost *:80>
+    Include conf.d/vhost_ldap.conf
+    Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<VirtualHost *:80>
+    Include conf.d/scripts-vhost-names.conf
+    Include conf.d/scripts-vhost.conf
+    Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+    Listen 443
+    Listen 444
+
+    AddType application/x-x509-ca-cert .crt
+    AddType application/x-pkcs7-crl    .crl
+
+    # This directive allows insecure renegotiations to succeed for browsers
+    # that do not yet support RFC 5746.  It should be removed when enough
+    # of the world has caught up.
+    SSLInsecureRenegotiation on
+
+    SSLPassPhraseDialog  builtin
+    SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
+    SSLSessionCacheTimeout 28800
+    SSLMutex default
+    SSLRandomSeed startup file:/dev/urandom 256
+    SSLRandomSeed connect builtin
+    SSLCryptoDevice builtin
+    SSLCertificateFile /etc/pki/tls/certs/star.scripts.pem
+    SSLCertificateKeyFile /etc/pki/tls/private/scripts-1024.key
+    SSLCACertificateFile /etc/pki/tls/certs/ca.pem
+    SSLVerifyClient none
+    SSLOptions +StdEnvVars
+    SSLProtocol all -SSLv2
+    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
+    <VirtualHost 18.181.0.50:443 18.181.0.50:444>
+        ServerName scripts-cert.mit.edu
+        ServerAlias scripts-cert
+        Include conf.d/scripts-vhost.conf
+        Include conf.d/vhosts-common-ssl.conf
+        SSLCertificateFile /etc/pki/tls/certs/scripts-cert.pem
+        Include conf.d/vhosts-common-ssl-cert.conf
+    </VirtualHost>
+    <VirtualHost 18.181.0.43:443>
+        Include conf.d/scripts-vhost-names.conf
+        Include conf.d/scripts-vhost.conf
+        Include conf.d/vhosts-common-ssl.conf
+        SSLCertificateFile /etc/pki/tls/certs/scripts.pem
+    </VirtualHost>
+    <VirtualHost 18.181.0.43:444>
+        Include conf.d/scripts-vhost-names.conf
+        Include conf.d/scripts-vhost.conf
+        Include conf.d/vhosts-common-ssl.conf
+        Include conf.d/vhosts-common-ssl-cert.conf
+        SSLCertificateFile /etc/pki/tls/certs/scripts.pem
+    </VirtualHost>
+    # LDAP vhost, w00t w00t
+    <VirtualHost *:443>
+        ServerName localhost
+        Include conf.d/vhost_ldap.conf
+        Include conf.d/vhosts-common-ssl.conf
+    </VirtualHost>
+    # LDAP vhost, w00t w00t
+    <VirtualHost *:444>
+        ServerName localhost
+        Include conf.d/vhost_ldap.conf
+        Include conf.d/vhosts-common-ssl.conf
+        Include conf.d/vhosts-common-ssl-cert.conf
+    </VirtualHost>
+</IfModule>
+Include vhosts.d/*.conf
+<IfModule ssl_module>
+    <VirtualHost *:443>
+        ServerName scripts.scripts.mit.edu
+        ServerAlias *.scripts.mit.edu *.scripts
+        SSLCertificateFile /etc/pki/tls/certs/star.scripts.pem
+        Include conf.d/vhost_ldap.conf
+        Include conf.d/vhosts-common-ssl.conf
+    </VirtualHost>
+    <VirtualHost *:443>
+        Include conf.d/scripts-vhost-names.conf
+        Include conf.d/scripts-vhost.conf
+        Include conf.d/vhosts-common-ssl.conf
+    </VirtualHost>
+    <VirtualHost *:444>
+        ServerName scripts.scripts.mit.edu
+        ServerAlias *.scripts.mit.edu *.scripts
+        SSLCertificateFile /etc/pki/tls/certs/star.scripts.pem
+        Include conf.d/vhost_ldap.conf
+        Include conf.d/vhosts-common-ssl.conf
+        Include conf.d/vhosts-common-ssl-cert.conf
+    </VirtualHost>
+    <VirtualHost *:444>
+        Include conf.d/scripts-vhost-names.conf
+        Include conf.d/scripts-vhost.conf
+        Include conf.d/vhosts-common-ssl.conf
+        Include conf.d/vhosts-common-ssl-cert.conf
+    </VirtualHost>
+</IfModule>
+
+LoadModule fcgid_module modules/mod_fcgid.so
+AddHandler fcgid-script fcgi
+<Files *.fcgi>
+        Options +ExecCGI
+</Files>
+SocketPath /var/run/mod_fcgid
+SharememPath /var/run/mod_fcgid/fcgid_shm
+IPCCommTimeout 300
+FcgidMaxRequestLen 209715200
+
+Include conf.d/auth_sslcert.conf
+Include conf.d/execsys.conf
+Include conf.d/scripts-special.conf
Index: branches/fc15-dev/server/fedora/config/etc/httpd/statistics_log_mitonly.sh
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/statistics_log_mitonly.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/statistics_log_mitonly.sh	(revision 1803)
@@ -0,0 +1,11 @@
+#!/bin/sh
+perl -ne 'BEGIN { $| = 1 }
+next unless /^18\./;
+next if /^18\.181\./;
+chomp; split;
+if ($_[1] eq "scripts.mit.edu" && $_[2] =~ m|/(~[^/]+)/|) {
+print "$1\n";
+} else {
+print "$_[1]\n";
+}' >> /var/log/httpd/statistics_log
+#awk '/^18\./ && ! /^18.181/ { print $2; fflush() }' >> /var/log/httpd/statistics_log
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ai6034.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ai6034.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ai6034.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName ai6034.mit.edu
+	ServerAlias ai6034
+	DocumentRoot /afs/athena.mit.edu/course/6/6.034/web_scripts
+	Alias /~6.034 /afs/athena.mit.edu/course/6/6.034/web_scripts
+	SuExecUserGroup 6.034 6.034
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName ai6034.mit.edu
+		ServerAlias ai6034
+		DocumentRoot /afs/athena.mit.edu/course/6/6.034/web_scripts
+		Alias /~6.034 /afs/athena.mit.edu/course/6/6.034/web_scripts
+		SuExecUserGroup 6.034 6.034
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/ai6034.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName ai6034.mit.edu
+		ServerAlias ai6034
+		DocumentRoot /afs/athena.mit.edu/course/6/6.034/web_scripts
+		Alias /~6.034 /afs/athena.mit.edu/course/6/6.034/web_scripts
+		SuExecUserGroup 6.034 6.034
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/ai6034.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/asa.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/asa.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/asa.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName asa.mit.edu
+	ServerAlias asa
+	DocumentRoot /afs/athena.mit.edu/activity/a/asa/web_scripts
+	Alias /~asa /afs/athena.mit.edu/activity/a/asa/web_scripts
+	SuExecUserGroup asa asa
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName asa.mit.edu
+		ServerAlias asa
+		DocumentRoot /afs/athena.mit.edu/activity/a/asa/web_scripts
+		Alias /~asa /afs/athena.mit.edu/activity/a/asa/web_scripts
+		SuExecUserGroup asa asa
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/asa.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName asa.mit.edu
+		ServerAlias asa
+		DocumentRoot /afs/athena.mit.edu/activity/a/asa/web_scripts
+		Alias /~asa /afs/athena.mit.edu/activity/a/asa/web_scripts
+		SuExecUserGroup asa asa
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/asa.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/axo.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/axo.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/axo.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName axo.mit.edu
+	ServerAlias axo
+	DocumentRoot /afs/athena.mit.edu/activity/a/axo/web_scripts/site
+	Alias /~axo /afs/athena.mit.edu/activity/a/axo/web_scripts
+	SuExecUserGroup axo axo
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName axo.mit.edu
+		ServerAlias axo
+		DocumentRoot /afs/athena.mit.edu/activity/a/axo/web_scripts/site
+		Alias /~axo /afs/athena.mit.edu/activity/a/axo/web_scripts
+		SuExecUserGroup axo axo
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/axo.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName axo.mit.edu
+		ServerAlias axo
+		DocumentRoot /afs/athena.mit.edu/activity/a/axo/web_scripts/site
+		Alias /~axo /afs/athena.mit.edu/activity/a/axo/web_scripts
+		SuExecUserGroup axo axo
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/axo.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/barnowl.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/barnowl.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/barnowl.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName barnowl.mit.edu
+	ServerAlias barnowl
+	DocumentRoot /afs/sipb.mit.edu/project/barnowl/web_scripts
+	Alias /~barnowl /afs/sipb.mit.edu/project/barnowl/web_scripts
+	SuExecUserGroup barnowl barnowl
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName barnowl.mit.edu
+		ServerAlias barnowl
+		DocumentRoot /afs/sipb.mit.edu/project/barnowl/web_scripts
+		Alias /~barnowl /afs/sipb.mit.edu/project/barnowl/web_scripts
+		SuExecUserGroup barnowl barnowl
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/barnowl.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName barnowl.mit.edu
+		ServerAlias barnowl
+		DocumentRoot /afs/sipb.mit.edu/project/barnowl/web_scripts
+		Alias /~barnowl /afs/sipb.mit.edu/project/barnowl/web_scripts
+		SuExecUserGroup barnowl barnowl
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/barnowl.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/bc.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/bc.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/bc.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName bc.mit.edu
+	ServerAlias bc
+	DocumentRoot /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+	Alias /~bc-desk /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+	SuExecUserGroup bc-desk bc-desk
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName bc.mit.edu
+		ServerAlias bc
+		DocumentRoot /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+		Alias /~bc-desk /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+		SuExecUserGroup bc-desk bc-desk
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/bc.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName bc.mit.edu
+		ServerAlias bc
+		DocumentRoot /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+		Alias /~bc-desk /afs/athena.mit.edu/activity/b/bc-desk/web_scripts
+		SuExecUserGroup bc-desk bc-desk
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/bc.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cdsa.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cdsa.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cdsa.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName cdsa.mit.edu
+	ServerAlias cdsa
+	DocumentRoot /afs/athena.mit.edu/org/c/cdsa/web_scripts
+	Alias /~cdsa /afs/athena.mit.edu/org/c/cdsa/web_scripts
+	SuExecUserGroup cdsa cdsa
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName cdsa.mit.edu
+		ServerAlias cdsa
+		DocumentRoot /afs/athena.mit.edu/org/c/cdsa/web_scripts
+		Alias /~cdsa /afs/athena.mit.edu/org/c/cdsa/web_scripts
+		SuExecUserGroup cdsa cdsa
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/cdsa.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName cdsa.mit.edu
+		ServerAlias cdsa
+		DocumentRoot /afs/athena.mit.edu/org/c/cdsa/web_scripts
+		Alias /~cdsa /afs/athena.mit.edu/org/c/cdsa/web_scripts
+		SuExecUserGroup cdsa cdsa
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/cdsa.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/classmates.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/classmates.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/classmates.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName classmates.mit.edu
+	ServerAlias classmates
+	DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/social/classmates
+	Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+	SuExecUserGroup keone keone
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName classmates.mit.edu
+		ServerAlias classmates
+		DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/social/classmates
+		Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+		SuExecUserGroup keone keone
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/classmates.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName classmates.mit.edu
+		ServerAlias classmates
+		DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/social/classmates
+		Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+		SuExecUserGroup keone keone
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/classmates.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cook.bluechi.ps.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cook.bluechi.ps.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cook.bluechi.ps.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName cook.bluechi.ps
+	
+	DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/cook.bluechi.ps
+	Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+	SuExecUserGroup blue-sun blue-sun
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName cook.bluechi.ps
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/cook.bluechi.ps
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/cook.bluechi.ps.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName cook.bluechi.ps
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/cook.bluechi.ps
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/cook.bluechi.ps.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/crew.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/crew.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/crew.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName crew.mit.edu
+	ServerAlias crew
+	DocumentRoot /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+	Alias /~mitcrew /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+	SuExecUserGroup mitcrew mitcrew
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName crew.mit.edu
+		ServerAlias crew
+		DocumentRoot /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+		Alias /~mitcrew /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+		SuExecUserGroup mitcrew mitcrew
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/crew.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName crew.mit.edu
+		ServerAlias crew
+		DocumentRoot /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+		Alias /~mitcrew /afs/athena.mit.edu/activity/m/mitcrew/web_scripts
+		SuExecUserGroup mitcrew mitcrew
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/crew.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cs6090.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cs6090.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/cs6090.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName cs6090.mit.edu
+	ServerAlias cs6090
+	DocumentRoot /afs/athena.mit.edu/course/6/6.090/web_scripts
+	Alias /~6.090 /afs/athena.mit.edu/course/6/6.090/web_scripts
+	SuExecUserGroup 6.090 6.090
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName cs6090.mit.edu
+		ServerAlias cs6090
+		DocumentRoot /afs/athena.mit.edu/course/6/6.090/web_scripts
+		Alias /~6.090 /afs/athena.mit.edu/course/6/6.090/web_scripts
+		SuExecUserGroup 6.090 6.090
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/cs6090.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName cs6090.mit.edu
+		ServerAlias cs6090
+		DocumentRoot /afs/athena.mit.edu/course/6/6.090/web_scripts
+		Alias /~6.090 /afs/athena.mit.edu/course/6/6.090/web_scripts
+		SuExecUserGroup 6.090 6.090
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/cs6090.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/debathena.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/debathena.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/debathena.conf	(revision 1803)
@@ -0,0 +1,35 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName debathena.mit.edu
+	ServerAlias debathena
+	DocumentRoot /afs/sipb.mit.edu/project/debathena/web_scripts
+	Alias /~debathena /afs/sipb.mit.edu/project/debathena/web_scripts
+	SuExecUserGroup debathena debathena
+	Include conf.d/vhosts-common.conf
+	CustomLog /home/logview/debathena.log combined
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName debathena.mit.edu
+		ServerAlias debathena
+		DocumentRoot /afs/sipb.mit.edu/project/debathena/web_scripts
+		Alias /~debathena /afs/sipb.mit.edu/project/debathena/web_scripts
+		SuExecUserGroup debathena debathena
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/debathena.pem
+		CustomLog /home/logview/debathena.log combined
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName debathena.mit.edu
+		ServerAlias debathena
+		DocumentRoot /afs/sipb.mit.edu/project/debathena/web_scripts
+		Alias /~debathena /afs/sipb.mit.edu/project/debathena/web_scripts
+		SuExecUserGroup debathena debathena
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/debathena.pem
+		CustomLog /home/logview/debathena.log combined
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/eastgate.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/eastgate.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/eastgate.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName eastgate.mit.edu
+	ServerAlias eastgate
+	DocumentRoot /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+	Alias /~eastgate /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+	SuExecUserGroup eastgate eastgate
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName eastgate.mit.edu
+		ServerAlias eastgate
+		DocumentRoot /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+		Alias /~eastgate /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+		SuExecUserGroup eastgate eastgate
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/eastgate.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName eastgate.mit.edu
+		ServerAlias eastgate
+		DocumentRoot /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+		Alias /~eastgate /afs/athena.mit.edu/activity/e/eastgate/web_scripts
+		SuExecUserGroup eastgate eastgate
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/eastgate.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ec.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ec.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ec.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName ec.mit.edu
+	ServerAlias ec
+	DocumentRoot /afs/athena.mit.edu/activity/e/ec/web_scripts
+	Alias /~ec /afs/athena.mit.edu/activity/e/ec/web_scripts
+	SuExecUserGroup ec ec
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName ec.mit.edu
+		ServerAlias ec
+		DocumentRoot /afs/athena.mit.edu/activity/e/ec/web_scripts
+		Alias /~ec /afs/athena.mit.edu/activity/e/ec/web_scripts
+		SuExecUserGroup ec ec
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/ec.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName ec.mit.edu
+		ServerAlias ec
+		DocumentRoot /afs/athena.mit.edu/activity/e/ec/web_scripts
+		Alias /~ec /afs/athena.mit.edu/activity/e/ec/web_scripts
+		SuExecUserGroup ec ec
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/ec.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/familynet.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/familynet.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/familynet.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName familynet.mit.edu
+	ServerAlias familynet
+	DocumentRoot /afs/athena.mit.edu/org/f/familynet/web_scripts
+	Alias /~familynet /afs/athena.mit.edu/org/f/familynet/web_scripts
+	SuExecUserGroup familynet familynet
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName familynet.mit.edu
+		ServerAlias familynet
+		DocumentRoot /afs/athena.mit.edu/org/f/familynet/web_scripts
+		Alias /~familynet /afs/athena.mit.edu/org/f/familynet/web_scripts
+		SuExecUserGroup familynet familynet
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/familynet.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName familynet.mit.edu
+		ServerAlias familynet
+		DocumentRoot /afs/athena.mit.edu/org/f/familynet/web_scripts
+		Alias /~familynet /afs/athena.mit.edu/org/f/familynet/web_scripts
+		SuExecUserGroup familynet familynet
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/familynet.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finance.blue-sun-corp.com.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finance.blue-sun-corp.com.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finance.blue-sun-corp.com.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName finance.blue-sun-corp.com
+
+	DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/finance
+	Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+	SuExecUserGroup blue-sun blue-sun
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName finance.blue-sun-corp.com
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/finance
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName finance.blue-sun-corp.com
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/finance
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finboard.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finboard.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/finboard.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName finboard.mit.edu
+	ServerAlias finboard
+	DocumentRoot /afs/athena.mit.edu/activity/f/finboard/web_scripts/finboard
+	Alias /~finboard /afs/athena.mit.edu/activity/f/finboard/web_scripts
+	SuExecUserGroup finboard finboard
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName finboard.mit.edu
+		ServerAlias finboard
+		DocumentRoot /afs/athena.mit.edu/activity/f/finboard/web_scripts/finboard
+		Alias /~finboard /afs/athena.mit.edu/activity/f/finboard/web_scripts
+		SuExecUserGroup finboard finboard
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/finboard.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName finboard.mit.edu
+		ServerAlias finboard
+		DocumentRoot /afs/athena.mit.edu/activity/f/finboard/web_scripts/finboard
+		Alias /~finboard /afs/athena.mit.edu/activity/f/finboard/web_scripts
+		SuExecUserGroup finboard finboard
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/finboard.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/fridget.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/fridget.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/fridget.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName fridget.mit.edu
+	ServerAlias fridget
+	DocumentRoot /afs/athena.mit.edu/user/k/r/kristjan/web_scripts/fridget
+	Alias /~kristjan /afs/athena.mit.edu/user/k/r/kristjan/web_scripts
+	SuExecUserGroup kristjan kristjan
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName fridget.mit.edu
+		ServerAlias fridget
+		DocumentRoot /afs/athena.mit.edu/user/k/r/kristjan/web_scripts/fridget
+		Alias /~kristjan /afs/athena.mit.edu/user/k/r/kristjan/web_scripts
+		SuExecUserGroup kristjan kristjan
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/fridget.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName fridget.mit.edu
+		ServerAlias fridget
+		DocumentRoot /afs/athena.mit.edu/user/k/r/kristjan/web_scripts/fridget
+		Alias /~kristjan /afs/athena.mit.edu/user/k/r/kristjan/web_scripts
+		SuExecUserGroup kristjan kristjan
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/fridget.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/gsc.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/gsc.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/gsc.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName gsc.mit.edu
+	ServerAlias gsc
+	DocumentRoot /afs/athena.mit.edu/activity/g/gsc/web_scripts
+	Alias /~gsc /afs/athena.mit.edu/activity/g/gsc/web_scripts
+	SuExecUserGroup gsc gsc
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName gsc.mit.edu
+		ServerAlias gsc
+		DocumentRoot /afs/athena.mit.edu/activity/g/gsc/web_scripts
+		Alias /~gsc /afs/athena.mit.edu/activity/g/gsc/web_scripts
+		SuExecUserGroup gsc gsc
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/gsc.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName gsc.mit.edu
+		ServerAlias gsc
+		DocumentRoot /afs/athena.mit.edu/activity/g/gsc/web_scripts
+		Alias /~gsc /afs/athena.mit.edu/activity/g/gsc/web_scripts
+		SuExecUserGroup gsc gsc
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/gsc.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/impact.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/impact.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/impact.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName impact.mit.edu
+	ServerAlias impact
+	DocumentRoot /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+	Alias /~mitimpact /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+	SuExecUserGroup mitimpact mitimpact
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName impact.mit.edu
+		ServerAlias impact
+		DocumentRoot /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+		Alias /~mitimpact /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+		SuExecUserGroup mitimpact mitimpact
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/impact.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName impact.mit.edu
+		ServerAlias impact
+		DocumentRoot /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+		Alias /~mitimpact /afs/athena.mit.edu/org/m/mitimpact/web_scripts
+		SuExecUserGroup mitimpact mitimpact
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/impact.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/isawyou.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/isawyou.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/isawyou.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName isawyou.mit.edu
+	ServerAlias isawyou
+	DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/isawyou
+	Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+	SuExecUserGroup keone keone
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName isawyou.mit.edu
+		ServerAlias isawyou
+		DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/isawyou
+		Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+		SuExecUserGroup keone keone
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/isawyou.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName isawyou.mit.edu
+		ServerAlias isawyou
+		DocumentRoot /afs/athena.mit.edu/user/k/e/keone/web_scripts/isawyou
+		Alias /~keone /afs/athena.mit.edu/user/k/e/keone/web_scripts
+		SuExecUserGroup keone keone
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/isawyou.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/listmon.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/listmon.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/listmon.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName listmon.mit.edu
+	ServerAlias listmon
+	DocumentRoot /afs/athena.mit.edu/user/a/s/aseering/web_scripts/listmon
+	Alias /~aseering /afs/athena.mit.edu/user/a/s/aseering/web_scripts
+	SuExecUserGroup aseering aseering
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName listmon.mit.edu
+		ServerAlias listmon
+		DocumentRoot /afs/athena.mit.edu/user/a/s/aseering/web_scripts/listmon
+		Alias /~aseering /afs/athena.mit.edu/user/a/s/aseering/web_scripts
+		SuExecUserGroup aseering aseering
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/listmon.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName listmon.mit.edu
+		ServerAlias listmon
+		DocumentRoot /afs/athena.mit.edu/user/a/s/aseering/web_scripts/listmon
+		Alias /~aseering /afs/athena.mit.edu/user/a/s/aseering/web_scripts
+		SuExecUserGroup aseering aseering
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/listmon.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/metu.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/metu.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/metu.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName metu.mit.edu
+	ServerAlias metu
+	DocumentRoot /afs/athena.mit.edu/org/m/metu/web_scripts/openings
+	Alias /~metu /afs/athena.mit.edu/org/m/metu/web_scripts
+	SuExecUserGroup metu metu
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName metu.mit.edu
+		ServerAlias metu
+		DocumentRoot /afs/athena.mit.edu/org/m/metu/web_scripts/openings
+		Alias /~metu /afs/athena.mit.edu/org/m/metu/web_scripts
+		SuExecUserGroup metu metu
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/metu.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName metu.mit.edu
+		ServerAlias metu
+		DocumentRoot /afs/athena.mit.edu/org/m/metu/web_scripts/openings
+		Alias /~metu /afs/athena.mit.edu/org/m/metu/web_scripts
+		SuExecUserGroup metu metu
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/metu.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/mitsoc.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/mitsoc.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/mitsoc.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName mitsoc.mit.edu
+	ServerAlias mitsoc
+	DocumentRoot /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+	Alias /~mitsoc /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+	SuExecUserGroup mitsoc mitsoc
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName mitsoc.mit.edu
+		ServerAlias mitsoc
+		DocumentRoot /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+		Alias /~mitsoc /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+		SuExecUserGroup mitsoc mitsoc
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/mitsoc.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName mitsoc.mit.edu
+		ServerAlias mitsoc
+		DocumentRoot /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+		Alias /~mitsoc /afs/athena.mit.edu/activity/m/mitsoc/web_scripts
+		SuExecUserGroup mitsoc mitsoc
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/mitsoc.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/music.blue-sun-corp.com.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/music.blue-sun-corp.com.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/music.blue-sun-corp.com.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName music.blue-sun-corp.com
+
+	DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/music
+	Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+	SuExecUserGroup blue-sun blue-sun
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName music.blue-sun-corp.com
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/music
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName music.blue-sun-corp.com
+		
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/music
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/next.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/next.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/next.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName next.mit.edu
+	ServerAlias next
+	DocumentRoot /afs/athena.mit.edu/activity/n/next/web_scripts/root
+	Alias /~next /afs/athena.mit.edu/activity/n/next/web_scripts
+	SuExecUserGroup next next
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName next.mit.edu
+		ServerAlias next
+		DocumentRoot /afs/athena.mit.edu/activity/n/next/web_scripts/root
+		Alias /~next /afs/athena.mit.edu/activity/n/next/web_scripts
+		SuExecUserGroup next next
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/next.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName next.mit.edu
+		ServerAlias next
+		DocumentRoot /afs/athena.mit.edu/activity/n/next/web_scripts/root
+		Alias /~next /afs/athena.mit.edu/activity/n/next/web_scripts
+		SuExecUserGroup next next
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/next.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/picker.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/picker.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/picker.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName picker.mit.edu
+	ServerAlias picker
+	DocumentRoot /afs/athena.mit.edu/course/urop/picker/web_scripts
+	Alias /~picker /afs/athena.mit.edu/course/urop/picker/web_scripts
+	SuExecUserGroup picker picker
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName picker.mit.edu
+		ServerAlias picker
+		DocumentRoot /afs/athena.mit.edu/course/urop/picker/web_scripts
+		Alias /~picker /afs/athena.mit.edu/course/urop/picker/web_scripts
+		SuExecUserGroup picker picker
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/picker.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName picker.mit.edu
+		ServerAlias picker
+		DocumentRoot /afs/athena.mit.edu/course/urop/picker/web_scripts
+		Alias /~picker /afs/athena.mit.edu/course/urop/picker/web_scripts
+		SuExecUserGroup picker picker
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/picker.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/psetcentral.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/psetcentral.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/psetcentral.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName psetcentral.mit.edu
+	ServerAlias psetcentral
+	DocumentRoot /afs/athena.mit.edu/course/21/21w785/web_scripts/psetcentral
+	Alias /~21w785 /afs/athena.mit.edu/course/21/21w785/web_scripts
+	SuExecUserGroup 21w785 21w785
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName psetcentral.mit.edu
+		ServerAlias psetcentral
+		DocumentRoot /afs/athena.mit.edu/course/21/21w785/web_scripts/psetcentral
+		Alias /~21w785 /afs/athena.mit.edu/course/21/21w785/web_scripts
+		SuExecUserGroup 21w785 21w785
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/psetcentral.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName psetcentral.mit.edu
+		ServerAlias psetcentral
+		DocumentRoot /afs/athena.mit.edu/course/21/21w785/web_scripts/psetcentral
+		Alias /~21w785 /afs/athena.mit.edu/course/21/21w785/web_scripts
+		SuExecUserGroup 21w785 21w785
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/psetcentral.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/random-hall.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/random-hall.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/random-hall.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName random-hall.mit.edu
+	ServerAlias random-hall
+	DocumentRoot /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+	Alias /~random-hall /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+	SuExecUserGroup random-hall random-hall
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName random-hall.mit.edu
+		ServerAlias random-hall
+		DocumentRoot /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+		Alias /~random-hall /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+		SuExecUserGroup random-hall random-hall
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/random-hall.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName random-hall.mit.edu
+		ServerAlias random-hall
+		DocumentRoot /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+		Alias /~random-hall /afs/athena.mit.edu/activity/r/random-hall/web_scripts
+		SuExecUserGroup random-hall random-hall
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/random-hall.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/reify-vhost.py
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/reify-vhost.py	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/reify-vhost.py	(revision 1803)
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+#
+# Converts an apacheConfig record from LDAP, as used by mod_vhost_ldap,
+# into a <VirtualHost> record as used in an Apache conf.d directory.
+# Useful for adding things like SSL server certs that mod_vhost_ldap
+# doesn't support.
+#
+# Usage:
+# scripts# cd /etc/httpd/vhosts.d
+# scripts# ./reify-vhost.py geofft > geofft.conf
+# scripts# service httpd graceful
+# 
+# Geoffrey Thomas <geofft@mit.edu>, 2008, public domain.
+
+# Note: As of 1/2011 we are inserting SSLCertificateKeyFile into reified
+# hosts, because previously-acqured certificates were signed with an
+# older (1024-bit) key. Sometime around 2014 when our last cert with
+# this key expires, we can update /etc/httpd/conf/httpd.conf to point to
+# the current key instead of the old one, and stop inserting this into
+# individual vhost records. -geofft
+
+import ldap
+import ldap.filter
+import pwd
+import sys
+
+ll = ldap.initialize("ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/")
+ll.simple_bind_s("", "")
+
+host = sys.argv[1]
+
+r = ll.search_s(
+    "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu",
+    ldap.SCOPE_SUBTREE,
+    ldap.filter.filter_format(
+            "(&(objectClass=apacheConfig)" +
+            "(|(apacheServerName=%s)" +
+            "(apacheServerAlias=%s)))",
+           [host, host]))
+if len(r) != 0:
+    user = pwd.getpwuid(int(r[0][1]['apacheSuexecUid'][0]))
+    serveralias = ""
+    if 'apacheServerAlias' in r[0][1]:
+        serveralias = "ServerAlias "+" ".join(r[0][1]['apacheServerAlias'])
+    print """# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName %(servername)s
+	%(serveralias)s
+	DocumentRoot %(docroot)s
+	Alias /~%(uname)s %(homedir)s/web_scripts
+	SuExecUserGroup %(uname)s %(uname)s
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName %(servername)s
+		%(serveralias)s
+		DocumentRoot %(docroot)s
+		Alias /~%(uname)s %(homedir)s/web_scripts
+		SuExecUserGroup %(uname)s %(uname)s
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/%(hname)s.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName %(servername)s
+		%(serveralias)s
+		DocumentRoot %(docroot)s
+		Alias /~%(uname)s %(homedir)s/web_scripts
+		SuExecUserGroup %(uname)s %(uname)s
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/%(hname)s.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>""" % {
+    'servername': r[0][1]['apacheServerName'][0],
+    'serveralias': serveralias,
+    'docroot': r[0][1]['apacheDocumentRoot'][0],
+    'uname': user[0],
+    'homedir': user[5],
+    'hname': host
+}
+
+# vim: set ts=4 sw=4 et:
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sayno.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sayno.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sayno.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName sayno.mit.edu
+	ServerAlias sayno
+	DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts/sayno
+	Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+	SuExecUserGroup cfs cfs
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName sayno.mit.edu
+		ServerAlias sayno
+		DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts/sayno
+		Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		SuExecUserGroup cfs cfs
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/sayno.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName sayno.mit.edu
+		ServerAlias sayno
+		DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts/sayno
+		Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		SuExecUserGroup cfs cfs
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/sayno.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/schuh.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/schuh.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/schuh.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName schuh.mit.edu
+	ServerAlias schuh
+	DocumentRoot /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+	Alias /~schuhgroup /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+	SuExecUserGroup schuhgroup schuhgroup
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName schuh.mit.edu
+		ServerAlias schuh
+		DocumentRoot /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+		Alias /~schuhgroup /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+		SuExecUserGroup schuhgroup schuhgroup
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/schuh.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName schuh.mit.edu
+		ServerAlias schuh
+		DocumentRoot /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+		Alias /~schuhgroup /afs/athena.mit.edu/org/s/schuhgroup/web_scripts
+		SuExecUserGroup schuhgroup schuhgroup
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/schuh.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/signup.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/signup.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/signup.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName signup.mit.edu
+	ServerAlias signup
+	DocumentRoot /afs/athena.mit.edu/user/d/h/dheera/web_scripts/signup
+	Alias /~dheera /afs/athena.mit.edu/user/d/h/dheera/web_scripts
+	SuExecUserGroup dheera dheera
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName signup.mit.edu
+		ServerAlias signup
+		DocumentRoot /afs/athena.mit.edu/user/d/h/dheera/web_scripts/signup
+		Alias /~dheera /afs/athena.mit.edu/user/d/h/dheera/web_scripts
+		SuExecUserGroup dheera dheera
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/signup.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName signup.mit.edu
+		ServerAlias signup
+		DocumentRoot /afs/athena.mit.edu/user/d/h/dheera/web_scripts/signup
+		Alias /~dheera /afs/athena.mit.edu/user/d/h/dheera/web_scripts
+		SuExecUserGroup dheera dheera
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/signup.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sipb.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sipb.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/sipb.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName sipb.mit.edu
+	ServerAlias sipb
+	DocumentRoot /afs/sipb.mit.edu/project/sipb-www/web_scripts/sipb
+	Alias /~sipb-www /afs/sipb.mit.edu/project/sipb-www/web_scripts
+	SuExecUserGroup sipb-www sipb-www
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName sipb.mit.edu
+		ServerAlias sipb
+		DocumentRoot /afs/sipb.mit.edu/project/sipb-www/web_scripts/sipb
+		Alias /~sipb-www /afs/sipb.mit.edu/project/sipb-www/web_scripts
+		SuExecUserGroup sipb-www sipb-www
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/sipb.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName sipb.mit.edu
+		ServerAlias sipb
+		DocumentRoot /afs/sipb.mit.edu/project/sipb-www/web_scripts/sipb
+		Alias /~sipb-www /afs/sipb.mit.edu/project/sipb-www/web_scripts
+		SuExecUserGroup sipb-www sipb-www
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/sipb.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/swe.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/swe.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/swe.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName swe.mit.edu
+	ServerAlias swe
+	DocumentRoot /afs/athena.mit.edu/activity/s/swe/web_scripts
+	Alias /~swe /afs/athena.mit.edu/activity/s/swe/web_scripts
+	SuExecUserGroup swe swe
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName swe.mit.edu
+		ServerAlias swe
+		DocumentRoot /afs/athena.mit.edu/activity/s/swe/web_scripts
+		Alias /~swe /afs/athena.mit.edu/activity/s/swe/web_scripts
+		SuExecUserGroup swe swe
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/swe.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName swe.mit.edu
+		ServerAlias swe
+		DocumentRoot /afs/athena.mit.edu/activity/s/swe/web_scripts
+		Alias /~swe /afs/athena.mit.edu/activity/s/swe/web_scripts
+		SuExecUserGroup swe swe
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/swe.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/techfair.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/techfair.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/techfair.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName techfair.mit.edu
+	ServerAlias techfair
+	DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+	Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+	SuExecUserGroup techfair techfair
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName techfair.mit.edu
+		ServerAlias techfair
+		DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		SuExecUserGroup techfair techfair
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/techfair.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName techfair.mit.edu
+		ServerAlias techfair
+		DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		SuExecUserGroup techfair techfair
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/techfair.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/template
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/template	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/template	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName hname.mit.edu
+	ServerAlias hname
+	DocumentRoot /afs/athena.mit.edu/path/web_scripts/subdir
+	Alias /~uname /afs/athena.mit.edu/path/web_scripts
+	SuExecUserGroup uname uname
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName hname.mit.edu
+		ServerAlias hname
+		DocumentRoot /afs/athena.mit.edu/path/web_scripts/subdir
+		Alias /~uname /afs/athena.mit.edu/path/web_scripts
+		SuExecUserGroup uname uname
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/hname.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName hname.mit.edu
+		ServerAlias hname
+		DocumentRoot /afs/athena.mit.edu/path/web_scripts/subdir
+		Alias /~uname /afs/athena.mit.edu/path/web_scripts
+		SuExecUserGroup uname uname
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/hname.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tf.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tf.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tf.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName tf.mit.edu
+	ServerAlias tf
+	DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+	Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+	SuExecUserGroup techfair techfair
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName tf.mit.edu
+		ServerAlias tf
+		DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		SuExecUserGroup techfair techfair
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/tf.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName tf.mit.edu
+		ServerAlias tf
+		DocumentRoot /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		Alias /~techfair /afs/athena.mit.edu/activity/t/techfair/web_scripts
+		SuExecUserGroup techfair techfair
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/tf.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tibetforum.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tibetforum.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tibetforum.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName tibetforum.mit.edu
+	ServerAlias tibetforum
+	DocumentRoot /afs/athena.mit.edu/activity/c/cssa/web_scripts/phpbb
+	Alias /~cssa /afs/athena.mit.edu/activity/c/cssa/web_scripts
+	SuExecUserGroup cssa cssa
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName tibetforum.mit.edu
+		ServerAlias tibetforum
+		DocumentRoot /afs/athena.mit.edu/activity/c/cssa/web_scripts/phpbb
+		Alias /~cssa /afs/athena.mit.edu/activity/c/cssa/web_scripts
+		SuExecUserGroup cssa cssa
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/tibetforum.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName tibetforum.mit.edu
+		ServerAlias tibetforum
+		DocumentRoot /afs/athena.mit.edu/activity/c/cssa/web_scripts/phpbb
+		Alias /~cssa /afs/athena.mit.edu/activity/c/cssa/web_scripts
+		SuExecUserGroup cssa cssa
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/tibetforum.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tours.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tours.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/tours.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName tours.mit.edu
+	ServerAlias tours
+	DocumentRoot /afs/athena.mit.edu/org/t/tours/web_scripts
+	Alias /~tours /afs/athena.mit.edu/org/t/tours/web_scripts
+	SuExecUserGroup tours tours
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName tours.mit.edu
+		ServerAlias tours
+		DocumentRoot /afs/athena.mit.edu/org/t/tours/web_scripts
+		Alias /~tours /afs/athena.mit.edu/org/t/tours/web_scripts
+		SuExecUserGroup tours tours
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/tours.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName tours.mit.edu
+		ServerAlias tours
+		DocumentRoot /afs/athena.mit.edu/org/t/tours/web_scripts
+		Alias /~tours /afs/athena.mit.edu/org/t/tours/web_scripts
+		SuExecUserGroup tours tours
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/tours.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/trac.blue-sun-corp.com.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/trac.blue-sun-corp.com.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/trac.blue-sun-corp.com.conf	(revision 1803)
@@ -0,0 +1,34 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName trac.blue-sun-corp.com
+	ServerAlias wiki.blue-sun-corp.com
+	DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/trac
+	Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+	SuExecUserGroup blue-sun blue-sun
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName trac.blue-sun-corp.com
+		ServerAlias wiki.blue-sun-corp.com
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/trac
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName trac.blue-sun-corp.com
+		ServerAlias wiki.blue-sun-corp.com
+		DocumentRoot /afs/sipb.mit.edu/contrib/blue-sun/web_scripts/trac
+		Alias /~blue-sun /afs/sipb.mit.edu/contrib/blue-sun/web_scripts
+		SuExecUserGroup blue-sun blue-sun
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/blue-sun-corp.com.pem
+		SSLCertificateKeyFile /etc/pki/tls/private/scripts.key
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/twentytwelve.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/twentytwelve.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/twentytwelve.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName twentytwelve.mit.edu
+	ServerAlias twentytwelve
+	DocumentRoot /afs/athena.mit.edu/activity/other/2012/web_scripts
+	Alias /~2012 /afs/athena.mit.edu/activity/other/2012/web_scripts
+	SuExecUserGroup 2012 2012
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName twentytwelve.mit.edu
+		ServerAlias twentytwelve
+		DocumentRoot /afs/athena.mit.edu/activity/other/2012/web_scripts
+		Alias /~2012 /afs/athena.mit.edu/activity/other/2012/web_scripts
+		SuExecUserGroup 2012 2012
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/twentytwelve.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName twentytwelve.mit.edu
+		ServerAlias twentytwelve
+		DocumentRoot /afs/athena.mit.edu/activity/other/2012/web_scripts
+		Alias /~2012 /afs/athena.mit.edu/activity/other/2012/web_scripts
+		SuExecUserGroup 2012 2012
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/twentytwelve.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ua.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ua.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/ua.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName ua.mit.edu
+	ServerAlias ua
+	DocumentRoot /afs/athena.mit.edu/activity/u/ua/web_scripts/wiki
+	Alias /~ua /afs/athena.mit.edu/activity/u/ua/web_scripts
+	SuExecUserGroup ua ua
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName ua.mit.edu
+		ServerAlias ua
+		DocumentRoot /afs/athena.mit.edu/activity/u/ua/web_scripts/wiki
+		Alias /~ua /afs/athena.mit.edu/activity/u/ua/web_scripts
+		SuExecUserGroup ua ua
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/ua.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName ua.mit.edu
+		ServerAlias ua
+		DocumentRoot /afs/athena.mit.edu/activity/u/ua/web_scripts/wiki
+		Alias /~ua /afs/athena.mit.edu/activity/u/ua/web_scripts
+		SuExecUserGroup ua ua
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/ua.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/wakeup.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/wakeup.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/wakeup.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName wakeup.mit.edu
+	ServerAlias wakeup
+	DocumentRoot /afs/athena.mit.edu/user/g/e/geofft/web_scripts/wakeup
+	Alias /~geofft /afs/athena.mit.edu/user/g/e/geofft/web_scripts
+	SuExecUserGroup geofft geofft
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName wakeup.mit.edu
+		ServerAlias wakeup
+		DocumentRoot /afs/athena.mit.edu/user/g/e/geofft/web_scripts/wakeup
+		Alias /~geofft /afs/athena.mit.edu/user/g/e/geofft/web_scripts
+		SuExecUserGroup geofft geofft
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/wakeup.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName wakeup.mit.edu
+		ServerAlias wakeup
+		DocumentRoot /afs/athena.mit.edu/user/g/e/geofft/web_scripts/wakeup
+		Alias /~geofft /afs/athena.mit.edu/user/g/e/geofft/web_scripts
+		SuExecUserGroup geofft geofft
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/wakeup.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/westgate.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/westgate.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/westgate.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName westgate.mit.edu
+	ServerAlias westgate
+	DocumentRoot /afs/athena.mit.edu/activity/w/westgate/web_scripts
+	Alias /~westgate /afs/athena.mit.edu/activity/w/westgate/web_scripts
+	SuExecUserGroup westgate westgate
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName westgate.mit.edu
+		ServerAlias westgate
+		DocumentRoot /afs/athena.mit.edu/activity/w/westgate/web_scripts
+		Alias /~westgate /afs/athena.mit.edu/activity/w/westgate/web_scripts
+		SuExecUserGroup westgate westgate
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/westgate.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName westgate.mit.edu
+		ServerAlias westgate
+		DocumentRoot /afs/athena.mit.edu/activity/w/westgate/web_scripts
+		Alias /~westgate /afs/athena.mit.edu/activity/w/westgate/web_scripts
+		SuExecUserGroup westgate westgate
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/westgate.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/whatsnext.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/whatsnext.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/httpd/vhosts.d/whatsnext.conf	(revision 1803)
@@ -0,0 +1,32 @@
+# do not trailing-slash DocumentRoot
+
+<VirtualHost *:80>
+	ServerName whatsnext.mit.edu
+	ServerAlias whatsnext
+	DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts
+	Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+	SuExecUserGroup cfs cfs
+	Include conf.d/vhosts-common.conf
+</VirtualHost>
+
+<IfModule ssl_module>
+	<VirtualHost *:443>
+		ServerName whatsnext.mit.edu
+		ServerAlias whatsnext
+		DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		SuExecUserGroup cfs cfs
+		Include conf.d/vhosts-common-ssl.conf
+		SSLCertificateFile /etc/pki/tls/certs/whatsnext.pem
+	</VirtualHost>
+	<VirtualHost *:444>
+		ServerName whatsnext.mit.edu
+		ServerAlias whatsnext
+		DocumentRoot /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		Alias /~cfs /afs/sipb.mit.edu/contrib/cfs/web_scripts
+		SuExecUserGroup cfs cfs
+		Include conf.d/vhosts-common-ssl.conf
+		Include conf.d/vhosts-common-ssl-cert.conf
+		SSLCertificateFile /etc/pki/tls/certs/whatsnext.pem
+	</VirtualHost>
+</IfModule>
Index: branches/fc15-dev/server/fedora/config/etc/issue.net
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/issue.net	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/issue.net	(revision 1803)
@@ -0,0 +1,1 @@
+If you have trouble logging in, see http://scripts.mit.edu/faq/41/.
Index: branches/fc15-dev/server/fedora/config/etc/issue.net.no_tkt
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/issue.net.no_tkt	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/issue.net.no_tkt	(revision 1803)
@@ -0,0 +1,5 @@
+You must log in to the scripts service using Kerberos tickets, but
+your ssh client did not pass a valid ticket to the scripts server.
+
+See http://scripts.mit.edu/faq/41
+
Index: branches/fc15-dev/server/fedora/config/etc/issue.net.no_user
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/issue.net.no_user	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/issue.net.no_user	(revision 1803)
@@ -0,0 +1,3 @@
+You do not appear to be signed up for the scripts.mit.edu service.
+
+You may sign up at http://scripts.mit.edu/
Index: branches/fc15-dev/server/fedora/config/etc/krb.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/krb.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/krb.conf	(revision 1803)
@@ -0,0 +1,5 @@
+ATHENA.MIT.EDU
+ATHENA.MIT.EDU	KERBEROS.MIT.EDU admin server
+ATHENA.MIT.EDU	KERBEROS-1.MIT.EDU
+ATHENA.MIT.EDU	KERBEROS-2.MIT.EDU
+ATHENA.MIT.EDU	KERBEROS-3.MIT.EDU
Index: branches/fc15-dev/server/fedora/config/etc/krb.realms
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/krb.realms	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/krb.realms	(revision 1803)
@@ -0,0 +1,54 @@
+sics.se		SICS.SE
+.sics.se	SICS.SE
+nada.kth.se	NADA.KTH.SE
+pdc.kth.se	NADA.KTH.SE
+.hydro.kth.se	NADA.KTH.SE
+.mech.kth.se	MECH.KTH.SE
+.nada.kth.se	NADA.KTH.SE
+.pdc.kth.se	NADA.KTH.SE
+.sans.kth.se	NADA.KTH.SE
+.admin.kth.se	ADMIN.KTH.SE
+.e.kth.se	E.KTH.SE
+.s3.kth.se	E.KTH.SE
+.radio.kth.se	E.KTH.SE
+.ttt.kth.se	E.KTH.SE
+.electrum.kth.se	IT.KTH.SE
+.math.kth.se	MATH.KTH.SE
+.it.kth.se	IT.KTH.SE
+.sth.sunet.se	SUNET.SE
+.pilsnet.sunet.se	SUNET.SE
+.sunet.se	SUNET.SE
+.ml.kva.se	ML.KVA.SE
+pi.se		PI.SE
+.pi.se		PI.SE
+.adm.pi.se	PI.SE
+.stacken.kth.se	STACKEN.KTH.SE
+kth.se		KTH.SE
+.kth.se		KTH.SE
+.bion.kth.se	BION.KTH.SE
+.lib.kth.se	LIB.KTH.SE
+.dsv.su.se	DSV.SU.SE
+.MIT.EDU ATHENA.MIT.EDU
+.MIT.EDU. ATHENA.MIT.EDU
+MIT.EDU ATHENA.MIT.EDU
+DODO.MIT.EDU SMS_TEST.MIT.EDU
+.UCSC.EDU CATS.UCSC.EDU
+.UCSC.EDU. CATS.UCSC.EDU
+CYGNUS.COM CYGNUS.COM
+.CYGNUS.COM CYGNUS.COM
+MIRKWOOD.CYGNUS.COM MIRKWOOD.CYGNUS.COM
+KITHRUP.COM KITHRUP.COM
+.KITHRUP.COM KITHRUP.COM
+.berkeley.edu   EECS.BERKELEY.EDU
+.CS.berkeley.edu        EECS.BERKELEY.EDU
+.MIT.EDU        ATHENA.MIT.EDU
+.mit.edu        ATHENA.MIT.EDU
+.BSDI.COM       BSDI.COM
+ARMADILLO.COM	ARMADILLO.COM
+.ARMADILLO.COM	ARMADILLO.COM
+ZEN.ORG		ZEN.ORG
+.ZEN.ORG	ZEN.ORG
+toad.com	TOAD.COM
+.toad.com	TOAD.COM
+lloyd.com	LLOYD.COM
+.lloyd.com	LLOYD.COM
Index: branches/fc15-dev/server/fedora/config/etc/krb5.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/krb5.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/krb5.conf	(revision 1803)
@@ -0,0 +1,116 @@
+[libdefaults]
+	default_realm = ATHENA.MIT.EDU
+# The following krb5.conf variables are only for MIT Kerberos.
+	krb4_config = /etc/krb.conf
+	krb4_realms = /etc/krb.realms
+	kdc_timesync = 1
+	ccache_type = 4
+	forwardable = true
+	proxiable = true
+	v4_instance_resolve = false
+	v4_name_convert = {
+		host = {
+			rcmd = host
+			ftp = ftp
+		}
+		plain = {
+			something = something-else
+		}
+	}
+
+[realms]
+	ATHENA.MIT.EDU = {
+		kdc = kerberos.mit.edu:88
+		kdc = kerberos-1.mit.edu:88
+		kdc = kerberos-2.mit.edu:88
+		kdc = kerberos-3.mit.edu:88
+		admin_server = kerberos.mit.edu
+		default_domain = mit.edu
+	}
+	MEDIA-LAB.MIT.EDU = {
+		kdc = kerberos.media.mit.edu
+		admin_server = kerberos.media.mit.edu
+	}
+	ZONE.MIT.EDU = {
+		kdc = casio.mit.edu
+		kdc = seiko.mit.edu
+		admin_server = casio.mit.edu
+	}
+	MOOF.MIT.EDU = {
+		kdc = three-headed-dogcow.mit.edu:88
+		kdc = three-headed-dogcow-1.mit.edu:88
+		admin_server = three-headed-dogcow.mit.edu
+	}
+	CYGNUS.COM = {
+		kdc = KERBEROS.CYGNUS.COM
+		kdc = KERBEROS-1.CYGNUS.COM
+		admin_server = KERBEROS.CYGNUS.COM
+	}
+	GREY17.ORG = {
+		kdc = kerberos.grey17.org
+		admin_server = kerberos.grey17.org
+	}
+	IHTFP.ORG = {
+		kdc = kerberos.ihtfp.org
+		admin_server = kerberos.ihtfp.org
+	}
+	GNU.ORG = {
+		kdc = kerberos.gnu.org
+		kdc = kerberos-2.gnu.org
+		kdc = kerberos-3.gnu.org
+		admin_server = kerberos.gnu.org
+	}
+	1TS.ORG = {
+		kdc = kerberos.1ts.org
+		admin_server = kerberos.1ts.org
+	}
+	GRATUITOUS.ORG = {
+		kdc = kerberos.gratuitous.org
+		admin_server = kerberos.gratuitous.org
+	}
+	DOOMCOM.ORG = {
+		kdc = kerberos.doomcom.org
+		admin_server = kerberos.doomcom.org
+	}
+	ANDREW.CMU.EDU = {
+		kdc = vice28.fs.andrew.cmu.edu
+		kdc = vice2.fs.andrew.cmu.edu
+		kdc = vice11.fs.andrew.cmu.edu
+		kdc = vice12.fs.andrew.cmu.edu
+		admin_server = vice28.fs.andrew.cmu.edu
+		default_domain = andrew.cmu.edu
+	}
+	CS.CMU.EDU = {
+		kdc = kerberos.cs.cmu.edu
+		kdc = kerberos-2.srv.cs.cmu.edu
+		admin_server = kerberos.cs.cmu.edu
+	}
+	DEMENTIA.ORG = {
+		kdc = kerberos.dementia.org
+		kdc = kerberos2.dementia.org
+		admin_server = kerberos.dementia.org
+	}
+	CSAIL.MIT.EDU = {
+		kdc = kerberos-1.csail.mit.edu
+		kdc = kerberos-2.csail.mit.edu
+		admin_server = kerberos.csail.mit.edu
+		default_domain = csail.mit.edu
+		krb524_server = krb524.csail.mit.edu
+	}
+
+[domain_realm]
+	.mit.edu = ATHENA.MIT.EDU
+	mit.edu = ATHENA.MIT.EDU
+	.media.mit.edu = MEDIA-LAB.MIT.EDU
+	media.mit.edu = MEDIA-LAB.MIT.EDU
+	.whoi.edu = ATHENA.MIT.EDU
+	whoi.edu = ATHENA.MIT.EDU
+	.csail.mit.edu = CSAIL.MIT.EDU
+        csail.mit.edu = CSAIL.MIT.EDU
+        .ai.mit.edu = CSAIL.MIT.EDU
+        ai.mit.edu = CSAIL.MIT.EDU
+	.stanford.edu = stanford.edu
+
+[login]
+	krb4_convert = true
+	krb4_get_tickets = true
Index: branches/fc15-dev/server/fedora/config/etc/ldap.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ldap.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ldap.conf	(revision 1803)
@@ -0,0 +1,296 @@
+# @(#)$Id: ldap.conf,v 1.38 2006/05/15 08:13:31 lukeh Exp $
+#
+# This is the configuration file for the LDAP nameservice
+# switch library and the LDAP PAM module.
+#
+# The man pages for this file are nss_ldap(5) and pam_ldap(5)
+#
+# PADL Software
+# http://www.padl.com
+#
+
+# Your LDAP server. Must be resolvable without using LDAP.
+# Multiple hosts may be specified, each separated by a 
+# space. How long nss_ldap takes to failover depends on
+# whether your LDAP client library supports configurable
+# network or connect timeouts (see bind_timelimit).
+#host 127.0.0.1
+
+# The distinguished name of the search base.
+base dc=scripts,dc=mit,dc=edu
+
+# Another way to specify your LDAP server is to provide an
+# uri with the server name. This allows to use
+# Unix Domain Sockets to connect to a local LDAP Server.
+#uri ldap://127.0.0.1/
+#uri ldaps://127.0.0.1/   
+#uri ldapi://%2fvar%2frun%2fldapi_sock/
+# Note: %2f encodes the '/' used as directory separator
+uri ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/
+
+# The LDAP version to use (defaults to 3
+# if supported by client library)
+#ldap_version 3
+
+# The distinguished name to bind to the server with.
+# Optional: default is to bind anonymously.
+#binddn cn=proxyuser,dc=example,dc=com
+
+# The credentials to bind with. 
+# Optional: default is no credential.
+#bindpw secret
+
+# The distinguished name to bind to the server with
+# if the effective user ID is root. Password is
+# stored in /etc/ldap.secret (mode 600)
+#rootbinddn cn=manager,dc=example,dc=com
+
+# The port.
+# Optional: default is 389.
+#port 389
+
+# The search scope.
+#scope sub
+#scope one
+#scope base
+
+# Search timelimit
+#timelimit 30
+timelimit 120
+
+# Bind/connect timelimit
+#bind_timelimit 30
+bind_timelimit 120
+
+# Reconnect policy: hard (default) will retry connecting to
+# the software with exponential backoff, soft will fail
+# immediately.
+#bind_policy hard
+
+# Idle timelimit; client will close connections
+# (nss_ldap only) if the server has not been contacted
+# for the number of seconds specified below.
+#idle_timelimit 3600
+idle_timelimit 3600
+
+# Filter to AND with uid=%s
+#pam_filter objectclass=account
+
+# The user ID attribute (defaults to uid)
+#pam_login_attribute uid
+
+# Search the root DSE for the password policy (works
+# with Netscape Directory Server)
+#pam_lookup_policy yes
+
+# Check the 'host' attribute for access control
+# Default is no; if set to yes, and user has no
+# value for the host attribute, and pam_ldap is
+# configured for account management (authorization)
+# then the user will not be allowed to login.
+#pam_check_host_attr yes
+
+# Check the 'authorizedService' attribute for access
+# control
+# Default is no; if set to yes, and the user has no
+# value for the authorizedService attribute, and
+# pam_ldap is configured for account management
+# (authorization) then the user will not be allowed
+# to login.
+#pam_check_service_attr yes
+
+# Group to enforce membership of
+#pam_groupdn cn=PAM,ou=Groups,dc=example,dc=com
+
+# Group member attribute
+#pam_member_attribute uniquemember
+
+# Specify a minium or maximum UID number allowed
+#pam_min_uid 0
+#pam_max_uid 0
+
+# Template login attribute, default template user
+# (can be overriden by value of former attribute
+# in user's entry)
+#pam_login_attribute userPrincipalName
+#pam_template_login_attribute uid
+#pam_template_login nobody
+
+# HEADS UP: the pam_crypt, pam_nds_passwd,
+# and pam_ad_passwd options are no
+# longer supported.
+#
+# Do not hash the password at all; presume
+# the directory server will do it, if
+# necessary. This is the default.
+#pam_password clear
+
+# Hash password locally; required for University of
+# Michigan LDAP server, and works with Netscape
+# Directory Server if you're using the UNIX-Crypt
+# hash mechanism and not using the NT Synchronization
+# service. 
+#pam_password crypt
+
+# Remove old password first, then update in
+# cleartext. Necessary for use with Novell
+# Directory Services (NDS)
+#pam_password clear_remove_old
+#pam_password nds
+
+# RACF is an alias for the above. For use with
+# IBM RACF
+#pam_password racf
+
+# Update Active Directory password, by
+# creating Unicode password and updating
+# unicodePwd attribute.
+#pam_password ad
+
+# Use the OpenLDAP password change
+# extended operation to update the password.
+#pam_password exop
+
+# Redirect users to a URL or somesuch on password
+# changes.
+#pam_password_prohibit_message Please visit http://internal to change your password.
+
+# RFC2307bis naming contexts
+# Syntax:
+# nss_base_XXX		base?scope?filter
+# where scope is {base,one,sub}
+# and filter is a filter to be &'d with the
+# default filter.
+# You can omit the suffix eg:
+# nss_base_passwd	ou=People,
+# to append the default base DN but this
+# may incur a small performance impact.
+nss_base_passwd		ou=People,dc=scripts,dc=mit,dc=edu?one
+#nss_base_shadow	ou=People,dc=example,dc=com?one
+nss_base_group		ou=Groups,dc=scripts,dc=mit,dc=edu?one
+#nss_base_hosts		ou=Hosts,dc=example,dc=com?one
+#nss_base_services	ou=Services,dc=example,dc=com?one
+#nss_base_networks	ou=Networks,dc=example,dc=com?one
+#nss_base_protocols	ou=Protocols,dc=example,dc=com?one
+#nss_base_rpc		ou=Rpc,dc=example,dc=com?one
+#nss_base_ethers	ou=Ethers,dc=example,dc=com?one
+#nss_base_netmasks	ou=Networks,dc=example,dc=com?ne
+#nss_base_bootparams	ou=Ethers,dc=example,dc=com?one
+#nss_base_aliases	ou=Aliases,dc=example,dc=com?one
+#nss_base_netgroup	ou=Netgroup,dc=example,dc=com?one
+
+# Just assume that there are no supplemental groups for these named users
+nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd
+
+# attribute/objectclass mapping
+# Syntax:
+#nss_map_attribute	rfc2307attribute	mapped_attribute
+#nss_map_objectclass	rfc2307objectclass	mapped_objectclass
+
+# configure --enable-nds is no longer supported.
+# NDS mappings
+#nss_map_attribute uniqueMember member
+
+# Services for UNIX 3.5 mappings
+#nss_map_objectclass posixAccount User
+#nss_map_objectclass shadowAccount User
+#nss_map_attribute uid msSFU30Name
+#nss_map_attribute uniqueMember msSFU30PosixMember
+#nss_map_attribute userPassword msSFU30Password
+#nss_map_attribute homeDirectory msSFU30HomeDirectory
+#nss_map_attribute homeDirectory msSFUHomeDirectory
+#nss_map_objectclass posixGroup Group
+#pam_login_attribute msSFU30Name
+#pam_filter objectclass=User
+#pam_password ad
+
+# configure --enable-mssfu-schema is no longer supported.
+# Services for UNIX 2.0 mappings
+#nss_map_objectclass posixAccount User
+#nss_map_objectclass shadowAccount user
+#nss_map_attribute uid msSFUName
+#nss_map_attribute uniqueMember posixMember
+#nss_map_attribute userPassword msSFUPassword
+#nss_map_attribute homeDirectory msSFUHomeDirectory
+#nss_map_attribute shadowLastChange pwdLastSet
+#nss_map_objectclass posixGroup Group
+#nss_map_attribute cn msSFUName
+#pam_login_attribute msSFUName
+#pam_filter objectclass=User
+#pam_password ad
+
+# RFC 2307 (AD) mappings
+#nss_map_objectclass posixAccount user
+#nss_map_objectclass shadowAccount user
+#nss_map_attribute uid sAMAccountName
+#nss_map_attribute homeDirectory unixHomeDirectory
+#nss_map_attribute shadowLastChange pwdLastSet
+#nss_map_objectclass posixGroup group
+#nss_map_attribute uniqueMember member
+#pam_login_attribute sAMAccountName
+#pam_filter objectclass=User
+#pam_password ad
+
+# configure --enable-authpassword is no longer supported
+# AuthPassword mappings
+#nss_map_attribute userPassword authPassword
+
+# AIX SecureWay mappings
+#nss_map_objectclass posixAccount aixAccount
+#nss_base_passwd ou=aixaccount,?one
+#nss_map_attribute uid userName
+#nss_map_attribute gidNumber gid
+#nss_map_attribute uidNumber uid
+#nss_map_attribute userPassword passwordChar
+#nss_map_objectclass posixGroup aixAccessGroup
+#nss_base_group ou=aixgroup,?one
+#nss_map_attribute cn groupName
+#nss_map_attribute uniqueMember member
+#pam_login_attribute userName
+#pam_filter objectclass=aixAccount
+#pam_password clear
+
+# Netscape SDK LDAPS
+#ssl on
+
+# Netscape SDK SSL options
+#sslpath /etc/ssl/certs
+
+# OpenLDAP SSL mechanism
+# start_tls mechanism uses the normal LDAP port, LDAPS typically 636
+#ssl start_tls
+#ssl on
+
+# OpenLDAP SSL options
+# Require and verify server certificate (yes/no)
+# Default is to use libldap's default behavior, which can be configured in
+# /etc/openldap/ldap.conf using the TLS_REQCERT setting.  The default for
+# OpenLDAP 2.0 and earlier is "no", for 2.1 and later is "yes".
+#tls_checkpeer yes
+
+# CA certificates for server certificate verification
+# At least one of these are required if tls_checkpeer is "yes"
+#tls_cacertfile /etc/ssl/ca.cert
+#tls_cacertdir /etc/ssl/certs
+
+# Seed the PRNG if /dev/urandom is not provided
+#tls_randfile /var/run/egd-pool
+
+# SSL cipher suite
+# See man ciphers for syntax
+#tls_ciphers TLSv1
+
+# Client certificate and key
+# Use these, if your server requires client authentication.
+#tls_cert
+#tls_key
+
+# Disable SASL security layers. This is needed for AD.
+#sasl_secprops maxssf=0
+
+# Override the default Kerberos ticket cache location.
+#krb5_ccname FILE:/etc/.ldapcache
+
+# SASL mechanism for PAM authentication - use is experimental
+# at present and does not support password policy control
+#pam_sasl_mech DIGEST-MD5
Index: branches/fc15-dev/server/fedora/config/etc/logrotate.d/httpd
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/logrotate.d/httpd	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/logrotate.d/httpd	(revision 1803)
@@ -0,0 +1,22 @@
+/var/log/httpd/*.log /home/logview/*log {
+    rotate 0
+    daily
+    missingok
+    notifempty
+    create 640 root logview
+    sharedscripts
+    postrotate
+	/bin/kill -HUP `cat /var/run/httpd/httpd.pid 2>/dev/null` 2> /dev/null || true
+    endscript
+}
+
+/var/log/httpd/statistics_log {
+    rotate 14
+    daily
+    missingok
+    notifempty
+    sharedscripts
+    postrotate
+	/bin/kill -HUP `cat /var/run/httpd/httpd.pid 2>/dev/null` 2> /dev/null || true
+    endscript
+}
Index: branches/fc15-dev/server/fedora/config/etc/logwatch/scripts/services/named
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/logwatch/scripts/services/named	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/logwatch/scripts/services/named	(revision 1803)
@@ -0,0 +1,568 @@
+##########################################################################
+# $Id: named,v 1.52 2007/04/28 20:58:39 bjorn Exp $
+##########################################################################
+# $Log: named,v $
+# Revision 1.52  2007/04/28 20:58:39  bjorn
+# More generic RCODE handling - prints summary of unexpected DNS RCODEs.
+#
+# Revision 1.51  2007/04/15 20:03:25  bjorn
+# Filtering updating zones with views, based on submittal by
+# Jesper K. Pedersen.
+#
+# Revision 1.50  2007/02/16 03:36:25  bjorn
+# Filtering some D-BUS statements, by Ivana Varekova.
+#
+# Revision 1.49  2007/01/29 18:28:38  bjorn
+# Better formatting of output, by Markus Lude.
+#
+# Revision 1.48  2006/11/12 21:14:02  bjorn
+# Filtering 'transfer started' message, by Russell Coker / Tom London.
+#
+# Revision 1.47  2006/10/20 21:02:00  bjorn
+# Typo fixed by Alex S.
+#
+# Revision 1.46  2006/10/20 16:44:38  bjorn
+# Changed regexp to handle IPV6, by Willi Mann.
+#
+# Revision 1.45  2006/09/15 15:40:58  bjorn
+# Additional filtering by Ivana Varekova.
+#
+# Revision 1.44  2006/03/20 20:42:57  bjorn
+# Additional filtering, by Ivana Varekova.
+#
+# Revision 1.43  2005/11/30 05:01:44  bjorn
+# Don't search for info: string (for Debian), by Willi Mann.
+#
+# Revision 1.42  2005/11/24 16:48:30  bjorn
+# Handles additional statements, by Ivana Varekova.
+#
+# Revision 1.41  2005/09/29 15:02:52  bjorn
+# Filtering 'succeeded' by Ivana Varekova.
+#
+# Revision 1.40  2005/04/15 21:44:35  bjorn
+# testing from anonymous
+#
+# Revision 1.39  2005/04/15 21:36:59  bjorn
+# typo fixed in 'named' release during 2004
+#
+# Revision 1.38  2005/04/13 17:24:13  kirk
+# Test change
+#
+# Revision 1.37  2005/02/24 17:08:04  kirk
+# Applying consolidated patches from Mike Tremaine
+#
+# Revision 1.9  2005/02/21 19:09:52  mgt
+# Bump to 5.2.8 removed some cvs logs -mgt
+#
+# Revision 1.8  2005/02/16 00:43:28  mgt
+# Added #vi tag to everything, updated ignore.conf with comments, added emerge and netopia to the tree from Laurent -mgt
+#
+# Revision 1.7  2005/02/13 17:15:40  mgt
+# perl -w corrections for uninit stuff -mgt
+#
+# Revision 1.6  2004/10/11 18:14:47  mgt
+# update from Laurent -mgt
+#
+# Revision 1.41  2004/09/29 10:33:29  laurent Dufour <laurent.dufour@havas.com>
+# Removed some ^ in regex to prevent message not being in start on line to be matched
+# Added some check for error in named zone config file
+# Added some check for message not being matched
+#
+# Revision 1.4  2004/07/29 19:33:29  mgt
+# Chmod and removed perl call -mgt
+#
+# Revision 1.3  2004/07/10 01:54:35  mgt
+# sync with kirk -mgt
+#
+#########################################################################
+
+########################################################
+# This was written and is maintained by:
+#    Kirk Bauer <kirk@kaybee.org>
+#
+# Please send all comments, suggestions, bug reports,
+#    etc, to kirk@kaybee.org.
+########################################################
+
+use Logwatch ':ip';
+
+
+#$DoLookup = ValueOrDefault($ENV{'named_ip_lookup'}, 0);
+$Debug = ValueOrDefault($ENV{'LOGWATCH_DEBUG'}, 0);
+$Detail = ValueOrDefault($ENV{'LOGWATCH_DETAIL_LEVEL'}, 0);
+
+# Avoid "Use of uninitialized value" warning messages.
+sub ValueOrDefault {
+    my ($value, $default) = @_;
+    return ($value ? $value : $default);
+}
+
+if ( $Debug >= 5 ) {
+    print STDERR "\n\nDEBUG: Inside NAMED Filter \n\n";
+    $DebugCounter = 1;
+}
+
+
+while (defined($ThisLine = <STDIN>)) {
+ if ( $Debug >= 30 ) {
+        print STDERR "DEBUG($DebugCounter): $ThisLine";
+        $DebugCounter++;
+    }
+
+   if (
+      ($ThisLine =~ /RR negative cache entry/) or
+      ($ThisLine =~ /ns_....: .* NS points to CNAME/) or
+      ($ThisLine =~ /accept: connection reset by peer/) or
+      ($ThisLine =~ /Connection reset by peer/) or
+      # typo fixed in 2004 release
+      ($ThisLine =~ /transfer(r)?ed serial/) or
+      ($ThisLine =~ /There may be a name server already running/) or
+      ($ThisLine =~ /exiting/) or
+      ($ThisLine =~ /running/) or
+      ($ThisLine =~ /NSTATS /) or
+      ($ThisLine =~ /Cleaned cache of \d+ RRs/) or
+      ($ThisLine =~ /USAGE \d+ \d+ CPU=\d+.*/) or
+      ($ThisLine =~ /XSTATS /) or
+      ($ThisLine =~ /Ready to answer queries/) or
+      ($ThisLine =~ /Forwarding source address is/) or
+      ($ThisLine =~ /bad referral/) or
+      ($ThisLine =~ /prerequisite not satisfied/) or
+      ($ThisLine =~ /(rcvd|Sent) NOTIFY/) or
+      ($ThisLine =~ /ns_resp: TCP truncated/) or
+      ($ThisLine =~ /No possible A RRs/) or
+      ($ThisLine =~ /points to a CNAME/) or
+      ($ThisLine =~ /dangling CNAME pointer/) or
+      ($ThisLine =~ /listening on/) or
+      ($ThisLine =~ /unrelated additional info/) or
+      ($ThisLine =~ /Response from unexpected source/) or
+      ($ThisLine =~ /No root nameservers for class IN/) or
+      ($ThisLine =~ /recvfrom: No route to host/) or
+      ($ThisLine =~ /(C|c)onnection refused/) or
+      ($ThisLine =~ /lame server resolving/) or
+      ($ThisLine =~ /transfer of/) or
+      ($ThisLine =~ /using \d+ CPU/) or
+      ($ThisLine =~ /loading configuration/) or
+      ($ThisLine =~ /command channel listening/) or
+      ($ThisLine =~ /no IPv6 interfaces found/) or
+      ($ThisLine =~ /^running/) or
+      ($ThisLine =~ /^exiting/) or
+      ($ThisLine =~ /no longer listening/) or
+      ($ThisLine =~ /the default for the .* option is now/) or
+      ($ThisLine =~ /stopping command channel on \S+/) or
+      ($ThisLine =~ /Malformed response from/) or
+      ($ThisLine =~ /client .* response from Internet for .*/) or
+      ($ThisLine =~ /client .+ query \(cache\) '.*' denied/) or
+      ($ThisLine =~ /client .+#\d+: query:/) or
+      # Do we really want to ignore these?
+      #($ThisLine =~ /unknown logging category/) or
+      ($ThisLine =~ /could not open entropy source/) or
+      ($ThisLine =~ /\/etc\/rndc.key: file not found/) or
+      ($ThisLine =~ /sending notifies/) or
+      # file syntax error get reported twice and are already caught below
+      ($ThisLine =~ /loading master file/) or
+      ($ThisLine =~ /^ succeeded$/) or
+      ($ThisLine =~ /\*\*\* POKED TIMER \*\*\*/) or
+      # The message about the end of transfer is the interesting one
+      ($ThisLine =~ /: Transfer started./) or
+      ($ThisLine =~ /D-BUS service (disabled|enabled)./) or
+      ($ThisLine =~ /D-BUS dhcdbd subscription disabled./) or
+      ($ThisLine =~ /automatic empty zone/) or
+      ($ThisLine =~ /binding TCP socket: address in use/) or
+      ($ThisLine =~ /dbus_mgr initialization failed. D-BUS service is disabled./) or
+      ($ThisLine =~ /dbus_svc_add_filter failed/) or
+      ($ThisLine =~ /isc_log_open 'named.run' failed: permission denied/) or 
+      ($ThisLine =~ /weak RSASHA1 \(5\) key found \(exponent=3\)/) or 
+      ($ThisLine =~ /Bad file descriptor/) or 
+      ($ThisLine =~ /open: .*: file not found/) or
+      ($ThisLine =~ /queries: client [0-9.#:]* view localhost_resolver: query: .* IN .*/) or
+      ($ThisLine =~ /zone .*: NS '.*' is a CNAME \(illegal\)/) or
+      ($ThisLine =~ /zone .*: zone serial unchanged. zone may fail to transfer to slaves/) or
+      ($ThisLine =~ /zone .*: loading from master file .* failed/) or
+      ($ThisLine =~ /zone .*: NS '.*' has no address records/) or
+      ($ThisLine =~ /^no valid (DS|KEY|RRSIG) resolving/) or
+      ($ThisLine =~ /^not insecure resolving/) or
+      ($ThisLine =~ /.*: not a valid number$/) or
+      ($ThisLine =~ /.*: unexpected end of input/) or
+      ($ThisLine =~ /too many timeouts resolving '.*' .*: disabling EDNS/) or
+      ($ThisLine =~ /too many timeouts resolving '.*' .*: reducing the advertised EDNS UDP packet size to .* octets/) or
+      ($ThisLine =~ /reloading zones succeeded/) or
+      ($ThisLine =~ /success resolving '.*' \(in '.*'?\) after disabling EDNS/) or
+      ($ThisLine =~ /success resolving '.*' \(in '.*'?\) after reducing the advertised EDNS UDP packet size to 512 octets/) or
+      ($ThisLine =~ /the working directory is not writable/) or
+      ($ThisLine =~ /using default UDP\/IPv[46] port range: \[[0-9]*, [0-9]*\]/) or
+      ($ThisLine =~ /adjusted limit on open files from [0-9]* to [0-9]*/) or
+      ($ThisLine =~ /using up to [0-9]* sockets/) or
+      ($ThisLine =~ /built with/)
+      # too many timeouts resolving 'ns-ext.nrt1.isc.org/AAAA' (in '.'?): disabling EDNS: 3 Time(s)
+   ) {
+      # Don't care about these...
+   } elsif (
+      ($ThisLine =~ /starting\..*named/) or
+      ($ThisLine =~ /starting BIND/) or
+      ($ThisLine =~ /named startup succeeded/)
+   ) {
+      $StartNamed++;
+   } elsif ( $ThisLine =~ /(reloading nameserver|named reload succeeded)/ ) {
+      $ReloadNamed++;
+   } elsif (
+      ($ThisLine =~ /shutting down/) or
+      ($ThisLine =~ /named shutting down/ ) or
+      ($ThisLine =~ /named shutdown succeeded/ )
+   ) {
+      $ShutdownNamed++;
+   } elsif ( ($Host, $Zone) = ( $ThisLine =~ /client ([^\#]+)#[^\:]+: zone transfer '(.+)' denied/ ) ) {
+      $DeniedZoneTransfers{$Host}{$Zone}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /cache zone \"(.*)\" loaded/ ) ) {
+      $ZoneLoaded{"cache $Zone"}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /cache zone \"(.*)\" .* loaded/ ) ) {
+      $ZoneLoaded{"cache $Zone"}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /primary zone \"(.+)\" loaded/ ) ) {
+      $ZoneLoaded{$Zone}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /master zone \"(.+)\" .* loaded/ ) ) {
+      $ZoneLoaded{$Zone}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /secondary zone \"(.+)\" loaded/ ) ) {
+      $ZoneLoaded{"secondary $Zone"}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /slave zone \"(.+)\" .* loaded/ ) ) {
+      $ZoneLoaded{"secondary $Zone"}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /zone (.+)\: loaded serial/ ) ) {
+      $ZoneLoaded{$Zone}++;
+   } elsif ( (undef,$Addr,undef,$Server) = ( $ThisLine =~ /ame server (on|resolving) '(.+)' \(in .+\):\s+(\[.+\]\.\d+)?\s*'?(.+)'?:?/ ) ) {
+      $LameServer{"$Addr ($Server)"}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /Zone \"(.+)\" was removed/ ) ) {
+      $ZoneRemoved{$Zone}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /received notify for zone '(.*)'/ ) ) {
+      $ZoneReceivedNotify{$Zone}++;
+   } elsif ( ($Zone) = ( $ThisLine =~ /zone (.*): notify from .* up to date/ ) ) {
+      $ZoneReceivedNotify{$Zone}++;
+   } elsif ( ($Host) = ( $ThisLine =~ /([^ ]+) has CNAME and other data \(invalid\)/ ) ) {
+      push @CNAMEAndOther, $Host;
+   } elsif ( ($File,$Line,$Entry,$Error) = ( $ThisLine =~ /dns_master_load: ([^:]+):(\d+): ([^ ]+): (.+)$/ ) ) {
+      $ZoneFileErrors{$File}{"$Entry: $Error"}++;
+   } elsif ( ($File,$Line,$Entry,$Error) = ( $ThisLine =~ /warning: ([^:]+):(\d+): (.+)$/ ) ) {
+      $ZoneFileErrors{$File}{"file does not end with newline: $Error"}++;
+   } elsif ( ($Way,$Host) = ( $ThisLine =~ /([^ ]+): sendto\(\[([^ ]+)\].+\): Network is unreachable/ ) ) {
+      $FullHost = LookupIP ($Host);
+      $NetworkUnreachable{$Way}{$FullHost}++;
+   } elsif ( ($Zone,$Message) = ( $ThisLine =~ /client [^\#]+#[^\:]+: (?:view \w+: )?updating zone '([^\:]+)': (.*)$/ ) ) {
+      $ZoneUpdates{$Zone}{$Message}++;
+   } elsif ( ($Host,$Zone) = ( $ThisLine =~ /approved AXFR from \[(.+)\]\..+ for \"(.+)\"/ ) ) {
+      $FullHost = LookupIP ($Host);
+      $AXFR{$Zone}{$FullHost}++;
+   } elsif ( ($Client) = ( $ThisLine =~ /warning: client (.*) no more TCP clients/ ) ) {
+      $FullClient = LookupIP ($Client);
+      $DeniedTCPClient{$FullClient}++;
+   } elsif ( ($Client) = ( $ThisLine =~ /client (.*)#\d+: query \(cache\) denied/ ) ) {
+      $FullClient = LookupIP ($Client);
+      $DeniedQuery{$FullClient}++;
+   } elsif ( ($Rhost, $Ldom) = ($ThisLine =~ /client ([\d\.]+)#\d+: update '(.*)' denied/)) {
+      $UpdateDenied{"$Rhost ($Ldom)"}++;
+   } elsif ( ($Zone) = ($ThisLine =~ /zone '([0-9a-zA-Z.-]+)' allows updates by IP address, which is insecure/)) {
+      $InsecUpdate{$Zone}++;
+   } elsif ( ($Zone) = ($ThisLine =~ /zone ([0-9a-zA-Z.\/-]+): journal rollforward failed: journal out of sync with zone/)) {
+      $JournalFail{$Zone}++;
+   } elsif ( ($Channel,$Reason) = ($ThisLine =~ /couldn't add command channel (.+#\d+): (.*)$/)) {
+      $ChannelAddFail{$Channel}{$Reason}++;
+   } elsif ( ($Zone,$Host,$Reason) = ($ThisLine =~ /zone ([^ ]*)\/IN: refresh: failure trying master ([^ ]*)#\d+: (.*)/) ) {
+      $MasterFailure{"$Zone from $Host"}{$Reason}++;
+   } elsif ( ($Zone) = ($ThisLine =~ /zone ([^\/]+)\/.+: refresh: non-authoritative answer from master/)) {
+      $NonAuthoritative{$Zone}++;
+   } elsif ( ($ThisLine =~ /unexpected RCODE \((.*)\) resolving/) ){
+      $UnexpRCODE{$1}++;
+   } elsif ( ($ThisLine =~ /FORMERR resolving '[^ ]+: [0-9.#]+/) ) {
+      chomp($ThisLine);
+      $FormErr{$ThisLine}++;
+   } elsif ( ($ThisLine =~ /found [0-9]* CPU(s)?, using [0-9]* worker thread(s)?/) ) {
+      chomp($ThisLine);
+      $StartLog{$ThisLine}++;
+   } elsif ( (($File,$Line,$Problem) = ($ThisLine =~ /\/etc\/(rndc.key|named.conf):([0-9]+): (unknown option '[^ ]*')/)) or
+	     (($File,$Line,$Problem) = ($ThisLine =~ /\/etc\/(rndc.key|named.conf):([0-9]+): ('[^ ]' expected near end of file)/)) or
+	     (($File,$Line,$Problem) = ($ThisLine =~ /\/etc\/(named.*.conf):([0-9]+): (.*)/)) or
+	     (($File,$Line,$Problem) = ($ThisLine =~ /()()(could not configure root hints from '.*': file not found)/))) {
+       $ConfProb{$File}{"$Line,$Problem"}++;
+   } elsif ( (($ErrorText) = ($ThisLine =~ /^(RUNTIME_CHECK.*)/))or
+	     (($ErrorText) = ($ThisLine =~ /^(.* REQUIRE.* failed.*)$/)) or
+	     (($ErrorText) = ($ThisLine =~ /(.*: fatal error)/)) ) {
+      $NError{$ErrorText}++;
+   } elsif ( ($From,$Log) = ($ThisLine =~ /invalid command from ([.0-9]*)#[0-9]*: (.*)/) ) {
+      $CCMessages{"$From,$Log"}++;
+   } elsif ( (($Log) = ($ThisLine =~ /(freezing .*zone.*)/)) or
+	     (($Log) = ($ThisLine =~ /(thawing .*zone.*)/)) ) {
+      $CCMessages2{$Log}++;
+   } elsif (($CCC) = ($ThisLine =~ /unknown control channel command '(.*)'/)) {
+      $UnknownCCCommands{$CCC}++;
+   } elsif (($CCC) = ($ThisLine =~ /received control channel command '(.*)'/)) {
+      $CCCommands{$CCC}++;
+   } elsif (($Name,$Address) = ($ThisLine =~ /network unreachable resolving '(.*)': (.*)/)) {
+      $NUR{$Name}{$Address}++;
+   } elsif (($Name,$Address) = ($ThisLine =~ /host unreachable resolving '(.*)': (.*)/)) {
+      $HUR{$Name}{$Address}++;
+   } else {
+      # Report any unmatched entries...
+      # remove PID from named messages
+      $ThisLine =~ s/(client [.0-9]+)\S+/$1/;
+      chomp($ThisLine);
+      $OtherList{$ThisLine}++;
+   }
+}
+
+#######################################
+
+if ( ( $Detail >= 5 ) and ($StartNamed) ) {
+   print "Named started: $StartNamed Time(s)\n";
+}
+
+if ( ( $Detail >= 5 ) and ($ReloadNamed) ) {
+   print "Named reloaded: $ReloadNamed Time(s)\n";
+}
+
+if ( ( $Detail >= 5 ) and ($ShutdownNamed) ) {
+   print "Named shutdown: $ShutdownNamed Time(s)\n";
+}
+
+if ( ( $Detail >= 5 ) and (keys %ZoneLoaded) ) {
+   print "\nLoaded Zones:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %ZoneLoaded) {
+      print "   $ThisOne: $ZoneLoaded{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %ZoneReceivedNotify) ) {
+   print "\nZones receiving notify:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %ZoneReceivedNotify) {
+      print "   $ThisOne: $ZoneReceivedNotify{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ($Detail >= 5) and (keys %ChannelAddFail) ) {
+   print "\nCan't add command channel:\n";
+   foreach $Channel (sort {$a cmp $b} keys %ChannelAddFail) {
+      print "   $Channel:\n";
+      foreach $Reason (sort {$a cmp $b} keys %{$ChannelAddFail{$Channel}}) {
+         print "      $Reason: $ChannelAddFail{$Channel}{$Reason} Time(s)\n";
+      }
+   }
+}
+
+if ( ($Detail >= 5) and (keys %MasterFailure) ) {
+   print "\nFailure trying to refresh zone:\n";
+   foreach $Zone (sort {$a cmp $b} keys %MasterFailure) {
+      print "   $Zone:\n";
+      foreach $Reason (sort {$a cmp $b} keys %{$MasterFailure{$Zone}}) {
+         print "      $Reason: $MasterFailure{$Zone}{$Reason}++ Time(s)\n";
+      }
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %DeniedZoneTransfers) ) {
+   print "\nDenied Zone Transfers:\n";
+   foreach my $Host (keys %DeniedZoneTransfers) {
+      print "   $Host:\n";
+      foreach my $Zone (keys %{$DeniedZoneTransfers{$Host}}) {
+         print "      $Zone: $DeniedZoneTransfers{$Host}{$Zone} Time(s)\n";
+      }
+      print "\n";
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %ZoneRemoved) ) {
+   print "\nRemoved Zones:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %ZoneRemoved) {
+      print "   $ThisOne: $ZoneRemoved{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %AXFR) ) {
+   print "\nZone Transfers:\n";
+   foreach $ThisOne (keys %AXFR) {
+      print "   Zone: $ThisOne\n";
+      foreach $Temp (keys %{$AXFR{$ThisOne}}) {
+         print "      by $Temp: $AXFR{$ThisOne}{$Temp} Time(s)\n";
+      }
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %DeniedTCPClient) ) {
+   print "\nno more TCP clients warning:\n";
+   foreach $ThisOne (keys %DeniedTCPClient) {
+      print "   from $ThisOne: $DeniedTCPClient{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %DeniedQuery) ) {
+   print "\nQueries (cache) that were denied:\n";
+   foreach $ThisOne (keys %DeniedQuery) {
+      print "   from $ThisOne: $DeniedQuery{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 10 ) and (@CNAMEAndOther) ) {
+   print "\nThese hosts have CNAME and other data (invalid):\n";
+   foreach $ThisOne (@CNAMEAndOther) {
+      print "   $ThisOne\n";
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %ZoneFileErrors) ) {
+   print "\nSyntax errors in zone files:\n";
+   for $File (keys %ZoneFileErrors) {
+      print "   $File\n";
+      for $Error ( keys %{$ZoneFileErrors{$File}} ) {
+         print "      \"$Error\" " . $ZoneFileErrors{$File}{$Error} . " Time(s)\n";
+      }
+   }
+}
+
+if ( ( $Detail >= 10 ) and (keys %LameServer) ) {
+   print "\nThese addresses had lame server references:\n";
+   foreach $ThisOne (keys %LameServer) {
+      print "   $ThisOne: $LameServer{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 10 ) and (keys %NonAuthoritative) ) {
+   print "\nNon-authoritative answer from master for these zones:\n";
+   foreach $ThisOne (keys %NonAuthoritative) {
+      print "   " . $ThisOne . ": " . $NonAuthoritative{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if ( ( $Detail >= 10 ) and (keys %NetworkUnreachable) ) {
+   print "\nNetwork is unreachable for:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %NetworkUnreachable) {
+      print "   $ThisOne:\n";
+      foreach $Host (sort {$a cmp $b} keys %{$NetworkUnreachable{$ThisOne}}) {
+         print "      $Host: $NetworkUnreachable{$ThisOne}{$Host} Time(s)\n";
+      } 
+   }
+}
+
+if ( ( $Detail >= 10 ) and (keys %NUR) ) {
+   print "\nNetwork unreachable resolving for:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %NUR) {
+      print "   $ThisOne:\n";
+      foreach $Host (sort {$a cmp $b} keys %{$NUR{$ThisOne}}) {
+         print "      $Host: $NUR{$ThisOne}{$Host} Time(s)\n";
+      }
+   }
+}
+
+if ( ( $Detail >= 10 ) and (keys %HUR) ) {
+   print "\nHost unreachable resolving for:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %HUR) {
+       print "   $ThisOne:\n";
+       foreach $Host (sort {$a cmp $b} keys %{$HUR{$ThisOne}}) {
+          print "      $Host: $HUR{$ThisOne}{$Host} Time(s)\n";
+       }
+   }
+}
+
+if ( ( $Detail >= 5 ) and (keys %ZoneUpdates) ) {
+   print "\nZone Updates:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %ZoneUpdates) {
+      print "   $ThisOne:\n";
+      foreach $Message (sort {$a cmp $b} keys %{$ZoneUpdates{$ThisOne}}) {
+         print "      $Message: $ZoneUpdates{$ThisOne}{$Message} Time(s)\n";
+      } 
+   }
+}
+
+if ( keys %UpdateDenied ) {
+   print "\nZone update refused:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %UpdateDenied) {
+      print "   $ThisOne: $UpdateDenied{$ThisOne} Time(s)\n";
+   }
+}
+
+if ( keys %InsecUpdate ) {
+   print "\nInsecure zones (dynamic update allowed by IP address):\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %InsecUpdate) {
+      print "   " . $ThisOne . ": " . $InsecUpdate{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if ( keys %JournalFail ) {
+   print "\nJournall rollforward failed:\n";
+   foreach $ThisOne (sort {$a cmp $b} keys %JournalFail) {
+      print "   " . $ThisOne . ": " . $JournalFail{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if (keys %ConfProb) {
+   print "\n Errors in configuration files\n";
+   foreach $File (sort keys %ConfProb) {
+      if ($File =~ /.+/) {
+        print "   file " . $File . "\n";
+        foreach (keys %{$ConfProb{$File}}) {
+           ($Line,$Problem) = split ",";
+           print "      " . $File . ":" . "$Line" . ": " . $Problem . ": " . $ConfProb{$File}{"$Line,$Problem"} . " Time(s)\n";
+        }
+      }
+      else {
+        foreach (keys %{$ConfProb{$File}}) {
+           ($Line,$Problem) = split ",";
+            print "   " . $Problem . ": " . $ConfProb{$File}{"$Line,$Problem"} . " Time(s)\n";
+        }
+      }
+   }
+}
+
+if (($Detail >= 5) and (keys %UnexpRCODE)) {
+   print "\n Unexpected DNS RCODEs:\n";
+   foreach $ThisOne (keys %UnexpRCODE) {
+      print "   " . $ThisOne . ": " . $UnexpRCODE{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if (($Detail >= 5) and (keys %FormErr)) {
+   print "\n Incorrect response format:\n";
+   foreach $ThisOne (keys %FormErr) {
+      print "   " . $ThisOne . ": " . $FormErr{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if (($Detail >= 10) and (keys %StartLog)) {
+   print "\n Named startup logs:\n";
+   foreach $ThisOne (keys %StartLog) {
+      print "   " . $ThisOne . ": " . $StartLog{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if (keys %NError) {
+   print "\n Errors:\n";
+   foreach $ThisOne (keys %NError) {
+      print "   " . $ThisOne . ": " . $NError{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if ((keys %CCMessages) or (keys %CCMessages2)){
+   print "\n Messages from control channel\n";
+   foreach (keys %CCMessages) {
+      ($From,$Log) = split ",";
+      print "   " . $From . ": " . $Log . ": " . $CCMessages{"$From,$Log"} . " Time(s)\n";
+   }
+   foreach $ThisOne (keys %CCMessages2) {
+      print "   " . $ThisOne . ": " . $CCMessages2{$ThisOne} . " Time(s)\n";
+   }
+}
+
+if ((keys %CCCommands) or (keys %UnknownCCCommands)) {
+   print "\nReceived control channel commands\n";
+   foreach $ThisOne (keys %CCCommands) {
+      print "   " . $ThisOne . ": " . $CCCommands{$ThisOne} . " Time(s)\n";
+   }
+   foreach $ThisOne (keys %UnknownCCCommands) {
+      print "   " . $ThisOne . "(unknown command): " . $CCCommands{$ThisOne} . " Time(s)\n";
+   }               
+}
+
+if (keys %OtherList) {
+   print "\n**Unmatched Entries**\n";
+   foreach $line (sort {$a cmp $b} keys %OtherList) {
+      print "   $line: $OtherList{$line} Time(s)\n";
+   }
+}
+
+exit(0);
+
+# vi: shiftwidth=3 tabstop=3 syntax=perl et
+
Index: branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-i386.cfg
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-i386.cfg	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-i386.cfg	(revision 1803)
@@ -0,0 +1,44 @@
+config_opts['root'] = 'fedora-11-i386'
+config_opts['target_arch'] = 'i586'
+config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'
+config_opts['dist'] = 'fc11'  # only useful for --resultdir variable subst
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+debuglevel=1
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+
+# repos
+
+[fedora]
+name=fedora
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-11&arch=i386
+failovermethod=priority
+
+[updates-released]
+name=updates
+#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f11&arch=i386
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/11/i386/
+failovermethod=priority
+
+[local]
+name=local
+baseurl=file:///home/scripts-build/mock-local/
+cost=2000
+enabled=1
+
+[scripts]
+name=Scripts
+baseurl=http://web.mit.edu/scripts/rpm-fc11/
+enabled=1
+gpgcheck=0
+"""
+
+
+
Index: branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-x86_64.cfg
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-x86_64.cfg	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc11-x86_64.cfg	(revision 1803)
@@ -0,0 +1,47 @@
+config_opts['root'] = 'fedora-11-x86_64'
+config_opts['target_arch'] = 'x86_64'
+config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'
+config_opts['dist'] = 'fc11'  # only useful for --resultdir variable subst
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+debuglevel=1
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+# grub/syslinux on x86_64 need glibc-devel.i386 which pulls in glibc.i386, need to exclude all
+# .i?86 packages except these.
+#exclude=[0-9A-Za-fh-z]*.i?86 g[0-9A-Za-km-z]*.i?86 gl[0-9A-Za-hj-z]*.i?86 gli[0-9A-Zac-z]*.i?86 glib[0-9A-Za-bd-z]*.i?86
+# The above is not needed anymore with yum multilib policy of "best" which is the default in Fedora.
+
+# repos
+
+[fedora]
+name=fedora
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-11&arch=x86_64
+failovermethod=priority
+
+[updates-released]
+name=updates
+#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f11&arch=x86_64
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/11/x86_64/
+failovermethod=priority
+
+[local]
+name=local
+baseurl=file:///home/scripts-build/mock-local/
+cost=2000
+enabled=1
+
+[scripts]
+name=Scripts
+baseurl=http://web.mit.edu/scripts/rpm-fc11/
+enabled=1
+gpgcheck=0
+"""
+
+
Index: branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-i386.cfg
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-i386.cfg	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-i386.cfg	(revision 1803)
@@ -0,0 +1,40 @@
+config_opts['root'] = 'fedora-13-i386'
+config_opts['target_arch'] = 'i686'
+config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'
+config_opts['dist'] = 'fc13'  # only useful for --resultdir variable subst
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+debuglevel=1
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+
+# repos
+
+[fedora]
+name=fedora
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-13&arch=i386
+failovermethod=priority
+
+[updates-released]
+name=updates
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/13/i386/
+failovermethod=priority
+
+[local]
+name=local
+baseurl=file:///home/scripts-build/mock-local/
+cost=2000
+enabled=1
+
+[scripts]
+name=Scripts
+baseurl=http://web.mit.edu/scripts/rpm-fc13/
+enabled=0
+gpgcheck=0
+""" # end config_opts['yum.conf']
Index: branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-x86_64.cfg
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-x86_64.cfg	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/mock/scripts-fc13-x86_64.cfg	(revision 1803)
@@ -0,0 +1,53 @@
+config_opts['root'] = 'fedora-13-x86_64'
+config_opts['target_arch'] = 'x86_64'
+config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build'
+config_opts['dist'] = 'fc13'  # only useful for --resultdir variable subst
+
+config_opts['yum.conf'] = """
+[main]
+cachedir=/var/cache/yum
+debuglevel=1
+reposdir=/dev/null
+logfile=/var/log/yum.log
+retries=20
+obsoletes=1
+gpgcheck=0
+assumeyes=1
+# grub/syslinux on x86_64 need glibc-devel.i386 which pulls in glibc.i386, need to exclude all
+# .i?86 packages except these.
+#exclude=[0-9A-Za-fh-z]*.i?86 g[0-9A-Za-km-z]*.i?86 gl[0-9A-Za-hj-z]*.i?86 gli[0-9A-Zac-z]*.i?86 glib[0-9A-Za-bd-z]*.i?86
+# The above is not needed anymore with yum multilib policy of "best" which is the default in Fedora.
+
+# repos
+
+[fedora]
+name=fedora
+mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-13&arch=x86_64
+failovermethod=priority
+
+[updates-released]
+name=updates
+#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f13&arch=x86_64
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/13/x86_64/
+failovermethod=priority
+
+[updates-testing]
+name=updates-testing
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/testing/13/x86_64/
+failovermethod=priority
+enabled=0
+
+[local]
+name=local
+baseurl=file:///home/scripts-build/mock-local/
+cost=2000
+enabled=1
+
+[scripts]
+name=Scripts
+baseurl=http://web.mit.edu/scripts/rpm-fc13/
+enabled=1
+gpgcheck=0
+"""
+
+
Index: branches/fc15-dev/server/fedora/config/etc/munin/apache-htpasswd
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/apache-htpasswd	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/apache-htpasswd	(revision 1803)
@@ -0,0 +1,2 @@
+munin:$apr1$OHrCw...$YROR8zbWmgxWL9netgXGi.
+geofft:AvCSyg9e75YZM
Index: branches/fc15-dev/server/fedora/config/etc/munin/munin-node.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/munin-node.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/munin-node.conf	(revision 1803)
@@ -0,0 +1,45 @@
+#
+# Example config-file for munin-node
+#
+
+log_level 4
+log_file /var/log/munin/munin-node.log
+pid_file /var/run/munin/munin-node.pid
+
+background 1
+setseid 1
+
+user munin
+group munin
+setsid yes
+
+# Regexps for files to ignore
+
+ignore_file ~$
+ignore_file \.bak$
+ignore_file %$
+ignore_file \.dpkg-(tmp|new|old|dist)$
+ignore_file \.rpm(save|new)$
+ignore_file \.pod$
+
+# Set this if the client doesn't report the correct hostname when
+# telnetting to localhost, port 4949
+#
+#host_name x86-3.fedora.phx.redhat.com
+
+# A list of addresses that are allowed to connect.  This must be a
+# regular expression, due to brain damage in Net::Server, which
+# doesn't understand CIDR-style network notation.  You may repeat
+# the allow line as many times as you'd like
+
+allow ^127\.0\.0\.1$
+allow ^18\.187\.1\.128$
+allow ^18\.181\.0\.65$
+
+# Which address to bind to;
+host *
+# host 127.0.0.1
+
+# And which port
+port 4949
+
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_accesses
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_accesses	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_accesses	(revision 1803)
@@ -0,0 +1,2 @@
+[apache_accesses]
+env.url http://munin:SsQWsHZWU5OJJOob78pD3UbxKu42Ka9ExGx9zYmvrWE1O5PCq4sBWJsQaJENi4R@127.0.0.1:%d/server-status/?auto
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_processes
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_processes	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_processes	(revision 1803)
@@ -0,0 +1,2 @@
+[apache_processes]
+env.url http://munin:SsQWsHZWU5OJJOob78pD3UbxKu42Ka9ExGx9zYmvrWE1O5PCq4sBWJsQaJENi4R@127.0.0.1:%d/server-status/?auto
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_volume
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_volume	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/apache_volume	(revision 1803)
@@ -0,0 +1,2 @@
+[apache_volume]
+env.url http://munin:SsQWsHZWU5OJJOob78pD3UbxKu42Ka9ExGx9zYmvrWE1O5PCq4sBWJsQaJENi4R@127.0.0.1:%d/server-status/?auto
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/hddtemp_smartctl
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/hddtemp_smartctl	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/hddtemp_smartctl	(revision 1803)
@@ -0,0 +1,4 @@
+[hddtemp_smartctl]
+user root
+env.drives sda sdb
+command sudo -E %c
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/munin-node
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/munin-node	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/munin-node	(revision 1803)
@@ -0,0 +1,46 @@
+# This file is used to configure how the plugins are invoked.
+# Place in /etc/munin/plugin-conf.d/ or corresponding directory.
+#
+# PLEASE NOTE: Changes in the plugin-conf.d directory are only
+# read at munin-node startup, so restart at any changes.
+#
+#  user <user>         # Set the user to run the plugin as
+#  group <group>       # Set the group to run the plugin as
+#  command <command>   # Run <command> instead of the plugin. %c
+# 	                 expands to what would normally be run.
+#  env.<variable> <value> # Sets <variable> in the plugin's environment, see the
+#                        individual plugins to find out which variables they
+#                        care about.
+#
+#
+
+[mysql*]
+#env.mysqlopts -u someuser
+
+[exim*]
+group mail
+
+[cps*]
+user root
+
+[apt]
+user root
+
+[vlan*]
+user root
+
+[postfix*]
+user root
+
+[smart_*]
+user root
+command sudo %c
+
+[sensors_*]
+user root
+command sudo %c
+
+[if_*]
+user root
+command sudo -E %c
+env.PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/postfix
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/postfix	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/postfix	(revision 1803)
@@ -0,0 +1,5 @@
+[postfix*]
+user root
+env.logfile maillog
+env.logdir /var/log
+command sudo -E %c
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/sendmail
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/sendmail	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugin-conf.d/sendmail	(revision 1803)
@@ -0,0 +1,4 @@
+[sendmail*]
+user root
+env.mspqueue /var/spool/clientmqueue
+command sudo -E %c
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_accesses
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_accesses	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_accesses	(revision 1803)
@@ -0,0 +1,1 @@
+link /usr/share/munin/plugins/apache_accesses
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_processes
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_processes	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_processes	(revision 1803)
@@ -0,0 +1,1 @@
+link /usr/share/munin/plugins/apache_processes
Index: branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_volume
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_volume	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/munin/plugins/apache_volume	(revision 1803)
@@ -0,0 +1,1 @@
+link /usr/share/munin/plugins/apache_volume
Index: branches/fc15-dev/server/fedora/config/etc/nagios/check_afs
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nagios/check_afs	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nagios/check_afs	(revision 1803)
@@ -0,0 +1,17 @@
+#!/bin/sh
+. /usr/lib64/nagios/plugins/utils.sh
+
+CHECKS=`/usr/bin/fs checks -all -fast`
+STATUS=$?
+
+$ECHO "$CHECKS"
+
+if [ $STATUS -gt 0 ]; then
+    if $ECHO "$CHECKS" | grep -i STYX >/dev/null; then
+	exit $STATE_CRITICAL;
+    else
+	exit $STATE_WARNING;
+    fi
+else
+    exit $STATE_OK;
+fi
Index: branches/fc15-dev/server/fedora/config/etc/nagios/check_cron_working
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nagios/check_cron_working	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nagios/check_cron_working	(revision 1803)
@@ -0,0 +1,2 @@
+#!/bin/bash
+exec /usr/lib64/nagios/plugins/check_file_age -f /afs/athena.mit.edu/contrib/scripts/cron_scripts/cron_status_flag/$(hostname -f)
Index: branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr	(revision 1803)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec /usr/bin/sudo -u signup /etc/nagios/check_ldap_mmr.real
Index: branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr.real
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr.real	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nagios/check_ldap_mmr.real	(revision 1803)
@@ -0,0 +1,104 @@
+#!/usr/bin/perl -w
+
+# Originally by Emmanuel BUU <emmanuel.buu@ives.fr> (c) IVèS 2008
+# Adapted for scripts.mit.edu by Mitchell Berger <mitchb@mit.edu>
+
+use Net::LDAP;
+use strict;
+
+my $nl  = $ENV{'USE_NEWLINES'} ? "\n" : "";
+my $tab = $ENV{'USE_NEWLINES'} ? "  " : "";
+
+# Nagios codes
+my %ERRORS=('OK'=>0, 'WARNING'=>1, 'CRITICAL'=>2, 'UNKNOWN'=>3, 'DEPENDENT'=>4);
+
+my $ldapserver = 'localhost';
+my $user = 'cn=Directory Manager';
+my $passwdfile = '/etc/signup-ldap-pw';
+my $configBase = "cn=config";
+my $replicatedBase = "dc=scripts,dc=mit,dc=edu";
+my $server="nsDS5ReplicaHost";
+my $status="nsds5replicaLastUpdateStatus";
+my $laststart="nsds5replicaLastUpdateStart";
+my $lastend="nsds5replicaLastUpdateEnd";
+ 
+my $ldap=ConnectLdap();
+my $result=LDAPSearch($ldap,"objectClass=nsDS5ReplicationAgreement","",$configBase);
+my @entries = $result->entries;
+my $replicaErrors = 0;
+my $conflictErrors = 0;
+my $errorstring = "Replication error(s): $nl";
+foreach my $entr ( @entries ) {
+    my $servername=$entr->get_value($server);
+    my $serverstatus=$entr->get_value($status);
+    my $serverlaststart=$entr->get_value($laststart);
+    my $serverlastend=$entr->get_value($lastend);
+    my $statuscode = $serverstatus;
+    $statuscode =~ s/(^[-0123456789]+) (.*$)/$1/;
+    $serverlaststart =~ s/(....)(..)(..)(..)(..)(..)./$1-$2-$3\ $4:$5:$6/;
+    $serverlastend =~ s/(....)(..)(..)(..)(..)(..)./$1-$2-$3\ $4:$5:$6/;
+    print "Replication to $servername last operation $serverlaststart $nl";
+    print $tab . "Status: $serverstatus.     $nl";
+    if ($statuscode) {
+        $replicaErrors++;
+        $errorstring = $errorstring . $serverstatus . ", ";
+    }
+}
+print "$nl";
+
+$result=LDAPSearch($ldap,"nsds5ReplConflict=*",["nsds5ReplConflict"],$replicatedBase);
+@entries = $result->entries;
+foreach my $entr ( @entries ) {
+    my $conflictingDN=$entr->dn();
+    my $conflictDesc=$entr->get_value("nsds5ReplConflict");
+    print "Conflict found for DN $conflictingDN $nl";
+    print $tab . "Reason: $conflictDesc.     $nl";
+    $conflictErrors++;
+    $errorstring = $errorstring . $conflictDesc . ", ";
+}
+print "$nl";
+
+if ($conflictErrors > 0) {
+    &nagios_return("CRITICAL", $errorstring);
+} elsif ($replicaErrors > 0) {
+    &nagios_return("WARNING", $errorstring);
+} else {
+    &nagios_return("OK", "All replicas are OK and no conflicts are present");
+}
+
+sub ConnectLdap {
+    my $ldap = Net::LDAP->new ( $ldapserver ) or die "$@";
+    open (PASSWD, $passwdfile) || &nagios_return("CRITICAL", "Could not read credentials");
+    my $passwd = <PASSWD>;
+    close (PASSWD);
+    my $mesg = $ldap->bind ( "$user", password => "$passwd" , version => 3 );
+    if ($mesg->code) {
+        &nagios_return("CRITICAL", "Failed to bind to LDAP: " . $mesg->error);
+    }
+    return $ldap;
+}
+
+sub LDAPSearch {
+    my ($ldap,$searchString,$attrs,$base) = @_;
+    my $result = $ldap->search ( base    => "$base",
+                                 scope   => "sub",
+                                 filter  => "$searchString",
+                                 attrs   =>  $attrs
+                               );
+}
+
+sub nagios_return($$) {
+    my ($ret, $message) = @_;
+    my ($retval, $retstr);
+    if (defined($ERRORS{$ret})) {
+        $retval = $ERRORS{$ret};
+        $retstr = $ret;
+    } else {
+        $retstr = 'UNKNOWN';
+        $retval = $ERRORS{$retstr};
+    }
+    $message = "$retstr - $message\n";
+    print $message;
+    exit $retval;
+}
+
Index: branches/fc15-dev/server/fedora/config/etc/nagios/nrpe.cfg
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nagios/nrpe.cfg	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nagios/nrpe.cfg	(revision 1803)
@@ -0,0 +1,225 @@
+#############################################################################
+# Sample NRPE Config File 
+# Written by: Ethan Galstad (nagios@nagios.org)
+# 
+# Last Modified: 11-23-2007
+#
+# NOTES:
+# This is a sample configuration file for the NRPE daemon.  It needs to be
+# located on the remote host that is running the NRPE daemon, not the host
+# from which the check_nrpe client is being executed.
+#############################################################################
+
+
+# LOG FACILITY
+# The syslog facility that should be used for logging purposes.
+
+log_facility=daemon
+
+
+
+# PID FILE
+# The name of the file in which the NRPE daemon should write it's process ID
+# number.  The file is only written if the NRPE daemon is started by the root
+# user and is running in standalone mode.
+
+pid_file=/var/run/nrpe.pid
+
+
+
+# PORT NUMBER
+# Port number we should wait for connections on.
+# NOTE: This must be a non-priviledged port (i.e. > 1024).
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+server_port=5666
+
+
+
+# SERVER ADDRESS
+# Address that nrpe should bind to in case there are more than one interface
+# and you do not want nrpe to bind on all interfaces.
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+#server_address=127.0.0.1
+
+
+
+# NRPE USER
+# This determines the effective user that the NRPE daemon should run as.  
+# You can either supply a username or a UID.
+# 
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+nrpe_user=nrpe
+
+
+
+# NRPE GROUP
+# This determines the effective group that the NRPE daemon should run as.  
+# You can either supply a group name or a GID.
+# 
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+nrpe_group=nrpe
+
+
+
+# ALLOWED HOST ADDRESSES
+# This is an optional comma-delimited list of IP address or hostnames 
+# that are allowed to talk to the NRPE daemon.
+#
+# Note: The daemon only does rudimentary checking of the client's IP
+# address.  I would highly recommend adding entries in your /etc/hosts.allow
+# file to allow only the specified host to connect to the port
+# you are running this daemon on.
+#
+# NOTE: This option is ignored if NRPE is running under either inetd or xinetd
+
+allowed_hosts=18.187.1.128,18.181.0.65
+ 
+
+
+# COMMAND ARGUMENT PROCESSING
+# This option determines whether or not the NRPE daemon will allow clients
+# to specify arguments to commands that are executed.  This option only works
+# if the daemon was configured with the --enable-command-args configure script
+# option.  
+#
+# *** ENABLING THIS OPTION IS A SECURITY RISK! *** 
+# Read the SECURITY file for information on some of the security implications
+# of enabling this variable.
+#
+# Values: 0=do not allow arguments, 1=allow command arguments
+
+dont_blame_nrpe=1
+
+
+
+# COMMAND PREFIX
+# This option allows you to prefix all commands with a user-defined string.
+# A space is automatically added between the specified prefix string and the
+# command line from the command definition.
+#
+# *** THIS EXAMPLE MAY POSE A POTENTIAL SECURITY RISK, SO USE WITH CAUTION! ***
+# Usage scenario: 
+# Execute restricted commmands using sudo.  For this to work, you need to add
+# the nagios user to your /etc/sudoers.  An example entry for alllowing 
+# execution of the plugins from might be:
+#
+# nagios          ALL=(ALL) NOPASSWD: /usr/lib/nagios/plugins/
+#
+# This lets the nagios user run all commands in that directory (and only them)
+# without asking for a password.  If you do this, make sure you don't give
+# random users write access to that directory or its contents!
+
+# command_prefix=/usr/bin/sudo 
+
+
+
+# DEBUGGING OPTION
+# This option determines whether or not debugging messages are logged to the
+# syslog facility.
+# Values: 0=debugging off, 1=debugging on
+
+debug=0
+
+
+
+# COMMAND TIMEOUT
+# This specifies the maximum number of seconds that the NRPE daemon will
+# allow plugins to finish executing before killing them off.
+
+command_timeout=60
+
+
+
+# CONNECTION TIMEOUT
+# This specifies the maximum number of seconds that the NRPE daemon will
+# wait for a connection to be established before exiting. This is sometimes
+# seen where a network problem stops the SSL being established even though
+# all network sessions are connected. This causes the nrpe daemons to
+# accumulate, eating system resources. Do not set this too low.
+
+connection_timeout=300
+
+
+
+# WEEK RANDOM SEED OPTION
+# This directive allows you to use SSL even if your system does not have
+# a /dev/random or /dev/urandom (on purpose or because the necessary patches
+# were not applied). The random number generator will be seeded from a file
+# which is either a file pointed to by the environment valiable $RANDFILE
+# or $HOME/.rnd. If neither exists, the pseudo random number generator will
+# be initialized and a warning will be issued.
+# Values: 0=only seed from /dev/[u]random, 1=also seed from weak randomness
+
+#allow_weak_random_seed=1
+
+
+
+# INCLUDE CONFIG FILE
+# This directive allows you to include definitions from an external config file.
+
+#include=<somefile.cfg>
+
+
+
+# INCLUDE CONFIG DIRECTORY
+# This directive allows you to include definitions from config files (with a
+# .cfg extension) in one or more directories (with recursion).
+
+#include_dir=<somedirectory>
+#include_dir=<someotherdirectory>
+
+
+
+# COMMAND DEFINITIONS
+# Command definitions that this daemon will run.  Definitions
+# are in the following format:
+#
+# command[<command_name>]=<command_line>
+#
+# When the daemon receives a request to return the results of <command_name>
+# it will execute the command specified by the <command_line> argument.
+#
+# Unlike Nagios, the command line cannot contain macros - it must be
+# typed exactly as it should be executed.
+#
+# Note: Any plugins that are used in the command lines must reside
+# on the machine that this daemon is running on!  The examples below
+# assume that you have plugins installed in a /usr/local/nagios/libexec
+# directory.  Also note that you will have to modify the definitions below
+# to match the argument format the plugins expect.  Remember, these are
+# examples only!
+
+
+# The following examples use hardcoded command arguments...
+
+#command[check_users]=/usr/lib64/nagios/plugins/check_users -w 5 -c 10
+#command[check_load]=/usr/lib64/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
+#command[check_hda1]=/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -p /dev/hda1
+#command[check_zombie_procs]=/usr/lib64/nagios/plugins/check_procs -w 5 -c 10 -s Z
+#command[check_total_procs]=/usr/lib64/nagios/plugins/check_procs -w 150 -c 200 
+
+
+# The following examples allow user-supplied arguments and can
+# only be used if the NRPE daemon was compiled with support for 
+# command arguments *AND* the dont_blame_nrpe directive in this
+# config file is set to '1'.  This poses a potential security risk, so
+# make sure you read the SECURITY file before doing this.
+
+command[check_users]=/usr/lib64/nagios/plugins/check_users -w $ARG1$ -c $ARG2$
+command[check_load]=/usr/lib64/nagios/plugins/check_load -w $ARG1$ -c $ARG2$
+command[check_disk]=/usr/lib64/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -A -i ^/mnt
+command[check_disk_p]=/usr/lib64/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
+command[check_procs]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$
+command[check_procs_C]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -C $ARG3$
+command[check_procs_P]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -P $ARG3$
+command[check_procs_m]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -m $ARG3$
+command[check_procs_s]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
+command[check_procs_u]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -u $ARG3$
+command[check_procs_z]=/usr/lib64/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -z $ARG3$
+command[check_afs]=/etc/nagios/check_afs
+command[check_cron_working]=/etc/nagios/check_cron_working
+command[check_ldap_mmr]=/etc/nagios/check_ldap_mmr
Index: branches/fc15-dev/server/fedora/config/etc/named.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/named.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/named.conf	(revision 1803)
@@ -0,0 +1,39 @@
+//
+// named.conf
+//
+// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
+// server as a caching only nameserver (as a localhost DNS resolver only).
+//
+// See /usr/share/doc/bind*/sample/ for example named configuration files.
+//
+
+options {
+	listen-on port 53 { 127.0.0.1; };
+	listen-on-v6 port 53 { ::1; };
+	directory 	"/var/named";
+	dump-file 	"/var/named/data/cache_dump.db";
+        statistics-file "/var/named/data/named_stats.txt";
+        memstatistics-file "/var/named/data/named_mem_stats.txt";
+	allow-query     { localhost; };
+	recursion yes;
+	#dnssec-enable yes;
+	#dnssec-validation yes;
+	#dnssec-lookaside . trust-anchor dlv.isc.org.;
+};
+
+logging {
+        channel default_debug {
+                file "data/named.run";
+                severity dynamic;
+        };
+};
+
+zone "." IN {
+	type hint;
+	file "named.ca";
+};
+
+include "/etc/named.rfc1912.zones";
+
+#include "/etc/pki/dnssec-keys//named.dnssec.keys";
+#include "/etc/pki/dnssec-keys//dlv/dlv.isc.org.conf";
Index: branches/fc15-dev/server/fedora/config/etc/nscd.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nscd.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nscd.conf	(revision 1803)
@@ -0,0 +1,80 @@
+#
+# /etc/nscd.conf
+#
+# An example Name Service Cache config file.  This file is needed by nscd.
+#
+# Legal entries are:
+#
+#	logfile			<file>
+#	debug-level		<level>
+#	threads			<initial #threads to use>
+#	max-threads		<maximum #threads to use>
+#	server-user             <user to run server as instead of root>
+#		server-user is ignored if nscd is started with -S parameters
+#       stat-user               <user who is allowed to request statistics>
+#	reload-count		unlimited|<number>
+#	paranoia		<yes|no>
+#	restart-interval	<time in seconds>
+#
+#       enable-cache		<service> <yes|no>
+#	positive-time-to-live	<service> <time in seconds>
+#	negative-time-to-live   <service> <time in seconds>
+#       suggested-size		<service> <prime number>
+#	check-files		<service> <yes|no>
+#	persistent		<service> <yes|no>
+#	shared			<service> <yes|no>
+#	max-db-size		<service> <number bytes>
+#	auto-propagate		<service> <yes|no>
+#
+# Currently supported cache names (services): passwd, group, hosts, services
+#
+
+
+	logfile			/var/log/nscd.log
+	threads			32
+	max-threads		128
+	server-user		nscd
+#	stat-user		somebody
+	debug-level		0
+#31
+#	reload-count		5
+#	paranoia		yes
+#	restart-interval	3600
+
+	enable-cache		passwd		yes
+	positive-time-to-live	passwd		120
+	negative-time-to-live	passwd		5
+	suggested-size		passwd		1999
+	check-files		passwd		yes
+	persistent		passwd		no
+	shared			passwd		yes
+	max-db-size		passwd		33554432
+	auto-propagate		passwd		yes
+
+	enable-cache		group		yes
+	positive-time-to-live	group		3600
+	negative-time-to-live	group		5
+	suggested-size		group		1999
+	check-files		group		yes
+	persistent		group		no
+	shared			group		yes
+	max-db-size		group		33554432
+	auto-propagate		group		yes
+
+	enable-cache		hosts		no
+	positive-time-to-live	hosts		3600
+	negative-time-to-live	hosts		20
+	suggested-size		hosts		1999
+	check-files		hosts		yes
+	persistent		hosts		yes
+	shared			hosts		yes
+	max-db-size		hosts		33554432
+
+	enable-cache		services	no
+	positive-time-to-live	services	28800
+	negative-time-to-live	services	20
+	suggested-size		services	211
+	check-files		services	yes
+	persistent		services	yes
+	shared			services	yes
+	max-db-size		services	33554432
Index: branches/fc15-dev/server/fedora/config/etc/nss-ldapd.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nss-ldapd.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nss-ldapd.conf	(revision 1803)
@@ -0,0 +1,134 @@
+# This is the configuration file for the LDAP nameservice
+# switch library's nslcd daemon. It configures the mapping
+# between NSS names (see /etc/nsswitch.conf) and LDAP
+# information in the directory.
+# See the manual page nss-ldapd.conf(5) for more information.
+
+# The uri pointing to the LDAP server to use for name lookups.
+# Multiple entries may be specified. The address that is used
+# here should be resolvable without using LDAP (obviously).
+#uri ldap://127.0.0.1/
+#uri ldaps://127.0.0.1/
+#uri ldapi://%2fvar%2frun%2fldapi_sock/
+# Note: %2f encodes the '/' used as directory separator
+# uri ldap://127.0.0.1/
+
+# The LDAP version to use (defaults to 3
+# if supported by client library)
+#ldap_version 3
+
+# The distinguished name of the search base.
+# base dc=example,dc=com
+
+# The distinguished name to bind to the server with.
+# Optional: default is to bind anonymously.
+#binddn cn=proxyuser,dc=example,dc=com
+
+# The credentials to bind with.
+# Optional: default is no credentials.
+# Note that if you set a bindpw you should check the permissions of this file.
+#bindpw secret
+
+# The default search scope.
+#scope sub
+#scope one
+#scope base
+
+# Customize certain database lookups.
+#base   group  ou=Groups,dc=example,dc=com
+#base   passwd ou=People,dc=example,dc=com
+#base   shadow ou=People,dc=example,dc=com
+#scope  group  onelevel
+#scope  hosts  sub
+
+# Bind/connect timelimit.
+#bind_timelimit 30
+
+# Search timelimit.
+#timelimit 30
+
+# Idle timelimit. nslcd will close connections if the
+# server has not been contacted for the number of seconds.
+#idle_timelimit 3600
+
+# Use StartTLS without verifying the server certificate.
+#ssl start_tls
+#tls_reqcert never
+
+# CA certificates for server certificate verification
+#tls_cacertdir /etc/ssl/certs
+#tls_cacertfile /etc/ssl/ca.cert
+
+# Seed the PRNG if /dev/urandom is not provided
+#tls_randfile /var/run/egd-pool
+
+# SSL cipher suite
+# See man ciphers for syntax
+#tls_ciphers TLSv1
+
+# Client certificate and key
+# Use these, if your server requires client authentication.
+#tls_cert
+#tls_key
+
+# NDS mappings
+#map group uniqueMember member
+
+# Mappings for Services for UNIX 3.5
+#filter passwd (objectClass=User)
+#map    passwd uid              msSFU30Name
+#map    passwd userPassword     msSFU30Password
+#map    passwd homeDirectory    msSFU30HomeDirectory
+#map    passwd homeDirectory    msSFUHomeDirectory
+#filter shadow (objectClass=User)
+#map    shadow uid              msSFU30Name
+#map    shadow userPassword     msSFU30Password
+#filter group  (objectClass=Group)
+#map    group  uniqueMember     msSFU30PosixMember
+
+# Mappings for Services for UNIX 2.0
+#filter passwd (objectClass=User)
+#map    passwd uid              msSFUName
+#map    passwd userPassword     msSFUPassword
+#map    passwd homeDirectory    msSFUHomeDirectory
+#map    passwd cn               msSFUName
+#filter shadow (objectClass=User)
+#map    shadow uid              msSFUName
+#map    shadow userPassword     msSFUPassword
+#map    shadow shadowLastChange pwdLastSet
+#filter group  (objectClass=Group)
+#map    group  uniqueMember     posixMember
+
+# Mappings for Active Directory
+#pagesize 1000
+#referrals off
+#filter passwd (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*))
+#map    passwd uid              sAMAccountName
+#map    passwd homeDirectory    unixHomeDirectory
+#map    passwd gecos            displayName
+#filter shadow (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*))
+#map    shadow uid              sAMAccountName
+#map    shadow shadowLastChange pwdLastSet
+#filter group  (objectClass=group)
+#map    group  uniqueMember     member
+
+# Mappings for AIX SecureWay
+#filter passwd (objectClass=aixAccount)
+#map    passwd uid              userName
+#map    passwd userPassword     passwordChar
+#map    passwd uidNumber        uid
+#map    passwd gidNumber        gid
+#filter group  (objectClass=aixAccessGroup)
+#map    group  cn               groupName
+#map    group  uniqueMember     member
+#map    group  gidNumber        gid
+uid nslcd
+gid ldap
+# This comment prevents repeated auto-migration of settings from /etc/ldap.conf.
+uri ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/
+base dc=scripts,dc=mit,dc=edu
+timelimit 120
+bind_timelimit 120
+idle_timelimit 3600
+base   group  ou=Groups,dc=scripts,dc=mit,dc=edu
+base   passwd ou=People,dc=scripts,dc=mit,dc=edu
Index: branches/fc15-dev/server/fedora/config/etc/nsswitch.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/nsswitch.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/nsswitch.conf	(revision 1803)
@@ -0,0 +1,74 @@
+#
+# /etc/nsswitch.conf
+#
+# An example Name Service Switch config file. This file should be
+# sorted with the most-used services at the beginning.
+#
+# The entry '[NOTFOUND=return]' means that the search for an
+# entry should stop if the search in the previous entry turned
+# up nothing. Note that if the search failed due to some other reason
+# (like no NIS server responding) then the search continues with the
+# next entry.
+#
+# Legal entries are:
+#
+#	nisplus or nis+		Use NIS+ (NIS version 3)
+#	nis or yp		Use NIS (NIS version 2), also called YP
+#	dns			Use DNS (Domain Name Service)
+#	files			Use the local files
+#	db			Use the local database (.db) files
+#	compat			Use NIS on compat mode
+#	hesiod			Use Hesiod for user lookups
+#	[NOTFOUND=return]	Stop searching if not found so far
+#
+
+# To use db, put the "db" in front of "files" for entries you want to be
+# looked up first in the databases
+#
+# Example:
+#passwd:    db files nisplus nis
+#shadow:    db files nisplus nis
+#group:     db files nisplus nis
+
+# With nss_nonlocal:
+passwd:     files nonlocal
+passwd_nonlocal: ldap
+shadow:     files
+group:      files nonlocal
+group_nonlocal: ldap
+
+## Without nss_nonlocal:
+#passwd:	  files ldap
+#group:	  files ldap
+#shadow:     files
+#passwd: files ldap
+#group: files ldap
+
+#hosts:     db files nisplus nis dns
+hosts:      files dns
+#hosts:      files mdns4_minimal [NOTFOUND=return] dns
+
+# Example - obey only what nisplus tells us...
+#services:   nisplus [NOTFOUND=return] files
+#networks:   nisplus [NOTFOUND=return] files
+#protocols:  nisplus [NOTFOUND=return] files
+#rpc:        nisplus [NOTFOUND=return] files
+#ethers:     nisplus [NOTFOUND=return] files
+#netmasks:   nisplus [NOTFOUND=return] files     
+
+bootparams: nisplus [NOTFOUND=return] files
+
+ethers:     files
+netmasks:   files
+networks:   files
+protocols:  files
+rpc:        files
+services:   files
+
+netgroup:   nisplus
+
+publickey:  nisplus
+
+automount:  files nisplus
+aliases:    files nisplus
+
Index: branches/fc15-dev/server/fedora/config/etc/ntp.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ntp.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ntp.conf	(revision 1803)
@@ -0,0 +1,8 @@
+restrict default kod nomodify notrap nopeer noquery
+restrict 127.0.0.1
+server time.mit.edu
+server tick.mit.edu
+server	127.127.1.0
+fudge	127.127.1.0 stratum 10
+driftfile /var/lib/ntp/drift
+keys /etc/ntp/keys
Index: branches/fc15-dev/server/fedora/config/etc/openafs/CellAlias
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/openafs/CellAlias	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/openafs/CellAlias	(revision 1803)
@@ -0,0 +1,15 @@
+#
+# This file can be used to specify AFS cell aliases, one per line.
+# The syntax to specify "my" as an alias for "my.cell.name" is:
+#
+#   my.cell.name	my
+
+athena.mit.edu		athena
+csail.mit.edu		csail
+dev.mit.edu		dev
+lees.mit.edu		lees
+net.mit.edu		net
+ops.mit.edu		ops
+sipb.mit.edu		sipb
+andrew.cmu.edu		andrew
+acpub.duke.edu		acpub
Index: branches/fc15-dev/server/fedora/config/etc/openafs/NetRestrict
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/openafs/NetRestrict	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/openafs/NetRestrict	(revision 1803)
@@ -0,0 +1,12 @@
+18.181.0.46
+18.181.0.50
+18.181.0.49
+18.181.0.43
+172.21.0.57
+172.21.0.53
+172.21.0.167
+172.21.0.228
+172.21.0.236
+172.21.0.237
+172.21.0.234
+172.21.0.235
Index: branches/fc15-dev/server/fedora/config/etc/openafs/ThisCell
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/openafs/ThisCell	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/openafs/ThisCell	(revision 1803)
@@ -0,0 +1,1 @@
+athena.mit.edu
Index: branches/fc15-dev/server/fedora/config/etc/pam.d/crond
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pam.d/crond	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pam.d/crond	(revision 1803)
@@ -0,0 +1,13 @@
+#
+# The PAM configuration file for the cron daemon
+#
+#
+auth	   sufficient pam_rootok.so
+auth       required   pam_env.so
+auth       include    system-auth
+account    required   pam_access.so
+account    include    system-auth
+session    required   pam_loginuid.so
+session    [default=1 success=ignore] pam_succeed_if.so user notin root quiet
+session    required   pam_env.so envfile=/etc/environment.cron
+session    include    system-auth
Index: branches/fc15-dev/server/fedora/config/etc/pam.d/mock
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pam.d/mock	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pam.d/mock	(revision 1803)
@@ -0,0 +1,15 @@
+#%PAM-1.0
+auth		sufficient	pam_rootok.so
+auth		sufficient	pam_succeed_if.so user ingroup mock use_uid quiet
+# Uncomment the following line to implicitly trust users in the "wheel" group.
+#auth		sufficient	pam_wheel.so trust use_uid
+# Uncomment the following line to require a user to be in the "wheel" group.
+#auth		required	pam_wheel.so use_uid
+#auth		include		system-auth
+auth		required	pam_deny.so
+account		sufficient	pam_succeed_if.so user ingroup mock use_uid quiet
+#account		include		system-auth
+account		required	pam_deny.so
+password	include		system-auth
+session		include		system-auth
+session		optional	pam_xauth.so
Index: branches/fc15-dev/server/fedora/config/etc/pam.d/sshd
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pam.d/sshd	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pam.d/sshd	(revision 1803)
@@ -0,0 +1,23 @@
+#%PAM-1.0
+# Authentication modules
+
+# If their user exists (success),
+auth	[success=ignore ignore=ignore default=1]	pam_succeed_if.so uid >= 0
+# print the "You don't have tickets" error:
+auth	[success=die ignore=reset default=die]	pam_echo.so file=/etc/issue.net.no_tkt
+# else print the "your account doesn't exist" error:
+auth	[success=die ignore=reset default=die]	pam_echo.so file=/etc/issue.net.no_user
+
+# Set environment variables:
+auth       required     pam_env.so
+# Use Unix authentication and succeed immediately (sufficient):
+auth       sufficient   pam_unix.so try_first_pass
+# If they somehow slipped through, deny:
+auth	   required	pam_deny.so
+
+account    required     pam_nologin.so
+account    include      system-auth
+password   include      system-auth
+session    optional     pam_keyinit.so force revoke
+session    include      system-auth
+session    required     pam_loginuid.so
Index: branches/fc15-dev/server/fedora/config/etc/php.d/_scripts.ini
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/php.d/_scripts.ini	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/php.d/_scripts.ini	(revision 1803)
@@ -0,0 +1,4 @@
+zend_extension = /usr/lib64/php/modules/scripts.so
+cgi.fix_pathinfo=1
+cgi.force_redirect = 0
+memory_limit = 1024M
Index: branches/fc15-dev/server/fedora/config/etc/php.d/dom.ini
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/php.d/dom.ini	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/php.d/dom.ini	(revision 1803)
@@ -0,0 +1,1 @@
+extension = dom.so
Index: branches/fc15-dev/server/fedora/config/etc/php.d/mysql.ini
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/php.d/mysql.ini	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/php.d/mysql.ini	(revision 1803)
@@ -0,0 +1,1 @@
+extension = mysql.so
Index: branches/fc15-dev/server/fedora/config/etc/php.d/tidy.ini
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/php.d/tidy.ini	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/php.d/tidy.ini	(revision 1803)
@@ -0,0 +1,1 @@
+
Index: branches/fc15-dev/server/fedora/config/etc/php.ini
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/php.ini	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/php.ini	(revision 1803)
@@ -0,0 +1,181 @@
+[PHP]
+engine = On
+zend.ze1_compatibility_mode = Off
+short_open_tag = On
+asp_tags = Off
+precision    =  14
+y2k_compliance = On
+output_buffering = 4096
+zlib.output_compression = Off
+implicit_flush = Off
+unserialize_callback_func=
+serialize_precision = 100
+allow_call_time_pass_reference = Off
+safe_mode = Off
+safe_mode_gid = Off
+safe_mode_include_dir =
+safe_mode_exec_dir =
+safe_mode_allowed_env_vars = PHP_
+safe_mode_protected_env_vars = LD_LIBRARY_PATH
+disable_functions =
+disable_classes =
+expose_php = On
+max_execution_time = 30     ; Maximum execution time of each script, in seconds
+max_input_time = 60	; Maximum amount of time each script may spend parsing request data
+memory_limit = 1024M      ; Maximum amount of memory a script may consume (16MB)
+error_reporting  =  E_ALL
+display_errors = Off
+display_startup_errors = Off
+log_errors = On
+log_errors_max_len = 1024
+ignore_repeated_errors = Off
+ignore_repeated_source = Off
+report_memleaks = On
+track_errors = Off
+variables_order = "EGPCS"
+register_globals = Off
+register_long_arrays = Off
+register_argc_argv = Off
+auto_globals_jit = On
+post_max_size = 8M
+magic_quotes_gpc = Off
+magic_quotes_runtime = Off
+magic_quotes_sybase = Off
+auto_prepend_file =
+auto_append_file =
+default_mimetype = "text/html"
+doc_root =
+user_dir =
+extension_dir = "/usr/lib64/php/modules"
+enable_dl = On
+file_uploads = On
+upload_max_filesize = 2M
+allow_url_fopen = On
+allow_url_include = Off
+default_socket_timeout = 60
+[date]
+date.timezone = "US/Eastern"
+[filter]
+[iconv]
+[sqlite]
+[xmlrpc]
+[Pcre]
+[Syslog]
+define_syslog_variables  = Off
+[mail function]
+smtp_port = 25
+sendmail_path = /usr/sbin/sendmail -t -i
+[SQL]
+sql.safe_mode = Off
+[ODBC]
+odbc.allow_persistent = On
+odbc.check_persistent = On
+odbc.max_persistent = -1
+odbc.max_links = -1
+odbc.defaultlrl = 4096
+odbc.defaultbinmode = 1
+[MySQL]
+mysql.allow_persistent = On
+mysql.max_persistent = -1
+mysql.max_links = -1
+mysql.default_port =
+mysql.default_socket =
+mysql.default_host = 'sql.mit.edu'
+mysql.default_user =
+mysql.default_password =
+mysql.connect_timeout = 60
+mysql.trace_mode = Off
+[MySQLi]
+mysqli.max_links = -1
+mysqli.default_port = 3306
+mysqli.default_socket =
+mysqli.default_host =
+mysqli.default_user =
+mysqli.default_pw =
+mysqli.reconnect = Off
+[mSQL]
+msql.allow_persistent = On
+msql.max_persistent = -1
+msql.max_links = -1
+[PostgresSQL]
+pgsql.allow_persistent = On
+pgsql.auto_reset_persistent = Off
+pgsql.max_persistent = -1
+pgsql.max_links = -1
+pgsql.ignore_notice = 0
+pgsql.log_notice = 0
+[Sybase]
+sybase.allow_persistent = On
+sybase.max_persistent = -1
+sybase.max_links = -1
+sybase.min_error_severity = 10
+sybase.min_message_severity = 10
+sybase.compatability_mode = Off
+[Sybase-CT]
+sybct.allow_persistent = On
+sybct.max_persistent = -1
+sybct.max_links = -1
+sybct.min_server_severity = 10
+sybct.min_client_severity = 10
+[bcmath]
+bcmath.scale = 0
+[browscap]
+[Informix]
+ifx.default_host =
+ifx.default_user =
+ifx.default_password =
+ifx.allow_persistent = On
+ifx.max_persistent = -1
+ifx.max_links = -1
+ifx.textasvarchar = 0
+ifx.byteasvarchar = 0
+ifx.charasvarchar = 0
+ifx.blobinfile = 0
+ifx.nullformat = 0
+[Session]
+session.save_handler = files
+session.save_path = "/tmp/sessions"
+session.use_cookies = 1
+session.name = PHPSESSID
+session.auto_start = 0
+session.cookie_lifetime = 0
+session.cookie_path = /
+session.cookie_domain =
+session.cookie_httponly = 
+session.serialize_handler = php
+session.gc_probability = 1
+session.gc_divisor     = 1000
+session.gc_maxlifetime = 1440
+session.bug_compat_42 = 0
+session.bug_compat_warn = 1
+session.referer_check =
+session.entropy_length = 0
+session.entropy_file =
+session.cache_limiter = nocache
+session.cache_expire = 180
+session.use_trans_sid = 0
+session.hash_function = 0
+session.hash_bits_per_character = 5
+url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
+[MSSQL]
+mssql.allow_persistent = On
+mssql.max_persistent = -1
+mssql.max_links = -1
+mssql.min_error_severity = 10
+mssql.min_message_severity = 10
+mssql.compatability_mode = Off
+mssql.secure_connection = Off
+[Assertion]
+[COM]
+[mbstring]
+[FrontBase]
+[gd]
+[exif]
+[Tidy]
+tidy.clean_output = Off
+[soap]
+soap.wsdl_cache_enabled=1
+soap.wsdl_cache_dir="/tmp"
+soap.wsdl_cache_ttl=86400
+[cgi]
+cgi.fix_pathinfo = 1
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ai6034.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ai6034.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ai6034.pem	(revision 1803)
@@ -0,0 +1,69 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            fe:8f:cc:2a:7d:76:b9:64:36:c3:e6:ec:48:e1:ee:1f
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 30 16:00:00 2010 GMT
+            Not After : Sep  1 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=ai6034.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        73:aa:4b:65:bf:b3:28:bd:80:f2:b8:80:55:5f:73:c0:93:49:
+        38:d3:7d:53:e7:33:4b:07:df:f0:b9:2f:47:7a:c6:41:02:f2:
+        1d:82:b4:e0:f2:84:3a:d1:43:75:48:ae:6e:31:e7:85:45:0c:
+        cd:a2:95:51:b1:5a:3b:eb:a0:e6:5d:bb:57:3d:b4:27:a6:f1:
+        c5:49:96:44:67:da:7a:f4:99:19:60:4f:ef:02:79:e9:c8:f6:
+        3b:3f:fa:0a:37:ce:1c:ec:c6:63:20:26:b6:44:a6:20:7d:06:
+        00:8e:e9:4a:94:fa:58:3d:42:17:6a:99:cc:8f:23:7c:28:ef:
+        1c:d7
+-----BEGIN CERTIFICATE-----
+MIIDfjCCAuegAwIBAgIRAP6PzCp9drlkNsPm7Ejh7h8wDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDA4MzAxNjAwMDBaFw0x
+MTA5MDExNjAwMDBaMIHQMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEXMBUGA1UEAxMOYWk2MDM0Lm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEF
+AAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48u
+orZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61Y
+JLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEA
+AaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAe
+BggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNV
+HQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0
+cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOB
+gQBzqktlv7MovYDyuIBVX3PAk0k4031T5zNLB9/wuS9HesZBAvIdgrTg8oQ60UN1
+SK5uMeeFRQzNopVRsVo766DmXbtXPbQnpvHFSZZEZ9p69JkZYE/vAnnpyPY7P/oK
+N84c7MZjICa2RKYgfQYAjulKlPpYPUIXapnMjyN8KO8c1w==
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/asa.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/asa.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/asa.pem	(revision 1803)
@@ -0,0 +1,111 @@
+
+-------- Original Message --------
+Subject: [help.mit.edu #1547750] CSR for asa.mit.edu and bc.mit.edu
+Date: Mon, 11 Apr 2011 11:55:38 -0400
+From: mitcert@MIT.EDU
+Reply-To: mitcert@MIT.EDU
+To: adehnert@mit.edu
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            f7:03:bd:64:23:2f:eb:2c:1e:fd:f1:af:a0:cd:c4:6c
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Apr  9 16:00:00 2011 GMT
+            Not After : Apr 10 16:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=asa.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints:
+                CA:FALSE
+            Netscape Cert Type:
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage:
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage:
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier:
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points:
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        09:79:1b:c2:fb:62:3c:2b:ff:0f:27:fe:15:a1:84:3d:3a:f3:
+        b2:e1:d6:09:0e:75:8e:cd:d1:5f:81:c0:ae:85:11:6b:50:e9:
+        c4:8e:52:bf:38:9e:38:9a:c0:cb:27:ec:11:65:91:34:ad:fa:
+        a8:84:72:c4:3a:35:cc:ad:1c:59:1b:2b:c0:8e:30:c7:4a:4a:
+        fd:d8:f9:99:00:84:08:35:25:43:ac:47:92:06:34:07:2c:49:
+        47:7f:c9:a1:44:80:86:ef:ab:75:f8:b4:90:d4:e5:be:04:db:
+        b8:03:f5:a4:c6:6d:b8:a3:fe:44:35:93:6e:a3:7a:b2:75:ae:
+        06:f7
+-----BEGIN CERTIFICATE-----
+MIIE/zCCBGigAwIBAgIRAPcDvWQjL+ssHv3xr6DNxGwwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTA0MDkxNjAwMDBaFw0x
+MjA0MTAxNjAwMDBaMIHNMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEUMBIGA1UEAxMLYXNhLm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pjk/e3AVc4
+bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMdeNQZi/irW
+DxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPca0SwXgFR
+0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt9iFR+sUG
+8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4DJnTCobPX
+y5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2MdCCNSX8L5
+TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCcixoCuhyNW
+8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfeVp3QttB9
+HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0tiQMkFfA
++dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNbfPU1+DEQ
+ezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9GzottAgMB
+AAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAw
+HgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYD
+VR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAmoCSGImh0
+dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQAD
+gYEACXkbwvtiPCv/Dyf+FaGEPTrzsuHWCQ51js3RX4HAroURa1DpxI5SvzieOJrA
+yyfsEWWRNK36qIRyxDo1zK0cWRsrwI4wx0pK/dj5mQCECDUlQ6xHkgY0ByxJR3/J
+oUSAhu+rdfi0kNTlvgTbuAP1pMZtuKP+RDWTbqN6snWuBvc=
+-----END CERTIFICATE----- 
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/axo.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/axo.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/axo.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:22:35 2010
+Date: Sat, 14 Aug 2010 09:22:34 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for axo.mit.edu  [help.mit.edu #1313557]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            04:ff:71:62:ac:05:6d:84:07:75:07:26:fb:9c:38:16
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=axo.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        98:b4:e8:f3:e5:fd:23:53:7b:45:b5:88:7f:36:e3:38:27:26:
+        0c:1f:1e:c9:01:46:6f:ac:11:a7:08:c8:db:ee:23:83:56:ff:
+        da:e5:64:a2:b5:2a:54:42:81:7c:cb:22:1b:e4:36:0b:77:d0:
+        54:56:80:35:23:b8:91:6d:d2:81:7f:d3:35:95:67:cf:a1:13:
+        df:b7:f5:fe:0a:57:33:af:b2:9f:db:47:a9:e7:d1:d2:89:37:
+        77:f1:2e:53:01:51:d8:1d:56:e2:6b:d2:42:c3:63:7e:ad:86:
+        60:7f:c0:7a:30:4e:7f:6b:46:52:ce:a2:7e:aa:f7:a2:0e:eb:
+        7e:af
+-----BEGIN CERTIFICATE-----
+MIIDejCCAuOgAwIBAgIQBP9xYqwFbYQHdQcm+5w4FjANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDgxMjE2MDAwMFoXDTEx
+MDgxMTE2MDAwMFowgc0xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRQwEgYDVQQDEwtheG8ubWl0LmVkdTEeMBwG
+CSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6itlPT
+tg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgksA6h
+bdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQABo4Gr
+MIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4GCCsG
+AQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1UdDgQW
+BBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
+Y2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GBAJi0
+6PPl/SNTe0W1iH824zgnJgwfHskBRm+sEacIyNvuI4NW/9rlZKK1KlRCgXzLIhvk
+Ngt30FRWgDUjuJFt0oF/0zWVZ8+hE9+39f4KVzOvsp/bR6nn0dKJN3fxLlMBUdgd
+VuJr0kLDY36thmB/wHowTn9rRlLOon6q96IO636v
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/barnowl.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/barnowl.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/barnowl.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:31:32 2010
+Date: Thu, 28 Oct 2010 09:31:30 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for barnowl.mit.edu  [help.mit.edu #1385000]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            79:30:52:53:16:02:80:22:5d:71:c4:b9:74:27:3c:07
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=barnowl.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        77:a7:52:e3:c1:0e:ba:bc:dd:a9:c6:42:44:8e:a9:26:85:4c:
+        d2:cb:85:12:03:72:31:c3:d6:f4:ae:b0:0d:64:8a:c3:e6:9d:
+        c9:e5:3d:77:51:9b:7e:52:95:fc:d4:79:9a:78:a7:e6:1b:61:
+        6c:e7:4f:ae:42:f8:ab:27:a1:7d:1e:6a:a6:27:b4:a3:ff:77:
+        d0:69:8d:e2:59:42:8e:5c:7c:1a:0d:da:f8:68:37:7e:3a:ba:
+        ba:05:d4:91:77:f2:0c:6a:ab:ff:64:b6:b3:0a:42:8c:3a:5e:
+        18:ff:9d:6b:19:fd:44:60:64:30:b1:03:d0:21:fa:3a:21:47:
+        97:f5
+-----BEGIN CERTIFICATE-----
+MIIDfjCCAuegAwIBAgIQeTBSUxYCgCJdccS5dCc8BzANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTAyNjE2MDAwMFoXDTEx
+MTAyNzE2MDAwMFowgdExCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI1NjcmlwdHMubWl0LmVk
+dSBXZWIgSG9zdGluZyBTZXJ2aWNlMRgwFgYDVQQDEw9iYXJub3dsLm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEF
+AAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48u
+orZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61Y
+JLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEA
+AaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAe
+BggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNV
+HQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0
+cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOB
+gQB3p1LjwQ66vN2pxkJEjqkmhUzSy4USA3Ixw9b0rrANZIrD5p3J5T13UZt+UpX8
+1HmaeKfmG2Fs50+uQvirJ6F9HmqmJ7Sj/3fQaY3iWUKOXHwaDdr4aDd+Orq6BdSR
+d/IMaqv/ZLazCkKMOl4Y/51rGf1EYGQwsQPQIfo6IUeX9Q==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/bc.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/bc.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/bc.pem	(revision 1803)
@@ -0,0 +1,111 @@
+
+-------- Original Message --------
+Subject: [help.mit.edu #1547750] CSR for asa.mit.edu and bc.mit.edu
+Date: Mon, 11 Apr 2011 11:55:07 -0400
+From: mitcert@MIT.EDU
+Reply-To: mitcert@MIT.EDU
+To: adehnert@mit.edu
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            26:a6:2a:37:79:0a:c0:9a:bf:ed:7a:7e:21:fb:4a:f0
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Apr  9 16:00:00 2011 GMT
+            Not After : Apr 10 16:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=bc.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints:
+                CA:FALSE
+            Netscape Cert Type:
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage:
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage:
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier:
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points:
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        49:8b:46:ea:3c:61:a7:57:4a:3b:a3:41:3c:51:d4:0c:00:46:
+        d7:3c:f5:1b:4a:55:17:df:97:fd:fc:e0:5f:3e:9b:ba:db:d4:
+        ad:c0:a1:fd:45:0a:37:7d:29:7a:4f:40:e9:77:4f:8f:82:37:
+        83:81:99:80:03:3f:e1:e5:7b:a6:c5:70:39:97:2d:30:65:aa:
+        fc:1c:45:5c:87:1e:18:03:bd:d4:50:49:52:ac:4a:d9:0a:52:
+        49:2e:7d:07:3a:5c:21:39:b2:5a:72:69:c8:03:65:4a:66:11:
+        2b:66:e0:27:69:02:7a:8b:5d:db:f6:29:be:e3:d5:7d:77:e3:
+        9c:4a
+-----BEGIN CERTIFICATE-----
+MIIE/TCCBGagAwIBAgIQJqYqN3kKwJq/7Xp+IftK8DANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTExMDQwOTE2MDAwMFoXDTEy
+MDQxMDE2MDAwMFowgcwxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRMwEQYDVQQDEwpiYy5taXQuZWR1MR4wHAYJ
+KoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQC/o/J7mMwWp1fmkoU0VvHjYoOeak81nfDPiYdz45P3twFXOG7p
+/FlNJOunF0fKLFEORci3aMkOMibgkdMGXIx8DmyZDLJGBQ9N8bDHXjUGYv4q1g8b
+LLUCJEzDBnHslModqq9+uS3AVUvMvFE9dmhb0+010AO6G2zzoNjT3GtEsF4BUdMC
+zEraUhLeNTFpFlpIiw/OrU3k1YsRNn+HHP2E2kMuhy9BcKyt31TA7fYhUfrFBvAb
+66Gwv00cQjSK1W/3JWZzj2DE140zkfRGOpcJWQH/w2SUQEgwaPBuAyZ0wqGz18uU
+/G5Tiiqe/bFPxHRWJWMfqr2VJXicRUYbDCFx64SU0LLx2lL20X9jHQgjUl/C+U2s
+pETlmlRw/Mn81NS3HXWVAOO/PkzzQ8OWxwkqKUUS0jHWeUyK51QnIsaArocjVvGN
+SZvI+u0zW19WdsgPfoUUacRIMQc5pTSB8msVUCL7uyytS4TqVWT33lad0LbQfR4b
+UVA3RJTmxBXrRTHxs+wPs6kM+BxHx1EABe/usD2ffgenOOiDTD3bNLYkDJBXwPnQ
+ZBSKk0ebQfWjFB2eGF3V2Gav9fPIL7ynAqfv3PAOx0eNLtaoYkKTW3z1NfgxEHs4
+1EAkaIETJ8v7dg7RmRTY1ev3aWSPr4+CuyQp+dQpHc7mFLpMiwn/Rs6LbQIDAQAB
+o4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4G
+CCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1Ud
+DgQWBBTLEbcBX4ZVT0VeqydpvuE8iXpVYjAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GB
+AEmLRuo8YadXSjujQTxR1AwARtc89RtKVRffl/384F8+m7rb1K3Aof1FCjd9KXpP
+QOl3T4+CN4OBmYADP+Hle6bFcDmXLTBlqvwcRVyHHhgDvdRQSVKsStkKUkkufQc6
+XCE5slpyacgDZUpmEStm4CdpAnqLXdv2Kb7j1X1345xK
+-----END CERTIFICATE----- 
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/blue-sun-corp.com.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/blue-sun-corp.com.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/blue-sun-corp.com.pem	(revision 1803)
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE6DCCBFGgAwIBAgIJAKbekIcoh850MA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD
+VQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEdMBsGA1UEChMUQmx1ZSBT
+dW4gQ29ycG9yYXRpb24xJzAlBgNVBAMTHkJsdWUgU3VuIENlcnRpZmljYXRlIEF1
+dGhvcml0eTElMCMGCSqGSIb3DQEJARYWcm9vdEBibHVlLXN1bi1jb3JwLmNvbTAe
+Fw0xMTAxMDMwMDM2MjhaFw0xMjAxMDMwMDM2MjhaMIHVMQswCQYDVQQGEwJVUzEW
+MBQGA1UECBMNTWFzc2FjaHVzZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYD
+VQQKEyVNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYD
+VQQLEyNzY3JpcHRzLm1pdC5lZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEcMBoGA1UE
+AwwTKi5ibHVlLXN1bi1jb3JwLmNvbTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0Bt
+aXQuZWR1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv6Pye5jMFqdX
+5pKFNFbx42KDnmpPNZ3wz4mHc+OT97cBVzhu6fxZTSTrpxdHyixRDkXIt2jJDjIm
+4JHTBlyMfA5smQyyRgUPTfGwx141BmL+KtYPGyy1AiRMwwZx7JTKHaqvfrktwFVL
+zLxRPXZoW9PtNdADuhts86DY09xrRLBeAVHTAsxK2lIS3jUxaRZaSIsPzq1N5NWL
+ETZ/hxz9hNpDLocvQXCsrd9UwO32IVH6xQbwG+uhsL9NHEI0itVv9yVmc49gxNeN
+M5H0RjqXCVkB/8NklEBIMGjwbgMmdMKhs9fLlPxuU4oqnv2xT8R0ViVjH6q9lSV4
+nEVGGwwhceuElNCy8dpS9tF/Yx0II1JfwvlNrKRE5ZpUcPzJ/NTUtx11lQDjvz5M
+80PDlscJKilFEtIx1nlMiudUJyLGgK6HI1bxjUmbyPrtM1tfVnbID36FFGnESDEH
+OaU0gfJrFVAi+7ssrUuE6lVk995WndC20H0eG1FQN0SU5sQV60Ux8bPsD7OpDPgc
+R8dRAAXv7rA9n34Hpzjog0w92zS2JAyQV8D50GQUipNHm0H1oxQdnhhd1dhmr/Xz
+yC+8pwKn79zwDsdHjS7WqGJCk1t89TX4MRB7ONRAJGiBEyfL+3YO0ZkU2NXr92lk
+j6+PgrskKfnUKR3O5hS6TIsJ/0bOi20CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglg
+hkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O
+BBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMB8GA1UdIwQYMBaAFGKnOr2peXKe7el+
+KIadYlHQD3U7MA0GCSqGSIb3DQEBBQUAA4GBAI7FacB+AS8KWaM5ISimMgWgOn5P
+yMiMdRXAOh7XUOfX5Y9JoUqwK1wVSGIK8Fj8C/BPwC9SOwnSVgxAMjsboBW3zEx3
+MKRpB6Ja3uX6NHwZz6WnH4WbMOA06BfDbH9WrCPoQjh8qwOsf2QcpXfLY4RyNY2c
+wpEVBOT1+qc8gkaf
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ca.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ca.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ca.pem	(revision 1803)
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDODCCAqGgAwIBAgIBATANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJVUzEW
+MBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMlTWFzc2FjaHVzZXR0cyBJ
+bnN0aXR1dGUgb2YgVGVjaG5vbG9neTEVMBMGA1UECxMMQ2xpZW50IENBIHYxMB4X
+DTA2MDYwNzIyMDcyNVoXDTI2MDgwMTIyMDcyNVowbDELMAkGA1UEBhMCVVMxFjAU
+BgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMgSW5z
+dGl0dXRlIG9mIFRlY2hub2xvZ3kxFTATBgNVBAsTDENsaWVudCBDQSB2MTCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV11Ca4OyWTnlF6FH8z8MwCUa3L5JxuF
+srLsz7arGeTDS39WjWywDgCZM3vOCvOpziGFYzicS7n4JQuy04QuT+6Xdc2bEx7u
+JOhoeTz/VypA4DIwcsv20I63Cgr14aMNz5Ur4KWQjyn6zcgQ276fnM/cJD3wzAzX
+2fU9mF/1LFECAwEAAaOB6TCB5jAdBgNVHQ4EFgQUARibj0xtym66P6slAv0eCMB6
+wo8wgZYGA1UdIwSBjjCBi4AUARibj0xtym66P6slAv0eCMB6wo+hcKRuMGwxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMS4wLAYDVQQKEyVNYXNz
+YWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MRUwEwYDVQQLEwxDbGll
+bnQgQ0EgdjGCAQEwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4
+QgEBBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4GBAC/J7KTQjDXUi9xANDWxZmKc02Yn
+90TBhqbg/f7em6/9SHO9vcSGr04atve79wCxgM46m1Hvd493sxyTgPJSH5Un6GrK
+8CQ1Iyqq4gXvjLBORblricOCnyu5KaaZ63NjYxnjwvwN2uy9opsuXmijMAJ/gL7r
+4Gd9vK+Uzsz0qmJP
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cdsa.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cdsa.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cdsa.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:32:39 2010
+Date: Thu, 28 Oct 2010 09:32:38 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for cdsa.mit.edu  [help.mit.edu #1385001]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            02:3c:d3:07:54:8f:68:94:a6:87:85:b9:eb:ab:bc:91
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=cdsa.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        06:6a:82:9e:e6:af:d1:0f:6e:80:14:2a:b7:c8:9f:9f:a9:76:
+        5d:b6:c2:7a:a0:1e:d7:ac:12:35:33:a3:0b:f8:ac:ab:25:89:
+        16:b9:01:40:72:30:98:d8:39:d5:43:b0:8d:36:6d:11:f3:cd:
+        29:49:46:0c:5a:79:b8:6e:2c:05:02:2a:cd:ac:fd:72:0a:97:
+        6a:ac:cc:26:cf:23:e8:20:fa:9b:e6:92:ea:d2:d1:9d:57:4e:
+        8a:41:45:78:ba:19:d5:98:ab:c3:ce:c6:9a:b5:5c:6d:ca:61:
+        a6:16:63:a3:77:de:0b:2e:76:c7:c1:58:37:c8:56:a2:47:40:
+        0d:d1
+-----BEGIN CERTIFICATE-----
+MIIDezCCAuSgAwIBAgIQAjzTB1SPaJSmh4W566u8kTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTAyNjE2MDAwMFoXDTEx
+MTAyNzE2MDAwMFowgc4xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI1NjcmlwdHMubWl0LmVk
+dSBXZWIgSG9zdGluZyBTZXJ2aWNlMRUwEwYDVQQDEwxjZHNhLm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48uorZT
+07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61YJLAO
+oW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEAAaOB
+qzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAeBggr
+BgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNVHQ4E
+FgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
+L2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOBgQAG
+aoKe5q/RD26AFCq3yJ+fqXZdtsJ6oB7XrBI1M6ML+KyrJYkWuQFAcjCY2DnVQ7CN
+Nm0R880pSUYMWnm4biwFAirNrP1yCpdqrMwmzyPoIPqb5pLq0tGdV06KQUV4uhnV
+mKvDzsaatVxtymGmFmOjd94LLnbHwVg3yFaiR0AN0Q==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/check.pl
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/check.pl	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/check.pl	(revision 1803)
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+
+use File::Basename;
+use Date::Parse;
+
+my $dir = dirname($0);
+chdir $dir or die "Failed to chdir('$dir'): $!";
+
+my $now = time();
+
+our $verbose = 0;
+$verbose = 1 if ($ARGV[0] eq "-v");
+
+use constant WARNING => 60*60*24*14; # Warn if a cert is expiring within 14 days
+
+foreach my $cert (glob "*.pem") {
+  open(X509, "-|", qw(openssl x509 -in), $cert, qw(-enddate -noout)) or die "Couldn't invoke openssl x509: $!";
+  chomp(my $exp = <X509>);
+  close(X509);
+  $exp =~ s/^notAfter=// or warn "Cert appears broken: $cert";
+
+  my $time = str2time($exp);
+
+  if ($verbose || ($time - $now) <= WARNING) {
+    printf "Certificate expiring in %.2f days: %s for ", (($time - $now) / (60.0*60*24)), $cert;
+    system(qw(openssl x509 -in), $cert, qw(-subject -noout));
+  }
+}
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/classmates.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/classmates.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/classmates.pem	(revision 1803)
@@ -0,0 +1,103 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            bb:57:1d:06:30:9d:77:47:f9:00:d8:fc:e2:f6:0e:67
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 22 17:00:00 2011 GMT
+            Not After : Jan 24 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=classmates.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        77:11:0a:a2:b8:7a:b8:07:2e:b2:a1:76:8e:a0:28:dc:f1:b9:
+        c3:3c:9f:5d:3a:2d:4f:91:a0:bd:8e:ee:4a:a3:87:c8:24:0f:
+        c4:9f:55:a4:16:31:c5:97:83:d2:78:e1:81:c3:a9:44:e1:5d:
+        d0:33:b9:35:81:11:03:3f:2b:9d:cc:6c:f3:83:56:57:28:7f:
+        a3:66:da:df:48:1a:1c:db:e5:e0:dc:47:59:99:03:57:ba:b6:
+        e9:42:3c:50:87:ad:68:07:e5:a6:26:11:37:09:a8:7e:bc:b0:
+        6e:21:1e:8e:95:46:1d:a0:00:a6:00:db:f6:1e:3c:64:f2:15:
+        64:ea
+-----BEGIN CERTIFICATE-----
+MIIFBjCCBG+gAwIBAgIRALtXHQYwnXdH+QDY/OL2DmcwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMjIxNzAwMDBaFw0x
+MjAxMjQxNzAwMDBaMIHUMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEbMBkGA1UEAxMSY2xhc3NtYXRlcy5taXQu
+ZWR1MR4wHAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQC/o/J7mMwWp1fmkoU0VvHjYoOeak81nfDPiYdz
+45P3twFXOG7p/FlNJOunF0fKLFEORci3aMkOMibgkdMGXIx8DmyZDLJGBQ9N8bDH
+XjUGYv4q1g8bLLUCJEzDBnHslModqq9+uS3AVUvMvFE9dmhb0+010AO6G2zzoNjT
+3GtEsF4BUdMCzEraUhLeNTFpFlpIiw/OrU3k1YsRNn+HHP2E2kMuhy9BcKyt31TA
+7fYhUfrFBvAb66Gwv00cQjSK1W/3JWZzj2DE140zkfRGOpcJWQH/w2SUQEgwaPBu
+AyZ0wqGz18uU/G5Tiiqe/bFPxHRWJWMfqr2VJXicRUYbDCFx64SU0LLx2lL20X9j
+HQgjUl/C+U2spETlmlRw/Mn81NS3HXWVAOO/PkzzQ8OWxwkqKUUS0jHWeUyK51Qn
+IsaArocjVvGNSZvI+u0zW19WdsgPfoUUacRIMQc5pTSB8msVUCL7uyytS4TqVWT3
+3lad0LbQfR4bUVA3RJTmxBXrRTHxs+wPs6kM+BxHx1EABe/usD2ffgenOOiDTD3b
+NLYkDJBXwPnQZBSKk0ebQfWjFB2eGF3V2Gav9fPIL7ynAqfv3PAOx0eNLtaoYkKT
+W3z1NfgxEHs41EAkaIETJ8v7dg7RmRTY1ev3aWSPr4+CuyQp+dQpHc7mFLpMiwn/
+Rs6LbQIDAQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcG
+A1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQD
+AgXgMB0GA1UdDgQWBBTLEbcBX4ZVT0VeqydpvuE8iXpVYjAzBgNVHR8ELDAqMCig
+JqAkhiJodHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3
+DQEBBQUAA4GBAHcRCqK4ergHLrKhdo6gKNzxucM8n106LU+RoL2O7kqjh8gkD8Sf
+VaQWMcWXg9J44YHDqUThXdAzuTWBEQM/K53MbPODVlcof6Nm2t9IGhzb5eDcR1mZ
+A1e6tulCPFCHrWgH5aYmETcJqH68sG4hHo6VRh2gAKYA2/YePGTyFWTq
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cook.bluechi.ps.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cook.bluechi.ps.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cook.bluechi.ps.pem	(revision 1803)
@@ -0,0 +1,37 @@
+-----BEGIN CERTIFICATE-----
+MIIGYTCCBUmgAwIBAgIHBEBFIbHXlzANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
+BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm
+aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5
+IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky
+ODcwHhcNMTEwMTAzMDMwMjE1WhcNMTIwMTAzMDMwMjE1WjBXMRgwFgYDVQQKEw9j
+b29rLmJsdWVjaGkucHMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRl
+ZDEYMBYGA1UEAxMPY29vay5ibHVlY2hpLnBzMIICIjANBgkqhkiG9w0BAQEFAAOC
+Ag8AMIICCgKCAgEAv6Pye5jMFqdX5pKFNFbx42KDnmpPNZ3wz4mHc+OT97cBVzhu
+6fxZTSTrpxdHyixRDkXIt2jJDjIm4JHTBlyMfA5smQyyRgUPTfGwx141BmL+KtYP
+Gyy1AiRMwwZx7JTKHaqvfrktwFVLzLxRPXZoW9PtNdADuhts86DY09xrRLBeAVHT
+AsxK2lIS3jUxaRZaSIsPzq1N5NWLETZ/hxz9hNpDLocvQXCsrd9UwO32IVH6xQbw
+G+uhsL9NHEI0itVv9yVmc49gxNeNM5H0RjqXCVkB/8NklEBIMGjwbgMmdMKhs9fL
+lPxuU4oqnv2xT8R0ViVjH6q9lSV4nEVGGwwhceuElNCy8dpS9tF/Yx0II1JfwvlN
+rKRE5ZpUcPzJ/NTUtx11lQDjvz5M80PDlscJKilFEtIx1nlMiudUJyLGgK6HI1bx
+jUmbyPrtM1tfVnbID36FFGnESDEHOaU0gfJrFVAi+7ssrUuE6lVk995WndC20H0e
+G1FQN0SU5sQV60Ux8bPsD7OpDPgcR8dRAAXv7rA9n34Hpzjog0w92zS2JAyQV8D5
+0GQUipNHm0H1oxQdnhhd1dhmr/XzyC+8pwKn79zwDsdHjS7WqGJCk1t89TX4MRB7
+ONRAJGiBEyfL+3YO0ZkU2NXr92lkj6+PgrskKfnUKR3O5hS6TIsJ/0bOi20CAwEA
+AaOCAbwwggG4MA8GA1UdEwEB/wQFMAMBAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
+CCsGAQUFBwMCMA4GA1UdDwEB/wQEAwIFoDAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY3JsLmdvZGFkZHkuY29tL2dkczEtMjguY3JsME0GA1UdIARGMEQwQgYLYIZI
+AYb9bQEHFwEwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2RhZGR5LmNv
+bS9yZXBvc2l0b3J5LzCBgAYIKwYBBQUHAQEEdDByMCQGCCsGAQUFBzABhhhodHRw
+Oi8vb2NzcC5nb2RhZGR5LmNvbS8wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jZXJ0aWZp
+Y2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9nZF9pbnRlcm1lZGlhdGUuY3J0
+MB8GA1UdIwQYMBaAFP2sYTKTbEXW4u6FX5q653aZaMznMC8GA1UdEQQoMCaCD2Nv
+b2suYmx1ZWNoaS5wc4ITd3d3LmNvb2suYmx1ZWNoaS5wczAdBgNVHQ4EFgQUyxG3
+AV+GVU9FXqsnab7hPIl6VWIwDQYJKoZIhvcNAQEFBQADggEBALB49kGSy5S8NpOe
+Bg0ULh5v0umDTl1tDwvHfkEvCJzu83Z7W1ull3DOsYiHRe0IxAZa0DbChZV4AM8R
+xRfAr7F8z77aeEyd4/J20dtrVd6Gfg7muG3/47V9JT7nDTJFV8yL+NyJqlmBm1KI
+HSrFrRmZn6J0MwKHKHrvwWEaGEoP/YNiEmqxGjWbAbGHDX8MKwIxBCxf4hD0/Xnj
+esnpGuEQwze3KQwJLFtXQF8gYJXTXuxzw6zYcSXAdw/qdyVcASn2TeCnFDmWS/FV
+WojdgcyBt+wid1J7N62b32MjeR/jgXqpK95oGkPLoZH8dqnqQJsN8Vm0mCfLIQrD
+Wp7xmiM=
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/crew.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/crew.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/crew.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:21:43 2010
+Date: Sat, 14 Aug 2010 09:21:42 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for crew.mit.edu  [help.mit.edu #1313558]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            2a:29:d6:c5:72:b5:a8:e6:f0:87:cc:60:a6:fe:26:94
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=crew.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        04:ff:fd:be:24:ac:4a:19:1c:bf:2f:4c:c2:5a:c4:81:43:41:
+        cb:91:77:f7:58:d8:db:48:96:28:b0:43:b1:b3:35:86:c8:d9:
+        70:d8:3c:85:57:52:df:f3:85:a5:ab:6c:e7:b4:97:91:a4:eb:
+        09:e6:16:9c:93:36:9d:37:fd:35:99:bb:be:e5:5b:cc:37:d6:
+        11:e0:fd:e2:ba:dc:f2:4e:81:e1:f5:fe:a8:ce:cc:68:16:ca:
+        29:96:d0:33:f8:bb:b4:35:6c:43:d1:33:1e:41:4f:16:f0:a9:
+        de:17:c4:6c:66:2e:67:12:d4:b8:3c:9f:d4:75:68:d2:a4:87:
+        6a:03
+-----BEGIN CERTIFICATE-----
+MIIDezCCAuSgAwIBAgIQKinWxXK1qObwh8xgpv4mlDANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDgxMjE2MDAwMFoXDTEx
+MDgxMTE2MDAwMFowgc4xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRUwEwYDVQQDEwxjcmV3Lm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48uorZT
+07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61YJLAO
+oW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEAAaOB
+qzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAeBggr
+BgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNVHQ4E
+FgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
+L2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOBgQAE
+//2+JKxKGRy/L0zCWsSBQ0HLkXf3WNjbSJYosEOxszWGyNlw2DyFV1Lf84Wlq2zn
+tJeRpOsJ5hackzadN/01mbu+5VvMN9YR4P3iutzyToHh9f6ozsxoFsopltAz+Lu0
+NWxD0TMeQU8W8KneF8RsZi5nEtS4PJ/UdWjSpIdqAw==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cs6090.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cs6090.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/cs6090.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Wed Jan 19 10:39:57 2011
+Date: Wed, 19 Jan 2011 10:39:56 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for cs6090.mit.edu  [help.mit.edu #1458903]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            80:e2:6f:5e:88:02:b2:80:d1:84:bd:e3:e3:80:17:b3
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 17 17:00:00 2011 GMT
+            Not After : Jan 19 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=cs6090.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        73:2a:f0:52:7e:3b:0b:20:61:18:e1:0d:cc:8f:de:96:2f:8f:
+        45:b2:6b:48:a7:ad:68:99:06:e0:df:b0:73:63:f8:f0:bc:57:
+        8c:38:e4:ee:8e:c6:2d:3c:af:61:c2:a1:6b:6f:c1:c9:86:4a:
+        79:65:65:08:d8:56:26:56:d0:b5:b8:b0:37:df:f7:76:84:07:
+        db:fb:6b:75:ce:9d:91:cb:a9:6a:0a:ac:bb:47:c3:ca:5f:e5:
+        32:f8:ed:d6:5b:d1:52:13:ea:0e:3d:0a:3b:79:fd:2f:16:b7:
+        6f:e0:bd:7e:27:43:46:e5:2e:f6:27:70:5f:ba:67:b0:3d:b3:
+        cd:41
+-----BEGIN CERTIFICATE-----
+MIIFAjCCBGugAwIBAgIRAIDib16IArKA0YS94+OAF7MwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMTcxNzAwMDBaFw0x
+MjAxMTkxNzAwMDBaMIHQMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEXMBUGA1UEAxMOY3M2MDkwLm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pjk/e3
+AVc4bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMdeNQZi
+/irWDxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPca0Sw
+XgFR0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt9iFR
++sUG8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4DJnTC
+obPXy5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2MdCCNS
+X8L5TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCcixoCu
+hyNW8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfeVp3Q
+ttB9HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0tiQM
+kFfA+dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNbfPU1
++DEQezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9Gzott
+AgMBAAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0l
+BCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAmoCSG
+Imh0dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEF
+BQADgYEAcyrwUn47CyBhGOENzI/eli+PRbJrSKetaJkG4N+wc2P48LxXjDjk7o7G
+LTyvYcKha2/ByYZKeWVlCNhWJlbQtbiwN9/3doQH2/trdc6dkcupagqsu0fDyl/l
+Mvjt1lvRUhPqDj0KO3n9Lxa3b+C9fidDRuUu9idwX7pnsD2zzUE=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/debathena.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/debathena.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/debathena.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Fri Dec 24 10:55:50 2010
+Date: Fri, 24 Dec 2010 10:55:49 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for debathena.mit.edu  [help.mit.edu #1439484]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            97:33:25:86:14:7b:cb:f8:59:da:fd:ae:c5:39:16:2d
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Dec 22 17:00:00 2010 GMT
+            Not After : Dec 22 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=debathena.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        6a:65:fb:a5:d2:ea:36:53:a6:91:cf:1c:f8:f1:31:30:23:a3:
+        64:68:2e:bc:91:f7:ae:af:ac:00:7b:84:e7:e2:a1:99:34:26:
+        36:95:3e:fa:ca:fe:02:81:b6:6e:f4:c4:70:64:03:2a:bf:ad:
+        92:ea:ba:cc:3e:a4:54:4a:77:47:41:51:07:f1:1e:2a:b6:1c:
+        46:32:d4:56:86:bb:1a:2f:08:37:e7:77:b3:a8:e1:58:2e:2d:
+        43:34:4f:33:ff:40:72:7b:f1:e1:b2:a1:dd:09:64:fb:44:59:
+        fe:2b:eb:4b:32:15:6f:d0:f4:2e:c4:2d:79:20:e7:9b:1c:64:
+        3c:2d
+-----BEGIN CERTIFICATE-----
+MIIDgTCCAuqgAwIBAgIRAJczJYYUe8v4Wdr9rsU5Fi0wDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDEyMjIxNzAwMDBaFw0x
+MTEyMjIxNzAwMDBaMIHTMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEaMBgGA1UEAxMRZGViYXRoZW5hLm1pdC5l
+ZHUxHjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37
+l48uorZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtc
+d61YJLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYEC
+AwEAAaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUE
+IDAeBggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAd
+BgNVHQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYi
+aHR0cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUF
+AAOBgQBqZful0uo2U6aRzxz48TEwI6NkaC68kfeur6wAe4Tn4qGZNCY2lT76yv4C
+gbZu9MRwZAMqv62S6rrMPqRUSndHQVEH8R4qthxGMtRWhrsaLwg353ezqOFYLi1D
+NE8z/0Bye/HhsqHdCWT7RFn+K+tLMhVv0PQuxC15IOebHGQ8LQ==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/eastgate.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/eastgate.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/eastgate.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Sat Jan 15 10:20:42 2011
+Date: Sat, 15 Jan 2011 10:20:41 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for eastgate.mit.edu  [help.mit.edu #1456826]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            21:05:bc:0b:0e:5f:eb:c9:f3:38:24:3e:fc:7a:1b:e2
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 13 17:00:00 2011 GMT
+            Not After : Jan 12 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=eastgate.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        ae:70:9c:e3:ef:df:3b:3d:12:c2:34:9b:05:36:93:7a:4c:76:
+        7d:1d:bc:22:05:34:df:8a:d6:2e:a1:05:0d:06:1d:d5:cb:1b:
+        52:c6:ab:fe:3e:0f:6a:97:cb:36:6d:25:f2:06:da:4b:9b:52:
+        f2:2a:4b:61:2d:8f:b9:3f:e2:74:89:20:a7:69:26:50:1f:38:
+        18:33:38:f4:fc:a3:95:85:5c:24:5b:32:12:bd:da:24:68:94:
+        c0:9d:f6:c7:a7:12:db:b9:d4:4a:2a:97:9d:1c:7b:87:5f:96:
+        4a:97:1f:d0:bb:4b:ed:fa:42:05:93:62:ac:2f:63:bc:d2:61:
+        5b:97
+-----BEGIN CERTIFICATE-----
+MIIFAzCCBGygAwIBAgIQIQW8Cw5f68nzOCQ+/Hob4jANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTExMDExMzE3MDAwMFoXDTEy
+MDExMjE3MDAwMFowgdIxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRkwFwYDVQQDExBlYXN0Z2F0ZS5taXQuZWR1
+MR4wHAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQC/o/J7mMwWp1fmkoU0VvHjYoOeak81nfDPiYdz45P3
+twFXOG7p/FlNJOunF0fKLFEORci3aMkOMibgkdMGXIx8DmyZDLJGBQ9N8bDHXjUG
+Yv4q1g8bLLUCJEzDBnHslModqq9+uS3AVUvMvFE9dmhb0+010AO6G2zzoNjT3GtE
+sF4BUdMCzEraUhLeNTFpFlpIiw/OrU3k1YsRNn+HHP2E2kMuhy9BcKyt31TA7fYh
+UfrFBvAb66Gwv00cQjSK1W/3JWZzj2DE140zkfRGOpcJWQH/w2SUQEgwaPBuAyZ0
+wqGz18uU/G5Tiiqe/bFPxHRWJWMfqr2VJXicRUYbDCFx64SU0LLx2lL20X9jHQgj
+Ul/C+U2spETlmlRw/Mn81NS3HXWVAOO/PkzzQ8OWxwkqKUUS0jHWeUyK51QnIsaA
+rocjVvGNSZvI+u0zW19WdsgPfoUUacRIMQc5pTSB8msVUCL7uyytS4TqVWT33lad
+0LbQfR4bUVA3RJTmxBXrRTHxs+wPs6kM+BxHx1EABe/usD2ffgenOOiDTD3bNLYk
+DJBXwPnQZBSKk0ebQfWjFB2eGF3V2Gav9fPIL7ynAqfv3PAOx0eNLtaoYkKTW3z1
+NfgxEHs41EAkaIETJ8v7dg7RmRTY1ev3aWSPr4+CuyQp+dQpHc7mFLpMiwn/Rs6L
+bQIDAQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1Ud
+JQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXg
+MB0GA1UdDgQWBBTLEbcBX4ZVT0VeqydpvuE8iXpVYjAzBgNVHR8ELDAqMCigJqAk
+hiJodHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEB
+BQUAA4GBAK5wnOPv3zs9EsI0mwU2k3pMdn0dvCIFNN+K1i6hBQ0GHdXLG1LGq/4+
+D2qXyzZtJfIG2kubUvIqS2Etj7k/4nSJIKdpJlAfOBgzOPT8o5WFXCRbMhK92iRo
+lMCd9senEtu51Eoql50ce4dflkqXH9C7S+36QgWTYqwvY7zSYVuX
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ec.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ec.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ec.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Nov 20 10:03:00 2010
+Date: Sat, 20 Nov 2010 10:02:59 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for ec.mit.edu  [help.mit.edu #1409006]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            35:3b:f7:7c:03:3f:fb:c8:0e:0b:07:c7:70:f6:73:85
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 18 17:00:00 2010 GMT
+            Not After : Nov 17 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=ec.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        9e:04:bd:45:9b:5b:a3:b0:55:fa:c2:3c:1a:ce:1b:1c:c4:95:
+        3d:52:e7:f3:fd:dc:f8:06:2a:06:fb:35:15:b9:c2:c2:34:5b:
+        ce:b0:98:e6:7b:a6:b5:5c:a6:1d:56:a2:31:0e:88:7d:a6:4b:
+        a1:f6:04:36:be:6b:c7:21:6e:32:d6:d7:c4:62:a5:35:5e:12:
+        c0:4e:77:47:ac:5d:7e:30:c6:c4:3b:25:12:f4:04:f8:f0:0b:
+        f7:1a:d0:f8:8e:d1:bc:96:2a:a3:54:92:c8:ea:05:a4:59:58:
+        5a:ab:64:ec:88:9c:7b:e8:83:48:24:db:ef:d8:85:8d:8b:13:
+        4e:00
+-----BEGIN CERTIFICATE-----
+MIIDeTCCAuKgAwIBAgIQNTv3fAM/+8gOCwfHcPZzhTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTExODE3MDAwMFoXDTEx
+MTExNzE3MDAwMFowgcwxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRMwEQYDVQQDEwplYy5taXQuZWR1MR4wHAYJ
+KoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt+5ePLqK2U9O2
+DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32LXHetWCSwDqFt
+1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2BAgMBAAGjgasw
+gagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAwHgYIKwYB
+BQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYDVR0OBBYE
+FFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9j
+YS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQADgYEAngS9
+RZtbo7BV+sI8Gs4bHMSVPVLn8/3c+AYqBvs1FbnCwjRbzrCY5numtVymHVaiMQ6I
+faZLofYENr5rxyFuMtbXxGKlNV4SwE53R6xdfjDGxDslEvQE+PAL9xrQ+I7RvJYq
+o1SSyOoFpFlYWqtk7Iice+iDSCTb79iFjYsTTgA=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/familynet.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/familynet.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/familynet.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:20:59 2010
+Date: Sat, 14 Aug 2010 09:20:58 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for familynet.mit.edu  [help.mit.edu #1313559]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            c4:72:a8:11:f6:2b:7f:17:00:0c:d1:77:da:03:4f:0a
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=familynet.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        10:1f:4f:0e:b0:da:f4:7e:8b:20:88:c7:b1:a0:a7:9f:a6:6a:
+        17:26:49:96:9e:41:f9:e4:48:8b:21:4a:fa:e7:4d:34:ab:48:
+        ff:69:0a:59:8f:d8:09:02:79:ed:45:dc:b0:3e:37:77:5e:93:
+        7d:09:b8:20:f9:83:0f:2f:2b:ce:e5:47:44:85:32:3c:3b:9b:
+        bf:b7:14:92:e0:1e:57:5a:90:1c:d0:89:b2:29:67:93:d1:45:
+        34:6c:e9:3a:de:ac:9a:07:19:4d:7e:9b:5a:c3:2d:fe:62:5b:
+        88:75:65:10:08:1d:a5:eb:4c:49:35:22:05:2c:26:41:5a:b8:
+        36:7f
+-----BEGIN CERTIFICATE-----
+MIIDgTCCAuqgAwIBAgIRAMRyqBH2K38XAAzRd9oDTwowDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDA4MTIxNjAwMDBaFw0x
+MTA4MTExNjAwMDBaMIHTMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEaMBgGA1UEAxMRZmFtaWx5bmV0Lm1pdC5l
+ZHUxHjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37
+l48uorZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtc
+d61YJLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYEC
+AwEAAaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUE
+IDAeBggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAd
+BgNVHQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYi
+aHR0cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUF
+AAOBgQAQH08OsNr0fosgiMexoKefpmoXJkmWnkH55EiLIUr65000q0j/aQpZj9gJ
+AnntRdywPjd3XpN9Cbgg+YMPLyvO5UdEhTI8O5u/txSS4B5XWpAc0ImyKWeT0UU0
+bOk63qyaBxlNfptawy3+YluIdWUQCB2l60xJNSIFLCZBWrg2fw==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/finboard.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/finboard.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/finboard.pem	(revision 1803)
@@ -0,0 +1,70 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            a4:10:09:e5:83:d7:c1:06:a9:b6:f5:bd:5d:dc:92:d8
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Apr 28 16:00:00 2010 GMT
+            Not After : Apr 28 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service,
+CN=finboard.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage:
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage:
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        4a:7c:d3:b2:84:dd:b8:f9:46:1e:04:28:c3:cc:7b:78:72:ca:
+        97:c3:6e:a9:6b:0e:a0:b1:99:47:65:1a:6c:13:5c:13:b2:20:
+        10:6e:cd:af:9e:f1:47:ff:4c:f5:b0:ab:0f:e5:2d:dd:bd:40:
+        05:43:cc:12:3d:dc:7b:c6:c8:d9:d8:18:dd:59:1a:e3:78:b2:
+        93:b4:c2:75:18:7a:23:2d:ee:15:0e:bf:9e:ff:18:c3:d2:9d:
+        4f:15:2a:f9:66:1c:04:40:db:cc:57:b8:fa:59:e6:b7:49:b8:
+        29:fc:02:a6:0f:a2:c9:dd:ee:00:e0:58:cc:b4:79:60:f5:3e:
+        91:fd
+-----BEGIN CERTIFICATE-----
+MIIDgDCCAumgAwIBAgIRAKQQCeWD18EGqbb1vV3cktgwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDA0MjgxNjAwMDBaFw0x
+MTA0MjgxNjAwMDBaMIHSMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEZMBcGA1UEAxMQZmluYm9hcmQubWl0LmVk
+dTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuX
+jy6itlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3
+rVgksA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQID
+AQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQg
+MB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0G
+A1UdDgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJo
+dHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUA
+A4GBAEp807KE3bj5Rh4EKMPMe3hyypfDbqlrDqCxmUdlGmwTXBOyIBBuza+e8Uf/
+TPWwqw/lLd29QAVDzBI93HvGyNnYGN1ZGuN4spO0wnUYeiMt7hUOv57/GMPSnU8V
+KvlmHARA28xXuPpZ5rdJuCn8AqYPosnd7gDgWMy0eWD1PpH9
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/fridget.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/fridget.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/fridget.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:33:50 2010
+Date: Thu, 28 Oct 2010 09:33:49 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for fridget.mit.edu  [help.mit.edu #1385003]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            d4:0c:18:79:68:d3:fe:c0:06:e0:af:3b:1e:ae:3e:4f
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=fridget.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        33:4b:3e:71:f3:08:28:14:9c:b9:8a:c1:6a:3a:2f:11:92:f5:
+        1e:21:83:61:e6:48:de:2b:cb:78:6a:6a:aa:3d:05:6b:ce:cf:
+        5f:f8:56:21:4d:b8:d9:fe:14:47:f1:93:ea:6c:c6:1b:1b:ba:
+        b2:35:e5:fb:8f:d0:3e:9d:a5:b2:87:28:39:f1:9d:f9:6f:2f:
+        14:47:c1:d2:aa:a5:5d:c9:33:eb:fc:ae:c3:b8:50:eb:48:ec:
+        ac:0d:0b:ef:fd:7f:e1:97:0d:3c:65:2e:a1:15:95:58:3b:27:
+        9d:5c:f6:a3:ba:0a:93:31:2f:0f:d9:8d:d2:54:67:98:3a:df:
+        bb:ea
+-----BEGIN CERTIFICATE-----
+MIIDfzCCAuigAwIBAgIRANQMGHlo0/7ABuCvOx6uPk8wDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDEwMjYxNjAwMDBaFw0x
+MTEwMjcxNjAwMDBaMIHRMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNTY3JpcHRzLm1pdC5l
+ZHUgV2ViIEhvc3RpbmcgU2VydmljZTEYMBYGA1UEAxMPZnJpZGdldC5taXQuZWR1
+MR4wHAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcNAQEB
+BQADgY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt+5eP
+LqK2U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32LXHet
+WCSwDqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2BAgMB
+AAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAw
+HgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYD
+VR0OBBYEFFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSGImh0
+dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQAD
+gYEAM0s+cfMIKBScuYrBajovEZL1HiGDYeZI3ivLeGpqqj0Fa87PX/hWIU242f4U
+R/GT6mzGGxu6sjXl+4/QPp2lsocoOfGd+W8vFEfB0qqlXckz6/yuw7hQ60jsrA0L
+7/1/4ZcNPGUuoRWVWDsnnVz2o7oKkzEvD9mN0lRnmDrfu+o=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/gsc.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/gsc.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/gsc.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Thu Mar  3 17:10:35 2011
+Date: Thu, 3 Mar 2011 17:10:33 -0500
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: [help.mit.edu #1500999] CSR for scripts site gsc.mit.edu 
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            af:40:8c:39:3a:43:35:f2:65:80:a6:24:d9:f7:1a:03
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Mar  2 17:00:00 2011 GMT
+            Not After : Mar  1 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=gsc.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        c5:32:c5:a3:74:ba:59:16:ec:5d:f5:f9:12:3c:c7:c1:fc:90:
+        be:9f:50:48:1a:1e:a1:aa:04:cc:e4:29:ac:e0:ab:96:9e:54:
+        35:be:4a:f9:1e:fb:1a:7e:fc:94:e1:a4:74:f6:7f:10:35:74:
+        3b:7d:2f:5c:de:e9:d3:3d:9f:bd:59:92:e2:82:2b:49:b9:4f:
+        04:17:9a:0d:9d:ea:e6:2a:30:4d:33:0e:ac:31:ac:af:94:8d:
+        4f:6c:d7:d1:86:5c:49:c0:3b:a9:f1:83:68:5e:ce:02:da:65:
+        87:eb:97:e6:8b:d9:6e:6c:83:9f:94:5e:ba:35:d7:47:67:45:
+        ee:7c
+-----BEGIN CERTIFICATE-----
+MIIE/zCCBGigAwIBAgIRAK9AjDk6QzXyZYCmJNn3GgMwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAzMDIxNzAwMDBaFw0x
+MjAzMDExNzAwMDBaMIHNMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEUMBIGA1UEAxMLZ3NjLm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pjk/e3AVc4
+bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMdeNQZi/irW
+DxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPca0SwXgFR
+0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt9iFR+sUG
+8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4DJnTCobPX
+y5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2MdCCNSX8L5
+TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCcixoCuhyNW
+8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfeVp3QttB9
+HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0tiQMkFfA
++dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNbfPU1+DEQ
+ezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9GzottAgMB
+AAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAw
+HgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYD
+VR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAmoCSGImh0
+dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQAD
+gYEAxTLFo3S6WRbsXfX5EjzHwfyQvp9QSBoeoaoEzOQprOCrlp5UNb5K+R77Gn78
+lOGkdPZ/EDV0O30vXN7p0z2fvVmS4oIrSblPBBeaDZ3q5iowTTMOrDGsr5SNT2zX
+0YZcScA7qfGDaF7OAtplh+uX5ovZbmyDn5ReujXXR2dF7nw=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/impact.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/impact.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/impact.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Fri Dec 24 10:54:43 2010
+Date: Fri, 24 Dec 2010 10:54:42 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for impact.mit.edu  [help.mit.edu #1439483]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            29:d0:86:34:f6:2a:b1:40:60:12:1b:fe:a3:2c:86:5d
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Dec 22 17:00:00 2010 GMT
+            Not After : Dec 22 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=impact.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        32:b8:3d:70:49:81:5c:2d:ee:fa:0b:c4:bd:72:36:d0:f4:d2:
+        f5:5f:7b:b5:eb:8c:3e:0c:45:49:5f:f3:3d:57:da:f8:93:d8:
+        fe:a0:f1:11:26:35:8c:d3:e4:c4:c4:bf:bf:fe:b0:38:67:9d:
+        4f:96:2c:5d:80:b3:39:18:b9:13:72:a9:24:ee:83:33:de:71:
+        6e:28:16:a3:88:79:ff:e9:c7:e0:4f:ee:ab:b3:d0:e8:f4:32:
+        2a:99:55:6b:aa:f0:c2:3b:71:0d:c2:d8:47:d3:14:65:6f:75:
+        1b:cf:39:38:3e:d0:24:ff:17:08:42:93:3d:ff:90:ea:6e:7b:
+        7f:b4
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIQKdCGNPYqsUBgEhv+oyyGXTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTIyMjE3MDAwMFoXDTEx
+MTIyMjE3MDAwMFowgdAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRcwFQYDVQQDEw5pbXBhY3QubWl0LmVkdTEe
+MBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6i
+tlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgk
+sA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQAB
+o4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4G
+CCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1Ud
+DgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GB
+ADK4PXBJgVwt7voLxL1yNtD00vVfe7XrjD4MRUlf8z1X2viT2P6g8REmNYzT5MTE
+v7/+sDhnnU+WLF2AszkYuRNyqSTugzPecW4oFqOIef/px+BP7quz0Oj0MiqZVWuq
+8MI7cQ3C2EfTFGVvdRvPOTg+0CT/FwhCkz3/kOpue3+0
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/isawyou.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/isawyou.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/isawyou.pem	(revision 1803)
@@ -0,0 +1,103 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            67:93:dd:7b:4e:e4:b2:43:31:0b:cd:0f:dc:44:29:52
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 22 17:00:00 2011 GMT
+            Not After : Jan 24 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=isawyou.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        7c:f1:f7:30:bf:36:e8:e1:8e:ea:af:46:e8:ab:d3:80:26:10:
+        84:70:a9:cc:36:b2:4e:62:02:29:25:a0:81:14:a5:56:51:f0:
+        59:94:d7:c7:bc:2a:29:61:11:7f:f5:e2:34:25:8d:ae:d1:e3:
+        e4:dc:3b:60:f1:e5:30:a0:d6:93:f8:b6:81:62:cd:02:e2:a9:
+        3f:5a:ac:6d:b8:eb:7c:90:e7:e6:09:78:17:58:c8:0f:e8:ac:
+        45:29:db:22:49:17:18:1e:ed:59:91:40:6e:71:42:9e:82:3f:
+        fa:2c:6e:18:b2:f7:2d:58:bc:52:04:11:65:59:39:ff:31:29:
+        fc:e8
+-----BEGIN CERTIFICATE-----
+MIIFAjCCBGugAwIBAgIQZ5Pde07kskMxC80P3EQpUjANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTExMDEyMjE3MDAwMFoXDTEy
+MDEyNDE3MDAwMFowgdExCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRgwFgYDVQQDEw9pc2F3eW91Lm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pjk/e3
+AVc4bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMdeNQZi
+/irWDxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPca0Sw
+XgFR0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt9iFR
++sUG8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4DJnTC
+obPXy5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2MdCCNS
+X8L5TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCcixoCu
+hyNW8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfeVp3Q
+ttB9HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0tiQM
+kFfA+dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNbfPU1
++DEQezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9Gzott
+AgMBAAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0l
+BCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAmoCSG
+Imh0dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEF
+BQADgYEAfPH3ML826OGO6q9G6KvTgCYQhHCpzDayTmICKSWggRSlVlHwWZTXx7wq
+KWERf/XiNCWNrtHj5Nw7YPHlMKDWk/i2gWLNAuKpP1qsbbjrfJDn5gl4F1jID+is
+RSnbIkkXGB7tWZFAbnFCnoI/+ixuGLL3LVi8UgQRZVk5/zEp/Og=
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/listmon.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/listmon.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/listmon.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Nov 18 09:27:49 2010
+Date: Thu, 18 Nov 2010 09:27:47 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for scripts site "listmon.mit.edu"  [help.mit.edu #1406503]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            33:62:1b:6c:45:3d:e6:f0:5a:4e:6a:dc:28:68:31:a2
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 16 17:00:00 2010 GMT
+            Not After : Nov 17 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=listmon.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        c9:a5:5c:bd:e0:33:e4:9c:aa:8f:c5:f2:ee:fe:08:f0:71:ec:
+        da:4a:7d:cd:ab:2f:00:4d:a8:7a:d1:7d:b0:84:b7:34:b3:2e:
+        42:60:b6:4c:a8:e7:e5:c4:2b:8f:fd:a0:db:68:f6:c2:30:7a:
+        d3:ec:34:79:e7:3c:89:95:0f:66:71:e1:0a:18:a5:66:28:bb:
+        fe:1d:df:e7:db:98:55:aa:8d:4b:f9:cc:9c:ea:fe:7e:2c:21:
+        4e:67:1f:c2:c1:ac:5c:e6:3c:a2:29:f8:2d:6b:46:be:1e:15:
+        df:15:95:f0:96:8b:8a:17:ae:e9:a5:1d:f7:89:0b:95:5d:ea:
+        5f:4a
+-----BEGIN CERTIFICATE-----
+MIIDfjCCAuegAwIBAgIQM2IbbEU95vBaTmrcKGgxojANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTExNjE3MDAwMFoXDTEx
+MTExNzE3MDAwMFowgdExCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRgwFgYDVQQDEw9saXN0bW9uLm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEF
+AAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48u
+orZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61Y
+JLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEA
+AaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAe
+BggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNV
+HQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0
+cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOB
+gQDJpVy94DPknKqPxfLu/gjwcezaSn3Nqy8ATah60X2whLc0sy5CYLZMqOflxCuP
+/aDbaPbCMHrT7DR55zyJlQ9mceEKGKVmKLv+Hd/n25hVqo1L+cyc6v5+LCFOZx/C
+waxc5jyiKfgta0a+HhXfFZXwlouKF67ppR33iQuVXepfSg==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/metu.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/metu.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/metu.pem	(revision 1803)
@@ -0,0 +1,69 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            06:ab:a1:83:4f:a6:a7:1a:7b:b2:3b:0a:22:13:70:e4
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jul 30 16:00:00 2010 GMT
+            Not After : Aug  1 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=metu.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        35:20:e9:bd:7b:8b:7e:5d:97:a8:a2:9f:3c:a4:9d:3b:48:20:
+        96:4c:f2:60:22:4c:af:eb:11:7a:8a:4a:9c:89:9a:3c:50:4b:
+        4a:e4:c5:fe:72:d2:56:82:a7:6c:c1:d9:a3:34:17:32:00:71:
+        bd:cd:e0:10:02:5e:f9:65:76:e4:b1:a4:1e:b1:be:05:e8:77:
+        fd:15:fd:2e:79:9f:b0:f6:94:c5:ca:69:21:3d:9b:5d:04:a5:
+        3a:ca:48:10:14:15:a0:f0:6a:cb:f5:94:db:a7:4b:5e:6a:65:
+        b6:87:3c:5d:8c:9b:88:59:46:d1:8c:59:d7:aa:3d:f9:5a:b6:
+        49:71
+-----BEGIN CERTIFICATE-----
+MIIDezCCAuSgAwIBAgIQBquhg0+mpxp7sjsKIhNw5DANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDczMDE2MDAwMFoXDTEx
+MDgwMTE2MDAwMFowgc4xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRUwEwYDVQQDEwxtZXR1Lm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48uorZT
+07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61YJLAO
+oW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEAAaOB
+qzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAeBggr
+BgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNVHQ4E
+FgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
+L2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOBgQA1
+IOm9e4t+XZeoop88pJ07SCCWTPJgIkyv6xF6ikqciZo8UEtK5MX+ctJWgqdswdmj
+NBcyAHG9zeAQAl75ZXbksaQesb4F6Hf9Ff0ueZ+w9pTFymkhPZtdBKU6ykgQFBWg
+8GrL9ZTbp0teamW2hzxdjJuIWUbRjFnXqj35WrZJcQ==
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/mitsoc.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/mitsoc.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/mitsoc.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:20:05 2010
+Date: Sat, 14 Aug 2010 09:20:04 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for mitsoc.mit.edu  [help.mit.edu #1313560]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            7e:dc:ef:52:16:33:b5:1f:85:e5:26:58:ad:07:93:28
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=mitsoc.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        98:92:57:8d:f8:86:dd:f5:f7:c1:a2:db:0e:5c:67:c6:7a:b5:
+        c3:30:58:29:d3:84:e9:e2:c4:2f:13:f3:fc:27:42:0a:0d:34:
+        5c:18:19:83:83:61:fc:5f:16:c9:34:99:3d:bc:79:74:94:7d:
+        e0:fd:84:47:7c:f6:28:0c:95:8d:6c:77:6c:8c:04:34:0d:9c:
+        22:8f:29:6a:1e:73:66:67:10:a2:85:5a:0f:1a:15:71:20:e3:
+        4e:eb:e5:4c:33:22:60:25:61:db:87:6c:1c:d0:bf:4b:5e:c2:
+        18:aa:d7:85:a5:dd:ae:cd:dd:cb:58:bb:7d:d9:29:c4:fc:59:
+        e2:e3
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIQftzvUhYztR+F5SZYrQeTKDANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDgxMjE2MDAwMFoXDTEx
+MDgxMTE2MDAwMFowgdAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRcwFQYDVQQDEw5taXRzb2MubWl0LmVkdTEe
+MBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6i
+tlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgk
+sA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQAB
+o4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4G
+CCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1Ud
+DgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GB
+AJiSV434ht3198Gi2w5cZ8Z6tcMwWCnThOnixC8T8/wnQgoNNFwYGYODYfxfFsk0
+mT28eXSUfeD9hEd89igMlY1sd2yMBDQNnCKPKWoec2ZnEKKFWg8aFXEg407r5Uwz
+ImAlYduHbBzQv0tewhiq14Wl3a7N3ctYu33ZKcT8WeLj
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/next.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/next.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/next.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:18:51 2010
+Date: Sat, 14 Aug 2010 09:18:50 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for next.mit.edu  [help.mit.edu #1313561]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            8f:c4:ea:d4:b3:a7:85:f8:17:d8:3a:a3:52:c7:84:81
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=next.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        91:12:11:6b:9b:16:2a:a5:e1:ce:55:e1:14:d3:c3:4f:89:82:
+        96:63:a8:1a:21:63:d8:a8:67:f8:78:8c:22:35:c1:a0:46:df:
+        b6:4c:df:ac:c8:55:c5:44:15:64:ba:8d:55:9e:a4:c5:e3:da:
+        30:d4:f3:77:33:c9:d9:ff:47:23:49:60:75:3f:5b:6a:33:a5:
+        e5:ea:fe:e6:5c:f8:f1:07:5b:39:9e:13:c5:c7:bc:cd:9e:d2:
+        6e:2b:78:38:df:4a:2e:8f:d5:de:48:45:a8:60:b5:11:d8:ec:
+        8b:f4:70:a0:37:fd:62:30:05:7f:b3:65:1f:3e:81:ac:6f:f5:
+        4f:f4
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAuWgAwIBAgIRAI/E6tSzp4X4F9g6o1LHhIEwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDA4MTIxNjAwMDBaFw0x
+MTA4MTExNjAwMDBaMIHOMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEVMBMGA1UEAxMMbmV4dC5taXQuZWR1MR4w
+HAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt+5ePLqK2
+U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32LXHetWCSw
+DqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2BAgMBAAGj
+gaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAwHgYI
+KwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYDVR0O
+BBYEFFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6
+Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQADgYEA
+kRIRa5sWKqXhzlXhFNPDT4mClmOoGiFj2Khn+HiMIjXBoEbftkzfrMhVxUQVZLqN
+VZ6kxePaMNTzdzPJ2f9HI0lgdT9bajOl5er+5lz48QdbOZ4Txce8zZ7Sbit4ON9K
+Lo/V3khFqGC1Edjsi/RwoDf9YjAFf7NlHz6BrG/1T/Q=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/picker.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/picker.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/picker.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Thu Jan 13 08:56:19 2011
+Date: Thu, 13 Jan 2011 08:56:18 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for picker.mit.edu  [help.mit.edu #1454794]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            ce:6b:53:f0:d7:ae:e2:7e:06:b8:6d:da:be:ea:19:14
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 11 17:00:00 2011 GMT
+            Not After : Jan 12 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=picker.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        a5:bf:b9:21:ac:37:d7:32:fb:4e:84:59:80:4f:84:a5:aa:b8:
+        00:e5:51:ab:75:4d:ee:fe:86:db:16:a0:56:d6:9c:a5:84:3d:
+        39:48:24:d2:0a:3d:d6:61:e7:52:e1:32:3f:68:d5:df:1b:7f:
+        d5:c7:18:f7:4c:eb:d0:ff:7e:8a:67:42:19:98:bb:2a:1a:bb:
+        67:bb:1f:2e:53:68:d4:a5:cd:97:4e:a3:b6:45:fa:13:cb:57:
+        a8:f9:6c:12:29:3a:8c:dd:98:76:05:4b:34:0f:fd:39:87:18:
+        f1:5d:ca:b9:dc:13:52:d8:e8:33:d2:13:34:54:de:9e:2b:26:
+        a3:b5
+-----BEGIN CERTIFICATE-----
+MIIFAjCCBGugAwIBAgIRAM5rU/DXruJ+Brht2r7qGRQwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMTExNzAwMDBaFw0x
+MjAxMTIxNzAwMDBaMIHQMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEXMBUGA1UEAxMOcGlja2VyLm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pjk/e3
+AVc4bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMdeNQZi
+/irWDxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPca0Sw
+XgFR0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt9iFR
++sUG8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4DJnTC
+obPXy5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2MdCCNS
+X8L5TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCcixoCu
+hyNW8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfeVp3Q
+ttB9HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0tiQM
+kFfA+dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNbfPU1
++DEQezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9Gzott
+AgMBAAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0l
+BCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAmoCSG
+Imh0dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEF
+BQADgYEApb+5Iaw31zL7ToRZgE+Epaq4AOVRq3VN7v6G2xagVtacpYQ9OUgk0go9
+1mHnUuEyP2jV3xt/1ccY90zr0P9+imdCGZi7Khq7Z7sfLlNo1KXNl06jtkX6E8tX
+qPlsEik6jN2YdgVLNA/9OYcY8V3KudwTUtjoM9ITNFTenismo7U=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/psetcentral.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/psetcentral.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/psetcentral.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Tue Feb  1 00:18:22 2011
+Date: Tue, 1 Feb 2011 00:18:21 -0500
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: [help.mit.edu #1471389] CSR for psetcentral.mit.edu 
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            be:7c:4e:58:02:ec:57:f0:69:51:fe:7e:31:a0:eb:f4
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jan 30 17:00:00 2011 GMT
+            Not After : Feb  1 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=psetcentral.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        7e:40:2e:c8:61:8f:b8:70:30:f7:83:d1:75:20:7e:27:e6:f9:
+        2e:7e:14:c6:39:95:06:ac:49:6b:11:a1:d5:76:5a:e1:4a:7e:
+        34:16:96:e1:ef:83:4b:c0:26:50:87:6d:c2:bb:ea:f3:24:34:
+        15:58:28:48:85:06:54:05:53:ab:65:62:3f:bc:9e:56:c3:1a:
+        dd:72:8b:0d:5f:da:a7:bf:8a:08:5d:f5:48:62:70:84:f7:c5:
+        1d:4c:2c:7a:30:00:1c:0f:f3:f9:f8:13:0a:71:24:d2:8c:d1:
+        42:39:d0:49:1e:dd:b5:dd:7f:ee:31:f9:af:7a:5b:ee:86:3d:
+        6b:12
+-----BEGIN CERTIFICATE-----
+MIIFBzCCBHCgAwIBAgIRAL58TlgC7FfwaVH+fjGg6/QwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMzAxNzAwMDBaFw0x
+MjAyMDExNzAwMDBaMIHVMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEcMBoGA1UEAxMTcHNldGNlbnRyYWwubWl0
+LmVkdTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAv6Pye5jMFqdX5pKFNFbx42KDnmpPNZ3wz4mH
+c+OT97cBVzhu6fxZTSTrpxdHyixRDkXIt2jJDjIm4JHTBlyMfA5smQyyRgUPTfGw
+x141BmL+KtYPGyy1AiRMwwZx7JTKHaqvfrktwFVLzLxRPXZoW9PtNdADuhts86DY
+09xrRLBeAVHTAsxK2lIS3jUxaRZaSIsPzq1N5NWLETZ/hxz9hNpDLocvQXCsrd9U
+wO32IVH6xQbwG+uhsL9NHEI0itVv9yVmc49gxNeNM5H0RjqXCVkB/8NklEBIMGjw
+bgMmdMKhs9fLlPxuU4oqnv2xT8R0ViVjH6q9lSV4nEVGGwwhceuElNCy8dpS9tF/
+Yx0II1JfwvlNrKRE5ZpUcPzJ/NTUtx11lQDjvz5M80PDlscJKilFEtIx1nlMiudU
+JyLGgK6HI1bxjUmbyPrtM1tfVnbID36FFGnESDEHOaU0gfJrFVAi+7ssrUuE6lVk
+995WndC20H0eG1FQN0SU5sQV60Ux8bPsD7OpDPgcR8dRAAXv7rA9n34Hpzjog0w9
+2zS2JAyQV8D50GQUipNHm0H1oxQdnhhd1dhmr/XzyC+8pwKn79zwDsdHjS7WqGJC
+k1t89TX4MRB7ONRAJGiBEyfL+3YO0ZkU2NXr92lkj6+PgrskKfnUKR3O5hS6TIsJ
+/0bOi20CAwEAAaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAn
+BgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQE
+AwIF4DAdBgNVHQ4EFgQUyxG3AV+GVU9FXqsnab7hPIl6VWIwMwYDVR0fBCwwKjAo
+oCagJIYiaHR0cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG
+9w0BAQUFAAOBgQB+QC7IYY+4cDD3g9F1IH4n5vkufhTGOZUGrElrEaHVdlrhSn40
+Fpbh74NLwCZQh23Cu+rzJDQVWChIhQZUBVOrZWI/vJ5WwxrdcosNX9qnv4oIXfVI
+YnCE98UdTCx6MAAcD/P5+BMKcSTSjNFCOdBJHt213X/uMfmvelvuhj1rEg==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/random-hall.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/random-hall.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/random-hall.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:17:51 2010
+Date: Sat, 14 Aug 2010 09:17:50 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for random-hall.mit.edu  [help.mit.edu #1313562]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            30:3c:40:e3:bb:a2:51:42:9f:29:99:4e:15:13:98:f7
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=random-hall.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        c4:f6:15:fb:62:bf:e3:1b:fc:e4:e7:fd:fd:42:f6:59:b7:ba:
+        9d:58:23:30:c6:ee:53:54:86:fa:36:ec:fa:87:ba:7a:9a:d5:
+        ad:54:b2:cb:6c:3e:3c:bc:37:ff:1c:a4:63:59:bc:4a:d2:2c:
+        6e:4f:95:ab:5c:44:f7:14:04:7a:cb:63:80:d9:41:63:05:23:
+        f8:17:88:2c:c9:3c:6c:a2:6a:a0:d2:00:31:1d:af:1b:d8:d1:
+        d2:37:44:64:39:46:3f:f3:e5:dc:dc:3e:7a:bd:39:fc:9e:54:
+        cf:e1:a2:e5:6f:e3:ab:90:68:37:06:20:94:e0:39:2c:1c:16:
+        6f:24
+-----BEGIN CERTIFICATE-----
+MIIDgjCCAuugAwIBAgIQMDxA47uiUUKfKZlOFROY9zANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDgxMjE2MDAwMFoXDTEx
+MDgxMTE2MDAwMFowgdUxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRwwGgYDVQQDExNyYW5kb20taGFsbC5taXQu
+ZWR1MR4wHAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcN
+AQEBBQADgY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt
++5ePLqK2U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32L
+XHetWCSwDqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2B
+AgMBAAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0l
+BCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAw
+HQYDVR0OBBYEFFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSG
+Imh0dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEF
+BQADgYEAxPYV+2K/4xv85Of9/UL2Wbe6nVgjMMbuU1SG+jbs+oe6eprVrVSyy2w+
+PLw3/xykY1m8StIsbk+Vq1xE9xQEestjgNlBYwUj+BeILMk8bKJqoNIAMR2vG9jR
+0jdEZDlGP/Pl3Nw+er05/J5Uz+Gi5W/jq5BoNwYglOA5LBwWbyQ=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sayno.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sayno.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sayno.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Nov 18 09:28:35 2010
+Date: Thu, 18 Nov 2010 09:28:34 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for scripts site "sayno.mit.edu"  [help.mit.edu #1406502]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            b9:05:8a:21:20:b2:56:82:46:30:25:5f:d7:a6:52:ca
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 16 17:00:00 2010 GMT
+            Not After : Nov 17 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=sayno.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        85:9d:2c:db:ab:7a:5a:d7:bc:d5:22:db:ba:2c:15:7b:d3:e5:
+        57:68:b1:f2:ce:70:e3:f7:a5:bb:15:26:f6:de:62:89:2b:a3:
+        27:69:45:fb:e5:8c:be:eb:d2:43:aa:a2:6e:e9:63:c4:94:64:
+        14:2b:0a:2e:6c:5c:42:40:ae:50:90:42:49:46:c6:7e:1b:98:
+        2a:bc:77:ae:f3:31:1b:ce:dc:f1:88:1b:6b:b5:23:3b:a6:d1:
+        8b:f6:ef:72:32:8c:d6:55:d4:c9:fe:0a:96:5a:7e:e2:68:00:
+        a6:5b:09:2b:cf:0a:7b:a0:6d:b3:82:7c:b7:46:a4:70:38:52:
+        35:29
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIRALkFiiEgslaCRjAlX9emUsowDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDExMTYxNzAwMDBaFw0x
+MTExMTcxNzAwMDBaMIHPMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEWMBQGA1UEAxMNc2F5bm8ubWl0LmVkdTEe
+MBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6i
+tlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgk
+sA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQAB
+o4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4G
+CCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1Ud
+DgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GB
+AIWdLNurelrXvNUi27osFXvT5VdosfLOcOP3pbsVJvbeYokroydpRfvljL7r0kOq
+om7pY8SUZBQrCi5sXEJArlCQQklGxn4bmCq8d67zMRvO3PGIG2u1Izum0Yv273Iy
+jNZV1Mn+CpZafuJoAKZbCSvPCnugbbOCfLdGpHA4UjUp
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/schuh.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/schuh.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/schuh.pem	(revision 1803)
@@ -0,0 +1,110 @@
+From mitcert@MIT.EDU Fri Feb 11 09:07:58 2011
+Date: Fri, 11 Feb 2011 09:07:56 -0500
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: [help.mit.edu #1482315] Certificate signing request for schuh.mit.edu 
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            c8:78:ed:28:f4:f0:be:3e:8c:b4:c2:d4:d3:b0:41:22
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Feb  9 17:00:00 2011 GMT
+            Not After : Feb  9 17:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=schuh.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        be:5e:5b:06:8a:30:ce:ad:19:f4:22:4c:f5:b2:67:8a:26:b8:
+        0e:13:b0:49:9a:be:54:64:fa:6e:be:98:db:16:0c:44:f0:b0:
+        fc:9d:f4:53:d8:a0:ef:bd:b4:f4:19:93:af:ae:bd:13:3a:cc:
+        e8:ab:31:73:e9:41:61:f6:af:93:c0:c6:cb:96:45:2a:7a:b3:
+        69:e9:6f:55:a1:94:18:0b:50:e5:77:4f:36:ef:5b:2a:f6:6d:
+        4c:3c:fd:77:e3:be:8e:70:ae:d6:22:c5:8a:71:cf:54:38:bb:
+        27:6f:56:93:c6:0c:78:9c:9f:65:4b:ae:b2:a3:14:6f:6e:f1:
+        92:6a
+-----BEGIN CERTIFICATE-----
+MIIFATCCBGqgAwIBAgIRAMh47Sj08L4+jLTC1NOwQSIwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAyMDkxNzAwMDBaFw0x
+MjAyMDkxNzAwMDBaMIHPMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEWMBQGA1UEAxMNc2NodWgubWl0LmVkdTEe
+MBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEAv6Pye5jMFqdX5pKFNFbx42KDnmpPNZ3wz4mHc+OT97cB
+Vzhu6fxZTSTrpxdHyixRDkXIt2jJDjIm4JHTBlyMfA5smQyyRgUPTfGwx141BmL+
+KtYPGyy1AiRMwwZx7JTKHaqvfrktwFVLzLxRPXZoW9PtNdADuhts86DY09xrRLBe
+AVHTAsxK2lIS3jUxaRZaSIsPzq1N5NWLETZ/hxz9hNpDLocvQXCsrd9UwO32IVH6
+xQbwG+uhsL9NHEI0itVv9yVmc49gxNeNM5H0RjqXCVkB/8NklEBIMGjwbgMmdMKh
+s9fLlPxuU4oqnv2xT8R0ViVjH6q9lSV4nEVGGwwhceuElNCy8dpS9tF/Yx0II1Jf
+wvlNrKRE5ZpUcPzJ/NTUtx11lQDjvz5M80PDlscJKilFEtIx1nlMiudUJyLGgK6H
+I1bxjUmbyPrtM1tfVnbID36FFGnESDEHOaU0gfJrFVAi+7ssrUuE6lVk995WndC2
+0H0eG1FQN0SU5sQV60Ux8bPsD7OpDPgcR8dRAAXv7rA9n34Hpzjog0w92zS2JAyQ
+V8D50GQUipNHm0H1oxQdnhhd1dhmr/XzyC+8pwKn79zwDsdHjS7WqGJCk1t89TX4
+MRB7ONRAJGiBEyfL+3YO0ZkU2NXr92lkj6+PgrskKfnUKR3O5hS6TIsJ/0bOi20C
+AwEAAaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUE
+IDAeBggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAd
+BgNVHQ4EFgQUyxG3AV+GVU9FXqsnab7hPIl6VWIwMwYDVR0fBCwwKjAooCagJIYi
+aHR0cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUF
+AAOBgQC+XlsGijDOrRn0Ikz1smeKJrgOE7BJmr5UZPpuvpjbFgxE8LD8nfRT2KDv
+vbT0GZOvrr0TOszoqzFz6UFh9q+TwMbLlkUqerNp6W9VoZQYC1Dld08271sq9m1M
+PP13476OcK7WIsWKcc9UOLsnb1aTxgx4nJ9lS66yoxRvbvGSag==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts-cert.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts-cert.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts-cert.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Wed Jun 23 22:32:29 2010
+Date: Wed, 23 Jun 2010 22:32:27 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: scripts-root@mit.edu
+Subject: CSR for scripts-cert@mit.edu  [help.mit.edu #1269024]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            62:d0:96:53:78:eb:91:3f:dd:66:93:e3:c0:d2:ed:ee
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jun 22 16:00:00 2010 GMT
+            Not After : Jun 23 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=scripts-cert.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        b5:59:50:6b:e1:e1:ac:15:2b:df:7c:97:7b:28:e0:ed:65:7e:
+        2c:bf:5b:a7:83:0d:75:8f:3e:6a:bb:31:a9:d2:86:90:87:bb:
+        f9:6d:8d:2f:07:3b:43:bf:84:77:c3:e6:2b:75:8a:bc:56:35:
+        dd:5b:6f:20:0f:26:d7:1d:ab:23:71:4f:39:a2:64:a2:9f:28:
+        78:ec:3e:e9:b5:d6:f5:66:1b:1a:22:c2:86:9d:68:3a:6d:13:
+        79:86:ff:df:c8:1d:f5:3f:c4:85:78:d7:41:7e:6c:f0:6a:af:
+        39:27:3d:1e:74:dc:5a:07:33:bb:f8:4b:db:e4:dc:b0:e9:99:
+        09:25
+-----BEGIN CERTIFICATE-----
+MIIDgzCCAuygAwIBAgIQYtCWU3jrkT/dZpPjwNLt7jANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDYyMjE2MDAwMFoXDTEx
+MDYyMzE2MDAwMFowgdYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMR0wGwYDVQQDExRzY3JpcHRzLWNlcnQubWl0
+LmVkdTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+x
+rfuXjy6itlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899
+i1x3rVgksA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopd
+gQIDAQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1Ud
+JQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXg
+MB0GA1UdDgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAk
+hiJodHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEB
+BQUAA4GBALVZUGvh4awVK998l3so4O1lfiy/W6eDDXWPPmq7ManShpCHu/ltjS8H
+O0O/hHfD5it1irxWNd1bbyAPJtcdqyNxTzmiZKKfKHjsPum11vVmGxoiwoadaDpt
+E3mG/9/IHfU/xIV410F+bPBqrzknPR503FoHM7v4S9vk3LDpmQkl
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/scripts.pem	(revision 1803)
@@ -0,0 +1,65 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 745256 (0xb5f28)
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
+        Validity
+            Not Before: Jun  4 20:22:36 2009 GMT
+            Not After : Jun  7 02:53:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Student Information Processing Board, CN=scripts.mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Key Usage: critical
+                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://crl.geotrust.com/crls/secureca.crl
+
+            X509v3 Authority Key Identifier: 
+                keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
+
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication
+    Signature Algorithm: sha1WithRSAEncryption
+        0e:42:72:ba:24:61:07:eb:69:d6:3e:4a:e9:ec:a3:f8:16:c0:
+        a2:31:2d:f0:93:ec:37:2c:dc:c0:7c:a6:9e:60:52:d4:c6:af:
+        f4:c7:cb:f0:ad:bf:3c:b8:34:a7:1e:35:c3:15:84:f6:79:96:
+        f3:ec:d7:78:62:83:81:b5:bb:5e:77:0a:19:b6:d1:9f:ae:a9:
+        0b:f6:8a:7c:71:1e:a9:8e:e7:3d:e7:a6:38:47:3a:9f:0c:69:
+        37:a1:3f:0e:44:77:47:b9:75:4a:49:08:f3:42:43:58:2c:24:
+        d2:b9:5b:9c:8b:9a:5f:b6:83:cc:bb:ec:26:65:b7:75:50:83:
+        a6:5b
+-----BEGIN CERTIFICATE-----
+MIIDKDCCApGgAwIBAgIDC18oMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
+MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA0MjAyMjM2WhcNMTEwNjA3MDI1MzAw
+WjCBsjELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxEjAQBgNV
+BAcTCUNhbWJyaWRnZTEuMCwGA1UEChMlTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUg
+b2YgVGVjaG5vbG9neTEtMCsGA1UECxMkU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9j
+ZXNzaW5nIEJvYXJkMRgwFgYDVQQDEw9zY3JpcHRzLm1pdC5lZHUwgZ8wDQYJKoZI
+hvcNAQEBBQADgY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8
+D7Gt+5ePLqK2U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2H
+z32LXHetWCSwDqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xq
+il2BAgMBAAGjga4wgaswDgYDVR0PAQH/BAQDAgTwMB0GA1UdDgQWBBRUEXwJVUQc
+lEWponZGKywkJmpE6DA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3JsLmdlb3Ry
+dXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDAfBgNVHSMEGDAWgBRI5mj5K9KylddH
+2CMgEE8zmJCf1DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZI
+hvcNAQEFBQADgYEADkJyuiRhB+tp1j5K6eyj+BbAojEt8JPsNyzcwHymnmBS1Mav
+9MfL8K2/PLg0px41wxWE9nmW8+zXeGKDgbW7XncKGbbRn66pC/aKfHEeqY7nPeem
+OEc6nwxpN6E/DkR3R7l1SkkI80JDWCwk0rlbnIuaX7aDzLvsJmW3dVCDpls=
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/signup.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/signup.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/signup.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:35:12 2010
+Date: Thu, 28 Oct 2010 09:35:10 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for signup.mit.edu  [help.mit.edu #1385004]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            94:83:91:b4:d9:7e:b8:31:c8:8f:d1:9b:92:26:71:9b
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=signup.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        25:ec:4c:a0:0a:a4:f0:69:80:ef:8c:76:b2:b4:4f:43:c5:72:
+        1e:b4:9c:c4:d9:92:06:db:ca:57:1d:00:3b:c3:10:69:9a:8e:
+        9d:0b:57:ce:04:29:3c:c3:65:44:ee:b6:27:0d:80:91:14:79:
+        c6:57:e0:f9:61:b1:c6:5b:66:0b:bb:5c:43:8c:ce:9b:85:d8:
+        b3:5d:2b:6c:d3:67:c9:d5:6d:b2:c8:25:80:58:e0:9b:34:16:
+        9c:03:e4:b9:91:fc:73:ef:39:31:b6:ee:b5:a9:19:dc:83:8b:
+        7a:7e:26:5b:27:bf:a3:4e:ec:48:90:37:54:a5:df:7f:04:7f:
+        63:18
+-----BEGIN CERTIFICATE-----
+MIIDfjCCAuegAwIBAgIRAJSDkbTZfrgxyI/Rm5ImcZswDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDEwMjYxNjAwMDBaFw0x
+MTEwMjcxNjAwMDBaMIHQMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNTY3JpcHRzLm1pdC5l
+ZHUgV2ViIEhvc3RpbmcgU2VydmljZTEXMBUGA1UEAxMOc2lnbnVwLm1pdC5lZHUx
+HjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEF
+AAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48u
+orZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61Y
+JLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEA
+AaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAe
+BggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNV
+HQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0
+cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOB
+gQAl7EygCqTwaYDvjHaytE9DxXIetJzE2ZIG28pXHQA7wxBpmo6dC1fOBCk8w2VE
+7rYnDYCRFHnGV+D5YbHGW2YLu1xDjM6bhdizXSts02fJ1W2yyCWAWOCbNBacA+S5
+kfxz7zkxtu61qRncg4t6fiZbJ7+jTuxIkDdUpd9/BH9jGA==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sipb.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sipb.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/sipb.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 14:41:31 2010
+Date: Thu, 28 Oct 2010 14:41:30 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for sipb.mit.edu  [help.mit.edu #1385007]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            64:1d:ea:17:1b:aa:8d:e0:4e:ee:8b:71:79:47:e0:ae
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 27 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=sipb.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        38:b2:96:5f:ed:dd:ce:65:0c:dc:f0:b6:ef:2e:3e:5c:ca:75:
+        47:f6:ff:dc:67:25:89:31:6b:d7:a3:c7:a3:48:ca:c6:64:45:
+        57:55:7b:f7:65:70:1e:8c:06:d0:31:7b:85:92:bb:54:c2:4a:
+        d0:b7:ce:8e:6c:f3:54:1d:60:5c:78:89:d8:10:d9:8e:33:f1:
+        f9:5e:da:82:7c:3e:0b:45:a1:1d:b2:c7:12:6a:e7:3b:24:24:
+        68:ed:7d:f9:f8:1b:29:e7:87:1e:32:d3:54:b3:cf:bd:26:58:
+        7c:c6:f1:9a:17:3e:c6:1d:ac:f4:4d:b6:aa:b2:bb:4c:a7:74:
+        0b:e8
+-----BEGIN CERTIFICATE-----
+MIIDezCCAuSgAwIBAgIQZB3qFxuqjeBO7otxeUfgrjANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTAyNzE2MDAwMFoXDTEx
+MTAyNzE2MDAwMFowgc4xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRUwEwYDVQQDEwxzaXBiLm1pdC5lZHUxHjAc
+BgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37l48uorZT
+07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtcd61YJLAO
+oW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYECAwEAAaOB
+qzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUEIDAeBggr
+BgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAdBgNVHQ4E
+FgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
+L2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUFAAOBgQA4
+spZf7d3OZQzc8LbvLj5cynVH9v/cZyWJMWvXo8ejSMrGZEVXVXv3ZXAejAbQMXuF
+krtUwkrQt86ObPNUHWBceInYENmOM/H5XtqCfD4LRaEdsscSauc7JCRo7X35+Bsp
+54ceMtNUs8+9Jlh8xvGaFz7GHaz0TbaqsrtMp3QL6A==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/star.scripts.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/star.scripts.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/star.scripts.pem	(revision 1803)
@@ -0,0 +1,65 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 744584 (0xb5c88)
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
+        Validity
+            Not Before: Jun  4 09:13:16 2009 GMT
+            Not After : Jun  5 13:13:22 2014 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Student Information Processing Board, CN=*.scripts.mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Key Usage: critical
+                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://crl.geotrust.com/crls/secureca.crl
+
+            X509v3 Authority Key Identifier: 
+                keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
+
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication
+    Signature Algorithm: sha1WithRSAEncryption
+        2c:25:90:82:a2:82:e8:03:58:b4:38:11:bc:c0:b5:f0:44:ee:
+        b3:d9:5f:90:ab:b3:f6:24:fa:92:6b:9c:3a:7d:5d:89:f4:a2:
+        3c:2f:cb:85:b2:fe:b6:92:0f:1b:94:65:2d:d6:70:f8:9f:77:
+        9c:b3:20:fa:16:91:9d:e1:b7:64:07:27:42:8b:be:e2:f3:d9:
+        78:71:42:12:3d:6f:33:37:4b:01:2e:1d:87:25:48:bf:50:23:
+        7a:b0:02:41:5d:35:08:bf:e7:15:08:5c:11:7d:91:10:06:52:
+        19:d3:05:01:94:86:07:f7:76:41:e1:fb:d9:1c:d0:ee:74:9f:
+        51:66
+-----BEGIN CERTIFICATE-----
+MIIDKjCCApOgAwIBAgIDC1yIMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
+MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA0MDkxMzE2WhcNMTQwNjA1MTMxMzIy
+WjCBtDELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxEjAQBgNV
+BAcTCUNhbWJyaWRnZTEuMCwGA1UEChMlTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUg
+b2YgVGVjaG5vbG9neTEtMCsGA1UECxMkU3R1ZGVudCBJbmZvcm1hdGlvbiBQcm9j
+ZXNzaW5nIEJvYXJkMRowGAYDVQQDFBEqLnNjcmlwdHMubWl0LmVkdTCBnzANBgkq
+hkiG9w0BAQEFAAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXy
+ZjwPsa37l48uorZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9
+HYfPfYtcd61YJLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb
+3GqKXYECAwEAAaOBrjCBqzAOBgNVHQ8BAf8EBAMCBPAwHQYDVR0OBBYEFFQRfAlV
+RByURamidkYrLCQmakToMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly9jcmwuZ2Vv
+dHJ1c3QuY29tL2NybHMvc2VjdXJlY2EuY3JsMB8GA1UdIwQYMBaAFEjmaPkr0rKV
+10fYIyAQTzOYkJ/UMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkq
+hkiG9w0BAQUFAAOBgQAsJZCCooLoA1i0OBG8wLXwRO6z2V+Qq7P2JPqSa5w6fV2J
+9KI8L8uFsv62kg8blGUt1nD4n3ecsyD6FpGd4bdkBydCi77i89l4cUISPW8zN0sB
+Lh2HJUi/UCN6sAJBXTUIv+cVCFwRfZEQBlIZ0wUBlIYH93ZB4fvZHNDudJ9RZg==
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/swe.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/swe.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/swe.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Nov 27 15:22:50 2010
+Date: Sat, 27 Nov 2010 15:22:48 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for scripts site swe.mit.edu  [help.mit.edu #1413707]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            27:b6:8f:a5:ce:0f:fc:13:61:9e:29:6d:75:b5:4f:62
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 26 17:00:00 2010 GMT
+            Not After : Nov 24 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=swe.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        bf:94:b6:02:4c:45:67:6c:d3:53:9e:d8:9a:f4:ca:a3:65:6c:
+        20:a8:44:21:fc:12:cc:2b:bb:9f:de:34:dd:76:e7:54:07:12:
+        e0:2e:f4:2c:ec:dc:ce:27:f8:72:d0:9a:16:90:ef:32:47:3a:
+        ec:ca:8b:34:87:87:24:ee:01:ca:31:3d:f3:14:98:98:d0:55:
+        4e:f2:20:38:3c:45:1e:c0:17:6c:45:15:4e:25:14:b9:5d:55:
+        40:ae:ff:76:ee:17:f5:94:33:a7:80:ef:47:27:98:46:de:81:
+        4b:ed:d7:19:1e:03:07:c4:9b:94:c0:a8:04:9e:f8:f5:c3:79:
+        a2:d1
+-----BEGIN CERTIFICATE-----
+MIIDejCCAuOgAwIBAgIQJ7aPpc4P/BNhniltdbVPYjANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTEyNjE3MDAwMFoXDTEx
+MTEyNDE3MDAwMFowgc0xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRQwEgYDVQQDEwtzd2UubWl0LmVkdTEeMBwG
+CSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6itlPT
+tg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgksA6h
+bdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQABo4Gr
+MIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4GCCsG
+AQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1UdDgQW
+BBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
+Y2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GBAL+U
+tgJMRWds01Oe2Jr0yqNlbCCoRCH8Eswru5/eNN1251QHEuAu9Czs3M4n+HLQmhaQ
+7zJHOuzKizSHhyTuAcoxPfMUmJjQVU7yIDg8RR7AF2xFFU4lFLldVUCu/3buF/WU
+M6eA70cnmEbegUvt1xkeAwfEm5TAqASe+PXDeaLR
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/techfair.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/techfair.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/techfair.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Nov 27 15:29:45 2010
+Date: Sat, 27 Nov 2010 15:29:43 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for scripts site techfair.mit.edu  [help.mit.edu #1413705]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            4e:9c:ce:a9:b4:dd:e8:a2:77:ee:f5:a8:9c:fc:22:9d
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 26 17:00:00 2010 GMT
+            Not After : Nov 24 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=techfair.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        51:ca:b0:0a:00:8f:63:1b:de:25:e2:a8:47:f2:cb:f7:47:f7:
+        e4:d5:7b:e4:cc:c6:9a:a5:38:26:2c:cb:e3:43:af:0f:d0:8a:
+        7a:26:43:73:ec:0e:e3:70:8a:73:25:8d:40:8e:5a:7a:58:5d:
+        91:b5:6e:05:08:67:b2:2f:b5:d6:2b:d9:67:58:5f:5d:65:b8:
+        43:36:1f:00:fd:f2:32:16:08:e6:c2:30:33:89:bd:5f:c6:ff:
+        95:91:78:c0:22:b2:d1:e8:2c:aa:bf:1b:37:ef:2a:45:ca:7c:
+        0d:44:41:01:bb:09:cc:c6:d7:49:d1:74:f7:44:85:65:75:dc:
+        b4:45
+-----BEGIN CERTIFICATE-----
+MIIDfzCCAuigAwIBAgIQTpzOqbTd6KJ37vWonPwinTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTEyNjE3MDAwMFoXDTEx
+MTEyNDE3MDAwMFowgdIxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRkwFwYDVQQDExB0ZWNoZmFpci5taXQuZWR1
+MR4wHAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcNAQEB
+BQADgY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt+5eP
+LqK2U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32LXHet
+WCSwDqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2BAgMB
+AAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAw
+HgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYD
+VR0OBBYEFFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSGImh0
+dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQAD
+gYEAUcqwCgCPYxveJeKoR/LL90f35NV75MzGmqU4JizL40OvD9CKeiZDc+wO43CK
+cyWNQI5aelhdkbVuBQhnsi+11ivZZ1hfXWW4QzYfAP3yMhYI5sIwM4m9X8b/lZF4
+wCKy0egsqr8bN+8qRcp8DURBAbsJzMbXSdF090SFZXXctEU=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tf.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tf.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tf.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Nov 27 15:28:25 2010
+Date: Sat, 27 Nov 2010 15:28:24 -0500 (EST)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for tf.mit.edu  [help.mit.edu #1413706]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            e3:74:d4:47:41:27:3d:7f:79:d2:1e:85:34:0b:a6:d2
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 26 17:00:00 2010 GMT
+            Not After : Nov 24 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=tf.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        99:53:43:b5:a8:7f:b4:1f:9f:3e:64:ec:32:a9:d0:e3:be:6c:
+        3f:dd:3d:52:4c:db:a9:2d:67:15:27:53:5d:da:3c:03:c8:92:
+        41:8f:73:8d:81:74:ab:f9:c8:ad:4a:55:b1:8b:f8:02:b0:82:
+        50:95:f1:4d:a4:c1:49:3f:65:fe:47:40:7b:ee:65:6d:7d:c4:
+        3a:a8:55:3b:9e:57:f6:68:77:86:24:31:a5:e6:b4:30:dc:5d:
+        74:1b:54:9a:79:9a:ca:cd:77:58:64:f8:d6:20:36:8d:fe:9c:
+        6c:de:e5:b0:0d:65:7c:7d:c8:d1:e7:ae:97:19:70:29:3c:d5:
+        eb:75
+-----BEGIN CERTIFICATE-----
+MIIDejCCAuOgAwIBAgIRAON01EdBJz1/edIehTQLptIwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDExMjYxNzAwMDBaFw0x
+MTExMjQxNzAwMDBaMIHMMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTETMBEGA1UEAxMKdGYubWl0LmVkdTEeMBwG
+CSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6itlPT
+tg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgksA6h
+bdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQABo4Gr
+MIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4GCCsG
+AQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1UdDgQW
+BBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
+Y2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GBAJlT
+Q7Wof7Qfnz5k7DKp0OO+bD/dPVJM26ktZxUnU13aPAPIkkGPc42BdKv5yK1KVbGL
++AKwglCV8U2kwUk/Zf5HQHvuZW19xDqoVTueV/Zod4YkMaXmtDDcXXQbVJp5msrN
+d1hk+NYgNo3+nGze5bANZXx9yNHnrpcZcCk81et1
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tibetforum.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tibetforum.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tibetforum.pem	(revision 1803)
@@ -0,0 +1,103 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            52:ef:bd:fa:26:8e:7c:4b:ed:d7:84:8e:53:86:76:a2
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Mar 19 16:00:00 2011 GMT
+            Not After : Mar 20 16:00:00 2012 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=tibetforum.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (4096 bit)
+                Modulus (4096 bit):
+                    00:bf:a3:f2:7b:98:cc:16:a7:57:e6:92:85:34:56:
+                    f1:e3:62:83:9e:6a:4f:35:9d:f0:cf:89:87:73:e3:
+                    93:f7:b7:01:57:38:6e:e9:fc:59:4d:24:eb:a7:17:
+                    47:ca:2c:51:0e:45:c8:b7:68:c9:0e:32:26:e0:91:
+                    d3:06:5c:8c:7c:0e:6c:99:0c:b2:46:05:0f:4d:f1:
+                    b0:c7:5e:35:06:62:fe:2a:d6:0f:1b:2c:b5:02:24:
+                    4c:c3:06:71:ec:94:ca:1d:aa:af:7e:b9:2d:c0:55:
+                    4b:cc:bc:51:3d:76:68:5b:d3:ed:35:d0:03:ba:1b:
+                    6c:f3:a0:d8:d3:dc:6b:44:b0:5e:01:51:d3:02:cc:
+                    4a:da:52:12:de:35:31:69:16:5a:48:8b:0f:ce:ad:
+                    4d:e4:d5:8b:11:36:7f:87:1c:fd:84:da:43:2e:87:
+                    2f:41:70:ac:ad:df:54:c0:ed:f6:21:51:fa:c5:06:
+                    f0:1b:eb:a1:b0:bf:4d:1c:42:34:8a:d5:6f:f7:25:
+                    66:73:8f:60:c4:d7:8d:33:91:f4:46:3a:97:09:59:
+                    01:ff:c3:64:94:40:48:30:68:f0:6e:03:26:74:c2:
+                    a1:b3:d7:cb:94:fc:6e:53:8a:2a:9e:fd:b1:4f:c4:
+                    74:56:25:63:1f:aa:bd:95:25:78:9c:45:46:1b:0c:
+                    21:71:eb:84:94:d0:b2:f1:da:52:f6:d1:7f:63:1d:
+                    08:23:52:5f:c2:f9:4d:ac:a4:44:e5:9a:54:70:fc:
+                    c9:fc:d4:d4:b7:1d:75:95:00:e3:bf:3e:4c:f3:43:
+                    c3:96:c7:09:2a:29:45:12:d2:31:d6:79:4c:8a:e7:
+                    54:27:22:c6:80:ae:87:23:56:f1:8d:49:9b:c8:fa:
+                    ed:33:5b:5f:56:76:c8:0f:7e:85:14:69:c4:48:31:
+                    07:39:a5:34:81:f2:6b:15:50:22:fb:bb:2c:ad:4b:
+                    84:ea:55:64:f7:de:56:9d:d0:b6:d0:7d:1e:1b:51:
+                    50:37:44:94:e6:c4:15:eb:45:31:f1:b3:ec:0f:b3:
+                    a9:0c:f8:1c:47:c7:51:00:05:ef:ee:b0:3d:9f:7e:
+                    07:a7:38:e8:83:4c:3d:db:34:b6:24:0c:90:57:c0:
+                    f9:d0:64:14:8a:93:47:9b:41:f5:a3:14:1d:9e:18:
+                    5d:d5:d8:66:af:f5:f3:c8:2f:bc:a7:02:a7:ef:dc:
+                    f0:0e:c7:47:8d:2e:d6:a8:62:42:93:5b:7c:f5:35:
+                    f8:31:10:7b:38:d4:40:24:68:81:13:27:cb:fb:76:
+                    0e:d1:99:14:d8:d5:eb:f7:69:64:8f:af:8f:82:bb:
+                    24:29:f9:d4:29:1d:ce:e6:14:ba:4c:8b:09:ff:46:
+                    ce:8b:6d
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                CB:11:B7:01:5F:86:55:4F:45:5E:AB:27:69:BE:E1:3C:89:7A:55:62
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        11:54:74:f0:83:d8:d8:d0:d6:5b:c5:f1:ee:95:6b:d7:73:db:
+        73:20:19:d1:a4:52:83:31:13:29:d5:13:8e:cc:03:2f:75:e1:
+        d6:2f:65:2a:92:7d:7a:8b:94:db:db:01:2a:d1:b1:b6:96:fa:
+        12:91:1d:44:b3:df:b3:3c:d2:34:4b:6d:43:3e:f6:19:35:08:
+        ed:ef:49:1f:3c:bb:6d:c2:a3:a1:2c:ed:6c:ef:21:7c:68:88:
+        f4:95:d1:2f:02:ed:18:17:e2:47:82:23:4e:57:99:77:22:22:
+        e3:37:2d:55:a5:42:85:1a:ad:5d:ba:19:bd:37:62:cd:62:f1:
+        e8:b9
+-----BEGIN CERTIFICATE-----
+MIIFBTCCBG6gAwIBAgIQUu+9+iaOfEvt14SOU4Z2ojANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTExMDMxOTE2MDAwMFoXDTEy
+MDMyMDE2MDAwMFowgdQxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRswGQYDVQQDExJ0aWJldGZvcnVtLm1pdC5l
+ZHUxHjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAL+j8nuYzBanV+aShTRW8eNig55qTzWd8M+Jh3Pj
+k/e3AVc4bun8WU0k66cXR8osUQ5FyLdoyQ4yJuCR0wZcjHwObJkMskYFD03xsMde
+NQZi/irWDxsstQIkTMMGceyUyh2qr365LcBVS8y8UT12aFvT7TXQA7obbPOg2NPc
+a0SwXgFR0wLMStpSEt41MWkWWkiLD86tTeTVixE2f4cc/YTaQy6HL0FwrK3fVMDt
+9iFR+sUG8BvrobC/TRxCNIrVb/clZnOPYMTXjTOR9EY6lwlZAf/DZJRASDBo8G4D
+JnTCobPXy5T8blOKKp79sU/EdFYlYx+qvZUleJxFRhsMIXHrhJTQsvHaUvbRf2Md
+CCNSX8L5TaykROWaVHD8yfzU1LcddZUA478+TPNDw5bHCSopRRLSMdZ5TIrnVCci
+xoCuhyNW8Y1Jm8j67TNbX1Z2yA9+hRRpxEgxBzmlNIHyaxVQIvu7LK1LhOpVZPfe
+Vp3QttB9HhtRUDdElObEFetFMfGz7A+zqQz4HEfHUQAF7+6wPZ9+B6c46INMPds0
+tiQMkFfA+dBkFIqTR5tB9aMUHZ4YXdXYZq/188gvvKcCp+/c8A7HR40u1qhiQpNb
+fPU1+DEQezjUQCRogRMny/t2DtGZFNjV6/dpZI+vj4K7JCn51CkdzuYUukyLCf9G
+zottAgMBAAGjgaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYD
+VR0lBCAwHgYIKwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMC
+BeAwHQYDVR0OBBYEFMsRtwFfhlVPRV6rJ2m+4TyJelViMDMGA1UdHwQsMCowKKAm
+oCSGImh0dHA6Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcN
+AQEFBQADgYEAEVR08IPY2NDWW8Xx7pVr13PbcyAZ0aRSgzETKdUTjswDL3Xh1i9l
+KpJ9eouU29sBKtGxtpb6EpEdRLPfszzSNEttQz72GTUI7e9JHzy7bcKjoSztbO8h
+fGiI9JXRLwLtGBfiR4IjTleZdyIi4zctVaVChRqtXboZvTdizWLx6Lk=
+-----END CERTIFICATE-----
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tours.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tours.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/tours.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Jun 17 08:13:52 2010
+Date: Thu, 17 Jun 2010 08:13:51 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for tours.mit.edu  [help.mit.edu #1263305]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            63:75:30:51:9d:87:bd:ac:0d:9b:0d:27:00:13:b9:b5
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Jun 15 16:00:00 2010 GMT
+            Not After : Jun 16 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=tours.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        5e:72:af:24:29:41:16:76:f9:61:0d:e1:ad:16:05:00:90:8c:
+        c4:42:41:ae:20:3b:cc:9f:e8:e5:de:07:26:35:bd:54:1a:95:
+        4f:20:7b:5a:5d:e1:5b:10:ac:6b:c1:24:0d:22:cd:ef:d2:16:
+        67:2a:33:b1:4e:8f:da:44:56:35:98:b0:67:67:47:ca:c5:89:
+        51:26:7e:cd:e9:5c:c2:74:73:d1:ac:ff:20:03:ee:76:17:97:
+        6c:d9:e2:74:c1:48:89:a4:b8:53:70:24:23:36:b8:f4:c4:ed:
+        76:9d:6a:d2:69:26:07:a7:79:fd:9f:9b:b1:f9:64:00:c2:61:
+        48:5e
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAuWgAwIBAgIQY3UwUZ2HvawNmw0nABO5tTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDYxNTE2MDAwMFoXDTEx
+MDYxNjE2MDAwMFowgc8xCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRYwFAYDVQQDEw10b3Vycy5taXQuZWR1MR4w
+HAYJKoZIhvcNAQkBFg9zY3JpcHRzQG1pdC5lZHUwgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBALU+IU3BiWsBjEeA/rM3J3b4UkHmoj1Ldnjl8mY8D7Gt+5ePLqK2
+U9O2DuJm+bkLt8601fUcH28ifUj1bfAWzY5IedEUShQvL/jEvR2Hz32LXHetWCSw
+DqFt1grH2LwvZ2XIXdjYMcJnS0r0oaVUgq/LNAgqBH+OfEy329xqil2BAgMBAAGj
+gaswgagwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBeAwJwYDVR0lBCAwHgYI
+KwYBBQUHAwEGCCsGAQUFBwMEBggrBgEFBQcDAjALBgNVHQ8EBAMCBeAwHQYDVR0O
+BBYEFFQRfAlVRByURamidkYrLCQmakToMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6
+Ly9jYS5taXQuZWR1L2NhL21pdHNlcnZlci5jcmwwDQYJKoZIhvcNAQEFBQADgYEA
+XnKvJClBFnb5YQ3hrRYFAJCMxEJBriA7zJ/o5d4HJjW9VBqVTyB7Wl3hWxCsa8Ek
+DSLN79IWZyozsU6P2kRWNZiwZ2dHysWJUSZ+zelcwnRz0az/IAPudheXbNnidMFI
+iaS4U3AkIza49MTtdp1q0mkmB6d5/Z+bsflkAMJhSF4=
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/twentytwelve.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/twentytwelve.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/twentytwelve.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:36:41 2010
+Date: Thu, 28 Oct 2010 09:36:39 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for twentytwelve.mit.edu  [help.mit.edu #1385005]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            77:93:4d:e9:5a:50:d8:b8:73:2a:f6:bd:d5:00:4a:9f
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=twentytwelve.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        2b:12:5c:d2:c5:09:65:f7:e1:68:95:40:47:3c:f0:89:60:25:
+        d3:18:11:60:26:53:af:60:ca:6b:ea:79:75:cb:8e:eb:c9:61:
+        91:41:91:b5:52:62:d4:f5:b8:4c:d5:48:3d:3c:93:0a:09:2f:
+        1c:26:80:32:53:74:cc:01:37:f0:91:ce:ab:d0:54:9a:26:d0:
+        aa:22:30:60:c3:82:3a:08:02:8e:ce:4a:45:f8:2e:5d:aa:58:
+        cb:ff:79:93:08:97:30:95:bc:1a:e6:cc:c2:83:b8:ce:e7:d2:
+        ac:bf:19:02:cd:af:9b:23:ad:92:3b:7c:85:34:f2:24:2a:8e:
+        e6:68
+-----BEGIN CERTIFICATE-----
+MIIDgzCCAuygAwIBAgIQd5NN6VpQ2LhzKva91QBKnzANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMTAyNjE2MDAwMFoXDTEx
+MTAyNzE2MDAwMFowgdYxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI1NjcmlwdHMubWl0LmVk
+dSBXZWIgSG9zdGluZyBTZXJ2aWNlMR0wGwYDVQQDExR0d2VudHl0d2VsdmUubWl0
+LmVkdTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+x
+rfuXjy6itlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899
+i1x3rVgksA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopd
+gQIDAQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1Ud
+JQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXg
+MB0GA1UdDgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAk
+hiJodHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEB
+BQUAA4GBACsSXNLFCWX34WiVQEc88IlgJdMYEWAmU69gymvqeXXLjuvJYZFBkbVS
+YtT1uEzVSD08kwoJLxwmgDJTdMwBN/CRzqvQVJom0KoiMGDDgjoIAo7OSkX4Ll2q
+WMv/eZMIlzCVvBrmzMKDuM7n0qy/GQLNr5sjrZI7fIU08iQqjuZo
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ua.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ua.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/ua.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Oct 28 09:38:23 2010
+Date: Thu, 28 Oct 2010 09:38:22 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: CSR for ua.mit.edu  [help.mit.edu #1385006]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            c4:80:e8:8d:c3:09:9f:dd:cb:45:ae:c6:f3:86:9a:01
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Oct 26 16:00:00 2010 GMT
+            Not After : Oct 27 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=Scripts.mit.edu Web Hosting Service, CN=ua.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        9f:22:39:a2:fe:82:17:d5:48:e2:f2:62:37:42:80:8a:39:5b:
+        3d:73:b1:2a:86:35:1c:ff:b2:82:c8:48:74:de:14:fe:68:3e:
+        93:48:55:2b:17:d0:b5:cb:0b:f9:51:a4:8b:57:4b:6b:b7:51:
+        c5:75:b2:3f:b1:1b:64:f0:25:17:39:a4:83:93:c2:f9:a7:e8:
+        97:9c:48:74:57:22:38:2e:fd:75:48:dc:8e:06:0c:1c:48:02:
+        ad:b3:06:8d:2f:5c:f1:4f:e7:70:a3:79:ee:e0:93:d0:a1:2d:
+        cd:15:69:c1:00:51:d2:9a:02:c5:f6:98:55:c3:8d:d9:ee:96:
+        47:89
+-----BEGIN CERTIFICATE-----
+MIIDejCCAuOgAwIBAgIRAMSA6I3DCZ/dy0WuxvOGmgEwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDEwMjYxNjAwMDBaFw0x
+MTEwMjcxNjAwMDBaMIHMMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNTY3JpcHRzLm1pdC5l
+ZHUgV2ViIEhvc3RpbmcgU2VydmljZTETMBEGA1UEAxMKdWEubWl0LmVkdTEeMBwG
+CSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6itlPT
+tg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgksA6h
+bdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQABo4Gr
+MIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4GCCsG
+AQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1UdDgQW
+BBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
+Y2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GBAJ8i
+OaL+ghfVSOLyYjdCgIo5Wz1zsSqGNRz/soLISHTeFP5oPpNIVSsX0LXLC/lRpItX
+S2u3UcV1sj+xG2TwJRc5pIOTwvmn6JecSHRXIjgu/XVI3I4GDBxIAq2zBo0vXPFP
+53Cjee7gk9ChLc0VacEAUdKaAsX2mFXDjdnulkeJ
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/wakeup.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/wakeup.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/wakeup.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:16:00 2010
+Date: Sat, 14 Aug 2010 09:15:59 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for wakeup.mit.edu  [help.mit.edu #1313563]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            8e:9c:9d:b6:b4:a0:88:bb:11:b2:06:89:35:3c:19
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=wakeup.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        85:b1:c3:e5:cf:00:26:44:dc:cc:31:0f:f9:a5:10:6a:ea:e6:
+        26:57:8e:61:b3:8e:a9:71:1f:63:f9:9c:60:87:48:bf:ca:a8:
+        d8:e8:f3:1d:c1:08:d4:2b:e9:62:3c:14:1c:ab:2e:2e:bd:c5:
+        e7:de:33:60:a2:bc:1b:cf:90:e4:ac:c2:68:05:02:e9:c3:8f:
+        ab:13:9c:c4:39:81:36:9c:d9:c4:bc:2f:1d:55:89:e4:f5:2b:
+        03:b0:df:21:2b:9f:68:39:6c:5b:9e:06:f9:d3:4a:be:b7:51:
+        3b:18:97:e1:50:d8:20:7b:cc:4d:57:36:46:b3:71:c6:f2:44:
+        25:b6
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIQAI6cnba0oIi7EbIGiTU8GTANBgkqhkiG9w0BAQUFADB7
+MQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czEuMCwGA1UEChMl
+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTEkMCIGA1UECxMb
+TUlUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDgxMjE2MDAwMFoXDTEx
+MDgxMTE2MDAwMFowgdAxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNl
+dHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxLjAsBgNVBAoTJU1hc3NhY2h1c2V0dHMg
+SW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxLDAqBgNVBAsTI3NjcmlwdHMubWl0LmVk
+dSB3ZWIgaG9zdGluZyBzZXJ2aWNlMRcwFQYDVQQDEw53YWtldXAubWl0LmVkdTEe
+MBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuXjy6i
+tlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3rVgk
+sA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQIDAQAB
+o4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQgMB4G
+CCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0GA1Ud
+DgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJodHRw
+Oi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUAA4GB
+AIWxw+XPACZE3MwxD/mlEGrq5iZXjmGzjqlxH2P5nGCHSL/KqNjo8x3BCNQr6WI8
+FByrLi69xefeM2CivBvPkOSswmgFAunDj6sTnMQ5gTac2cS8Lx1VieT1KwOw3yEr
+n2g5bFueBvnTSr63UTsYl+FQ2CB7zE1XNkazccbyRCW2
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/westgate.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/westgate.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/westgate.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Sat Aug 14 09:15:10 2010
+Date: Sat, 14 Aug 2010 09:15:09 -0400 (EDT)
+From: mitcert@MIT.EDU
+To: geofft@mit.edu
+Subject: Certificate renewal for westgate.mit.edu  [help.mit.edu #1313564]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            87:51:ab:ce:27:eb:8a:bb:48:2a:ed:35:32:03:26:26
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Aug 12 16:00:00 2010 GMT
+            Not After : Aug 11 16:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=westgate.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        11:08:4c:f4:3c:5d:65:a9:47:46:fc:7e:b3:e3:78:4a:8c:64:
+        18:47:e8:af:c8:5e:a6:7a:bf:51:da:ce:cc:c6:82:e5:4c:21:
+        11:14:68:2b:b2:46:1f:7a:7c:fe:e5:33:cf:a6:8b:35:d5:d6:
+        83:3c:93:07:50:66:c4:2d:20:31:d4:ee:b6:ad:9f:ea:53:8b:
+        fc:96:09:5f:39:44:d1:df:23:0a:c0:cd:83:53:8f:54:f7:41:
+        52:f2:66:6a:b8:10:1d:bf:2e:9d:1f:0f:3a:45:96:39:2e:4e:
+        4d:ac:83:46:77:e3:a7:11:43:b2:5d:34:a3:b1:d0:5c:5e:cf:
+        61:d2
+-----BEGIN CERTIFICATE-----
+MIIDgDCCAumgAwIBAgIRAIdRq84n64q7SCrtNTIDJiYwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDA4MTIxNjAwMDBaFw0x
+MTA4MTExNjAwMDBaMIHSMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEZMBcGA1UEAxMQd2VzdGdhdGUubWl0LmVk
+dTEeMBwGCSqGSIb3DQEJARYPc2NyaXB0c0BtaXQuZWR1MIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQC1PiFNwYlrAYxHgP6zNyd2+FJB5qI9S3Z45fJmPA+xrfuX
+jy6itlPTtg7iZvm5C7fOtNX1HB9vIn1I9W3wFs2OSHnRFEoULy/4xL0dh899i1x3
+rVgksA6hbdYKx9i8L2dlyF3Y2DHCZ0tK9KGlVIKvyzQIKgR/jnxMt9vcaopdgQID
+AQABo4GrMIGoMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgXgMCcGA1UdJQQg
+MB4GCCsGAQUFBwMBBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQDAgXgMB0G
+A1UdDgQWBBRUEXwJVUQclEWponZGKywkJmpE6DAzBgNVHR8ELDAqMCigJqAkhiJo
+dHRwOi8vY2EubWl0LmVkdS9jYS9taXRzZXJ2ZXIuY3JsMA0GCSqGSIb3DQEBBQUA
+A4GBABEITPQ8XWWpR0b8frPjeEqMZBhH6K/IXqZ6v1HazszGguVMIREUaCuyRh96
+fP7lM8+mizXV1oM8kwdQZsQtIDHU7ratn+pTi/yWCV85RNHfIwrAzYNTj1T3QVLy
+Zmq4EB2/Lp0fDzpFljkuTk2sg0Z346cRQ7JdNKOx0Fxez2HS
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/whatsnext.pem
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/whatsnext.pem	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/certs/whatsnext.pem	(revision 1803)
@@ -0,0 +1,76 @@
+From mitcert@MIT.EDU Thu Nov 18 11:59:11 2010
+Date: Thu, 18 Nov 2010 11:59:10 -0500 (EST)
+From: mitcert@MIT.EDU
+To: mitchb@mit.edu
+Subject: Certificate signing request for whatsnext.mit.edu  [help.mit.edu #1406648]
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            f7:49:e0:b4:7e:2f:42:62:0e:a7:07:79:f7:52:eb:c7
+        Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, ST=Massachusetts, O=Massachusetts Institute of Technology, OU=MIT Certification Authority
+        Validity
+            Not Before: Nov 16 17:00:00 2010 GMT
+            Not After : Nov 17 17:00:00 2011 GMT
+        Subject: C=US, ST=Massachusetts, L=Cambridge, O=Massachusetts Institute of Technology, OU=scripts.mit.edu web hosting service, CN=whatsnext.mit.edu/emailAddress=scripts@mit.edu
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (1024 bit)
+                Modulus (1024 bit):
+                    00:b5:3e:21:4d:c1:89:6b:01:8c:47:80:fe:b3:37:
+                    27:76:f8:52:41:e6:a2:3d:4b:76:78:e5:f2:66:3c:
+                    0f:b1:ad:fb:97:8f:2e:a2:b6:53:d3:b6:0e:e2:66:
+                    f9:b9:0b:b7:ce:b4:d5:f5:1c:1f:6f:22:7d:48:f5:
+                    6d:f0:16:cd:8e:48:79:d1:14:4a:14:2f:2f:f8:c4:
+                    bd:1d:87:cf:7d:8b:5c:77:ad:58:24:b0:0e:a1:6d:
+                    d6:0a:c7:d8:bc:2f:67:65:c8:5d:d8:d8:31:c2:67:
+                    4b:4a:f4:a1:a5:54:82:af:cb:34:08:2a:04:7f:8e:
+                    7c:4c:b7:db:dc:6a:8a:5d:81
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Cert Type: 
+                SSL Client, SSL Server, S/MIME
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, E-mail Protection, TLS Web Client Authentication
+            X509v3 Key Usage: 
+                Digital Signature, Non Repudiation, Key Encipherment
+            X509v3 Subject Key Identifier: 
+                54:11:7C:09:55:44:1C:94:45:A9:A2:76:46:2B:2C:24:26:6A:44:E8
+            X509v3 CRL Distribution Points: 
+                URI:http://ca.mit.edu/ca/mitserver.crl
+
+    Signature Algorithm: sha1WithRSAEncryption
+        47:c5:f0:86:46:28:9b:c4:ec:38:2f:a3:4b:5e:11:77:1e:1e:
+        81:ec:82:3f:de:36:14:0f:bf:6e:5b:74:55:1c:b6:1b:b2:ae:
+        77:ff:40:ae:22:43:d3:9e:f9:05:aa:ba:54:de:39:e4:fa:bb:
+        e4:54:98:94:f8:b4:33:26:15:1a:1f:01:50:5b:8e:d2:ad:ff:
+        74:69:98:f8:7b:b7:7c:92:aa:5a:51:bc:99:a8:4f:77:a8:0b:
+        a5:93:03:8c:32:12:66:f5:9a:8b:c2:47:6e:b4:8b:e9:f9:ad:
+        3f:0a:8b:02:78:b7:45:d1:16:03:2c:65:7b:f4:83:2e:97:a0:
+        fb:9a
+-----BEGIN CERTIFICATE-----
+MIIDgTCCAuqgAwIBAgIRAPdJ4LR+L0JiDqcHefdS68cwDQYJKoZIhvcNAQEFBQAw
+ezELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxLjAsBgNVBAoT
+JU1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kxJDAiBgNVBAsT
+G01JVCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMDExMTYxNzAwMDBaFw0x
+MTExMTcxNzAwMDBaMIHTMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTWFzc2FjaHVz
+ZXR0czESMBAGA1UEBxMJQ2FtYnJpZGdlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRz
+IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5MSwwKgYDVQQLEyNzY3JpcHRzLm1pdC5l
+ZHUgd2ViIGhvc3Rpbmcgc2VydmljZTEaMBgGA1UEAxMRd2hhdHNuZXh0Lm1pdC5l
+ZHUxHjAcBgkqhkiG9w0BCQEWD3NjcmlwdHNAbWl0LmVkdTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAtT4hTcGJawGMR4D+szcndvhSQeaiPUt2eOXyZjwPsa37
+l48uorZT07YO4mb5uQu3zrTV9RwfbyJ9SPVt8BbNjkh50RRKFC8v+MS9HYfPfYtc
+d61YJLAOoW3WCsfYvC9nZchd2NgxwmdLSvShpVSCr8s0CCoEf458TLfb3GqKXYEC
+AwEAAaOBqzCBqDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIF4DAnBgNVHSUE
+IDAeBggrBgEFBQcDAQYIKwYBBQUHAwQGCCsGAQUFBwMCMAsGA1UdDwQEAwIF4DAd
+BgNVHQ4EFgQUVBF8CVVEHJRFqaJ2RissJCZqROgwMwYDVR0fBCwwKjAooCagJIYi
+aHR0cDovL2NhLm1pdC5lZHUvY2EvbWl0c2VydmVyLmNybDANBgkqhkiG9w0BAQUF
+AAOBgQBHxfCGRiibxOw4L6NLXhF3Hh6B7II/3jYUD79uW3RVHLYbsq53/0CuIkPT
+nvkFqrpU3jnk+rvkVJiU+LQzJhUaHwFQW47Srf90aZj4e7d8kqpaUbyZqE93qAul
+kwOMMhJm9ZqLwkdutIvp+a0/CosCeLdF0RYDLGV79IMul6D7mg==
+-----END CERTIFICATE-----
+
Index: branches/fc15-dev/server/fedora/config/etc/pki/tls/openssl.cnf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/pki/tls/openssl.cnf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/pki/tls/openssl.cnf	(revision 1803)
@@ -0,0 +1,318 @@
+#
+# OpenSSL example configuration file.
+# This is mostly being used for generation of certificate requests.
+#
+
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME			= .
+RANDFILE		= $ENV::HOME/.rnd
+
+# Extra OBJECT IDENTIFIER info:
+#oid_file		= $ENV::HOME/.oid
+oid_section		= new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions		= 
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+
+# We can add new OIDs in here for use by 'ca' and 'req'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+####################################################################
+[ ca ]
+default_ca	= CA_default		# The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir		= ../../CA		# Where everything is kept
+certs		= $dir/certs		# Where the issued certs are kept
+crl_dir		= $dir/crl		# Where the issued crl are kept
+database	= $dir/index.txt	# database index file.
+#unique_subject	= no			# Set to 'no' to allow creation of
+					# several ctificates with same subject.
+new_certs_dir	= $dir/newcerts		# default place for new certs.
+
+certificate	= $dir/cacert.pem 	# The CA certificate
+serial		= $dir/serial 		# The current serial number
+crlnumber	= $dir/crlnumber	# the current crl number
+					# must be commented out to leave a V1 CRL
+crl		= $dir/crl.pem 		# The current CRL
+private_key	= $dir/private/cakey.pem# The private key
+RANDFILE	= $dir/private/.rand	# private random number file
+
+x509_extensions	= usr_cert		# The extentions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt 	= ca_default		# Subject Name options
+cert_opt 	= ca_default		# Certificate field options
+
+# Extension copying option: use with caution.
+# copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+# crl_extensions	= crl_ext
+
+default_days	= 365			# how long to certify for
+default_crl_days= 30			# how long before next CRL
+default_md	= sha1			# which md to use.
+preserve	= no			# keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy		= policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName		= match
+stateOrProvinceName	= match
+organizationName	= match
+organizationalUnitName	= optional
+commonName		= supplied
+emailAddress		= optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName		= optional
+stateOrProvinceName	= optional
+localityName		= optional
+organizationName	= optional
+organizationalUnitName	= optional
+commonName		= supplied
+emailAddress		= optional
+
+####################################################################
+[ req ]
+default_bits		= 1024
+default_md		= sha1
+default_keyfile 	= privkey.pem
+distinguished_name	= req_distinguished_name
+attributes		= req_attributes
+x509_extensions	= v3_ca	# The extentions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+# input_password = secret
+# output_password = secret
+
+# This sets a mask for permitted string types. There are several options. 
+# default: PrintableString, T61String, BMPString.
+# pkix	 : PrintableString, BMPString.
+# utf8only: only UTF8Strings.
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
+# so use this option with caution!
+# we use PrintableString+UTF8String mask so if pure ASCII texts are used
+# the resulting certificates are compatible with Netscape
+string_mask = MASK:0x2002
+
+# req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName			= Country Name (2 letter code)
+countryName_default		= US
+countryName_min			= 2
+countryName_max			= 2
+
+stateOrProvinceName		= State or Province Name (full name)
+stateOrProvinceName_default	= Massachusetts
+
+localityName			= Locality Name (eg, city)
+localityName_default		= Cambridge
+
+0.organizationName		= Organization Name (eg, company)
+0.organizationName_default	= Massachusetts Institute of Technology
+
+# we can do this but it is not needed normally :-)
+#1.organizationName		= Second Organization Name (eg, company)
+#1.organizationName_default	= World Wide Web Pty Ltd
+
+organizationalUnitName		= OU
+organizationalUnitName_default	= scripts.mit.edu web hosting service
+
+commonName			= Common Name (eg, your name or your server\'s hostname)
+commonName_max			= 64
+
+emailAddress			= Email Address
+emailAddress_max		= 64
+emailAddress_default		= scripts@mit.edu
+
+# SET-ex3			= SET extension number 3
+
+[ req_attributes ]
+challengePassword		= A challenge password
+challengePassword_min		= 4
+challengePassword_max		= 20
+
+unstructuredName		= An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# Here are some examples of the usage of nsCertType. If it is omitted
+# the certificate can be used for anything *except* object signing.
+
+# This is OK for an SSL server.
+# nsCertType			= server
+
+# For an object signing certificate this would be used.
+# nsCertType = objsign
+
+# For normal client use this is typical
+# nsCertType = client, email
+
+# and for everything including object signing:
+# nsCertType = client, email, objsign
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# This will be displayed in Netscape's comment listbox.
+nsComment			= "OpenSSL Generated Certificate"
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
+#nsBaseUrl
+#nsRevocationUrl
+#nsRenewalUrl
+#nsCaPolicyUrl
+#nsSslServerName
+
+[ v3_req ]
+
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer:always
+
+# This is what PKIX recommends but some broken software chokes on critical
+# extensions.
+#basicConstraints = critical,CA:true
+# So we do this instead.
+basicConstraints = CA:true
+
+# Key usage: this is typical for a CA certificate. However since it will
+# prevent it being used as an test self-signed certificate it is best
+# left out by default.
+# keyUsage = cRLSign, keyCertSign
+
+# Some might want this also
+# nsCertType = sslCA, emailCA
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always,issuer:always
+
+[ proxy_cert_ext ]
+# These extensions should be added when creating a proxy certificate
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# Here are some examples of the usage of nsCertType. If it is omitted
+# the certificate can be used for anything *except* object signing.
+
+# This is OK for an SSL server.
+# nsCertType			= server
+
+# For an object signing certificate this would be used.
+# nsCertType = objsign
+
+# For normal client use this is typical
+# nsCertType = client, email
+
+# and for everything including object signing:
+# nsCertType = client, email, objsign
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# This will be displayed in Netscape's comment listbox.
+nsComment			= "OpenSSL Generated Certificate"
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer:always
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
+#nsBaseUrl
+#nsRevocationUrl
+#nsRenewalUrl
+#nsCaPolicyUrl
+#nsSslServerName
+
+# This really needs to be in place for it to be a proxy certificate.
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
Index: branches/fc15-dev/server/fedora/config/etc/postfix/main.cf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/postfix/main.cf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/postfix/main.cf	(revision 1803)
@@ -0,0 +1,34 @@
+#biff = no
+
+# appending .domain is the MUA's job.
+#append_dot_mydomain = no
+
+# Uncomment the next line to generate "delayed mail" warnings
+#delay_warning_time = 4h
+
+alias_maps = hash:/etc/aliases
+alias_database = hash:/etc/aliases
+myorigin = scripts.mit.edu
+mydestination = scripts.mit.edu, scripts, $myhostname, scripts-test.mit.edu, scripts-test, scripts-vhosts.mit.edu, scripts-vhosts, localhost
+relayhost =
+mynetworks = 127.0.0.0/8
+mailbox_command = /usr/bin/procmail -t -a "${EXTENSION}" ~/mail_scripts/procmailrc
+mailbox_size_limit = 0
+recipient_delimiter = +
+inet_interfaces = all
+readme_directory = /usr/share/doc/postfix-2.7.3/README_FILES
+sample_directory = /usr/share/doc/postfix-2.7.3/samples
+sendmail_path = /usr/sbin/sendmail
+html_directory = no
+setgid_group = postdrop
+command_directory = /usr/sbin
+manpage_directory = /usr/share/man
+daemon_directory = /usr/libexec/postfix
+newaliases_path = /usr/bin/newaliases
+mailq_path = /usr/bin/mailq
+queue_directory = /var/spool/postfix
+mail_owner = postfix
+virtual_alias_domains = hash:/etc/postfix/virtual, regexp:/etc/postfix/virtual_re, ldap:/etc/postfix/virtual-alias-domains-ldap.cf
+virtual_alias_maps = hash:/etc/postfix/virtual, regexp:/etc/postfix/virtual_re, ldap:/etc/postfix/virtual-alias-maps-ldap.cf
+data_directory = /var/lib/postfix
+authorized_submit_users = !/etc/postfix/blocked_users, static:all
Index: branches/fc15-dev/server/fedora/config/etc/postfix/virtual
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/postfix/virtual	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/postfix/virtual	(revision 1803)
@@ -0,0 +1,7 @@
+webmaster@szs.mit.edu jdaniel@mit.edu
+webmaster@webzephyr.mit.edu jdaniel@mit.edu
+@szs.mit.edu webzephyr
+@webzephyr.mit.edu webzephyr
+# Domains also match here
+szs.mit.edu true
+webzephyr.mit.edu true
Index: branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-domains-ldap.cf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-domains-ldap.cf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-domains-ldap.cf	(revision 1803)
@@ -0,0 +1,21 @@
+# Find any vhost with a name or alias matching the domain of the e-mail
+# address.  We're queried with only the domain portion to determine whether
+# we accept mail at all for a given domain.  If we have no matching vhost
+# and return no records, Postfix will reject mail with a "Relay access denied"
+# error, unless the domain is configured in $mydestination.  We don't match
+# the scripts.mit.edu vhost here because otherwise it'll be treated as a
+# virtual alias domain and once we resolve an address to a scripts account,
+# we'll end up resolving the locker@scripts.mit.edu address to go to the
+# owners of the scripts.mit.edu vhost.  The value we return (if we return
+# anything at all) is supposedly arbitrary.  We choose to return the same
+# value we were queried with (the domain whose mail we host).  Protocol
+# version 3 is necessary to use ldapi.
+
+server_host = ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/
+search_base = ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+query_filter = (&(objectClass=scriptsVhost)(|(scriptsVhostName=%s)(scriptsVhostAlias=%s))(!(scriptsVhostName=scripts.mit.edu)))
+result_attribute = scriptsVhostName
+result_format = %S
+bind = no
+version = 3
+
Index: branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-maps-ldap.cf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-maps-ldap.cf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/postfix/virtual-alias-maps-ldap.cf	(revision 1803)
@@ -0,0 +1,22 @@
+# Find any vhost with a name or alias matching the domain of the e-mail
+# address.  We're queried with an entire e-mail address, but are only
+# interested in checking whether the domain portion corresponds to a
+# vhost; we'll simply deliver any mail for the vhost to its owner, regardless
+# of the lefthand side of the address.  %d extracts only the domain.
+# We don't match the scripts.mit.edu vhost here because we don't want
+# to first resolve an arbitrary address to a scripts account, and then
+# end up sending their mail to the owners of the scripts.mit.edu vhost.
+# Once we've found the scriptsVhost object corresponding to the domain
+# the e-mail is for, we recursively search the suffix for the vhost's
+# scriptsVhostAccount, and take the uid from that object.  This uid is
+# the name of the locker that owns the vhost.  Protocol version 3 is
+# necessary to use ldapi.
+
+server_host = ldapi://%2fvar%2frun%2fdirsrv%2fslapd-scripts.socket/
+search_base = ou=VirtualHosts,dc=scripts,dc=mit,dc=edu
+query_filter = (&(objectClass=scriptsVhost)(|(scriptsVhostName=%d)(scriptsVhostAlias=%d))(!(scriptsVhostName=scripts.mit.edu)))
+result_attribute = uid
+special_result_attribute = scriptsVhostAccount
+bind = no
+version = 3
+
Index: branches/fc15-dev/server/fedora/config/etc/postfix/virtual_re
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/postfix/virtual_re	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/postfix/virtual_re	(revision 1803)
@@ -0,0 +1,3 @@
+/^(.*)@scripts.mit.edu$/ $1@scripts.mit.edu
+/^(.*)@([^@]*)\.scripts\.mit\.edu$/ $2+$1
+/^([^@]*)\.scripts\.mit\.edu$/ true
Index: branches/fc15-dev/server/fedora/config/etc/printcap
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/printcap	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/printcap	(revision 1803)
@@ -0,0 +1,3 @@
+# This file was automatically generated by cupsd(8) from the
+# /etc/cups/printers.conf file.  All changes to this file
+# will be lost.
Index: branches/fc15-dev/server/fedora/config/etc/rc.d/rc.local
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/rc.d/rc.local	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/rc.d/rc.local	(revision 1803)
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+touch /var/lock/subsys/local
+
+if [ -r "/afs/athena.mit.edu" ]; then
+	/sbin/service postfix start
+fi
+
+/bin/mkdir -pm 1773 /tmp/sessions
Index: branches/fc15-dev/server/fedora/config/etc/resolv.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/resolv.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/resolv.conf	(revision 1803)
@@ -0,0 +1,2 @@
+search mit.edu
+nameserver 127.0.0.1
Index: branches/fc15-dev/server/fedora/config/etc/scripts/modprobe
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/scripts/modprobe	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/scripts/modprobe	(revision 1803)
@@ -0,0 +1,19 @@
+#!/bin/sh
+if [ $# -eq 3 ] && [ "$1" = "-q" ] && [ "$2" = "--" ] && [ "$3" = "binfmt-464c" ]; then
+    # 464c are the second two bytes of the ELF magic.  This module
+    # doesn't exist; being called for it indicates the in-kernel
+    # binfmt_elf decided to return ENOEXEC for this ELF file for some
+    # reason.
+    exit 1
+fi
+(
+    echo "Ignoring request from kernel: modprobe $*"
+    stacks=$(grep -ls request_module /proc/*/stack)
+    if [ "$stacks" ]; then
+	ps -Lfwp $(for stack in $stacks; do
+		proc="${stack%/stack}"
+		echo "${proc#/proc/}";
+	    done)
+    fi
+) | logger -p authpriv.info
+false
Index: branches/fc15-dev/server/fedora/config/etc/security/limits.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/security/limits.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/security/limits.conf	(revision 1803)
@@ -0,0 +1,60 @@
+# /etc/security/limits.conf
+#
+#Each line describes a limit for a user in the form:
+#
+#<domain>        <type>  <item>  <value>
+#
+#Where:
+#<domain> can be:
+#        - an user name
+#        - a group name, with @group syntax
+#        - the wildcard *, for default entry
+#        - the wildcard %, can be also used with %group syntax,
+#                 for maxlogin limit
+#
+#<type> can have the two values:
+#        - "soft" for enforcing the soft limits
+#        - "hard" for enforcing hard limits
+#
+#<item> can be one of the following:
+#        - core - limits the core file size (KB)
+#        - data - max data size (KB)
+#        - fsize - maximum filesize (KB)
+#        - memlock - max locked-in-memory address space (KB)
+#        - nofile - max number of open files
+#        - rss - max resident set size (KB)
+#        - stack - max stack size (KB)
+#        - cpu - max CPU time (MIN)
+#        - nproc - max number of processes
+#        - as - address space limit (KB)
+#        - maxlogins - max number of logins for this user
+#        - maxsyslogins - max number of logins on the system
+#        - priority - the priority to run user process with
+#        - locks - max number of file locks the user can hold
+#        - sigpending - max number of pending signals
+#        - msgqueue - max memory used by POSIX message queues (bytes)
+#        - nice - max nice priority allowed to raise to values: [-20, 19]
+#        - rtprio - max realtime priority
+#
+#<domain>      <type>  <item>         <value>
+#
+
+# No limits for root
+root             -
+scripts-build    -
+
+# For everyone else,
+*                soft    core            0
+*                -       rss             524268
+*                -       data            1048576
+*                -       as              1572864
+
+#*               soft    core            0
+#*               hard    rss             10000
+#@student        hard    nproc           20
+#@faculty        soft    nproc           20
+#@faculty        hard    nproc           50
+#ftp             hard    nproc           0
+#@student        -       maxlogins       4
+
+# End of file
Index: branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/userhelper_context
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/userhelper_context	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/userhelper_context	(revision 1803)
@@ -0,0 +1,1 @@
+user_u:user_r:user_setuid_t:s0
Index: branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/users/root
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/users/root	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/selinux/strict/contexts/users/root	(revision 1803)
@@ -0,0 +1,9 @@
+system_r:local_login_t:s0  sysadm_r:sysadm_t:s0 staff_r:staff_t:s0 user_r:user_t:s0
+system_r:crond_t:s0	sysadm_r:sysadm_crond_t:s0 staff_r:staff_crond_t:s0 user_r:user_crond_t:s0
+staff_r:staff_su_t:s0	sysadm_r:sysadm_t:s0 staff_r:staff_t:s0 user_r:user_t:s0
+sysadm_r:sysadm_su_t:s0	sysadm_r:sysadm_t:s0 staff_r:staff_t:s0 user_r:user_t:s0
+user_r:user_su_t:s0	sysadm_r:sysadm_t:s0 staff_r:staff_t:s0 user_r:user_t:s0
+#
+# Uncomment if you want to automatically login as sysadm_r
+#
+#system_r:sshd_t:s0 sysadm_r:sysadm_t:s0 staff_r:staff_t:s0 user_r:user_t:s0
Index: branches/fc15-dev/server/fedora/config/etc/snmp/snmpd.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/snmp/snmpd.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/snmp/snmpd.conf	(revision 1803)
@@ -0,0 +1,1 @@
+rocommunity public
Index: branches/fc15-dev/server/fedora/config/etc/ssh/shosts.equiv
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ssh/shosts.equiv	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ssh/shosts.equiv	(revision 1803)
@@ -0,0 +1,18 @@
+better-mousetrap.mit.edu
+old-faithful.mit.edu
+bees-knees.mit.edu
+cats-whiskers.mit.edu
+pancake-bunny.mit.edu
+busy-beaver.mit.edu
+real-mccoy.mit.edu
+shining-armor.mit.edu
+whole-enchilada.mit.edu
+172.21.0.53
+172.21.0.57
+172.21.0.167
+172.21.0.228
+172.21.0.237
+172.21.0.234
+172.21.0.235
+172.21.0.135
+172.21.0.236
Index: branches/fc15-dev/server/fedora/config/etc/ssh/ssh_config
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ssh/ssh_config	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ssh/ssh_config	(revision 1803)
@@ -0,0 +1,56 @@
+#	$OpenBSD: ssh_config,v 1.23 2007/06/08 04:40:40 pvalchev Exp $
+
+# This is the ssh client system-wide configuration file.  See
+# ssh_config(5) for more information.  This file provides defaults for
+# users, and the values can be changed in per-user configuration files
+# or on the command line.
+
+# Configuration data is parsed as follows:
+#  1. command line options
+#  2. user-specific file
+#  3. system-wide file
+# Any configuration value is only changed the first time it is set.
+# Thus, host-specific definitions should be at the beginning of the
+# configuration file, and defaults at the end.
+
+# Site-wide defaults for some commonly used options.  For a comprehensive
+# list of available options, their meanings and defaults, please see the
+# ssh_config(5) man page.
+
+# Host *
+#   ForwardAgent no
+#   ForwardX11 no
+#   RhostsRSAAuthentication no
+#   RSAAuthentication yes
+   EnableSSHKeysign yes
+   PasswordAuthentication no
+   HostbasedAuthentication yes
+#   GSSAPIAuthentication no
+#   GSSAPIDelegateCredentials no
+#   BatchMode no
+#   CheckHostIP yes
+#   AddressFamily any
+#   ConnectTimeout 0
+#   StrictHostKeyChecking ask
+#   IdentityFile ~/.ssh/identity
+#   IdentityFile ~/.ssh/id_rsa
+#   IdentityFile ~/.ssh/id_dsa
+#   Port 22
+#   Protocol 2,1
+#   Cipher 3des
+#   Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
+#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
+#   EscapeChar ~
+#   Tunnel no
+#   TunnelDevice any:any
+#   PermitLocalCommand no
+Host *
+	GSSAPIAuthentication yes
+# If this option is set to yes then remote X11 clients will have full access
+# to the original X11 display. As virtually no X11 client supports the untrusted
+# mode correctly we set this to yes.
+	ForwardX11Trusted yes
+# Send locale-related environment variables
+	SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES 
+	SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT 
+	SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
Index: branches/fc15-dev/server/fedora/config/etc/ssh/ssh_known_hosts
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ssh/ssh_known_hosts	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ssh/ssh_known_hosts	(revision 1803)
@@ -0,0 +1,9 @@
+real-mccoy.mit.edu,real-mccoy,r-m.mit.edu,r-m,scripts8.mit.edu,scripts8,18.181.0.235,172.21.0.235 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+busy-beaver.mit.edu,busy-beaver,b-b.mit.edu,b-b,scripts7.mit.edu,scripts7,18.181.0.234,172.21.0.234 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+pancake-bunny.mit.edu,pancake-bunny,p-b.mit.edu,p-b,scripts6.mit.edu,scripts6,18.181.0.237,172.21.0.237 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+cats-whiskers.mit.edu,cats-whiskers,c-w.mit.edu,c-w,scripts4.mit.edu,scripts4,18.181.0.228,172.21.0.228 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+bees-knees.mit.edu,bees-knees,b-k.mit.edu,b-k,scripts3.mit.edu,scripts3,18.181.0.167,172.21.0.167 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+better-mousetrap.mit.edu,better-mousetrap,b-m.mit.edu,b-m,scripts1.mit.edu,scripts1,18.181.0.57,172.21.0.57 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+old-faithful.mit.edu,old-faithful,o-f.mit.edu,o-f,scripts2.mit.edu,scripts2,18.181.0.53,172.21.0.53 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+whole-enchilada.mit.edu,whole-enchilada,w-e.mit.edu,w-e,scripts5.mit.edu,scripts5,18.181.0.236,172.21.0.236 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
+shining-armor.mit.edu,shining-armor,s-a.mit.edu,s-a,scripts9.mit.edu,scripts9,18.181.0.135,172.21.0.135 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuEpkEgaIgjK7F1gV81lLSYTwSqIZX/9IJs37VaJCsJFv3D86uuJSdfI3Y94fPn2OH6AxfdaqGNksVdi27mKQfzvCB4ogjQgxmM391MIDLd+izZDY0YvCb4DqJLMJUpX49cNUMkj+/rJg1O0K2w/lb8DGr7wdoLSPKCUJNJv5WMMDxpFL253lPELsmnds4T+R6LpTt6W9+FalHl84me51sEjV9PbmhcTaNwuoJStAjhrKPfgHHDIKNyCUvaVkoHPXEsdzz00yY7i57djyZlzPV/jM7LKar+Xw2LB0Z3098IQcdbD8zmz2DdakPTlShxavNPC6kZDZ3WVqziC+bszaSQ==
Index: branches/fc15-dev/server/fedora/config/etc/ssh/sshd_config
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/ssh/sshd_config	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/ssh/sshd_config	(revision 1803)
@@ -0,0 +1,22 @@
+Protocol 2
+SyslogFacility AUTHPRIV
+PasswordAuthentication no
+ChallengeResponseAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+GSSAPIStrictAcceptorCheck no
+UsePAM yes
+AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
+AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
+AcceptEnv LC_IDENTIFICATION LC_ALL
+AcceptEnv EDITOR VISUAL
+X11Forwarding no
+Banner /etc/issue.net
+Subsystem sftp /usr/libexec/openssh/sftp-server
+LogLevel VERBOSE
+
+# See trac #23
+HostbasedAuthentication yes
+IgnoreRhosts yes
+IgnoreUserKnownHosts yes
+DenyUsers root@old-faithful.mit.edu root@better-mousetrap.mit.edu root@bees-knees.mit.edu root@cats-whiskers.mit.edu root@pancake-bunny.mit.edu root@busy-beaver.mit.edu root@real-mccoy.mit.edu root@whole-enchilada.mit.edu root@shining-armor.mit.edu
Index: branches/fc15-dev/server/fedora/config/etc/sudoers
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sudoers	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sudoers	(revision 1803)
@@ -0,0 +1,79 @@
+## Sudoers allows particular users to run various commands as
+## the root user, without needing the root password.
+##
+## Examples are provided at the bottom of the file for collections
+## of related commands, which can then be delegated out to particular
+## users or groups.
+## 
+## This file must be edited with the 'visudo' command.
+
+## Host Aliases
+## Groups of machines. You may prefer to use hostnames (perhaps using 
+## wildcards for entire domains) or IP addresses instead.
+# Host_Alias     FILESERVERS = fs1, fs2
+# Host_Alias     MAILSERVERS = smtp, smtp2
+
+## User Aliases
+## These aren't often necessary, as you can use regular groups
+## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
+## rather than USERALIAS
+# User_Alias ADMINS = jsmith, mikem
+
+
+## Command Aliases
+## These are groups of related commands...
+
+## Networking
+Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
+
+## Installation and management of software
+Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
+
+## Services
+Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
+
+## Updating the locate database
+Cmnd_Alias LOCATE = /usr/bin/updatedb
+
+## Storage
+Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
+
+## Delegating permissions
+Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp 
+
+## Processes
+Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
+
+## Drivers
+Cmnd_Alias DRIVERS = /sbin/modprobe
+
+#Defaults    requiretty
+
+Defaults    env_reset
+Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
+Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
+Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
+Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
+Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
+Defaults    env_keep += "USE_NEWLINES"
+
+## Next comes the main part: which users can run what software on 
+## which machines (the sudoers file can be shared between multiple
+## systems).
+## Syntax:
+##
+## 	user	MACHINE=COMMANDS
+##
+## The COMMANDS section may have other options added to it.
+##
+## Allow root to run any commands anywhere 
+root	ALL=(ALL) 	ALL
+
+scripts	ALL=(root)	NOPASSWD: /usr/local/sbin/ldap-backup ""
+rebecca	ALL=(root)	NOPASSWD: /sbin/service nscd restart
+nrpe	ALL=(signup)	NOPASSWD: /etc/nagios/check_ldap_mmr.real
+
+Defaults:munin !syslog
+
+munin ALL=(root) SETENV: NOPASSWD: /etc/munin/plugins/postfix_mailqueue , /etc/munin/plugins/postfix_mailvolume , /etc/munin/plugins/hddtemp_smartctl , /etc/munin/plugins/sendmail* , /etc/munin/plugins/if_* , /etc/munin/plugins/if_err_eth2
+munin ALL=(root) NOPASSWD: /etc/munin/plugins/smart_*, /etc/munin/plugins/sensors_*
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/crond
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/crond	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/crond	(revision 1803)
@@ -0,0 +1,12 @@
+# Settings for the CRON daemon.
+# CRONDARGS= :  any extra command-line startup arguments for crond
+# CRON_VALIDATE_MAILRCPTS=1:a non-empty value of this variable will
+#                           enable vixie-cron-4.1's validation of 
+#                           mail recipient names, which would then be
+#                           restricted to contain only the chars
+#                           from this tr(1) set : [@!:%-_.,:alnum:]
+#                           otherwise mailing is not attempted.
+CRONDARGS="-m '/usr/sbin/sendmail -FCronDaemon -i -odi -oem -oi -t'"
+
+# Force crond to always run with tokens
+su -c '/home/afsagent/renew' -l afsagent || :
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/dirsrv
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/dirsrv	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/dirsrv	(revision 1803)
@@ -0,0 +1,55 @@
+# This file is sourced by dirsrv upon startup to set
+# the default environment for all directory server instances.
+# To set instance specific defaults, use the file in the same
+# directory called dirsrv-instance where "instance"
+# is the name of your directory server instance e.g.
+# dirsrv-localhost for the slapd-localhost instance.
+
+# In order to make more file descriptors available
+# to the directory server, first make sure the system
+# hard limits are raised, then use ulimit - uncomment
+# out the following line and change the value to the
+# desired value
+# ulimit -n 8192
+
+# A per instance keytab does not make much sense for servers.
+# Kerberos clients use the machine FQDN to obtain a ticket like ldap/FQDN, there
+# is nothing that can make a client understand how to get a per-instance ticket.
+# Therefore by default a keytab should be considered a per server option.
+
+# Also this file is sourced for all instances, so again all
+# instances would ultimately get the same keytab.
+
+# Finally a keytab is normally named either krb5.keytab or <service>.keytab
+
+# In order to use SASL/GSSAPI (Kerberos) the directory
+# server needs to know where to find its keytab
+# file - uncomment the following line and set
+# the path and filename appropriately
+KRB5_KTNAME=/etc/dirsrv/keytab ; export KRB5_KTNAME
+
+# Use a disk ccache instead of a memory one (this is renewed by the
+# slapdagent cronjob) -- geofft 30 October 2010
+KRB5CCNAME=/var/run/dirsrv/krb5cc; export KRB5CCNAME
+/usr/kerberos/bin/kinit -k -t "$KRB5_KTNAME" ldap/"$(hostname)"
+chown --reference="$KRB5_KTNAME" "$KRB5CCNAME"
+
+# other environment settings can be added here too
+OS=`uname -s`
+# use the new mt slab memory allocator on Solaris
+# this requires Solaris 9 update 3 or later
+if [ "$OS" = "SunOS" -a -f /usr/lib/libumem.so ] ; then
+    LD_PRELOAD=/usr/lib/libumem.so
+    export LD_PRELOAD
+fi
+if [ "$OS" = "SunOS" -a -f /usr/lib/64/libumem.so ] ; then
+    LD_PRELOAD_64=/usr/lib/64/libumem.so
+    export LD_PRELOAD_64
+fi
+
+# how many seconds to wait for the startpid file to show
+# up before we assume there is a problem and fail to start
+#STARTPID_TIME=10 ; export STARTPID_TIME
+# how many seconds to wait for the pid file to show
+# up before we assume there is a problem and fail to start
+#PID_TIME=600 ; export PID_TIME
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/freshclam
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/freshclam	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/freshclam	(revision 1803)
@@ -0,0 +1,24 @@
+## When changing the periodicity of freshclam runs in the crontab,
+## this value must be adjusted also. Its value is the timespan between
+## two subsequent freshclam runs in minutes. E.g. for the default
+##
+## | 0 */3 * * *  ...
+##
+## crontab line, the value is 180 (minutes).
+# FRESHCLAM_MOD=
+
+## A predefined value for the delay in seconds. By default, the value is
+## calculated by the 'hostid' program. This predefined value guarantees
+## constant timespans of 3 hours between two subsequent freshclam runs.
+##
+## This option accepts two special values:
+## 'disabled-warn'  ...  disables the automatic freshclam update and
+##                         gives out a warning
+## 'disabled'       ...  disables the automatic freshclam silently
+# FRESHCLAM_DELAY=
+
+
+### !!!!! REMOVE ME !!!!!!
+### REMOVE ME: By default, the freshclam update is disabled to avoid
+### REMOVE ME: network access without prior activation
+#FRESHCLAM_DELAY=disabled-warn	# REMOVE ME
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/httpd
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/httpd	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/httpd	(revision 1803)
@@ -0,0 +1,22 @@
+# Configuration file for the httpd service.
+
+#
+# The default processing model (MPM) is the process-based
+# 'prefork' model.  A thread-based model, 'worker', is also
+# available, but does not work with some modules (such as PHP).
+# The service must be stopped before changing this variable.
+#
+HTTPD=/usr/sbin/httpd.worker
+
+#
+# To pass additional options (for instance, -D definitions) to the
+# httpd binary at startup, set OPTIONS here.
+#
+#OPTIONS=
+
+#
+# By default, the httpd process is started in the C locale; to 
+# change the locale in which the server runs, the HTTPD_LANG
+# variable can be set.
+#
+#HTTPD_LANG=C
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables	(revision 1803)
@@ -0,0 +1,8 @@
+# Generated by iptables-save v1.3.5 on Tue Jul 18 01:46:04 2006
+*filter
+:INPUT ACCEPT [0:0]
+-A INPUT -p udp -m udp --dport 161 ! -s 18.0.0.0/8 -j REJECT
+:FORWARD ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+COMMIT
+# Completed on Tue Jul 18 01:46:04 2006
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables-config
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables-config	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/iptables-config	(revision 1803)
@@ -0,0 +1,48 @@
+# Load additional iptables modules (nat helpers)
+#   Default: -none-
+# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
+# are loaded after the firewall rules are applied. Options for the helpers are
+# stored in /etc/modprobe.conf.
+IPTABLES_MODULES=""
+
+# Unload modules on restart and stop
+#   Value: yes|no,  default: yes
+# This option has to be 'yes' to get to a sane state for a firewall
+# restart or stop. Only set to 'no' if there are problems unloading netfilter
+# modules.
+IPTABLES_MODULES_UNLOAD="yes"
+
+# Save current firewall rules on stop.
+#   Value: yes|no,  default: no
+# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
+# (e.g. on system shutdown).
+IPTABLES_SAVE_ON_STOP="no"
+
+# Save current firewall rules on restart.
+#   Value: yes|no,  default: no
+# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
+# restarted.
+IPTABLES_SAVE_ON_RESTART="no"
+
+# Save (and restore) rule and chain counter.
+#   Value: yes|no,  default: no
+# Save counters for rules and chains to /etc/sysconfig/iptables if
+# 'service iptables save' is called or on stop or restart if SAVE_ON_STOP or
+# SAVE_ON_RESTART is enabled.
+IPTABLES_SAVE_COUNTER="no"
+
+# Numeric status output
+#   Value: yes|no,  default: yes
+# Print IP addresses and port numbers in numeric format in the status output.
+IPTABLES_STATUS_NUMERIC="yes"
+
+# Verbose status output
+#   Value: yes|no,  default: yes
+# Print info about the number of packets and bytes plus the "input-" and
+# "outputdevice" in the status output.
+IPTABLES_STATUS_VERBOSE="no"
+
+# Status output with numbered lines
+#   Value: yes|no,  default: yes
+# Print a counter/number for every rule in the status output.
+IPTABLES_STATUS_LINENUMBERS="yes"
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:0
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:0	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:0	(revision 1803)
@@ -0,0 +1,5 @@
+DEVICE=lo:0
+IPADDR=18.181.0.46
+NETMASK=255.255.255.255
+NETWORK=18.181.0.0
+ONBOOT=yes
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:1
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:1	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:1	(revision 1803)
@@ -0,0 +1,5 @@
+DEVICE=lo:1
+IPADDR=18.181.0.50
+NETMASK=255.255.255.255
+NETWORK=18.181.0.0
+ONBOOT=yes
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:2
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:2	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:2	(revision 1803)
@@ -0,0 +1,5 @@
+DEVICE=lo:2
+IPADDR=18.181.0.49
+NETMASK=255.255.255.255
+NETWORK=18.181.0.0
+ONBOOT=yes
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:3
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:3	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/ifcfg-lo:3	(revision 1803)
@@ -0,0 +1,5 @@
+DEVICE=lo:3
+IPADDR=18.181.0.43
+NETMASK=255.255.255.255
+NETWORK=18.181.0.0
+ONBOOT=yes
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/route-eth1
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/route-eth1	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/network-scripts/route-eth1	(revision 1803)
@@ -0,0 +1,13 @@
+18.181.0.47 via 172.21.0.47
+18.181.0.55 via 172.21.0.55
+18.181.0.56 via 172.21.0.56
+18.181.0.52 via 172.21.0.52
+18.181.0.57 via 172.21.0.57
+18.181.0.53 via 172.21.0.53
+18.181.0.167 via 172.21.0.167
+18.181.0.228 via 172.21.0.228
+18.181.0.236 via 172.21.0.236
+18.181.0.237 via 172.21.0.237
+18.181.0.234 via 172.21.0.234
+18.181.0.235 via 172.21.0.235
+18.181.0.135 via 172.21.0.135
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/networking/profiles/default/resolv.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/networking/profiles/default/resolv.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/networking/profiles/default/resolv.conf	(revision 1803)
@@ -0,0 +1,2 @@
+search mit.edu
+nameserver 127.0.0.1
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/openafs
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/openafs	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/openafs	(revision 1803)
@@ -0,0 +1,21 @@
+AFSD_ARGS="-afsdb -dynroot -fakestat-all -stat 25000 -daemons 100 -volumes 400 -files 400000 -chunksize 19"
+BOSSERVER_ARGS=
+
+postinit () {
+	/sbin/sysctl -q afs.GCPAGs=0
+	/usr/bin/fs setcrypt on
+	case "$(lsb_release -cs)" in
+	  Moonshine)
+	    /usr/bin/fs sysname 'amd64_fedora7_scripts' 'scripts' 'amd64_fedora7' 'amd64_linux26' 'i386_rhel4' 'i386_rhel3' 'i386_rh9' 'i386_linux26' 'i386_linux24' 'i386_linux22' 'i386_linux3' 'i386_linux2' 'i386_linux1' ;;
+	  Sulphur)
+	    /usr/bin/fs sysname 'amd64_fedora9_scripts' 'amd64_fedora7_scripts' 'scripts' 'amd64_fedora9' 'amd64_fedora7' 'amd64_linux26' 'i386_deb40' 'i386_rhel4' 'i386_rhel3' 'i386_rh9' 'i386_linux26' 'i386_linux24' 'i386_linux22' 'i386_linux3' 'i386_linux2' ;;
+	  Leonidas)
+	    /usr/bin/fs sysname 'amd64_fedora11_scripts' 'amd64_fedora9_scripts' 'amd64_fedora7_scripts' 'scripts' 'amd64_fedora11' 'amd64_fedora9' 'amd64_fedora7' 'amd64_linux26' 'i386_deb50' 'i386_deb40' 'i386_rhel4' 'i386_rhel3' 'i386_rh9' 'i386_linux26' 'i386_linux24' 'i386_linux22' 'i386_linux3' 'i386_linux2' ;;
+	  Goddard)
+	    /usr/bin/fs sysname 'amd64_fedora13_scripts' 'amd64_fedora11_scripts' 'amd64_fedora9_scripts' 'amd64_fedora7_scripts' 'scripts' 'amd64_fedora13' 'amd64_fedora11' 'amd64_fedora9' 'amd64_fedora7' 'amd64_linux26' 'i386_deb50' 'i386_deb40' 'i386_rhel4' 'i386_rhel3' 'i386_rh9' 'i386_linux26' 'i386_linux24' 'i386_linux22' 'i386_linux3' 'i386_linux2' ;;
+	  *)
+	    echo "Warning: unknown platform. AFS sysname not set."
+	esac
+	/usr/bin/fs setcell -nosuid -c athena
+}
+AFS_POST_INIT=postinit
Index: branches/fc15-dev/server/fedora/config/etc/sysconfig/sysstat
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysconfig/sysstat	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysconfig/sysstat	(revision 1803)
@@ -0,0 +1,2 @@
+# How long to keep log files (days), maximum is a month
+HISTORY=30
Index: branches/fc15-dev/server/fedora/config/etc/sysctl.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/sysctl.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/sysctl.conf	(revision 1803)
@@ -0,0 +1,15 @@
+net.ipv4.ip_forward = 1
+net.ipv4.conf.all.rp_filter = 2
+net.ipv4.conf.default.accept_source_route = 0
+kernel.panic = 5
+kernel.sysrq = 1
+kernel.core_uses_pid = 1
+vm.panic_on_oom = 1
+net.ipv4.tcp_syncookies = 1
+net.ipv4.conf.default.arp_ignore = 1
+net.ipv4.conf.default.arp_announce = 2
+net.ipv4.conf.all.arp_ignore = 1
+net.ipv4.conf.all.arp_announce = 2
+net.ipv4.tcp_keepalive_time = 825
+afs.GCPAGs = 0
+kernel.modprobe = /etc/scripts/modprobe
Index: branches/fc15-dev/server/fedora/config/etc/syslog-ng/d_zroot.pl
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/syslog-ng/d_zroot.pl	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/syslog-ng/d_zroot.pl	(revision 1803)
@@ -0,0 +1,131 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Sys::Hostname;
+use Time::HiRes qw(ualarm);
+use File::Temp;
+
+our $ZCLASS = "scripts-auto";
+our @USERS = qw/root logview/;
+my $k5login;
+open $k5login, '/root/.k5login';
+our @RECIPIENTS = map {chomp; m|([^/@]*)| && $1} <$k5login>;
+close $k5login;
+
+our %USERS;
+@USERS{@USERS} = undef;
+
+sub zwrite($;$$@) {
+    my ($message, $class, $instance, @recipients) = @_;
+    $class ||= $ZCLASS;
+    $instance ||= 'root.'.hostname;
+    open(ZWRITE, "|-", qw|/usr/bin/zwrite -d -n -O log -c|, $class, '-i', $instance, '-s', hostname, @recipients) or die "Couldn't open zwrite";
+    print ZWRITE $message;
+    close(ZWRITE);
+}
+
+my %toclass;
+
+my %sshkeys;
+
+sub buildKeyMap($) {
+    my ($file) = @_;
+    open (KEYS, $file) or warn "Couldn't open $file: $!";
+    while (<KEYS>) {
+	chomp;
+	my ($fingerprint, $comment) = parseKey($_);
+	$sshkeys{$fingerprint} = $comment;
+    }
+    close(KEYS);
+}
+
+sub parseKey($) {
+    my ($key) = @_;
+    my $tmp = new File::Temp;
+    print $tmp $key;
+    close $tmp;
+    open (KEYGEN, "-|", qw(/usr/bin/ssh-keygen -l -f), $tmp) or die "Couldn't call ssh-keygen: $!";
+    my ($line) = <KEYGEN>;
+    close(KEYGEN);
+    my (undef, $fingerprint, undef) = split(' ', $line, 3);
+    my (undef, undef, $comment) = split(' ', $key, 3);
+    #print "$fingerprint $comment";
+    return ($fingerprint, $comment);
+}
+
+buildKeyMap("/root/.ssh/authorized_keys");
+buildKeyMap("/root/.ssh/authorized_keys2");
+
+while (1) {
+    my @message = scalar(<>);
+    eval {
+        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
+        ualarm(500*1000);
+        while (<>) { push @message, $_; }
+    };
+    chomp @message;
+    map { s/^(.*?): // } @message;
+    %toclass = ();
+    foreach my $message (@message) {
+	sub sendmsg ($;$) {
+	    my ($message, $class) = @_;
+	    $class ||= $ZCLASS;
+	    $toclass{$class} .= $message."\n";
+	}
+	if ($message =~ m|Accepted (\S+) for (\S+)|) {
+	    sendmsg($message) if exists $USERS{$2}
+	} elsif ($message =~ m|Authorized to (\S+),|) {
+	    sendmsg($message) if exists $USERS{$1};
+	} elsif ($message =~ m|Root (\S+) shell|) {
+	    sendmsg($message);
+	} elsif ($message =~ m|session \S+ for user (\S+)|) {
+	    sendmsg($message) if exists $USERS{$1};
+	} elsif ($message =~ m|^Found matching (\w+) key: (\S+)|) {
+	    if ($sshkeys{$2}) {
+		sendmsg($message." (".$sshkeys{$2}.")");
+	    } else {
+		sendmsg($message." (UNKNOWN KEY)");
+	    }
+	} elsif ($message =~ m|^Out of memory:|) {
+	    sendmsg($message);
+	} elsif ($message =~ m|^giving \S+ admin rights|) {
+	    sendmsg($message);
+	} elsif ($message =~ m|^Connection closed|) {
+	    # Do nothing
+	} elsif ($message =~ m|^Closing connection to |) {
+	} elsif ($message =~ m|^Connection from (\S+) port (\S+)|) {
+	} elsif ($message =~ m|^Invalid user|) {
+	} elsif ($message =~ m|^input_userauth_request: invalid user|) {
+	} elsif ($message =~ m|^Received disconnect from|) {
+	} elsif ($message =~ m|^Postponed keyboard-interactive|) {
+	} elsif ($message =~ m|^Failed keyboard-interactive/pam|) {
+	} elsif ($message =~ m|^fatal: Read from socket failed: Connection reset by peer$|) {
+	} elsif ($message =~ m|^reverse mapping checking getaddrinfo|) {
+	} elsif ($message =~ m|^pam_succeed_if\(sshd\:auth\)\:|) {
+	} elsif ($message =~ m|^error: PAM: Authentication failure|) {
+	} elsif ($message =~ m|^pam_unix\(sshd:auth\): authentication failure|) {
+	} elsif ($message =~ m|^Postponed keyboard-interactive for invalid user |) {
+	} elsif ($message =~ m|^Failed keyboard-interactive/pam for invalid user |) {
+	} elsif ($message =~ m|^Postponed gssapi-with-mic for |) {
+	} elsif ($message =~ m|^Address \S+ maps to \S+, but this does not map back to the address|) {
+	} elsif ($message =~ m|^Nasty PTR record .* is set up for .*, ignoring|) {
+	} elsif ($message =~ m|^User child is on pid \d+$|) {
+	} elsif ($message =~ m|^Transferred: sent \d+, received \d+ bytes$|) {
+	} elsif ($message =~ m|^Setting tty modes failed: Invalid argument$|) {
+	} elsif ($message =~ m|^ *nrpe .* COMMAND=/etc/nagios/check_ldap_mmr.real$|) {
+	} elsif ($message =~ m|^ *root : TTY=|) {
+	} elsif ($message =~ m|^Set /proc/self/oom_adj to |) {
+	} else {
+	    sendmsg($message, "scripts-spew");
+	}
+    }
+
+    foreach my $class (keys %toclass) {
+	if ($class eq "scripts-auto") {
+	    zwrite($toclass{$class}, $class);
+	} else {
+	    zwrite($toclass{$class}, $class, undef, @RECIPIENTS);
+	}
+    }
+}
Index: branches/fc15-dev/server/fedora/config/etc/syslog-ng/syslog-ng.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/syslog-ng/syslog-ng.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/syslog-ng/syslog-ng.conf	(revision 1803)
@@ -0,0 +1,70 @@
+# syslog-ng configuration file.
+#
+# This should behave pretty much like the original syslog on RedHat. But
+# it could be configured a lot smarter.
+#
+# See syslog-ng(8) and syslog-ng.conf(5) for more information.
+#
+
+options {
+	sync (0);
+	time_reopen (10);
+	log_fifo_size (1000);
+	long_hostnames (off);
+	use_dns (no);
+	use_fqdn (no);
+	create_dirs (no);
+	keep_hostname (yes);
+};
+
+source s_sys {
+	file ("/proc/kmsg" log_prefix("kernel: "));
+	unix-stream ("/dev/log");
+	internal();
+	# udp(ip(0.0.0.0) port(514));
+};
+
+destination d_cons { file("/dev/console"); };
+destination d_mesg { file("/var/log/messages"); };
+destination d_auth { file("/var/log/secure"); };
+destination d_mail { file("/var/log/maillog" sync(10)); };
+destination d_spol { file("/var/log/spooler"); };
+destination d_boot { file("/var/log/boot.log"); };
+destination d_cron { file("/var/log/cron"); };
+#destination d_kern { file("/var/log/kern"); };
+destination d_mlal { usertty("*"); };
+
+destination d_zroot { program("/etc/syslog-ng/d_zroot.pl"); };
+#destination d_watch { program("/usr/local/libexec/watch-syslog.py"); };
+
+#filter f_kernel     { facility(kern); };
+filter f_default    { level(info..emerg) and
+                        not (facility(mail)
+                        or facility(authpriv) 
+                        or facility(cron)); };
+filter f_auth       { facility(authpriv); };
+filter f_mail       { facility(mail); };
+filter f_emergency  { level(emerg); };
+filter f_news       { facility(uucp) or
+                        (facility(news) 
+                        and level(crit..emerg)); };
+filter f_boot   { facility(local7); };
+filter f_cron   { facility(cron); };
+
+filter f_oom { facility(kern) and (match("Out of memory:") or match("Killed process")); };
+
+#log { source(s_sys); filter(f_kernel); destination(d_cons); };
+#log { source(s_sys); filter(f_kernel); destination(d_kern); };
+log { source(s_sys); filter(f_default); destination(d_mesg); };
+log { source(s_sys); filter(f_auth); destination(d_auth); };
+log { source(s_sys); filter(f_mail); destination(d_mail); };
+log { source(s_sys); filter(f_emergency); destination(d_mlal); };
+log { source(s_sys); filter(f_news); destination(d_spol); };
+log { source(s_sys); filter(f_boot); destination(d_boot); };
+log { source(s_sys); filter(f_cron); destination(d_cron); };
+
+log { source(s_sys); filter(f_auth); destination(d_zroot); };
+#log { source(s_sys); filter(f_default); destination(d_watch); };
+log { source(s_sys); filter(f_oom); destination(d_zroot); };
+
+# vim:ft=syslog-ng:ai:si:ts=4:sw=4:et:
Index: branches/fc15-dev/server/fedora/config/etc/syslog.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/syslog.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/syslog.conf	(revision 1803)
@@ -0,0 +1,28 @@
+# Log all kernel messages to the console.
+# Logging much else clutters up the screen.
+#kern.*							/dev/console
+
+# Log anything (except mail) of level info or higher.
+# Don't log private authentication messages!
+*.info;mail.none;authpriv.none;cron.none;local0.none	/var/log/messages
+
+# The authpriv file has restricted access.
+authpriv.*						/var/log/secure
+
+# Log all the mail messages in one place.
+mail.*							-/var/log/maillog
+
+
+# Log cron stuff
+cron.*							/var/log/cron
+
+# Everybody gets emergency messages
+*.emerg							*
+
+# Save news errors of level crit and higher in a special file.
+uucp,news.crit						/var/log/spooler
+
+# Save boot messages also to boot.log
+local7.*						/var/log/boot.log
+
+local0.info	/var/log/heartbeat.log
Index: branches/fc15-dev/server/fedora/config/etc/vimrc
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/vimrc	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/vimrc	(revision 1803)
@@ -0,0 +1,60 @@
+if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
+   set fileencodings=ucs-bom,utf-8,latin1
+endif
+
+set nocompatible	" Use Vim defaults (much better!)
+set bs=indent,eol,start		" allow backspacing over everything in insert mode
+"set ai			" always set autoindenting on
+"set backup		" keep a backup file
+set viminfo=		" don't keep a viminfo file
+set history=50		" keep 50 lines of command line history
+set ruler		" show the cursor position all the time
+
+" Only do this part when compiled with support for autocommands
+if has("autocmd")
+  " In text files, always limit the width of text to 78 characters
+  autocmd BufRead *.txt set tw=78
+  " When editing a file, always jump to the last cursor position
+  autocmd BufReadPost *
+  \ if line("'\"") > 0 && line ("'\"") <= line("$") |
+  \   exe "normal! g'\"" |
+  \ endif
+  " don't write swapfile on most commonly used directories for NFS mounts or USB sticks
+  autocmd BufNewFile,BufReadPre /media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp
+  " start with spec file template
+  autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec
+endif
+
+if has("cscope") && filereadable("/usr/bin/cscope")
+   set csprg=/usr/bin/cscope
+   set csto=0
+   set cst
+   set nocsverb
+   " add any database in current directory
+   if filereadable("cscope.out")
+      cs add cscope.out
+   " else add database pointed to by environment
+   elseif $CSCOPE_DB != ""
+      cs add $CSCOPE_DB
+   endif
+   set csverb
+endif
+
+" Switch syntax highlighting on, when the terminal has colors
+" Also switch on highlighting the last used search pattern.
+if &t_Co > 2 || has("gui_running")
+  syntax on
+  set hlsearch
+endif
+
+filetype plugin on
+
+if &term=="xterm"
+     set t_Co=8
+     set t_Sb=[4%dm
+     set t_Sf=[3%dm
+endif
+
+" Don't wake up system with blinking cursor:
+" http://www.linuxpowertop.org/known.php
+let &guicursor = &guicursor . ",a:blinkon0"
Index: branches/fc15-dev/server/fedora/config/etc/yum.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/yum.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/yum.conf	(revision 1803)
@@ -0,0 +1,14 @@
+[main]
+cachedir=/var/cache/yum
+keepcache=0
+debuglevel=2
+logfile=/var/log/yum.log
+exactarch=1
+obsoletes=1
+gpgcheck=1
+plugins=1
+metadata_expire=1800
+installonlypkgs=kernel kernel-devel kmod-openafs
+
+# PUT YOUR REPOS HERE OR IN separate files named file.repo
+# in /etc/yum.repos.d
Index: branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates-testing.repo
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates-testing.repo	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates-testing.repo	(revision 1803)
@@ -0,0 +1,29 @@
+[updates-testing]
+name=Fedora $releasever - $basearch - Test Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/$basearch/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/testing/$releasever/$basearch/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-debuginfo]
+name=Fedora $releasever - $basearch - Test Updates Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/$basearch/debug/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/testing/$releasever/$basearch/debug/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[updates-testing-source]
+name=Fedora $releasever - Test Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/testing/$releasever/SRPMS/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/testing/$releasever/SRPMS/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
Index: branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates.repo
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates.repo	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/yum.repos.d/fedora-updates.repo	(revision 1803)
@@ -0,0 +1,29 @@
+[updates]
+name=Fedora $releasever - $basearch - Updates
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/$releasever/$basearch/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
+enabled=1
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[updates-debuginfo]
+name=Fedora $releasever - $basearch - Updates - Debug
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/debug/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/$releasever/$basearch/debug/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
+
+[updates-source]
+name=Fedora $releasever - Updates Source
+failovermethod=priority
+#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/SRPMS/
+baseurl=http://download3.fedora.redhat.com/pub/fedora/linux/updates/$releasever/SRPMS/
+#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f$releasever&arch=$basearch
+enabled=0
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
Index: branches/fc15-dev/server/fedora/config/etc/yum.repos.d/scripts.repo
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/yum.repos.d/scripts.repo	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/yum.repos.d/scripts.repo	(revision 1803)
@@ -0,0 +1,11 @@
+[scripts]
+name=Scripts
+baseurl=http://web.mit.edu/scripts/rpm-fc13/
+enabled=1
+gpgcheck=0
+
+[scripts-testing]
+name=Scripts Testing
+baseurl=http://web.mit.edu/scripts/rpm-fc13-testing/
+enabled=0
+gpgcheck=0
Index: branches/fc15-dev/server/fedora/config/etc/yum/yum-updatesd.conf
===================================================================
--- branches/fc15-dev/server/fedora/config/etc/yum/yum-updatesd.conf	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/etc/yum/yum-updatesd.conf	(revision 1803)
@@ -0,0 +1,18 @@
+[main]
+# how often to check for new updates (in seconds)
+run_interval = 14400
+# how often to allow checking on request (in seconds)
+updaterefresh = 600
+
+# how to send notifications (valid: dbus, email, syslog)
+emit_via = dbus email
+# should we listen via dbus to give out update information/check for
+# new updates 
+dbus_listener = yes
+
+# automatically install updates
+do_update = no
+# automatically download updates
+do_download = yes
+# automatically download deps of updates
+do_download_deps = yes
Index: branches/fc15-dev/server/fedora/config/gems.py
===================================================================
--- branches/fc15-dev/server/fedora/config/gems.py	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/gems.py	(revision 1803)
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+"""Retrieve local ruby gem list from scripts.mit.edu
+
+Joe Presbrey <presbrey@mit.edu"""
+
+import commands, re, sys
+
+def scripts_gems():
+    o = commands.getoutput('gem list --local')
+    return map(lambda x: len(x) > 1 and (x[0], x[1].split(', ')) or x,
+               re.findall('([^\s]+)\s\(([^\)]+)\)', o))
+
+if __name__ == "__main__":
+    for x in scripts_gems():
+        if x[0] == 'sources': continue
+        #print >>sys.stderr, x
+        for y in x[1]:
+            print 'gem install %s --version %s -y' % (x[0], y)
Index: branches/fc15-dev/server/fedora/config/home/scripts-build/.rpmmacros
===================================================================
--- branches/fc15-dev/server/fedora/config/home/scripts-build/.rpmmacros	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/home/scripts-build/.rpmmacros	(revision 1803)
@@ -0,0 +1,3 @@
+%_topdir %(echo $HOME)/rpmbuild
+%_smp_mflags  -j3
+%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot
Index: branches/fc15-dev/server/fedora/config/php.sh
===================================================================
--- branches/fc15-dev/server/fedora/config/php.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/php.sh	(revision 1803)
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+mkdir -p /etc/php.d/disable
+mv -f /etc/php.d/*.ini -u /etc/php.d/disable/
+rm -f /etc/php.d/*.ini
+pushd /etc/php.d/ >/dev/null
+touch `ls /etc/php.d/disable/*.ini | cut -d/ -f5` -t01010000
+popd >/dev/null
+
+svn revert /etc/php.d/scripts.ini
+
+restorecon -R /etc
Index: branches/fc15-dev/server/fedora/config/rpms.sh
===================================================================
--- branches/fc15-dev/server/fedora/config/rpms.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/rpms.sh	(revision 1803)
@@ -0,0 +1,12 @@
+#!/bin/bash
+#
+# Retrieve package list from scripts.mit.edu
+# Install them with yum
+#
+# Joe Presbrey <presbrey@mit.edu>
+#
+# Skip openafs (custom built), kernel (pedantic), and pubkeys.
+
+ssh root@scripts.mit.edu rpm -qa --qf '%{name}.%{arch}\\n' | grep -v openafs | grep -v kernel | grep -v pubkey > rpms.log
+
+yum install `cat rpms.log`
Index: branches/fc15-dev/server/fedora/config/selinux.sh
===================================================================
--- branches/fc15-dev/server/fedora/config/selinux.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/selinux.sh	(revision 1803)
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+SESTAT=`getenforce`
+setenforce 0
+semanage user -P user -R user_r -R afsagent_r -a afsagent_u
+semanage login -s afsagent_u -a afsagent
+setenforce $SESTAT
Index: branches/fc15-dev/server/fedora/config/services.sh
===================================================================
--- branches/fc15-dev/server/fedora/config/services.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/services.sh	(revision 1803)
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+S_ON='acpid auditd autofs crond execsys-binfmt httpd ip6tables iptables lm_sensors mcstrans mdmonitor named network nrpe openafs-client restorecond sshd syslog sysstat zhm ntpd netfs nfslock portmap'
+S_OFF='NetworkManager NetworkManagerDispatcher anacron atd avahi-dnsconfd capi cpuspeed cups dc_client dc_server dhcdbd diskdump firstboot gpm haldaemon irda isdn kudzu mdmpd messagebus multipathd netdump netplugd nscd pcscd psacct rdisc readahead_later rpcgssd rpcidmapd rpcsvcgssd saslauthd sendmail snmpd snmptrapd spamassassin wpa_supplicant ypbind avahi-daemon readahead_early xfs xinetd yum-updatesd irqbalance smartd postfix nfs'
+
+for s in $S_OFF; do
+	/sbin/chkconfig $s off
+	/sbin/service $s stop
+done
+
+for s in $S_ON; do
+	/sbin/chkconfig --add $s
+	/sbin/chkconfig $s on
+	#/sbin/service $s status || runcon system_u:system_r:initrc_t:s0 /sbin/service $s start
+done
+
+restorecon -R /etc
Index: branches/fc15-dev/server/fedora/config/signup.py
===================================================================
--- branches/fc15-dev/server/fedora/config/signup.py	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/signup.py	(revision 1803)
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+"""Add system users from external passwd and group files
+Joe Presbrey <presbrey@mit.edu>
+
+arguments: <passwd-file> <group-file>"""
+
+
+import commands
+import os,sys,string
+#import athena
+
+def do_groupfile(f):
+	for x in f.readlines():
+		gname = x.strip().split(':')[0]
+		gid = x.strip().split(':')[2]
+		c = commands.getstatusoutput('groupadd -g ' + gid + ' ' + gname)
+		if c[0] == 0:
+			print "group " + gname + "/" + gid + " added successfully."
+
+def do_userfile(f):
+	for x in f.readlines():
+		name = x.strip().split(':')[0]
+		#uathena = AthenaUser(name)
+		uid = x.strip().split(':')[2]
+		gid = x.strip().split(':')[3]
+		home = x.strip().split(':')[5]
+		if uid > 100:
+			c = commands.getstatusoutput('useradd -M -d ' + home + ' -u ' + uid + ' -g ' + gid + ' -G users -s /usr/local/bin/mbash ' + name)
+			if c[0] == 0:
+				print "user " + name + "/" + uid + " added successfully."
+
+if __name__ == "__main__":
+	if len(sys.argv) != 3:
+		print __doc__
+	else:
+		do_groupfile(file(sys.argv[2]))
+		do_userfile(file(sys.argv[1]))
Index: branches/fc15-dev/server/fedora/config/usr/vice/etc/CellServDB.local
===================================================================
--- branches/fc15-dev/server/fedora/config/usr/vice/etc/CellServDB.local	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/usr/vice/etc/CellServDB.local	(revision 1803)
@@ -0,0 +1,657 @@
+>athena.mit.edu         #MIT/Athena cell
+18.3.48.11                      #aether.mit.edu
+18.9.48.11                      #castor.mit.edu
+18.9.48.12                      #pollux.mit.edu.
+>dev.mit.edu            #MIT/IS Development cell
+18.9.48.13                      #saw.mit.edu.
+18.9.60.110                     #hammer.mit.edu.
+18.9.60.111                     #screw.mit.edu.
+>net.mit.edu            #MIT/Network Group cell
+18.7.7.73                       #gracie.mit.edu
+18.7.21.95                      #george.mit.edu
+>numenor.mit.edu        #Project Numenor
+18.243.2.49                     #numenor.mit.edu
+>sipb.mit.edu           #MIT/SIPB cell
+18.181.0.19                     #reynelda.mit.edu
+18.181.0.22                     #rosebud.mit.edu
+18.181.0.23                     #ronald-ann.mit.edu
+>soap.mit.edu           #MIT School Of Architecture & Planning
+18.89.1.204                     #crypt.mit.edu
+18.89.3.46                      #soap.mit.edu
+18.89.4.9                       #arch.mit.edu
+>grand.central.org      #GCO Public CellServDB 28 Feb 2010
+18.9.48.14                      #grand.mit.edu
+128.2.203.61                    #penn.central.org
+130.237.48.87                   #andrew.e.kth.se
+>wu-wien.ac.at          #University of Economics, Vienna, Austria
+137.208.3.33                    #goya.wu-wien.ac.at
+137.208.7.57                    #caravaggio.wu-wien.ac.at
+137.208.127.57                  #vermeer.wu-wien.ac.at
+>hephy.at               #hephy-vienna
+193.170.243.10                  #mowgli.oeaw.ac.at
+193.170.243.12                  #baloo.oeaw.ac.at
+193.170.243.14                  #akela.oeaw.ac.at
+>cgv.tugraz.at          #CGV cell
+129.27.218.30                   #phobos.cgv.tugraz.at
+129.27.218.31                   #deimos.cgv.tugraz.at
+129.27.218.32                   #trinculo.cgv.tugraz.at
+>itp.tugraz.at          #Institute of Theoretical and Computational Physics, TU Graz, Aus
+129.27.161.7                    #faepafs1.tu-graz.ac.at
+129.27.161.15                   #faepafs2.tu-graz.ac.at
+129.27.161.114                  #faepafs3.tu-graz.ac.at
+>sums.math.mcgill.ca    #Society of Undergraduate Mathematics Students of McGill Universi
+132.216.24.122                  #germain.sums.math.mcgill.ca
+132.216.24.125                  #turing.sums.math.mcgill.ca
+>cern.ch                #European Laboratory for Particle Physics, Geneva
+137.138.128.148                 #afsdb1.cern.ch
+137.138.246.50                  #afsdb3.cern.ch
+137.138.246.51                  #afsdb2.cern.ch
+>ams.cern.ch            #AMS Experiment
+137.138.188.185                 #ams.cern.ch
+137.138.199.58                  #pcamsf4.cern.ch
+>epfl.ch                #Swiss Federal Institute of Technology at Lausanne
+128.178.109.111                 #kd1.epfl.ch
+128.178.109.112                 #kd2.epfl.ch
+128.178.109.113                 #kd3.epfl.ch
+>ethz.ch                #Swiss Federal Inst. of Tech. - Zurich, Switzerland
+82.130.118.32                   #afs-db-1.ethz.ch
+>psi.ch                 #Paul Scherrer Institut - Villigen, Switzerland
+129.129.190.140                 #afs00.psi.ch
+129.129.190.141                 #afs01.psi.ch
+129.129.190.142                 #afs02.psi.ch
+>extundo.com            #Simon Josefsson's cell
+195.42.214.241                  #slipsten.extundo.com
+>freedaemon.com         #Free Daemon Consulting, Oklahoma City, OK, USA
+66.210.104.254                  #afs0.freedaemon.com
+>membrain.com           #membrain.com
+66.93.118.125                   #stormy
+130.85.24.11                    #weasel
+130.85.24.13                    #straykitten
+>setfilepointer.com     #SetFilePointer.com
+69.164.193.174                  #alpha.setfilepointer.com
+174.143.159.53                  #beta.setfilepointer.com
+>sodre.cx               #Sodre.cx
+128.8.140.165                   #greed.sodre.cx
+>ruk.cuni.cz            #Charles University Computer Centre, Prague, CR
+195.113.0.36                    #asterix.ruk.cuni.cz
+195.113.0.37                    #obelix.ruk.cuni.cz
+195.113.0.40                    #sal.ruk.cuni.cz
+>ics.muni.cz            #Masaryk university
+147.251.3.11                    #grond.ics.muni.cz
+147.251.3.15                    #nimloth.ics.muni.cz
+147.251.3.19                    #sirion.ics.muni.cz
+>zcu.cz                 #University of West Bohemia, Czech Republic
+147.228.10.18                   #sauron.zcu.cz
+147.228.52.10                   #oknos.zcu.cz
+147.228.52.17                   #nic.zcu.cz
+>desy.de                #Deutsches Elektronen-Synchrotron
+131.169.2.19                    #afsdb2.desy.de
+131.169.2.20                    #afsdb3.desy.de
+131.169.244.60                  #solar00.desy.de
+>gppc.de                #GPP Chemnitz mbH
+213.187.92.33                   #gpp1.gppc.de
+213.187.92.34                   #paulchen.gppc.de
+213.187.92.35                   #lotus.gppc.de
+>cms.hu-berlin.de       #Humboldt University Berlin
+141.20.1.65                     #commodus.cms.hu-berlin.de
+141.20.1.66                     #faustinus.cms.hu-berlin.de
+141.20.1.67                     #marcellus.cms.hu-berlin.de
+>ifh.de                 #DESY Zeuthen
+141.34.22.10                    #romulus.ifh.de
+141.34.22.11                    #remus.ifh.de
+141.34.22.29                    #hekate.ifh.de
+>integra-ev.de          #INTEGRA e.V.
+134.155.48.8                    #afsdb2.integra-ev.de
+134.155.48.63                   #afsdb1.integra-ev.de
+>lrz-muenchen.de        #Leibniz Computing Centre, Germany
+129.187.10.36                   #afs1.lrz-muenchen.de
+129.187.10.56                   #afs3.lrz-muenchen.de
+129.187.10.57                   #afs2.lrz-muenchen.de
+>ipp-garching.mpg.de    #Institut fuer Plasmaphysik
+130.183.9.5                     #afs-db1.rzg.mpg.de
+130.183.14.14                   #afs-db3.bc.rzg.mpg.de
+130.183.100.10                  #afs-db2.aug.ipp-garching.mpg.de
+>mpe.mpg.de             #MPE cell
+130.183.130.7                   #irafs1.mpe-garching.mpg.de
+130.183.134.20                  #irafs2.mpe-garching.mpg.de
+>nicsys.de              #NICsys GbR
+213.187.80.3                    #attila.nicsys.de
+>i1.informatik.rwth-aachen.de #Informatik I, RWTH Aachen
+137.226.244.79                  #remus.informatik.rwth-aachen.de
+>combi.tfh-wildau.de    #Philips Research Lab
+194.95.50.106                   #joda13.combi.tfh-wildau.de
+>tu-bs.de               #Technical University of Braunschweig, Germany
+134.169.1.1                     #rzafs1.rz.tu-bs.de
+134.169.1.5                     #rzafs2.rz.tu-bs.de
+134.169.1.6                     #rzafs3.rz.tu-bs.de
+>tu-chemnitz.de         #Technische Universitaet Chemnitz, Germany
+134.109.2.1                     #zuse.hrz.tu-chemnitz.de
+134.109.2.15                    #phoenix.hrz.tu-chemnitz.de
+134.109.200.7                   #aetius.hrz.tu-chemnitz.de
+>e18.ph.tum.de          #Experimental Physics, TU Munich, Germany
+129.187.154.223                 #hamlet.e18.physik.tu-muenchen.de
+>atlass01.physik.uni-bonn.de #Bonn ATLAS
+131.220.165.43                  #atlass01.physik.uni-bonn.de
+>uni-freiburg.de        #Albert-Ludwigs-Universitat Freiburg
+132.230.6.237                   #sv8.ruf.uni-freiburg.de
+132.230.6.239                   #sv10.ruf.uni-freiburg.de
+>physik.uni-freiburg.de #Institute of Physics, University Freiburg, Germany
+132.230.6.234                   #afs1.ruf.uni-freiburg.de
+132.230.6.235                   #afs2.ruf.uni-freiburg.de
+132.230.77.16                   #hepafs.physik.uni-freiburg.de
+>physnet.uni-hamburg.de #PHYSnet-Rechenzentrum university of hamburg
+134.100.106.44                  #afs-core.physnet.uni-hamburg.de
+134.100.106.45                  #afs-core2.physnet.uni-hamburg.de
+134.100.106.47                  #afs-core3.physnet.uni-hamburg.de
+>mathi.uni-heidelberg.de #Uni Heidelberg (Mathematisches Institut)
+129.206.26.241                  #hactar.mathi.uni-heidelberg.de
+>urz.uni-heidelberg.de  #Uni Heidelberg (Rechenzentrum)
+129.206.119.10                  #afsdb.urz.uni-heidelberg.de
+129.206.119.16                  #afsdb1.urz.uni-heidelberg.de
+129.206.119.17                  #afsdb2.urz.uni-heidelberg.de
+>ziti.uni-heidelberg.de #Institute of Computer Science at the University of Heidelberg
+147.142.42.246                  #mp-sun.ziti.uni-heidelberg.de
+>uni-hohenheim.de       #University of Hohenheim
+144.41.2.2                      #rs13.serv.uni-hohenheim.de
+144.41.2.3                      #rs14.serv.uni-hohenheim.de
+144.41.2.4                      #rs15.serv.uni-hohenheim.de
+>rz.uni-jena.de         #Rechenzentrum University of Jena, Germany
+141.35.2.180                    #afs00.rz.uni-jena.de
+141.35.2.181                    #afs01.rz.uni-jena.de
+141.35.2.182                    #afs02.rz.uni-jena.de
+>impetus.uni-koeln.de   #Univ. of Cologne - Geophysics/Meteorology Inst.
+134.95.80.39                    #forano.meteo.uni-koeln.de
+>meteo.uni-koeln.de     #Univ. of Cologne - Inst. for Geophysics & Meteorology
+134.95.144.22                   #afs1.meteo.uni-koeln.de
+134.95.144.24                   #afs2.meteo.uni-koeln.de
+>rrz.uni-koeln.de       #University of Cologne - Reg Comp Center
+134.95.19.3                     #afsdb1.rrz.uni-koeln.de
+134.95.19.4                     #afsdb2.rrz.uni-koeln.de
+134.95.19.10                    #lyra.rrz.uni-koeln.de
+134.95.67.97                    #afs.thp.uni-koeln.de
+134.95.112.8                    #ladon.rrz.uni-koeln.de
+>physik.uni-mainz.de    #institute of physics, university Mainz, Germany
+134.93.130.93                   #hardy.physik.uni-mainz.de
+>uni-mannheim.de        #Uni Mannheim (Rechenzentrum)
+134.155.97.204                  #afsdb1.uni-mannheim.de
+134.155.97.205                  #afsdb2.uni-mannheim.de
+134.155.97.206                  #afsdb3.uni-mannheim.de
+>uni-paderborn.de       #University of Paderborn, Germany
+131.234.137.10                  #afsdb1.uni-paderborn.de
+131.234.137.11                  #afsdb2.uni-paderborn.de
+131.234.137.12                  #afsdb3.uni-paderborn.de
+>physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
+132.195.104.3                   #afs1.physik.uni-wuppertal.de
+132.195.104.230                 #afs2.physik.uni-wuppertal.de
+>s-et.aau.dk            #Aalborg Univ., The Student Society, Denmark
+130.225.196.22                  #afs.s-et.aau.dk
+>ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
+130.225.51.73                   #afsdb1.kom.auc.dk
+130.225.51.74                   #afsdb2.kom.auc.dk
+130.225.51.85                   #afsdb3.kom.auc.dk
+>asu.edu                #Arizona State University
+129.219.10.69                   #authen2.asu.edu
+129.219.10.70                   #authen1.asu.edu
+129.219.10.72                   #authen3.asu.edu
+129.219.100.16                  #authen4.asu.edu
+>mars.asu.edu           #Mars Space Flight Facility - ASU Mars Research
+149.169.146.57                  #kdc1.mars.asu.edu
+149.169.146.58                  #kdc2.mars.asu.edu
+149.169.146.59                  #kdc3.mars.asu.edu
+>eecs.berkeley.edu      #University of California, Berkeley - EECS Dept.
+128.32.139.34                   #greed.eecs.berkeley.edu
+128.32.139.35                   #gluttony.eecs.berkeley.edu
+169.229.60.112                  #envy.eecs.berkeley.edu
+>hep.caltech.edu        #Caltech High Energy Physics
+131.215.116.20                  #afs.hep.caltech.edu
+>ugcs.caltech.edu       #Caltech UGCS lab
+131.215.176.65                  #afs-c.ugcs.caltech.edu
+131.215.176.67                  #afs-a.ugcs.caltech.edu
+131.215.176.68                  #afs-b.ugcs.caltech.edu
+>clarkson.edu           #Clarkson University, Potsdam, New York USA
+128.153.1.111                   #arthur.clarkson.edu
+128.153.9.111                   #lancelot.clarkson.edu
+128.153.17.111                  #uther.clarkson.edu
+>andrew.cmu.edu         #Carnegie Mellon University - Computing Services Cell
+128.2.10.2                      #afsdb-01.andrew.cmu.edu
+128.2.10.7                      #afsdb-02.andrew.cmu.edu
+128.2.10.11                     #afsdb-03.andrew.cmu.edu
+>mw.andrew.cmu.edu      #Carnegie Mellon University - Middleware Test Cell
+128.2.234.24                    #null.andrew.cmu.edu
+128.2.234.170                   #mw-mgr.andrew.cmu.edu
+>club.cc.cmu.edu        #Carnegie Mellon University Computer Club
+128.2.204.149                   #barium.club.cc.cmu.edu
+128.237.157.11                  #sodium.club.cc.cmu.edu
+128.237.157.13                  #potassium.club.cc.cmu.edu
+>chem.cmu.edu           #Carnegie Mellon University - Chemistry Dept.
+128.2.40.134                    #afs.chem.cmu.edu
+128.2.40.140                    #afs2.chem.cmu.edu
+>cs.cmu.edu             #Carnegie Mellon University - School of Comp. Sci.
+128.2.172.58                    #date.srv.cs.cmu.edu
+128.2.172.60                    #fig.srv.cs.cmu.edu
+128.2.184.215                   #pumpkin.srv.cs.cmu.edu
+128.2.200.97                    #watermelon.srv.cs.cmu.edu
+128.2.201.46                    #strawberry.srv.cs.cmu.edu
+128.2.201.48                    #cherry.srv.cs.cmu.edu
+>ece.cmu.edu            #Carnegie Mellon University - Elec. Comp. Eng. Dept.
+128.2.129.7                     #porok.ece.cmu.edu
+128.2.129.8                     #vicio.ece.cmu.edu
+128.2.129.9                     #e-xing.ece.cmu.edu
+>scotch.ece.cmu.edu     #CMU ECE CALCM research group
+128.2.134.82                    #lagavulin.ece.cmu.edu
+>qatar.cmu.edu          #Carnegie Mellon University - Qatar
+86.36.46.6                      #afs1.qatar.cmu.edu
+86.36.46.7                      #afs2.qatar.cmu.edu
+>sbp.ri.cmu.edu         #Carnegie Mellon University - Sensor Based Planning Lab
+128.2.179.12                    #nihao.sbp.ri.cmu.edu
+128.2.179.113                   #youtheman.sbp.ri.cmu.edu
+>cnf.cornell.edu        #CNF
+128.253.198.9                   #hole.cnf.cornell.edu
+128.253.198.27                  #smoke.cnf.cornell.edu
+128.253.198.231                 #mist.cnf.cornell.edu
+>math.cornell.edu       #Cornell Math Dept
+128.84.234.12                   #pooh.math.cornell.edu
+128.84.234.16                   #bernoulli.math.cornell.edu
+128.84.234.162                  #dyno.math.cornell.edu
+>msc.cornell.edu        #Cornell University Materials Science Center
+128.84.231.242                  #miranda.ccmr.cornell.edu
+128.84.241.35                   #co.ccmr.cornell.edu
+128.84.249.78                   #dax.ccmr.cornell.edu
+>dbic.dartmouth.edu     #Dartmouth Brain Imaging Center
+129.170.30.143                  #dbicafs1.dartmouth.edu
+129.170.30.144                  #dbicafs2.dartmouth.edu
+129.170.30.145                  #dbicafs3.dartmouth.edu
+>northstar.dartmouth.edu #Dartmouth College Research Computing
+129.170.16.22                   #halley.dartmouth.edu
+129.170.16.26                   #andromeda.dartmouth.edu
+129.170.16.43                   #cygnusx1.dartmouth.edu
+>cs.hm.edu              #Department Computer Science Munich University Of Applied Science
+129.187.208.2                   #srv1.informatik.fh-muenchen.de
+>eecs.harvard.edu       #Harvard - EECS
+140.247.60.64                   #lefkada.eecs.harvard.edu
+140.247.60.83                   #corfu.eecs.harvard.edu
+>iastate.edu            #Iowa State University
+129.186.1.243                   #afsdb-1.iastate.edu
+129.186.6.243                   #afsdb-2.iastate.edu
+129.186.142.243                 #afsdb-3.iastate.edu
+>msu.edu                #Michigan State University Main Cell
+35.9.7.10                       #afsdb0.cl.msu.edu
+>nd.edu                 #University of Notre Dame
+129.74.223.17                   #john.helios.nd.edu
+129.74.223.33                   #lizardo.helios.nd.edu
+129.74.223.65                   #buckaroo.helios.nd.edu
+>crc.nd.edu             #University of Notre Dame - Center for Research Computing
+129.74.85.34                    #afsdb1.crc.nd.edu
+129.74.85.35                    #afsdb2.crc.nd.edu
+129.74.85.36                    #afsdb3.crc.nd.edu
+>pitt.edu               #University of Pittsburgh
+136.142.8.15                    #afs09.srv.cis.pitt.edu
+136.142.8.20                    #afs10.srv.cis.pitt.edu
+136.142.8.21                    #afs11.srv.cis.pitt.edu
+>cs.pitt.edu            #University of Pittsburgh - Computer Science
+130.49.220.11                   #afs01.cs.pitt.edu
+130.49.220.12                   #afs02.cs.pitt.edu
+130.49.220.13                   #afs03.cs.pitt.edu
+>psc.edu                #PSC (Pittsburgh Supercomputing Center)
+128.182.59.182                  #shaggy.psc.edu
+128.182.66.184                  #velma.psc.edu
+128.182.66.185                  #daphne.psc.edu
+>scoobydoo.psc.edu      #PSC Test Cell
+128.182.59.181                  #scooby.psc.edu
+>cede.psu.edu           #Penn State - Center for Engr. Design & Entrepeneurship
+146.186.218.10                  #greenly.cede.psu.edu
+146.186.218.60                  #b50.cede.psu.edu
+146.186.218.246                 #stalin.cede.psu.edu
+>rose-hulman.edu        #Rose-Hulman Institute of Technology
+137.112.7.11                    #afs1.rose-hulman.edu
+137.112.7.12                    #afs2.rose-hulman.edu
+137.112.7.13                    #afs3.rose-hulman.edu
+>cs.rose-hulman.edu     #Rose-Hulman CS Department
+137.112.40.10                   #galaxy.cs.rose-hulman.edu
+>rpi.edu                #Rensselaer Polytechnic Institute
+128.113.22.11                   #saul.server.rpi.edu
+128.113.22.12                   #joab.server.rpi.edu
+128.113.22.13                   #korah.server.rpi.edu
+128.113.22.14                   #achan.server.rpi.edu
+>hep.sc.edu             #University of South Carolina, Dept. of Physics
+129.252.78.77                   #cpeven.physics.sc.edu
+>cs.stanford.edu        #Stanford University Computer Science Department
+171.64.64.10                    #cs-afs-1.Stanford.EDU
+171.64.64.66                    #cs-afs-2.stanford.edu
+171.64.64.69                    #cs-afs-3.stanford.edu
+>ir.stanford.edu        #Stanford University
+171.64.7.222                    #afsdb1.stanford.edu
+171.64.7.234                    #afsdb2.stanford.edu
+171.64.7.246                    #afsdb3.stanford.edu
+>slac.stanford.edu      #Stanford Linear Accelerator Center
+134.79.18.25                    #afsdb1.slac.stanford.edu
+134.79.18.26                    #afsdb2.slac.stanford.edu
+134.79.18.27                    #afsdb3.slac.stanford.edu
+>physics.ucsb.edu       #UC Santa Barbara, Physics Dept
+128.111.18.161                  #ledzeppelin.physics.ucsb.edu
+>cats.ucsc.edu          #UC Santa Cruz, Comp and Tech Services, California U.S.A
+128.114.123.14                  #elan.ucsc.edu
+128.114.123.15                  #ichabod.ucsc.edu
+128.114.123.18                  #maneki.ucsc.edu
+>acm.uiuc.edu           #ACM at the University of Illinois
+128.174.251.8                   #alnitak.acm.uiuc.edu
+128.174.251.9                   #alnilam.acm.uiuc.edu
+128.174.251.10                  #mintaka.acm.uiuc.edu
+>illigal.uiuc.edu       #Illinois Genetic Algorithms Labaratory
+128.174.193.200                 #ial.illigal.uiuc.edu
+128.174.193.201                 #cac.illigal.uiuc.edu
+128.174.193.202                 #gcs.illigal.uiuc.edu
+>ncsa.uiuc.edu          #University of Illinois
+141.142.3.5                     #congo.ncsa.uiuc.edu
+141.142.3.8                     #nile.ncsa.uiuc.edu
+141.142.3.9                     #kaskaskia.ncsa.uiuc.edu
+>umbc.edu               #University of Maryland, Baltimore County
+130.85.24.23                    #db2.afs.umbc.edu
+130.85.24.87                    #db3.afs.umbc.edu
+130.85.24.101                   #db1.afs.umbc.edu
+>glue.umd.edu           #University of Maryland - Project Glue
+128.8.70.11                     #olmec.umd.edu
+128.8.236.4                     #egypt.umd.edu
+128.8.236.230                   #babylon.umd.edu
+>wam.umd.edu            #University of Maryland Network WAM Project
+128.8.70.9                      #csc-srv.wam.umd.edu
+128.8.236.5                     #avw-srv.wam.umd.edu
+128.8.236.231                   #ptx-srv.wam.umd.edu
+>umich.edu              #University of Michigan - Campus
+141.211.1.32                    #fear.ifs.umich.edu
+141.211.1.33                    #surprise.ifs.umich.edu
+141.211.1.34                    #ruthless.ifs.umich.edu
+>atlas.umich.edu        #ATLAS group cell in physics at University of Michigan
+141.211.43.102                  #linat02.grid.umich.edu
+141.211.43.103                  #linat03.grid.umich.edu
+141.211.43.104                  #linat04.grid.umich.edu
+>citi.umich.edu         #University of Michigan - Center for Information Technology Integ
+141.212.112.5                   #babylon.citi.umich.edu
+>sph.umich.edu          #University of Michigan -- School of Public  Health
+141.211.51.137                  #afssph7.sph.umich.edu
+141.211.51.139                  #afssph0.sph.umich.edu
+141.211.51.142                  #afssph6.sph.umich.edu
+>isis.unc.edu           #Univ. of NC at Chapel Hill - ITS
+152.2.1.5                       #db0.isis.unc.edu
+152.2.1.6                       #db1.isis.unc.edu
+152.2.1.7                       #db2.isis.unc.edu
+>physics.unc.edu        #Univ. of NC at Chapel Hill, Dept. of Physics
+152.2.4.1                       #who.physics.unc.edu
+152.2.4.3                       #what.physics.unc.edu
+152.2.4.5                       #when.physics.unc.edu
+>uncc.edu               #University of NC at Charlotte Mosaic AFS Cell
+152.15.10.70                    #as-sm1.uncc.edu
+152.15.93.186                   #as-ece1.uncc.edu
+152.15.181.175                  #as-me1.uncc.edu
+>eng.utah.edu           #University of Utah - Engineering
+155.98.111.9                    #lenny.eng.utah.edu
+155.98.111.10                   #carl.eng.utah.edu
+>cs.uwm.edu             #University of Wisconsin--Milwaukee
+129.89.38.124                   #solomons.cs.uwm.edu
+>cs.wisc.edu            #Univ. of Wisconsin-Madison, Computer Sciences Dept.
+128.105.132.14                  #timon.cs.wisc.edu
+128.105.132.15                  #pumbaa.cs.wisc.edu
+128.105.132.16                  #zazu.cs.wisc.edu
+>engr.wisc.edu          #University of Wisconsin-Madison, College of Engineering
+144.92.13.14                    #larry.cae.wisc.edu
+144.92.13.15                    #curly.cae.wisc.edu
+144.92.13.16                    #moe.cae.wisc.edu
+>hep.wisc.edu           #University of Wisconsin -- High Energy Physics
+128.104.28.219                  #anise.hep.wisc.edu
+144.92.180.7                    #rosemary.hep.wisc.edu
+144.92.180.30                   #fennel.hep.wisc.edu
+>physics.wisc.edu       #Univ. of Wisconsin-Madison, Physics Department
+128.104.160.13                  #kendra.physics.wisc.edu
+128.104.160.14                  #fray.physics.wisc.edu
+128.104.160.15                  #buffy.physics.wisc.edu
+>ciemat.es              #Ciemat, Madrid, Spain
+130.206.11.42                   #afsdb1.ciemat.es
+130.206.11.217                  #afsdb2.ciemat.es
+130.206.11.247                  #afsdb3.ciemat.es
+>ifca.unican.es         #Instituto de Fisica de Cantabria (IFCA), Santander, Spain
+193.144.209.20                  #gridwall.ifca.unican.es
+>ific.uv.es             #Instituto de Fisica Corpuscular, Valencia, Spain
+147.156.163.11                  #alpha.ific.uv.es
+>biocenter.helsinki.fi  #University of Helsinki, Institute of Biotechnology
+128.214.58.174                  #afsdb1.biocenter.helsinki.fi
+128.214.88.114                  #afsdb2.biocenter.helsinki.fi
+>dapnia.saclay.cea.fr   #CEA DAPNIA
+132.166.32.7                    #dphrsg.saclay.cea.fr
+132.166.32.12                   #dphrsl.saclay.cea.fr
+>in2p3.fr               #IN2P3 production cell
+134.158.104.11                  #ccafsdb01.in2p3.fr
+134.158.104.12                  #ccafsdb02.in2p3.fr
+134.158.232.11                  #ccafsdb1.in2p3.fr
+134.158.232.12                  #ccafsdb2.in2p3.fr
+134.158.232.13                  #ccafsdb3.in2p3.fr
+>mcc.ac.gb              #University of Manchester
+130.88.203.41                   #nevis.mc.man.ac.uk
+130.88.203.144                  #eryri.mc.man.ac.uk
+130.88.203.145                  #scafell.mc.man.ac.uk
+>anl.gov                #Argonne National Laboratory
+146.137.96.33                   #arteus.it.anl.gov
+146.137.162.88                  #agamemnon.it.anl.gov
+146.137.194.80                  #antenor.it.anl.gov
+>rhic.bnl.gov           #Relativistic Heavy Ion Collider
+130.199.6.51                    #rafs03.rcf.bnl.gov
+130.199.6.52                    #rafs02.rcf.bnl.gov
+130.199.6.69                    #rafs01.rcf.bnl.gov
+>usatlas.bnl.gov        #US Atlas Tier 1 Facility at BNL
+130.199.48.32                   #aafs01.usatlas.bnl.gov
+130.199.48.33                   #aafs02.usatlas.bnl.gov
+130.199.48.34                   #aafs03.usatlas.bnl.gov
+>fnal.gov               #Fermi National Acclerator Laboratory
+131.225.68.1                    #fsus01.fnal.gov
+131.225.68.4                    #fsus03.fnal.gov
+131.225.68.14                   #fsus04.fnal.gov
+>ic-afs.arc.nasa.gov    #Code IC, Ames Research Center
+128.102.105.62                  #udanax.arc.nasa.gov
+>jpl.nasa.gov           #Jet Propulsion Laboratory
+137.78.160.21                   #afsdb08.jpl.nasa.gov
+137.78.160.22                   #afsdb09.jpl.nasa.gov
+137.78.160.23                   #afsdb10.jpl.nasa.gov
+>nersc.gov              #National Energy Research Supercomputer Center
+128.55.128.250                  #mars.nersc.gov
+128.55.128.252                  #alfred.nersc.gov
+128.55.128.254                  #lurch.nersc.gov
+>doe.atomki.hu          #Institute of Nuclear Research (MTA ATOMKI), Debrecen, Hungary
+193.6.179.31                    #afs.doe.atomki.hu
+>bme.hu                 #Budapest University of Technology and Economics
+152.66.241.6                    #afs.iit.bme.hu
+>kfki.hu                #Research Institute for Nuclear and Particle Physics - Budapest,H
+148.6.8.14                      #afs.kfki.hu
+>caspur.it              #CASPUR Inter-University Computing Consortium, Rome
+193.204.5.45                    #pomodoro.caspur.it
+193.204.5.46                    #banana.caspur.it
+193.204.5.50                    #maslo.caspur.it
+>enea.it                #ENEA New Tech. Energy & Environment Agency, Italy
+192.107.54.5                    #aixfs.frascati.enea.it
+192.107.54.11                   #rs2ced.frascati.enea.it
+192.107.54.12                   #43p.frascati.enea.it
+>fusione.it             #Assoz. FUSIONE/Euratom, ENEA, Frascati-Italy
+192.107.90.2                    #fusafs1.frascati.enea.it
+192.107.90.3                    #fusafs2.frascati.enea.it
+192.107.90.4                    #fusafs3.frascati.enea.it
+>icemb.it               #ICEMB, Universita' La Sapienza - Rome - Italy
+193.204.6.130                   #icembfs.caspur.it
+>ictp.it                #The Abdus Salam International Centre for Theoretical Physics (IC
+140.105.34.7                    #afsdb1.ictp.it
+140.105.34.8                    #afsdb2.ictp.it
+>infn.it                #Istituto Nazionale di Fisica Nucleare (INFN), Italia
+131.154.1.7                     #afscnaf.infn.it
+141.108.26.75                   #afsrm1.roma1.infn.it
+192.84.134.75                   #afsna.na.infn.it
+>ba.infn.it             #INFN, Sezione di Bari
+193.206.185.235                 #baafsserver.ba.infn.it
+193.206.185.236                 #debsrv.ba.infn.it
+>kloe.infn.it           #INFN, KLOE experiment at Laboratori di Frascati
+192.135.25.111                  #kloeafs1.lnf.infn.it
+192.135.25.112                  #kloeafs2.lnf.infn.it
+>le.infn.it             #INFN, Sezione di Lecce
+192.84.152.40                   #afs01.le.infn.it
+192.84.152.148                  #afs02.le.infn.it
+>lnf.infn.it            #INFN, Laboratori Nazionali di Frascati
+193.206.84.121                  #afs1.lnf.infn.it
+193.206.84.122                  #afs2.lnf.infn.it
+193.206.84.123                  #afs3.lnf.infn.it
+>lngs.infn.it           #INFN, Laboratori Nazionali di Gran Sasso
+192.84.135.21                   #rsgs05.lngs.infn.it
+>pi.infn.it             #INFN, Sezione di Pisa
+192.84.133.50                   #aix1.pi.infn.it
+212.189.152.6                   #afs1.pi.infn.it
+212.189.152.7                   #afs2.pi.infn.it
+>roma3.infn.it          #Istituto Nazionale di Fisica Nucleare (INFN), Italia
+193.205.159.17                  #afsrm3.roma3.infn.it
+>psm.it                 #Progetto San Marco, Universita' di Roma-1
+151.100.1.65                    #atlante.psm.uniroma1.it
+>tgrid.it               #CASPUR-CILEA-CINECA Grid Cell
+193.204.5.33                    #cccgrid.caspur.it
+>math.unifi.it          #math.unifi.it
+150.217.34.182                  #xeno.math.unifi.it
+>ing.uniroma1.it        #Universita' La Sapienza, Fac. Ingeneria
+151.100.85.253                  #alfa.ing.uniroma1.it
+>dia.uniroma3.it        #University Roma Tre - DIA
+193.204.161.79                  #plm.dia.uniroma3.it
+193.204.161.118                 #afs.dia.uniroma3.it
+>vn.uniroma3.it         #University of Rome 3, Area Vasca Navale
+193.204.161.136                 #alfa.dia.uniroma3.it
+193.204.161.137                 #beta.dia.uniroma3.it
+193.204.161.138                 #gamma.dia.uniroma3.it
+>italia                 #Italian public AFS cell
+193.204.5.9                     #afs.caspur.it
+>cmf.nrl.navy.mil       #Naval Research Laboratory - Center for Computational Science
+134.207.12.68                   #picard.cmf.nrl.navy.mil
+134.207.12.69                   #riker.cmf.nrl.navy.mil
+134.207.12.70                   #kirk.cmf.nrl.navy.mil
+>lcp.nrl.navy.mil       #Naval Research Lab - Lab for Computational Physics
+132.250.114.2                   #afs1.lcp.nrl.navy.mil
+132.250.114.4                   #afs2.lcp.nrl.navy.mil
+132.250.114.6                   #afs3.lcp.nrl.navy.mil
+>epitech.net            #EPITECH, France
+163.5.255.41                    #afs-db-1.epitech.net
+163.5.255.42                    #afs-db-2.epitech.net
+>es.net                 #Energy Sciences Net
+198.128.3.21                    #fs1.es.net
+198.128.3.22                    #fs2.es.net
+198.128.3.23                    #fs3.es.net
+>laroia.net             #Laroia Networks
+66.66.102.254                   #supercore.laroia.net
+>sinenomine.net         #Sine Nomine Associates
+66.135.48.108                   #tx2srv03.sinenomine.net
+72.73.30.42                     #va.sinenomine.net
+>slackers.net           #The Slackers' Network
+199.4.150.159                   #alexandria.slackers.net
+>tproa.net              #The People's Republic of Ames
+204.11.35.83                    #service-3.tproa.net
+204.11.35.84                    #service-4.tproa.net
+204.11.35.85                    #service-5.tproa.net
+>interdose.net          #Interdose Ltd. & Co. KG, Germany
+80.190.171.42                   #bfd9000.tow5.interdose.net
+80.190.171.43                   #bfd9001.tow5.interdose.net
+>nikhef.nl              #The Dutch National Institute for High Energy Physics
+192.16.185.26                   #afs1.nikhef.nl
+192.16.185.27                   #afs2.nikhef.nl
+>1ts.org                #1TS.ORG, Cambridge, MA
+69.25.196.126                   #neuromancer.1ts.org
+>acm-csuf.org           #California State Univerisity Fullerton ACM
+137.151.29.193                  #afs1.acm-csuf.org
+>adrake.org             #adrake.org
+128.2.98.241                    #afs.adrake.org
+>bazquux.org            #Baz Quux Organization
+66.207.142.196                  #baxquux.org
+>coed.org               #Adam Pennington's Cell
+66.93.61.184                    #vice1.coed.org
+128.237.157.35                  #vice3.coed.org
+>dementia.org           #Dementia Unlimited
+128.2.13.209                    #dedlock.dementia.org
+128.2.235.26                    #meredith.dementia.org
+>idahofuturetruck.org   #University of Idaho hybrid vehicle development
+12.18.238.210                   #dsle210.fsr.net
+>jeaton.org             #jeaton.org (Jeffrey Eaton, jeaton@jeaton.org)
+128.2.234.89                    #jeaton-org-01.jeaton.org
+128.2.234.92                    #jeaton-org-02.jeaton.org
+>mrow.org               #MROW.ORG and RITLUG Cell
+88.198.46.111                   #mrow.org
+129.21.205.119                  #mirror.rit.edu
+>mrph.org               #Mrph
+66.207.133.1                    #sanber.mrph.org
+128.2.99.209                    #hernandarias.mrph.org
+>mstacm.org             #Missouri Science & Technology - ACM
+131.151.249.193                 #acm.mst.edu
+>nomh.org               #nomh.org
+204.29.154.12                   #iota.nomh.org
+204.29.154.32                   #adversity.xi.nomh.org
+>oc7.org                #The OC7 Project
+128.2.122.140                   #knife.oc7.org
+207.22.77.170                   #spoon.oc7.org
+>pfriedma.org           #pfriedma.org
+72.95.215.18                    #vice.pfriedma.org
+>riscpkg.org            #The RISC OS Packaging Project
+83.104.175.10                   #delenn.riscpkg.org
+>kth.se                 #Royal Institute of Technology, Stockholm, Sweden
+130.237.32.145                  #sonen.e.kth.se
+130.237.48.7                    #anden.e.kth.se
+130.237.48.244                  #fadern.e.kth.se
+>isk.kth.se             #Royal Institute of Technology, ISK
+130.237.209.5                   #afsdb2.isk.kth.se
+130.237.216.17                  #afsdb1.isk.kth.se
+>it.kth.se              #Royal Institute of Technology, IT
+130.237.212.15                  #ptah.it.kth.se
+130.237.212.16                  #toth.it.kth.se
+130.237.215.7                   #isis.it.kth.se
+>md.kth.se              #Royal Institute of Technology, MMK
+130.237.57.21                   #euler.md.kth.se
+130.237.57.68                   #trinity.md.kth.se
+130.237.57.72                   #morpheus.md.kth.se
+>mech.kth.se            #Royal Institute of Technology, MECH
+130.237.233.142                 #matterhorn.mech.kth.se
+130.237.233.143                 #castor.mech.kth.se
+130.237.233.144                 #pollux.mech.kth.se
+>nada.kth.se            #Royal Institute of Technology, NADA
+130.237.222.20                  #kosmos.nada.kth.se
+130.237.223.12                  #sputnik.nada.kth.se
+130.237.224.78                  #mir.nada.kth.se
+130.237.227.23                  #gagarin.nada.kth.se
+130.237.228.28                  #laika.nada.kth.se
+>pdc.kth.se             #Royal Institute of Technology, PDC
+130.237.232.29                  #crab.pdc.kth.se
+130.237.232.112                 #anna.pdc.kth.se
+130.237.232.114                 #hokkigai.pdc.kth.se
+>stacken.kth.se         #Stacken Computer Club
+130.237.234.3                   #milko.stacken.kth.se
+130.237.234.43                  #hot.stacken.kth.se
+130.237.234.101                 #fishburger.stacken.kth.se
+>syd.kth.se             #Royal Institute of Technology, KTH-Syd
+130.237.83.23                   #afs.haninge.kth.se
+>physto.se              #Physics department Stockholm University
+130.237.205.36                  #sysafs1.physto.se
+130.237.205.72                  #sysafs2.physto.se
+>sanchin.se             #Sanchin Consulting AB, Sweden
+192.195.148.10                  #sesan.sanchin.se
+>su.se                  #Stockholm University
+130.237.162.81                  #afsdb1.su.se
+130.237.162.82                  #afsdb2.su.se
+130.237.162.230                 #afsdb3.su.se
+>f9.ijs.si              #F9, Jozef Stefan Institue
+194.249.156.1                   #brenta.ijs.si
+>p-ng.si                #Nova Gorica Polytechnic
+193.2.120.2                     #solkan.p-ng.si
+>hep-ex.physics.metu.edu.tr #METU Department of Physics, Experimental HEP group, Ankara/Turke
+144.122.31.131                  #neutrino.physics.metu.edu.tr
+>phy.bris.ac.uk         #Bristol University - physics
+137.222.74.18                   #zen.phy.bris.ac.uk
+>inf.ed.ac.uk           #School of Informatics, University of Edinburgh
+129.215.64.16                   #afsdb0.inf.ed.ac.uk
+129.215.64.17                   #afsdb1.inf.ed.ac.uk
+129.215.64.18                   #afsdb2.inf.ed.ac.uk
+>ic.ac.uk               #Imperial College London
+155.198.63.148                  #icafs2.cc.ic.ac.uk
+155.198.63.149                  #icafs1.cc.ic.ac.uk
+>hep.man.ac.uk          #Manchester HEP
+194.36.2.3                      #afs1.hep.man.ac.uk
+194.36.2.4                      #afs2.hep.man.ac.uk
+194.36.2.5                      #afs3.hep.man.ac.uk
+>rl.ac.uk               #Rutherford Appleton Lab, England
+130.246.183.203                 #afs1.gridpp.rl.ac.uk
+130.246.183.204                 #afs2.gridpp.rl.ac.uk
+130.246.183.205                 #afs3.gridpp.rl.ac.uk
Index: branches/fc15-dev/server/fedora/config/usr/vice/etc/NetRestrict
===================================================================
--- branches/fc15-dev/server/fedora/config/usr/vice/etc/NetRestrict	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/usr/vice/etc/NetRestrict	(revision 1803)
@@ -0,0 +1,1 @@
+link /etc/openafs/NetRestrict
Index: branches/fc15-dev/server/fedora/config/usr/vice/etc/ThisCell
===================================================================
--- branches/fc15-dev/server/fedora/config/usr/vice/etc/ThisCell	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/usr/vice/etc/ThisCell	(revision 1803)
@@ -0,0 +1,1 @@
+athena.mit.edu
Index: branches/fc15-dev/server/fedora/config/usr/vice/etc/cacheinfo
===================================================================
--- branches/fc15-dev/server/fedora/config/usr/vice/etc/cacheinfo	(revision 1803)
+++ branches/fc15-dev/server/fedora/config/usr/vice/etc/cacheinfo	(revision 1803)
@@ -0,0 +1,1 @@
+/afs:/usr/vice/cache:10000000
Index: branches/fc15-dev/server/fedora/ref-prepatch/README
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/README	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/README	(revision 1803)
@@ -0,0 +1,5 @@
+This directory contains some reference Fedora source files that are known to
+work with our patches.
+
+This information is useful to have around when a patch does not apply or does
+not work.
Index: branches/fc15-dev/server/fedora/ref-prepatch/VERSIONS
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/VERSIONS	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/VERSIONS	(revision 1803)
@@ -0,0 +1,2 @@
+krb5.spec and kuserok.c from FC6's krb5-1.5-7.src.rpm
+httpd.spec and suexec.c from FC6's httpd-2.2.3-5.src.rpm
Index: branches/fc15-dev/server/fedora/ref-prepatch/httpd.spec
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/httpd.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/httpd.spec	(revision 1803)
@@ -0,0 +1,686 @@
+%define contentdir /var/www
+%define suexec_caller apache
+%define mmn 20051115
+%define vstring Fedora
+%define distro Fedora Core
+
+Summary: Apache HTTP Server
+Name: httpd
+Version: 2.2.3
+Release: 5
+URL: http://httpd.apache.org/
+Source0: http://www.apache.org/dist/httpd/httpd-%{version}.tar.gz
+Source1: index.html
+Source3: httpd.logrotate
+Source4: httpd.init
+Source5: httpd.sysconf
+Source7: powered_by_fedora.png
+Source10: httpd.conf
+Source11: ssl.conf
+Source12: welcome.conf
+Source13: manual.conf
+Source14: proxy_ajp.conf
+# Documentation
+Source30: migration.xml
+Source31: migration.css
+Source32: html.xsl
+Source33: README.confd
+# build/scripts patches
+Patch1: httpd-2.1.10-apctl.patch
+Patch2: httpd-2.1.10-apxs.patch
+Patch3: httpd-2.0.45-deplibs.patch
+Patch4: httpd-2.1.10-disablemods.patch
+Patch5: httpd-2.1.10-layout.patch
+Patch6: httpd-2.2.2-ac260.patch
+# Features/functional changes
+Patch20: httpd-2.0.48-release.patch
+Patch21: httpd-2.0.40-xfsz.patch
+Patch22: httpd-2.1.10-pod.patch
+Patch23: httpd-2.0.45-export.patch
+Patch24: httpd-2.0.48-corelimit.patch
+Patch25: httpd-2.0.54-selinux.patch
+# Bug fixes
+Patch50: httpd-2.0.45-encode.patch
+Patch54: httpd-2.2.0-authnoprov.patch
+License: Apache Software License
+Group: System Environment/Daemons
+BuildRoot: %{_tmppath}/%{name}-root
+BuildRequires: autoconf, perl, pkgconfig, xmlto >= 0.0.11, findutils
+BuildRequires: db4-devel, expat-devel, zlib-devel, libselinux-devel
+BuildRequires: apr-devel >= 1.2.0, apr-util-devel >= 1.2.0, pcre-devel >= 5.0, 
+Requires: /etc/mime.types, gawk, /usr/share/magic.mime, /usr/bin/find
+Requires: initscripts >= 8.36
+Obsoletes: httpd-suexec
+Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv
+Prereq: sh-utils, textutils, /usr/sbin/useradd
+Provides: webserver
+Provides: httpd-mmn = %{mmn}
+Obsoletes: apache, secureweb, mod_dav, mod_gzip, stronghold-apache, stronghold-htdocs
+Obsoletes: mod_put, mod_roaming, mod_jk
+Conflicts: pcre < 4.0
+
+%description
+The Apache HTTP Server is a powerful, efficient, and extensible
+web server.
+
+%package devel
+Group: Development/Libraries
+Summary: Development tools for the Apache HTTP server.
+Obsoletes: secureweb-devel, apache-devel, stronghold-apache-devel
+Requires: apr-devel, apr-util-devel, pkgconfig
+Requires: httpd = %{version}-%{release}
+
+%description devel
+The httpd-devel package contains the APXS binary and other files
+that you need to build Dynamic Shared Objects (DSOs) for the
+Apache HTTP Server.
+
+If you are installing the Apache HTTP server and you want to be
+able to compile or develop additional modules for Apache, you need
+to install this package.
+
+%package manual
+Group: Documentation
+Summary: Documentation for the Apache HTTP server.
+Requires: httpd = %{version}-%{release}
+Obsoletes: secureweb-manual, apache-manual
+
+%description manual
+The httpd-manual package contains the complete manual and
+reference guide for the Apache HTTP server. The information can
+also be found at http://httpd.apache.org/docs/2.2/.
+
+%package -n mod_ssl
+Group: System Environment/Daemons
+Summary: SSL/TLS module for the Apache HTTP server
+Epoch: 1
+BuildRequires: openssl-devel, distcache-devel
+Requires(post): openssl >= 0.9.7f-4, /bin/cat
+Requires: httpd = 0:%{version}-%{release}, httpd-mmn = %{mmn}
+Obsoletes: stronghold-mod_ssl
+
+%description -n mod_ssl
+The mod_ssl module provides strong cryptography for the Apache Web
+server via the Secure Sockets Layer (SSL) and Transport Layer
+Security (TLS) protocols.
+
+%prep
+%setup -q
+%patch1 -p1 -b .apctl
+%patch2 -p1 -b .apxs
+%patch3 -p1 -b .deplibs
+%patch4 -p1 -b .disablemods
+%patch5 -p1 -b .layout
+%patch6 -p1 -b .ac260
+
+%patch21 -p0 -b .xfsz
+%patch22 -p1 -b .pod
+%patch23 -p1 -b .export
+%patch24 -p1 -b .corelimit
+%patch25 -p1 -b .selinux
+
+# no -b to prevent droplets in install root
+%patch50 -p1
+%patch54 -p1 -b .authnoprov
+
+# Patch in vendor/release string
+sed "s/@RELEASE@/%{vstring}/" < %{PATCH20} | patch -p1
+
+# Safety check: prevent build if defined MMN does not equal upstream MMN.
+vmmn=`echo MODULE_MAGIC_NUMBER_MAJOR | cpp -include include/ap_mmn.h | sed -n '/^2/p'`
+if test "x${vmmn}" != "x%{mmn}"; then
+   : Error: Upstream MMN is now ${vmmn}, packaged MMN is %{mmn}.
+   : Update the mmn macro and rebuild.
+   exit 1
+fi
+
+: Building for '%{distro}' with MMN %{mmn} and vendor string '%{vstring}'
+
+%build
+# forcibly prevent use of bundled apr, apr-util, pcre
+rm -rf srclib/{apr,apr-util,pcre}
+
+# regenerate configure scripts
+autoheader && autoconf || exit 1
+
+# Limit size of CHANGES to recent history
+echo '1,/Changes with Apache MPM/wq' | ed CHANGES
+
+# Before configure; fix location of build dir in generated apxs
+%{__perl} -pi -e "s:\@exp_installbuilddir\@:%{_libdir}/httpd/build:g" \
+	support/apxs.in
+# update location of migration guide in apachectl
+%{__perl} -pi -e "s:\@docdir\@:%{_docdir}/%{name}-%{version}:g" \
+	support/apachectl.in
+
+# Build the migration guide
+sed 's/@DISTRO@/%{distro}/' < $RPM_SOURCE_DIR/migration.xml > migration.xml
+xmlto -x $RPM_SOURCE_DIR/html.xsl html-nochunks migration.xml
+cp $RPM_SOURCE_DIR/migration.css . # make %%doc happy
+
+CFLAGS=$RPM_OPT_FLAGS
+SH_LDFLAGS="-Wl,-z,relro"
+export CFLAGS SH_LDFLAGS
+
+function mpmbuild()
+{
+mpm=$1; shift
+mkdir $mpm; pushd $mpm
+../configure \
+ 	--prefix=%{_sysconfdir}/httpd \
+ 	--exec-prefix=%{_prefix} \
+ 	--bindir=%{_bindir} \
+ 	--sbindir=%{_sbindir} \
+ 	--mandir=%{_mandir} \
+	--libdir=%{_libdir} \
+	--sysconfdir=%{_sysconfdir}/httpd/conf \
+	--includedir=%{_includedir}/httpd \
+	--libexecdir=%{_libdir}/httpd/modules \
+	--datadir=%{contentdir} \
+        --with-installbuilddir=%{_libdir}/httpd/build \
+	--with-mpm=$mpm \
+        --with-apr=%{_prefix} --with-apr-util=%{_prefix} \
+	--enable-suexec --with-suexec \
+	--with-suexec-caller=%{suexec_caller} \
+	--with-suexec-docroot=%{contentdir} \
+	--with-suexec-logfile=%{_localstatedir}/log/httpd/suexec.log \
+	--with-suexec-bin=%{_sbindir}/suexec \
+	--with-suexec-uidmin=500 --with-suexec-gidmin=100 \
+        --enable-pie \
+        --with-pcre \
+	$*
+
+make %{?_smp_mflags}
+popd
+}
+
+# Build everything and the kitchen sink with the prefork build
+mpmbuild prefork \
+        --enable-mods-shared=all \
+	--enable-ssl --with-ssl --enable-distcache \
+	--enable-proxy \
+        --enable-cache --enable-mem-cache \
+        --enable-file-cache --enable-disk-cache \
+        --enable-ldap --enable-authnz-ldap \
+        --enable-cgid \
+        --enable-authn-anon --enable-authn-alias
+
+# For the other MPMs, just build httpd and no optional modules
+mpmbuild worker --enable-modules=none
+#mpmbuild event --enable-modules=none
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+# Classify ab and logresolve as section 1 commands, as they are in /usr/bin
+mv docs/man/ab.8 docs/man/ab.1
+mv docs/man/logresolve.8 docs/man/logresolve.1
+
+pushd prefork
+make DESTDIR=$RPM_BUILD_ROOT install
+popd
+
+# install alternative MPMs
+install -m 755 worker/httpd $RPM_BUILD_ROOT%{_sbindir}/httpd.worker
+#install -m 755 event/httpd $RPM_BUILD_ROOT%{_sbindir}/httpd.event
+
+# install conf file/directory
+mkdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d
+install -m 644 $RPM_SOURCE_DIR/README.confd \
+    $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/README
+for f in ssl.conf welcome.conf manual.conf proxy_ajp.conf; do
+  install -m 644 $RPM_SOURCE_DIR/$f $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/$f
+done
+
+rm $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/*.conf
+install -m 644 $RPM_SOURCE_DIR/httpd.conf \
+   $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/httpd.conf
+
+mkdir $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
+install -m 644 $RPM_SOURCE_DIR/httpd.sysconf \
+   $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/httpd
+
+# for holding mod_dav lock database
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/dav
+
+# create a prototype session cache
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/mod_ssl
+touch $RPM_BUILD_ROOT%{_localstatedir}/cache/mod_ssl/scache.{dir,pag,sem}
+
+# create cache root
+mkdir $RPM_BUILD_ROOT%{_localstatedir}/cache/mod_proxy
+
+# move utilities to /usr/bin
+mv $RPM_BUILD_ROOT%{_sbindir}/{ab,htdbm,logresolve,htpasswd,htdigest} \
+   $RPM_BUILD_ROOT%{_bindir}
+
+# Make the MMN accessible to module packages
+echo %{mmn} > $RPM_BUILD_ROOT%{_includedir}/httpd/.mmn
+
+# docroot
+mkdir $RPM_BUILD_ROOT%{contentdir}/html
+install -m 644 $RPM_SOURCE_DIR/index.html \
+	$RPM_BUILD_ROOT%{contentdir}/error/noindex.html
+
+# remove manual sources
+find $RPM_BUILD_ROOT%{contentdir}/manual \( \
+    -name \*.xml -o -name \*.xml.* -o -name \*.ent -o -name \*.xsl -o -name \*.dtd \
+    \) -print0 | xargs -0 rm -f
+
+# Strip the manual down just to English and replace the typemaps with flat files:
+set +x
+for f in `find $RPM_BUILD_ROOT%{contentdir}/manual -name \*.html -type f`; do
+   if test -f ${f}.en; then
+      cp ${f}.en ${f}
+      rm ${f}.*
+   fi
+done
+set -x
+
+install -m 644 $RPM_SOURCE_DIR/powered_by_fedora.png \
+	$RPM_BUILD_ROOT%{contentdir}/icons
+
+# logs
+rmdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/logs
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/httpd
+
+# symlinks for /etc/httpd
+ln -s ../..%{_localstatedir}/log/httpd $RPM_BUILD_ROOT/etc/httpd/logs
+ln -s ../..%{_localstatedir}/run $RPM_BUILD_ROOT/etc/httpd/run
+ln -s ../..%{_libdir}/httpd/modules $RPM_BUILD_ROOT/etc/httpd/modules
+
+# install SYSV init stuff
+mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
+install -m755 $RPM_SOURCE_DIR/httpd.init \
+	$RPM_BUILD_ROOT/etc/rc.d/init.d/httpd
+%{__perl} -pi -e "s:\@docdir\@:%{_docdir}/%{name}-%{version}:g" \
+	$RPM_BUILD_ROOT/etc/rc.d/init.d/httpd	
+
+# install log rotation stuff
+mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d
+install -m644 $RPM_SOURCE_DIR/httpd.logrotate \
+	$RPM_BUILD_ROOT/etc/logrotate.d/httpd
+
+# fix man page paths
+sed -e "s|/usr/local/apache2/conf/httpd.conf|/etc/httpd/conf/httpd.conf|" \
+    -e "s|/usr/local/apache2/conf/mime.types|/etc/mime.types|" \
+    -e "s|/usr/local/apache2/conf/magic|/etc/httpd/conf/magic|" \
+    -e "s|/usr/local/apache2/logs/error_log|/var/log/httpd/error_log|" \
+    -e "s|/usr/local/apache2/logs/access_log|/var/log/httpd/access_log|" \
+    -e "s|/usr/local/apache2/logs/httpd.pid|/var/run/httpd.pid|" \
+    -e "s|/usr/local/apache2|/etc/httpd|" < docs/man/httpd.8 \
+  > $RPM_BUILD_ROOT%{_mandir}/man8/httpd.8
+
+# Make ap_config_layout.h libdir-agnostic
+sed -i '/.*DEFAULT_..._LIBEXECDIR/d;/DEFAULT_..._INSTALLBUILDDIR/d' \
+    $RPM_BUILD_ROOT%{_includedir}/httpd/ap_config_layout.h
+
+# Remove unpackaged files
+rm -f $RPM_BUILD_ROOT%{_libdir}/*.exp \
+      $RPM_BUILD_ROOT/etc/httpd/conf/mime.types \
+      $RPM_BUILD_ROOT%{_libdir}/httpd/modules/*.exp \
+      $RPM_BUILD_ROOT%{_libdir}/httpd/build/config.nice \
+      $RPM_BUILD_ROOT%{_bindir}/ap?-config \
+      $RPM_BUILD_ROOT%{_sbindir}/{checkgid,dbmmanage,envvars*} \
+      $RPM_BUILD_ROOT%{contentdir}/htdocs/* \
+      $RPM_BUILD_ROOT%{_mandir}/man1/dbmmanage.* \
+      $RPM_BUILD_ROOT%{contentdir}/cgi-bin/*
+
+rm -rf $RPM_BUILD_ROOT/etc/httpd/conf/{original,extra}
+
+# Make suexec a+rw so it can be stripped.  %%files lists real permissions
+chmod 755 $RPM_BUILD_ROOT%{_sbindir}/suexec
+
+%pre
+# Add the "apache" user
+/usr/sbin/useradd -c "Apache" -u 48 \
+	-s /sbin/nologin -r -d %{contentdir} apache 2> /dev/null || :
+
+%triggerpostun -- apache < 2.0, stronghold-apache < 2.0
+/sbin/chkconfig --add httpd
+
+# Prevent removal of index.html on upgrades from 1.3
+%triggerun -- apache < 2.0, stronghold-apache < 2.0
+if [ -r %{contentdir}/index.html -a ! -r %{contentdir}/index.html.rpmold ]; then
+  mv %{contentdir}/index.html %{contentdir}/index.html.rpmold
+fi
+
+%post
+# Register the httpd service
+/sbin/chkconfig --add httpd
+
+%preun
+if [ $1 = 0 ]; then
+	/sbin/service httpd stop > /dev/null 2>&1
+	/sbin/chkconfig --del httpd
+fi
+
+%define sslcert %{_sysconfdir}/pki/tls/certs/localhost.crt
+%define sslkey %{_sysconfdir}/pki/tls/private/localhost.key
+
+%post -n mod_ssl
+umask 077
+
+if [ ! -f %{sslkey} ] ; then
+%{_bindir}/openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > %{sslkey} 2> /dev/null
+fi
+
+FQDN=`hostname`
+if [ "x${FQDN}" = "x" ]; then
+   FQDN=localhost.localdomain
+fi
+
+if [ ! -f %{sslcert} ] ; then
+cat << EOF | %{_bindir}/openssl req -new -key %{sslkey} \
+         -x509 -days 365 -set_serial $RANDOM \
+         -out %{sslcert} 2>/dev/null
+--
+SomeState
+SomeCity
+SomeOrganization
+SomeOrganizationalUnit
+${FQDN}
+root@${FQDN}
+EOF
+fi
+
+%check
+# Check the built modules are all PIC
+if readelf -d $RPM_BUILD_ROOT%{_libdir}/httpd/modules/*.so | grep TEXTREL; then
+   : modules contain non-relocatable code
+   exit 1
+fi
+
+# Verify that the same modules were built into the httpd binaries
+./prefork/httpd -l | grep -v prefork > prefork.mods
+for mpm in worker; do
+  ./${mpm}/httpd -l | grep -v ${mpm} > ${mpm}.mods
+  if ! diff -u prefork.mods ${mpm}.mods; then
+    : Different modules built into httpd binaries, will not proceed
+    exit 1
+  fi
+done
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+
+%doc ABOUT_APACHE README CHANGES LICENSE VERSIONING NOTICE
+%doc migration.html migration.css
+
+%dir %{_sysconfdir}/httpd
+%{_sysconfdir}/httpd/modules
+%{_sysconfdir}/httpd/logs
+%{_sysconfdir}/httpd/run
+%dir %{_sysconfdir}/httpd/conf
+%config %{_sysconfdir}/httpd/conf/httpd.conf
+%config(noreplace) %{_sysconfdir}/httpd/conf.d/welcome.conf
+%config(noreplace) %{_sysconfdir}/httpd/conf.d/proxy_ajp.conf
+%config(noreplace) %{_sysconfdir}/httpd/conf/magic
+
+%config(noreplace) %{_sysconfdir}/logrotate.d/httpd
+%config %{_sysconfdir}/rc.d/init.d/httpd
+
+%dir %{_sysconfdir}/httpd/conf.d
+%{_sysconfdir}/httpd/conf.d/README
+
+%config(noreplace) %{_sysconfdir}/sysconfig/httpd
+
+%{_bindir}/*
+%{_sbindir}/ht*
+%{_sbindir}/apachectl
+%{_sbindir}/rotatelogs
+%attr(4510,root,%{suexec_caller}) %{_sbindir}/suexec
+
+%dir %{_libdir}/httpd
+%dir %{_libdir}/httpd/modules
+%{_libdir}/httpd/modules/mod*.so
+%exclude %{_libdir}/httpd/modules/mod_ssl.so
+
+%dir %{contentdir}
+%dir %{contentdir}/cgi-bin
+%dir %{contentdir}/html
+%dir %{contentdir}/icons
+%dir %{contentdir}/error
+%dir %{contentdir}/error/include
+%{contentdir}/icons/*
+%{contentdir}/error/README
+%{contentdir}/error/noindex.html
+%config %{contentdir}/error/*.var
+%config %{contentdir}/error/include/*.html
+
+%attr(0700,root,root) %dir %{_localstatedir}/log/httpd
+%attr(0700,apache,apache) %dir %{_localstatedir}/lib/dav
+%attr(0700,apache,apache) %dir %{_localstatedir}/cache/mod_proxy
+
+%{_mandir}/man?/*
+%exclude %{_mandir}/man8/apxs.8*
+
+%files manual
+%defattr(-,root,root)
+%{contentdir}/manual
+%config %{_sysconfdir}/httpd/conf.d/manual.conf
+
+%files -n mod_ssl
+%defattr(-,root,root)
+%{_libdir}/httpd/modules/mod_ssl.so
+%config(noreplace) %{_sysconfdir}/httpd/conf.d/ssl.conf
+%attr(0700,apache,root) %dir %{_localstatedir}/cache/mod_ssl
+%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.dir
+%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.pag
+%attr(0600,apache,root) %ghost %{_localstatedir}/cache/mod_ssl/scache.sem
+
+%files devel
+%defattr(-,root,root)
+%{_includedir}/httpd
+%{_sbindir}/apxs
+%{_mandir}/man8/apxs.8*
+%dir %{_libdir}/httpd/build
+%{_libdir}/httpd/build/*.mk
+%{_libdir}/httpd/build/*.sh
+
+%changelog
+* Mon Sep 11 2006 Joe Orton <jorton@redhat.com> 2.2.3-5
+- updated "powered by Fedora" logo (#205573, Diana Fong)
+- tweak welcome page wording slightly (#205880)
+
+* Fri Aug 18 2006 Jesse Keating <jkeating@redhat.com> - 2.2.3-4
+- rebuilt with latest binutils to pick up 64K -z commonpagesize on ppc*
+  (#203001)
+
+* Thu Aug  3 2006 Joe Orton <jorton@redhat.com> 2.2.3-3
+- init: use killproc() delay to avoid race killing parent
+
+* Fri Jul 28 2006 Joe Orton <jorton@redhat.com> 2.2.3-2
+- update to 2.2.3
+- trim %%changelog to >=2.0.52
+
+* Thu Jul 20 2006 Joe Orton <jorton@redhat.com> 2.2.2-8
+- fix segfault on dummy connection failure at graceful restart (#199429)
+
+* Wed Jul 19 2006 Joe Orton <jorton@redhat.com> 2.2.2-7
+- fix "apxs -g"-generated Makefile
+- fix buildconf with autoconf 2.60
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 2.2.2-5.1
+- rebuild
+
+* Wed Jun  7 2006 Joe Orton <jorton@redhat.com> 2.2.2-5
+- require pkgconfig for -devel (#194152)
+- fixes for installed support makefiles (special.mk et al)
+- BR autoconf
+
+* Fri Jun  2 2006 Joe Orton <jorton@redhat.com> 2.2.2-4
+- make -devel package multilib-safe (#192686)
+
+* Thu May 11 2006 Joe Orton <jorton@redhat.com> 2.2.2-3
+- build DSOs using -z relro linker flag
+
+* Wed May  3 2006 Joe Orton <jorton@redhat.com> 2.2.2-2
+- update to 2.2.2
+
+* Thu Apr  6 2006 Joe Orton <jorton@redhat.com> 2.2.0-6
+- rebuild to pick up apr-util LDAP interface fix (#188073)
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - (none):2.2.0-5.1.2
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - (none):2.2.0-5.1.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Mon Feb  6 2006 Joe Orton <jorton@redhat.com> 2.2.0-5.1
+- mod_auth_basic/mod_authn_file: if no provider is configured,
+  and AuthUserFile is not configured, decline to handle authn
+  silently rather than failing noisily.
+
+* Fri Feb  3 2006 Joe Orton <jorton@redhat.com> 2.2.0-5
+- mod_ssl: add security fix for CVE-2005-3357 (#177914)
+- mod_imagemap: add security fix for CVE-2005-3352 (#177913)
+- add fix for AP_INIT_* designated initializers with C++ compilers
+- httpd.conf: enable HTMLTable in default IndexOptions
+- httpd.conf: add more "redirect-carefully" matches for DAV clients
+
+* Thu Jan  5 2006 Joe Orton <jorton@redhat.com> 2.2.0-4
+- mod_proxy_ajp: fix Cookie handling (Mladen Turk, r358769)
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Wed Dec  7 2005 Joe Orton <jorton@redhat.com> 2.2.0-3
+- strip manual to just English content
+
+* Mon Dec  5 2005 Joe Orton <jorton@redhat.com> 2.2.0-2
+- don't strip C-L from HEAD responses (Greg Ames, #110552)
+- load mod_proxy_balancer by default
+- add proxy_ajp.conf to load/configure mod_proxy_ajp
+- Obsolete mod_jk
+- update docs URLs in httpd.conf/ssl.conf
+
+* Fri Dec  2 2005 Joe Orton <jorton@redhat.com> 2.2.0-1
+- update to 2.2.0
+
+* Wed Nov 30 2005 Joe Orton <jorton@redhat.com> 2.1.10-2
+- enable mod_authn_alias, mod_authn_anon
+- update default httpd.conf
+
+* Fri Nov 25 2005 Joe Orton <jorton@redhat.com> 2.1.10-1
+- update to 2.1.10
+- require apr >= 1.2.0, apr-util >= 1.2.0
+
+* Wed Nov  9 2005 Tomas Mraz <tmraz@redhat.com> 2.0.54-16
+- rebuilt against new openssl
+
+* Thu Nov  3 2005 Joe Orton <jorton@redhat.com> 2.0.54-15
+- log notice giving SELinux context at startup if enabled
+- drop SSLv2 and restrict default cipher suite in default
+ SSL configuration
+
+* Thu Oct 20 2005 Joe Orton <jorton@redhat.com> 2.0.54-14
+- mod_ssl: add security fix for SSLVerifyClient (CVE-2005-2700)
+- add security fix for byterange filter DoS (CVE-2005-2728)
+- add security fix for C-L vs T-E handling (CVE-2005-2088)
+- mod_ssl: add security fix for CRL overflow (CVE-2005-1268)
+- mod_ldap/mod_auth_ldap: add fixes from 2.0.x branch (upstream #34209 etc)
+- add fix for dummy connection handling (#167425)
+- mod_auth_digest: fix hostinfo comparison in CONNECT requests
+- mod_include: fix variable corruption in nested includes (upstream #12655)
+- mod_ssl: add fix for handling non-blocking reads
+- mod_ssl: fix to enable output buffering (upstream #35279)
+- mod_ssl: buffer request bodies for per-location renegotiation (upstream #12355)
+
+* Sat Aug 13 2005 Joe Orton <jorton@redhat.com> 2.0.54-13
+- don't load by default: mod_cern_meta, mod_asis
+- do load by default: mod_ext_filter (#165893)
+
+* Thu Jul 28 2005 Joe Orton <jorton@redhat.com> 2.0.54-12
+- drop broken epoch deps
+
+* Thu Jun 30 2005 Joe Orton <jorton@redhat.com> 2.0.54-11
+- mod_dav_fs: fix uninitialized variable (#162144)
+- add epoch to dependencies as appropriate
+- mod_ssl: drop dependencies on dev, make
+- mod_ssl: mark post script dependencies as such
+
+* Mon May 23 2005 Joe Orton <jorton@redhat.com> 2.0.54-10
+- remove broken symlink (Robert Scheck, #158404)
+
+* Wed May 18 2005 Joe Orton <jorton@redhat.com> 2.0.54-9
+- add piped logger fixes (w/Jeff Trawick)
+
+* Mon May  9 2005 Joe Orton <jorton@redhat.com> 2.0.54-8
+- drop old "powered by Red Hat" logos
+
+* Wed May  4 2005 Joe Orton <jorton@redhat.com> 2.0.54-7
+- mod_userdir: fix memory allocation issue (upstream #34588)
+- mod_ldap: fix memory corruption issue (Brad Nicholes, upstream #34618)
+
+* Tue Apr 26 2005 Joe Orton <jorton@redhat.com> 2.0.54-6
+- fix key/cert locations in post script
+
+* Mon Apr 25 2005 Joe Orton <jorton@redhat.com> 2.0.54-5
+- create default dummy cert in /etc/pki/tls
+- use a pseudo-random serial number on the dummy cert
+- change default ssl.conf to point at /etc/pki/tls
+- merge back -suexec subpackage; SELinux policy can now be
+  used to persistently disable suexec (#155716)
+- drop /etc/httpd/conf/ssl.* directories and Makefiles
+- unconditionally enable PIE support
+- mod_ssl: fix for picking up -shutdown options (upstream #34452)
+
+* Mon Apr 18 2005 Joe Orton <jorton@redhat.com> 2.0.54-4
+- replace PreReq with Requires(pre) 
+
+* Mon Apr 18 2005 Joe Orton <jorton@redhat.com> 2.0.54-3
+- update to 2.0.54
+
+* Tue Mar 29 2005 Joe Orton <jorton@redhat.com> 2.0.53-6
+- update default httpd.conf:
+ * clarify the comments on AddDefaultCharset usage (#135821)
+ * remove all the AddCharset default extensions
+ * don't load mod_imap by default
+ * synch with upstream 2.0.53 httpd-std.conf
+- mod_ssl: set user from SSLUserName in access hook (upstream #31418)
+- htdigest: fix permissions of created files (upstream #33765)
+- remove htsslpass
+
+* Wed Mar  2 2005 Joe Orton <jorton@redhat.com> 2.0.53-5
+- apachectl: restore use of $OPTIONS again
+
+* Wed Feb  9 2005 Joe Orton <jorton@redhat.com> 2.0.53-4
+- update to 2.0.53
+- move prefork/worker modules comparison to %%check
+
+* Mon Feb  7 2005 Joe Orton <jorton@redhat.com> 2.0.52-7
+- fix cosmetic issues in "service httpd reload"
+- move User/Group higher in httpd.conf (#146793)
+- load mod_logio by default in httpd.conf
+- apachectl: update for correct libselinux tools locations
+
+* Tue Nov 16 2004 Joe Orton <jorton@redhat.com> 2.0.52-6
+- add security fix for CVE CAN-2004-0942 (memory consumption DoS)
+- SELinux: run httpd -t under runcon in configtest (Steven Smalley)
+- fix SSLSessionCache comment for distcache in ssl.conf
+- restart using SIGHUP not SIGUSR1 after logrotate
+- add ap_save_brigade fix (upstream #31247)
+- mod_ssl: fix possible segfault in auth hook (upstream #31848)
+- add htsslpass(1) and configure as default SSLPassPhraseDialog (#128677)
+- apachectl: restore use of $OPTIONS
+- apachectl, httpd.init: refuse to restart if $HTTPD -t fails
+- apachectl: run $HTTPD -t in user SELinux context for configtest
+- update for pcre-5.0 header locations
+
+* Sat Nov 13 2004 Jeff Johnson <jbj@redhat.com> 2.0.52-5
+- rebuild against db-4.3.21 aware apr-util.
+
+* Thu Nov 11 2004 Jeff Johnson <jbj@jbj.org> 2.0.52-4
+- rebuild against db-4.3-21.
+
+* Thu Sep 28 2004 Joe Orton <jorton@redhat.com> 2.0.52-3
+- add dummy connection address fixes from HEAD
+- mod_ssl: add security fix for CAN-2004-0885
+
+* Tue Sep 28 2004 Joe Orton <jorton@redhat.com> 2.0.52-2
+- update to 2.0.52
+
Index: branches/fc15-dev/server/fedora/ref-prepatch/krb5.spec
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/krb5.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/krb5.spec	(revision 1803)
@@ -0,0 +1,1309 @@
+%if %{?WITH_SELINUX:0}%{!?WITH_SELINUX:1}
+%define WITH_SELINUX 0
+%endif
+
+%define krb5prefix %{_prefix}/kerberos
+
+# FIXME: is it upstream's intention that the new autoconf macro be installed?
+%define install_macro 0
+
+Summary: The Kerberos network authentication system.
+Name: krb5
+Version: 1.5
+Release: 7
+# Maybe we should explode from the now-available-to-everybody tarball instead?
+# http://web.mit.edu/kerberos/dist/krb5/1.5/krb5-1.5-signed.tar
+Source0: krb5-%{version}.tar.gz
+Source1: krb5-%{version}.tar.gz.asc
+Source2: kpropd.init
+Source3: krb524d.init
+Source4: kadmind.init
+Source5: krb5kdc.init
+Source6: krb5.conf
+Source7: krb5.sh
+Source8: krb5.csh
+Source9: kdcrotate
+Source10: kdc.conf
+Source11: kadm5.acl
+Source12: krsh
+Source13: krlogin
+Source14: eklogin.xinetd
+Source15: klogin.xinetd
+Source16: kshell.xinetd
+Source17: krb5-telnet.xinetd
+Source18: gssftp.xinetd
+Source19: krb5kdc.sysconfig
+Source20: kadmin.sysconfig
+Source21: krb524.sysconfig
+Source22: ekrb5-telnet.xinetd
+
+Patch2: krb5-1.3-manpage-paths.patch
+Patch3: krb5-1.3-netkit-rsh.patch
+Patch4: krb5-1.3-rlogind-environ.patch
+Patch5: krb5-1.3-ksu-access.patch
+Patch6: krb5-1.5-ksu-path.patch
+Patch9: krb5-1.5-brokenrev.patch
+Patch11: krb5-1.2.1-passive.patch
+Patch12: krb5-1.4-ktany.patch
+Patch13: krb5-1.3-large-file.patch
+Patch14: krb5-1.3-ftp-glob.patch
+Patch15: krb5-1.3-check.patch
+Patch16: krb5-1.5-no-rpath.patch
+Patch18: krb5-1.2.7-reject-bad-transited.patch
+Patch21: krb5-selinux.patch
+Patch23: krb5-1.3.1-dns.patch
+Patch25: krb5-1.4-null.patch
+Patch26: krb5-1.3.2-efence.patch
+Patch27: krb5-1.3.3-rcp-sendlarge.patch
+Patch29: krb5-1.3.5-kprop-mktemp.patch
+Patch30: krb5-1.3.4-send-pr-tempfile.patch
+Patch32: krb5-1.4-ncurses.patch
+Patch33: krb5-1.5-io.patch
+Patch35: krb5-1.5-fclose.patch
+Patch36: krb5-1.3.3-rcp-markus.patch
+Patch39: krb5-1.4.1-api.patch
+Patch40: krb5-1.4.1-telnet-environ.patch
+Patch41: krb5-1.2.7-login-lpass.patch
+Patch44: krb5-1.4.3-enospc.patch
+Patch45: krb5-1.5-gssinit.patch
+Patch46: http://web.mit.edu/kerberos/advisories/2006-001-patch_1.5.txt
+
+License: MIT, freely distributable.
+URL: http://web.mit.edu/kerberos/www/
+Group: System Environment/Libraries
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+Prereq: grep, info, sh-utils, /sbin/install-info
+BuildPrereq: autoconf, bison, e2fsprogs-devel >= 1.35, flex
+BuildPrereq: gzip, ncurses-devel, rsh, texinfo, tar
+
+Patch1000: krb5-kuserok-scripts.patch
+
+%description
+Kerberos V5 is a trusted-third-party network authentication system,
+which can improve your network's security by eliminating the insecure
+practice of cleartext passwords.
+
+%package devel
+Summary: Development files needed to compile Kerberos 5 programs.
+Group: Development/Libraries
+Requires: %{name}-libs = %{version}-%{release}, e2fsprogs-devel
+
+%description devel
+Kerberos is a network authentication system. The krb5-devel package
+contains the header files and libraries needed for compiling Kerberos
+5 programs. If you want to develop Kerberos-aware programs, you need
+to install this package.
+
+%package libs
+Summary: The shared libraries used by Kerberos 5.
+Group: System Environment/Libraries
+Prereq: grep, /sbin/ldconfig, sh-utils
+Obsoletes: krb5-configs
+
+%description libs
+Kerberos is a network authentication system. The krb5-libs package
+contains the shared libraries needed by Kerberos 5. If you are using
+Kerberos, you need to install this package.
+
+%package server
+Group: System Environment/Daemons
+Summary: The server programs for Kerberos 5.
+Requires: %{name}-libs = %{version}-%{release}
+Prereq: grep, /sbin/install-info, /bin/sh, sh-utils, /sbin/chkconfig
+
+%description server
+Kerberos is a network authentication system. The krb5-server package
+contains the programs that must be installed on a Kerberos 5 server.
+If you are installing a Kerberos 5 server, you need to install this
+package (in other words, most people should NOT install this
+package).
+
+%package workstation
+Summary: Kerberos 5 programs for use on workstations.
+Group: System Environment/Base
+Requires: %{name}-libs = %{version}-%{release}
+Prereq: grep, /sbin/install-info, /bin/sh, sh-utils
+# mktemp is used by krb5-send-pr
+Requires: mktemp
+
+%description workstation
+Kerberos is a network authentication system. The krb5-workstation
+package contains the basic Kerberos programs (kinit, klist, kdestroy,
+kpasswd) as well as kerberized versions of Telnet and FTP. If your
+network uses Kerberos, this package should be installed on every
+workstation.
+
+%changelog
+* Wed Sep  6 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-7
+- set SS_LIB at configure-time so that libss-using apps get working readline
+  support (#197044)
+
+* Fri Aug 18 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-6
+- switch to the updated patch for MITKRB-SA-2006-001
+
+* Tue Aug  8 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-5
+- apply patch to address MITKRB-SA-2006-001 (CVE-2006-3084)
+
+* Mon Aug  7 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-4
+- ensure that the gssapi library's been initialized before walking the
+  internal mechanism list in gss_release_oid(), needed if called from
+  gss_release_name() right after a gss_import_name() (#198092)
+
+* Tue Jul 25 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-3
+- rebuild
+
+* Tue Jul 25 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-2
+- pull up latest revision of patch to reduce lockups in rsh/rshd
+
+* Mon Jul 17 2006 Nalin Dahyabhai <nalin@redhat.com> - 1.5-1.2
+- rebuild
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 1.5-1.1
+- rebuild
+
+* Thu Jul  6 2006 Nalin Dahyabhai <nalin@redhat.com> 1.5-1
+- build
+
+* Wed Jul  5 2006 Nalin Dahyabhai <nalin@redhat.com> 1.5-0
+- update to 1.5
+
+* Fri Jun 23 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-9
+- mark profile.d config files noreplace (Laurent Rineau, #196447)
+
+* Thu Jun  8 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-8
+- add buildprereq for autoconf
+
+* Mon May 22 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-7
+- further munge krb5-config so that 'libdir=/usr/lib' is given even on 64-bit
+  architectures, to avoid multilib conflicts; other changes will conspire to
+  strip out the -L flag which uses this, so it should be harmless (#192692)
+
+* Fri Apr 28 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-6
+- adjust the patch which removes the use of rpath to also produce a
+  krb5-config which is okay in multilib environments (#190118)
+- make the name-of-the-tempfile comment which compile_et adds to error code
+  headers always list the same file to avoid conflicts on multilib installations
+- strip SIZEOF_LONG out of krb5.h so that it doesn't conflict on multilib boxes
+- strip GSS_SIZEOF_LONG out of gssapi.h so that it doesn't conflict on mulitlib
+  boxes
+
+* Fri Apr 14 2006 Stepan Kasal <skasal@redhat.com> 1.4.3-5
+- Fix formatting typo in kinit.1 (krb5-kinit-man-typo.patch)
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> 1.4.3-4.1
+- bump again for double-long bug on ppc(64)
+
+* Mon Feb  6 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-4
+- give a little bit more information to the user when kinit gets the catch-all
+  I/O error (#180175)
+
+* Thu Jan 19 2006 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-3
+- rebuild properly when pthread_mutexattr_setrobust_np() is defined but not
+  declared, such as with recent glibc when _GNU_SOURCE isn't being used
+
+* Thu Jan 19 2006 Matthias Clasen <mclasen@redhat.com> 1.4.3-2
+- Use full paths in krb5.sh to avoid path lookups
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Thu Dec  1 2005 Nalin Dahyabhai <nalin@redhat.com>
+- login: don't truncate passwords before passing them into crypt(), in
+  case they're significant (#149476)
+
+* Thu Nov 17 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.3-1
+- update to 1.4.3
+- make ksu setuid again (#137934, others)
+
+* Tue Sep 13 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.2-4
+- mark %%{krb5prefix}/man so that files which are packaged within it are
+  flagged as %%doc (#168163)
+
+* Tue Sep  6 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.2-3
+- add an xinetd configuration file for encryption-only telnetd, parallelling
+  the kshell/ekshell pair (#167535)
+
+* Wed Aug 31 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.2-2
+- change the default configured encryption type for KDC databases to the
+  compiled-in default of des3-hmac-sha1 (#57847)
+
+* Thu Aug 11 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.2-1
+- update to 1.4.2, incorporating the fixes for MIT-KRB5-SA-2005-002 and
+  MIT-KRB5-SA-2005-003
+
+* Wed Jun 29 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.1-6
+- rebuild
+
+* Wed Jun 29 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.1-5
+- fix telnet client environment variable disclosure the same way NetKit's
+  telnet client did (CAN-2005-0488) (#159305)
+- keep apps which call krb5_principal_compare() or krb5_realm_compare() with
+  malformed or NULL principal structures from crashing outright (Thomas Biege)
+  (#161475)
+
+* Tue Jun 28 2005 Nalin Dahyabhai <nalin@redhat.com>
+- apply fixes from draft of MIT-KRB5-SA-2005-002 (CAN-2005-1174,CAN-2005-1175)
+  (#157104)
+- apply fixes from draft of MIT-KRB5-SA-2005-003 (CAN-2005-1689) (#159755)
+
+* Fri Jun 24 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.1-4
+- fix double-close in keytab handling
+- add port of fixes for CAN-2004-0175 to krb5-aware rcp (#151612)
+
+* Fri May 13 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.1-3
+- prevent spurious EBADF in krshd when stdin is closed by the client while
+  the command is running (#151111)
+
+* Fri May 13 2005 Martin Stransky <stransky@redhat.com> 1.4.1-2
+- add deadlock patch, removed old patch
+
+* Fri May  6 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4.1-1
+- update to 1.4.1, incorporating fixes for CAN-2005-0468 and CAN-2005-0469
+- when starting the KDC or kadmind, if KRB5REALM is set via the /etc/sysconfig
+  file for the service, pass it as an argument for the -r flag
+
+* Wed Mar 23 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4-3
+- drop krshd patch for now
+
+* Thu Mar 17 2005 Nalin Dahyabhai <nalin@redhat.com>
+- add draft fix from Tom Yu for slc_add_reply() buffer overflow (CAN-2005-0469)
+- add draft fix from Tom Yu for env_opt_add() buffer overflow (CAN-2005-0468)
+
+* Wed Mar 16 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4-2
+- don't include <term.h> into the telnet client when we're not using curses
+
+* Thu Feb 24 2005 Nalin Dahyabhai <nalin@redhat.com> 1.4-1
+- update to 1.4
+  - v1.4 kadmin client requires a v1.4 kadmind on the server, or use the "-O"
+    flag to specify that it should communicate with the server using the older
+    protocol
+  - new libkrb5support library
+  - v5passwdd and kadmind4 are gone
+  - versioned symbols
+- pick up $KRB5KDC_ARGS from /etc/sysconfig/krb5kdc, if it exists, and pass
+  it on to krb5kdc
+- pick up $KADMIND_ARGS from /etc/sysconfig/kadmin, if it exists, and pass
+  it on to kadmind
+- pick up $KRB524D_ARGS from /etc/sysconfig/krb524, if it exists, and pass
+  it on to krb524d *instead of* "-m"
+- set "forwardable" in [libdefaults] in the default krb5.conf to match the
+  default setting which we supply for pam_krb5
+- set a default of 24h for "ticket_lifetime" in [libdefaults], reflecting the
+  compiled-in default
+
+* Mon Dec 20 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.6-3
+- rebuild
+
+* Mon Dec 20 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.6-2
+- rebuild
+
+* Mon Dec 20 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.6-1
+- update to 1.3.6, which includes the previous fix
+
+* Mon Dec 20 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.5-8
+- apply fix from Tom Yu for MITKRB5-SA-2004-004 (CAN-2004-1189)
+
+* Fri Dec 17 2004 Martin Stransky <stransky@redhat.com> 1.3.5-7
+- fix deadlock during file transfer via rsync/krsh
+- thanks goes to James Antil for hint
+
+* Fri Nov 26 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.5-6
+- rebuild
+
+* Mon Nov 22 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.5-3
+- fix predictable-tempfile-name bug in krb5-send-pr (CAN-2004-0971, #140036)
+
+* Tue Nov 16 2004 Nalin Dahyabhai <nalin@redhat.com>
+- silence compiler warning in kprop by using an in-memory ccache with a fixed
+  name instead of an on-disk ccache with a name generated by tmpnam()
+
+* Tue Nov 16 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.5-2
+- fix globbing patch port mode (#139075)
+
+* Mon Nov  1 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.5-1
+- fix segfault in telnet due to incorrect checking of gethostbyname_r result
+  codes (#129059)
+
+* Fri Oct 15 2004 Nalin Dahyabhai <nalin@redhat.com>
+- remove rc4-hmac:norealm and rc4-hmac:onlyrealm from the default list of
+  supported keytypes in kdc.conf -- they produce exactly the same keys as
+  rc4-hmac:normal because rc4 string-to-key ignores salts
+- nuke kdcrotate -- there are better ways to balance the load on KDCs, and
+  the SELinux policy for it would have been scary-looking
+- update to 1.3.5, mainly to include MITKRB5SA 2004-002 and 2004-003
+
+* Tue Aug 31 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-7
+- rebuild
+
+* Tue Aug 24 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-6
+- rebuild
+
+* Tue Aug 24 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-5
+- incorporate revised fixes from Tom Yu for CAN-2004-0642, CAN-2004-0644,
+  CAN-2004-0772
+
+* Mon Aug 23 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-4
+- rebuild
+
+* Mon Aug 23 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-3
+- incorporate fixes from Tom Yu for CAN-2004-0642, CAN-2004-0772
+  (MITKRB5-SA-2004-002, #130732)
+- incorporate fixes from Tom Yu for CAN-2004-0644 (MITKRB5-SA-2004-003, #130732)
+
+* Tue Jul 27 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-2
+- fix indexing error in server sorting patch (#127336)
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Mon Jun 14 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-0.1
+- update to 1.3.4 final
+
+* Mon Jun  7 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.4-0
+- update to 1.3.4 beta1
+- remove MITKRB5-SA-2004-001, included in 1.3.4
+
+* Mon Jun  7 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-8
+- rebuild
+
+* Fri Jun  4 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-7
+- rebuild
+
+* Fri Jun  4 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-6
+- apply updated patch from MITKRB5-SA-2004-001 (revision 2004-06-02)
+
+* Tue Jun  1 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-5
+- rebuild
+
+* Tue Jun  1 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-4
+- apply patch from MITKRB5-SA-2004-001 (#125001)
+
+* Wed May 12 2004 Thomas Woerner <twoerner@redhat.com> 1.3.3-3
+- removed rpath
+
+* Thu Apr 15 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-2
+- re-enable large file support, fell out in 1.3-1
+- patch rcp to use long long and %%lld format specifiers when reporting file
+  sizes on large files
+
+* Tue Apr 13 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.3-1
+- update to 1.3.3
+
+* Wed Mar 10 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.2-1
+- update to 1.3.2
+
+* Mon Mar  8 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-12
+- rebuild
+
+* Tue Mar 02 2004 Elliot Lee <sopwith@redhat.com> 1.3.1-11.1
+- rebuilt
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com> 1.3.1-11
+- rebuilt
+
+* Mon Feb  9 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-10
+- catch krb4 send_to_kdc cases in kdc preference patch
+
+* Mon Feb  2 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-9
+- remove patch to set TERM in klogind which, combined with the upstream fix in
+  1.3.1, actually produces the bug now (#114762)
+
+* Mon Jan 19 2004 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-8
+- when iterating over lists of interfaces which are "up" from getifaddrs(),
+  skip over those which have no address (#113347)
+
+* Mon Jan 12 2004 Nalin Dahyabhai <nalin@redhat.com>
+- prefer the kdc which last replied to a request when sending requests to kdcs
+
+* Mon Nov 24 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-7
+- fix combination of --with-netlib and --enable-dns (#82176)
+
+* Tue Nov 18 2003 Nalin Dahyabhai <nalin@redhat.com>
+- remove libdefault ticket_lifetime option from the default krb5.conf, it is
+  ignored by libkrb5
+
+* Thu Sep 25 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-6
+- fix bug in patch to make rlogind start login with a clean environment a la
+  netkit rlogin, spotted and fixed by Scott McClung
+
+* Tue Sep 23 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-5
+- include profile.d scriptlets in krb5-devel so that krb5-config will be in
+  the path if krb5-workstation isn't installed, reported by Kir Kolyshkin
+
+* Mon Sep  8 2003 Nalin Dahyabhai <nalin@redhat.com>
+- add more etypes (arcfour) to the default enctype list in kdc.conf
+- don't apply previous patch, refused upstream
+
+* Fri Sep  5 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-4
+- fix 32/64-bit bug storing and retrieving the issue_date in v4 credentials
+
+* Wed Sep 3 2003 Dan Walsh <dwalsh@redhat.com> 1.3.1-3
+- Don't check for write access on /etc/krb5.conf if SELinux
+
+* Tue Aug 26 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-2
+- fixup some int/pointer varargs wackiness
+
+* Tue Aug  5 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-1
+- rebuild
+
+* Mon Aug  4 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3.1-0
+- update to 1.3.1
+
+* Thu Jul 24 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3-2
+- pull fix for non-compliant encoding of salt field in etype-info2 preauth
+  data from 1.3.1 beta 1, until 1.3.1 is released.
+
+* Mon Jul 21 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3-1
+- update to 1.3
+
+* Mon Jul  7 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.8-4
+- correctly use stdargs
+
+* Wed Jun 18 2003 Nalin Dahyabhai <nalin@redhat.com> 1.3-0.beta.4
+- test update to 1.3 beta 4
+- ditch statglue build option
+- krb5-devel requires e2fsprogs-devel, which now provides libss and libcom_err
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed May 21 2003 Jeremy Katz <katzj@redhat.com> 1.2.8-2
+- gcc 3.3 doesn't implement varargs.h, include stdarg.h instead
+
+* Wed Apr  9 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.8-1
+- update to 1.2.8
+
+* Mon Mar 31 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-14
+- fix double-free of enc_part2 in krb524d
+
+* Fri Mar 21 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-13
+- update to latest patch kit for MITKRB5-SA-2003-004
+
+* Wed Mar 19 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-12
+- add patch included in MITKRB5-SA-2003-003 (CAN-2003-0028)
+
+* Mon Mar 17 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-11
+- add patches from patchkit from MITKRB5-SA-2003-004 (CAN-2003-0138 and
+  CAN-2003-0139)
+
+* Thu Mar  6 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-10
+- rebuild
+
+* Thu Mar  6 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-9
+- fix buffer underrun in unparsing certain principals (CAN-2003-0082)
+
+* Tue Feb  4 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-8
+- add patch to document the reject-bad-transited option in kdc.conf
+
+* Mon Feb  3 2003 Nalin Dahyabhai <nalin@redhat.com>
+- add patch to fix server-side crashes when principals have no
+  components (CAN-2003-0072)
+
+* Thu Jan 23 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-7
+- add patch from Mark Cox for exploitable bugs in ftp client
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Wed Jan 15 2003 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-5
+- use PICFLAGS when building code from the ktany patch
+
+* Thu Jan  9 2003 Bill Nottingham <notting@redhat.com> 1.2.7-4
+- debloat
+
+* Tue Jan  7 2003 Jeremy Katz <katzj@redhat.com> 1.2.7-3
+- include .so.* symlinks as well as .so.*.*
+
+* Mon Dec  9 2002 Jakub Jelinek <jakub@redhat.com> 1.2.7-2
+- always #include <errno.h> to access errno, never do it directly
+- enable LFS on a bunch of other 32-bit arches
+
+* Wed Dec  4 2002 Nalin Dahyabhai <nalin@redhat.com>
+- increase the maximum name length allowed by kuserok() to the higher value
+  used in development versions
+
+* Mon Dec  2 2002 Nalin Dahyabhai <nalin@redhat.com>
+- install src/krb524/README as README.krb524 in the -servers package,
+  includes information about converting for AFS principals
+
+* Fri Nov 15 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.7-1
+- update to 1.2.7
+- disable use of tcl
+
+* Mon Nov 11 2002 Nalin Dahyabhai <nalin@redhat.com>
+- update to 1.2.7-beta2 (internal only, not for release), dropping dnsparse
+  and kadmind4 fixes
+
+* Wed Oct 23 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.6-5
+- add patch for buffer overflow in kadmind4 (not used by default)
+
+* Fri Oct 11 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.6-4
+- drop a hunk from the dnsparse patch which is actually redundant (thanks to
+  Tom Yu)
+
+* Wed Oct  9 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.6-3
+- patch to handle truncated dns responses
+
+* Mon Oct  7 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.6-2
+- remove hashless key types from the default kdc.conf, they're not supposed to
+  be there, noted by Sam Hartman on krbdev
+
+* Fri Sep 27 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.6-1
+- update to 1.2.6
+
+* Fri Sep 13 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.5-7
+- use %%{_lib} for the sake of multilib systems
+
+* Fri Aug  2 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.5-6
+- add patch from Tom Yu for exploitable bugs in rpc code used in kadmind
+
+* Tue Jul 23 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.5-5
+- fix bug in krb5.csh which would cause the path check to always succeed
+
+* Fri Jul 19 2002 Jakub Jelinek <jakub@redhat.com> 1.2.5-4
+- build even libdb.a with -fPIC and $RPM_OPT_FLAGS.
+
+* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Sun May 26 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Wed May  1 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.5-1
+- update to 1.2.5
+- disable statglue
+
+* Fri Mar  1 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.4-1
+- update to 1.2.4
+
+* Wed Feb 20 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.3-5
+- rebuild in new environment
+- reenable statglue
+
+* Sat Jan 26 2002 Florian La Roche <Florian.LaRoche@redhat.de>
+- prereq chkconfig for the server subpackage
+
+* Wed Jan 16 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.3-3
+- build without -g3, which gives us large static libraries in -devel
+
+* Tue Jan 15 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.3-2
+- reintroduce ld.so.conf munging in the -libs %%post
+
+* Thu Jan 10 2002 Nalin Dahyabhai <nalin@redhat.com> 1.2.3-1
+- rename the krb5 package back to krb5-libs; the previous rename caused
+  something of an uproar
+- update to 1.2.3, which includes the FTP and telnetd fixes
+- configure without --enable-dns-for-kdc --enable-dns-for-realm, which now set
+  the default behavior instead of enabling the feature (the feature is enabled
+  by --enable-dns, which we still use)
+- reenable optimizations on Alpha
+- support more encryption types in the default kdc.conf (heads-up from post
+  to comp.protocols.kerberos by Jason Heiss)
+
+* Fri Aug  3 2001 Nalin Dahyabhai <nalin@redhat.com> 1.2.2-14
+- rename the krb5-libs package to krb5 (naming a subpackage -libs when there
+  is no main package is silly)
+- move defaults for PAM to the appdefaults section of krb5.conf -- this is
+  the area where the krb5_appdefault_* functions look for settings)
+- disable statglue (warning: breaks binary compatibility with previous
+  packages, but has to be broken at some point to work correctly with
+  unpatched versions built with newer versions of glibc)
+
+* Fri Aug  3 2001 Nalin Dahyabhai <nalin@redhat.com> 1.2.2-13
+- bump release number and rebuild
+
+* Wed Aug  1 2001 Nalin Dahyabhai <nalin@redhat.com>
+- add patch to fix telnetd vulnerability
+
+* Fri Jul 20 2001 Nalin Dahyabhai <nalin@redhat.com>
+- tweak statglue.c to fix stat/stat64 aliasing problems
+- be cleaner in use of gcc to build shlibs
+
+* Wed Jul 11 2001 Nalin Dahyabhai <nalin@redhat.com>
+- use gcc to build shared libraries
+
+* Wed Jun 27 2001 Nalin Dahyabhai <nalin@redhat.com>
+- add patch to support "ANY" keytab type (i.e.,
+  "default_keytab_name = ANY:FILE:/etc/krb5.keytab,SRVTAB:/etc/srvtab"
+  patch from Gerald Britton, #42551)
+- build with -D_FILE_OFFSET_BITS=64 to get large file I/O in ftpd (#30697)
+- patch ftpd to use long long and %%lld format specifiers to support the SIZE
+  command on large files (also #30697)
+- don't use LOG_AUTH as an option value when calling openlog() in ksu (#45965)
+- implement reload in krb5kdc and kadmind init scripts (#41911)
+- lose the krb5server init script (not using it any more)
+
+* Sun Jun 24 2001 Elliot Lee <sopwith@redhat.com>
+- Bump release + rebuild.
+
+* Tue May 29 2001 Nalin Dahyabhai <nalin@redhat.com>
+- pass some structures by address instead of on the stack in krb5kdc
+
+* Tue May 22 2001 Nalin Dahyabhai <nalin@redhat.com>
+- rebuild in new environment
+
+* Thu Apr 26 2001 Nalin Dahyabhai <nalin@redhat.com>
+- add patch from Tom Yu to fix ftpd overflows (#37731)
+
+* Wed Apr 18 2001 Than Ngo <than@redhat.com>
+- disable optimizations on the alpha again
+
+* Fri Mar 30 2001 Nalin Dahyabhai <nalin@redhat.com>
+- add in glue code to make sure that libkrb5 continues to provide a
+  weak copy of stat()
+
+* Thu Mar 15 2001 Nalin Dahyabhai <nalin@redhat.com>
+- build alpha with -O0 for now
+
+* Thu Mar  8 2001 Nalin Dahyabhai <nalin@redhat.com>
+- fix the kpropd init script
+
+* Mon Mar  5 2001 Nalin Dahyabhai <nalin@redhat.com>
+- update to 1.2.2, which fixes some bugs relating to empty ETYPE-INFO
+- re-enable optimization on Alpha
+
+* Thu Feb  8 2001 Nalin Dahyabhai <nalin@redhat.com>
+- build alpha with -O0 for now
+- own %{_var}/kerberos
+
+* Tue Feb  6 2001 Nalin Dahyabhai <nalin@redhat.com>
+- own the directories which are created for each package (#26342)
+
+* Tue Jan 23 2001 Nalin Dahyabhai <nalin@redhat.com>
+- gettextize init scripts
+
+* Fri Jan 19 2001 Nalin Dahyabhai <nalin@redhat.com>
+- add some comments to the ksu patches for the curious
+- re-enable optimization on alphas
+
+* Mon Jan 15 2001 Nalin Dahyabhai <nalin@redhat.com>
+- fix krb5-send-pr (#18932) and move it from -server to -workstation
+- buildprereq libtermcap-devel
+- temporariliy disable optimization on alphas
+- gettextize init scripts
+
+* Tue Dec  5 2000 Nalin Dahyabhai <nalin@redhat.com>
+- force -fPIC
+
+* Fri Dec  1 2000 Nalin Dahyabhai <nalin@redhat.com>
+- rebuild in new environment
+
+* Tue Oct 31 2000 Nalin Dahyabhai <nalin@redhat.com>
+- add bison as a BuildPrereq (#20091)
+
+* Mon Oct 30 2000 Nalin Dahyabhai <nalin@redhat.com>
+- change /usr/dict/words to /usr/share/dict/words in default kdc.conf (#20000)
+
+* Thu Oct  5 2000 Nalin Dahyabhai <nalin@redhat.com>
+- apply kpasswd bug fixes from David Wragg
+
+* Wed Oct  4 2000 Nalin Dahyabhai <nalin@redhat.com>
+- make krb5-libs obsolete the old krb5-configs package (#18351)
+- don't quit from the kpropd init script if there's no principal database so
+  that you can propagate the first time without running kpropd manually
+- don't complain if /etc/ld.so.conf doesn't exist in the -libs %post
+
+* Tue Sep 12 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix credential forwarding problem in klogind (goof in KRB5CCNAME handling)
+  (#11588)
+- fix heap corruption bug in FTP client (#14301)
+
+* Wed Aug 16 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix summaries and descriptions
+- switched the default transfer protocol from PORT to PASV as proposed on
+  bugzilla (#16134), and to match the regular ftp package's behavior
+
+* Wed Jul 19 2000 Jeff Johnson <jbj@redhat.com>
+- rebuild to compress man pages.
+
+* Sat Jul 15 2000 Bill Nottingham <notting@redhat.com>
+- move initscript back
+
+* Fri Jul 14 2000 Nalin Dahyabhai <nalin@redhat.com>
+- disable servers by default to keep linuxconf from thinking they need to be
+  started when they don't
+
+* Thu Jul 13 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Mon Jul 10 2000 Nalin Dahyabhai <nalin@redhat.com>
+- change cleanup code in post to not tickle chkconfig
+- add grep as a Prereq: for -libs
+
+* Thu Jul  6 2000 Nalin Dahyabhai <nalin@redhat.com>
+- move condrestarts to postun
+- make xinetd configs noreplace
+- add descriptions to xinetd configs
+- add /etc/init.d as a prereq for the -server package
+- patch to properly truncate $TERM in krlogind
+
+* Fri Jun 30 2000 Nalin Dahyabhai <nalin@redhat.com>
+- update to 1.2.1
+- back out Tom Yu's patch, which is a big chunk of the 1.2 -> 1.2.1 update
+- start using the official source tarball instead of its contents
+
+* Thu Jun 29 2000 Nalin Dahyabhai <nalin@redhat.com>
+- Tom Yu's patch to fix compatibility between 1.2 kadmin and 1.1.1 kadmind
+- pull out 6.2 options in the spec file (sonames changing in 1.2 means it's not
+  compatible with other stuff in 6.2, so no need)
+
+* Wed Jun 28 2000 Nalin Dahyabhai <nalin@redhat.com>
+- tweak graceful start/stop logic in post and preun
+
+* Mon Jun 26 2000 Nalin Dahyabhai <nalin@redhat.com>
+- update to the 1.2 release
+- ditch a lot of our patches which went upstream
+- enable use of DNS to look up things at build-time
+- disable use of DNS to look up things at run-time in default krb5.conf
+- change ownership of the convert-config-files script to root.root
+- compress PS docs
+- fix some typos in the kinit man page
+- run condrestart in server post, and shut down in preun
+
+* Mon Jun 19 2000 Nalin Dahyabhai <nalin@redhat.com>
+- only remove old krb5server init script links if the init script is there
+
+* Sat Jun 17 2000 Nalin Dahyabhai <nalin@redhat.com>
+- disable kshell and eklogin by default
+
+* Thu Jun 15 2000 Nalin Dahyabhai <nalin@redhat.com>
+- patch mkdir/rmdir problem in ftpcmd.y
+- add condrestart option to init script
+- split the server init script into three pieces and add one for kpropd
+
+* Wed Jun 14 2000 Nalin Dahyabhai <nalin@redhat.com>
+- make sure workstation servers are all disabled by default
+- clean up krb5server init script
+
+* Fri Jun  9 2000 Nalin Dahyabhai <nalin@redhat.com>
+- apply second set of buffer overflow fixes from Tom Yu
+- fix from Dirk Husung for a bug in buffer cleanups in the test suite
+- work around possibly broken rev binary in running test suite
+- move default realm configs from /var/kerberos to %{_var}/kerberos
+
+* Tue Jun  6 2000 Nalin Dahyabhai <nalin@redhat.com>
+- make ksu and v4rcp owned by root
+
+* Sat Jun  3 2000 Nalin Dahyabhai <nalin@redhat.com>
+- use %%{_infodir} to better comply with FHS
+- move .so files to -devel subpackage
+- tweak xinetd config files (bugs #11833, #11835, #11836, #11840)
+- fix package descriptions again
+
+* Wed May 24 2000 Nalin Dahyabhai <nalin@redhat.com>
+- change a LINE_MAX to 1024, fix from Ken Raeburn
+- add fix for login vulnerability in case anyone rebuilds without krb4 compat
+- add tweaks for byte-swapping macros in krb.h, also from Ken
+- add xinetd config files
+- make rsh and rlogin quieter
+- build with debug to fix credential forwarding
+- add rsh as a build-time req because the configure scripts look for it to
+  determine paths
+
+* Wed May 17 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix config_subpackage logic
+
+* Tue May 16 2000 Nalin Dahyabhai <nalin@redhat.com>
+- remove setuid bit on v4rcp and ksu in case the checks previously added
+  don't close all of the problems in ksu
+- apply patches from Jeffrey Schiller to fix overruns Chris Evans found
+- reintroduce configs subpackage for use in the errata
+- add PreReq: sh-utils
+
+* Mon May 15 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix double-free in the kdc (patch merged into MIT tree)
+- include convert-config-files script as a documentation file
+
+* Wed May 03 2000 Nalin Dahyabhai <nalin@redhat.com>
+- patch ksu man page because the -C option never works
+- add access() checks and disable debug mode in ksu
+- modify default ksu build arguments to specify more directories in CMD_PATH
+  and to use getusershell()
+
+* Wed May 03 2000 Bill Nottingham <notting@redhat.com>
+- fix configure stuff for ia64
+
+* Mon Apr 10 2000 Nalin Dahyabhai <nalin@redhat.com>
+- add LDCOMBINE=-lc to configure invocation to use libc versioning (bug #10653)
+- change Requires: for/in subpackages to include %{version}
+
+* Wed Apr 05 2000 Nalin Dahyabhai <nalin@redhat.com>
+- add man pages for kerberos(1), kvno(1), .k5login(5)
+- add kvno to -workstation
+
+* Mon Apr 03 2000 Nalin Dahyabhai <nalin@redhat.com>
+- Merge krb5-configs back into krb5-libs.  The krb5.conf file is marked as
+  a %%config file anyway.
+- Make krb5.conf a noreplace config file.
+
+* Thu Mar 30 2000 Nalin Dahyabhai <nalin@redhat.com>
+- Make klogind pass a clean environment to children, like NetKit's rlogind does.
+
+* Wed Mar 08 2000 Nalin Dahyabhai <nalin@redhat.com>
+- Don't enable the server by default.
+- Compress info pages.
+- Add defaults for the PAM module to krb5.conf
+
+* Mon Mar 06 2000 Nalin Dahyabhai <nalin@redhat.com>
+- Correct copyright: it's exportable now, provided the proper paperwork is
+  filed with the government.
+
+* Fri Mar 03 2000 Nalin Dahyabhai <nalin@redhat.com>
+- apply Mike Friedman's patch to fix format string problems
+- don't strip off argv[0] when invoking regular rsh/rlogin
+
+* Thu Mar 02 2000 Nalin Dahyabhai <nalin@redhat.com>
+- run kadmin.local correctly at startup
+
+* Mon Feb 28 2000 Nalin Dahyabhai <nalin@redhat.com>
+- pass absolute path to kadm5.keytab if/when extracting keys at startup
+
+* Sat Feb 19 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix info page insertions
+
+* Wed Feb  9 2000 Nalin Dahyabhai <nalin@redhat.com>
+- tweak server init script to automatically extract kadm5 keys if
+  /var/kerberos/krb5kdc/kadm5.keytab doesn't exist yet
+- adjust package descriptions
+
+* Thu Feb  3 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix for potentially gzipped man pages
+
+* Fri Jan 21 2000 Nalin Dahyabhai <nalin@redhat.com>
+- fix comments in krb5-configs
+
+* Fri Jan  7 2000 Nalin Dahyabhai <nalin@redhat.com>
+- move /usr/kerberos/bin to end of PATH
+
+* Tue Dec 28 1999 Nalin Dahyabhai <nalin@redhat.com>
+- install kadmin header files
+
+* Tue Dec 21 1999 Nalin Dahyabhai <nalin@redhat.com>
+- patch around TIOCGTLC defined on alpha and remove warnings from libpty.h
+- add installation of info docs
+- remove krb4 compat patch because it doesn't fix workstation-side servers
+
+* Mon Dec 20 1999 Nalin Dahyabhai <nalin@redhat.com>
+- remove hesiod dependency at build-time
+
+* Sun Dec 19 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- rebuild on 1.1.1
+
+* Thu Oct  7 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- clean up init script for server, verify that it works [jlkatz]
+- clean up rotation script so that rc likes it better
+- add clean stanza
+
+* Mon Oct  4 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- backed out ncurses and makeshlib patches
+- update for krb5-1.1
+- add KDC rotation to rc.boot, based on ideas from Michael's C version
+
+* Mon Sep 26 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- added -lncurses to telnet and telnetd makefiles
+
+* Mon Jul  5 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- added krb5.csh and krb5.sh to /etc/profile.d
+
+* Mon Jun 22 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- broke out configuration files
+
+* Mon Jun 14 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- fixed server package so that it works now
+
+* Sat May 15 1999 Nalin Dahyabhai <nsdahya1@eos.ncsu.edu>
+- started changelog (previous package from zedz.net)
+- updated existing 1.0.5 RPM from Eos Linux to krb5 1.0.6
+- added --force to makeinfo commands to skip errors during build
+
+%prep
+%setup -q
+%patch2  -p1 -b .manpage-paths
+%patch3  -p1 -b .netkit-rsh
+%patch4  -p1 -b .rlogind-environ
+%patch5  -p1 -b .ksu-access
+%patch6  -p1 -b .ksu-path
+%patch9  -p1 -b .brokenrev
+%patch11 -p1 -b .passive
+%patch12 -p1 -b .ktany
+%patch13 -p1 -b .large-file
+%patch14 -p1 -b .ftp-glob
+%patch15 -p1 -b .check
+%patch16 -p1 -b .no-rpath
+%patch18 -p1 -b .reject-bad-transited
+%if %{WITH_SELINUX}
+%patch21 -p1 -b .selinux
+%endif
+%patch23 -p1 -b .dns
+%patch25 -p1 -b .null
+# Removes a malloc(0) case, nothing more.
+# %patch26 -p1 -b .efence
+%patch27 -p1 -b .rcp-sendlarge
+%patch29 -p1 -b .kprop-mktemp
+%patch30 -p1 -b .send-pr-tempfile
+%patch32 -p1 -b .ncurses
+%patch33 -p1 -b .io
+%patch35 -p1 -b .fclose
+%patch36 -p1 -b .rcp-markus
+%patch39 -p1 -b .api
+%patch40 -p1 -b .telnet-environ
+%patch41 -p1 -b .login-lpass
+%patch44 -p1 -b .enospc
+%patch45 -p1 -b .gssinit
+pushd src
+%patch46 -p0 -b .2006-001
+popd
+cp src/krb524/README README.krb524
+gzip doc/*.ps
+%patch1000 -p1 -b .scripts
+cd src
+top=`pwd`
+for configurein in `find -name configure.in -type f` ; do
+	pushd `dirname $configurein`
+	autoconf -I "$top"
+	popd
+done
+
+%build
+cd src
+INCLUDES=-I%{_includedir}/et
+# Get LFS support on systems that need it which aren't already 64-bit.
+%ifarch %{ix86} s390 ppc sparc
+DEFINES="-D_FILE_OFFSET_BITS=64" ; export DEFINES
+%endif
+CFLAGS="`echo $RPM_OPT_FLAGS $DEFINES $INCLUDES -fPIC`"
+CPPFLAGS="`echo $DEFINES $INCLUDES`"
+%configure \
+	CC=%{__cc} \
+	CFLAGS="$CFLAGS" \
+	LDFLAGS="-pie" \
+	CPPFLAGS="$CPPFLAGS" \
+	SS_LIB="-lss -lcurses" \
+	--enable-shared --enable-static \
+	--bindir=%{krb5prefix}/bin \
+	--mandir=%{krb5prefix}/man \
+	--sbindir=%{krb5prefix}/sbin \
+	--datadir=%{krb5prefix}/share \
+	--localstatedir=%{_var}/kerberos \
+	--with-krb4 \
+	--with-system-et \
+	--with-system-ss \
+	--with-netlib=-lresolv \
+	--without-tcl \
+	--enable-dns
+# Now build it.  Override the RPATH_FLAG and PROG_LIBPATH to drop the rpath, and
+# override LDCOMBINE to use gcc instead of ld to build shared libraries.
+make	RPATH_FLAG= PROG_RPATH= \
+	OBJLISTS="OBJS.ST OBJS.SH" \
+	LDCOMBINE='%{__cc} -shared -Wl,-soname=lib$(LIB)$(SHLIBSEXT) $(CFLAGS)'
+
+# Run the test suite.
+: make	RPATH_FLAG= PROG_RPATH= check TMPDIR=%{_tmppath}
+
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+
+# Shell scripts wrappers for Kerberized rsh and rlogin.
+mkdir -p $RPM_BUILD_ROOT%{krb5prefix}/bin
+install -m 755 $RPM_SOURCE_DIR/{krsh,krlogin} $RPM_BUILD_ROOT/%{krb5prefix}/bin/
+
+# Info docs.
+mkdir -p $RPM_BUILD_ROOT%{_infodir}
+install -m 644 doc/*.info* $RPM_BUILD_ROOT%{_infodir}/
+# Forcefully compress the info pages so that we know the right file name to
+# pass to install-info in %%post.
+gzip $RPM_BUILD_ROOT%{_infodir}/*.info*
+
+# Sample KDC config files.
+mkdir -p $RPM_BUILD_ROOT%{_var}/kerberos/krb5kdc
+install -m 644 $RPM_SOURCE_DIR/kdc.conf  $RPM_BUILD_ROOT%{_var}/kerberos/krb5kdc/
+install -m 644 $RPM_SOURCE_DIR/kadm5.acl $RPM_BUILD_ROOT%{_var}/kerberos/krb5kdc/
+
+# Login-time scriptlets to fix the PATH variable.
+mkdir -p $RPM_BUILD_ROOT/etc/profile.d
+install -m 644 $RPM_SOURCE_DIR/krb5.conf $RPM_BUILD_ROOT/etc/krb5.conf
+install -m 755 $RPM_SOURCE_DIR/krb5.{sh,csh} $RPM_BUILD_ROOT/etc/profile.d/
+
+# Server init scripts.
+mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
+install -m 755 $RPM_SOURCE_DIR/krb5kdc.init $RPM_BUILD_ROOT/etc/rc.d/init.d/krb5kdc
+install -m 755 $RPM_SOURCE_DIR/kadmind.init $RPM_BUILD_ROOT/etc/rc.d/init.d/kadmin
+install -m 755 $RPM_SOURCE_DIR/kpropd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/kprop
+install -m 755 $RPM_SOURCE_DIR/krb524d.init $RPM_BUILD_ROOT/etc/rc.d/init.d/krb524
+mkdir -p $RPM_BUILD_ROOT/etc/sysconfig
+install -m 644 $RPM_SOURCE_DIR/krb5kdc.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/krb5kdc
+install -m 644 $RPM_SOURCE_DIR/kadmin.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/kadmin
+install -m 644 $RPM_SOURCE_DIR/krb524.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/krb524
+
+# Xinetd configuration files.
+mkdir -p $RPM_BUILD_ROOT/etc/xinetd.d/
+for xinetd in eklogin klogin kshell ekrb5-telnet krb5-telnet gssftp ; do
+	install -m 644 $RPM_SOURCE_DIR/${xinetd}.xinetd \
+	$RPM_BUILD_ROOT/etc/xinetd.d/${xinetd}
+done
+
+# The rest of the binaries, headers, libraries, and docs.
+make -C src DESTDIR=$RPM_BUILD_ROOT install
+
+# Fixup permissions on header files.
+find $RPM_BUILD_ROOT/%{_includedir} -type d | xargs chmod 755
+find $RPM_BUILD_ROOT/%{_includedir} -type f | xargs chmod 644
+
+# Fixup strange shared library permissions.
+chmod 755 $RPM_BUILD_ROOT%{_libdir}/*.so{,.*}
+
+# Munge the krb5-config script to remove rpaths.
+sed "s|^CC_LINK=.*|CC_LINK='\$(CC) \$(PROG_LIBPATH)'|g" src/krb5-config > $RPM_BUILD_ROOT%{krb5prefix}/bin/krb5-config
+
+# Munge krb5-config yet again.  This is totally wrong for 64-bit, but chunks
+# of the no-rpath patch already conspire to strip out /usr/<anything> from the
+# list of link flags.
+sed -r -i -e 's|^libdir=/usr/lib(64)?$|libdir=/usr/lib|g' $RPM_BUILD_ROOT%{krb5prefix}/bin/krb5-config
+
+# Remove the randomly-generated compile-et filename comment from header files.
+sed -i -e 's|^ \* ettmp[^ \t]*\.h:$| * ettmpXXXXXX.h:|g' $RPM_BUILD_ROOT%{_includedir}/*{,/*}.h
+
+%if %{install_macro}
+# Install the autoconf macro.
+mkdir -p $RPM_BUILD_ROOT/%{_datadir}/aclocal
+install -m644 src/util/ac_check_krb5.m4 $RPM_BUILD_ROOT/%{_datadir}/aclocal/
+%endif
+
+%clean
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+
+%post libs -p /sbin/ldconfig
+
+%postun libs -p /sbin/ldconfig
+
+%post server
+# Remove the init script for older servers.
+[ -x /etc/rc.d/init.d/krb5server ] && /sbin/chkconfig --del krb5server
+# Install the new ones.
+/sbin/chkconfig --add krb5kdc
+/sbin/chkconfig --add kadmin
+/sbin/chkconfig --add krb524
+/sbin/chkconfig --add kprop
+# Install info pages.
+/sbin/install-info %{_infodir}/krb425.info.gz %{_infodir}/dir
+/sbin/install-info %{_infodir}/krb5-admin.info.gz %{_infodir}/dir
+/sbin/install-info %{_infodir}/krb5-install.info.gz %{_infodir}/dir
+
+%preun server
+if [ "$1" = "0" ] ; then
+	/sbin/chkconfig --del krb5kdc
+	/sbin/chkconfig --del kadmin
+	/sbin/chkconfig --del krb524
+	/sbin/chkconfig --del kprop
+	/sbin/service krb5kdc stop > /dev/null 2>&1 || :
+	/sbin/service kadmin stop > /dev/null 2>&1 || :
+	/sbin/service krb524 stop > /dev/null 2>&1 || :
+	/sbin/service kprop stop > /dev/null 2>&1 || :
+	/sbin/install-info --delete %{_infodir}/krb425.info.gz %{_infodir}/dir
+	/sbin/install-info --delete %{_infodir}/krb5-admin.info.gz %{_infodir}/dir
+	/sbin/install-info --delete %{_infodir}/krb5-install.info.gz %{_infodir}/dir
+fi
+
+%postun server
+if [ "$1" -ge 1 ] ; then
+	/sbin/service krb5kdc condrestart > /dev/null 2>&1 || :
+	/sbin/service kadmin condrestart > /dev/null 2>&1 || :
+	/sbin/service krb524 condrestart > /dev/null 2>&1 || :
+	/sbin/service kprop condrestart > /dev/null 2>&1 || :
+fi
+
+%post workstation
+/sbin/install-info %{_infodir}/krb5-user.info %{_infodir}/dir
+/sbin/service xinetd reload > /dev/null 2>&1 || :
+
+%preun workstation
+if [ "$1" = "0" ] ; then
+	/sbin/install-info --delete %{_infodir}/krb5-user.info %{_infodir}/dir
+fi
+
+%postun workstation
+/sbin/service xinetd reload > /dev/null 2>&1 || :
+
+%files workstation
+%defattr(-,root,root)
+
+%config(noreplace) /etc/profile.d/krb5.sh
+%config(noreplace) /etc/profile.d/krb5.csh
+
+%config(noreplace) /etc/xinetd.d/*
+
+%docdir %{krb5prefix}/man
+%doc doc/krb5-user/*.html doc/user*.ps.gz src/config-files/services.append
+%doc doc/{ftp,kdestroy,kinit,klist,kpasswd,ksu,rcp,rlogin,rsh,telnet}.html
+%attr(0755,root,root) %doc src/config-files/convert-config-files
+%{_infodir}/krb5-user.info*
+
+%dir %{krb5prefix}
+%dir %{krb5prefix}/bin
+%dir %{krb5prefix}/man
+%dir %{krb5prefix}/man/man1
+%dir %{krb5prefix}/man/man5
+%dir %{krb5prefix}/man/man8
+%dir %{krb5prefix}/sbin
+
+%{krb5prefix}/bin/ftp
+%{krb5prefix}/man/man1/ftp.1*
+%{krb5prefix}/bin/gss-client
+%{krb5prefix}/bin/kdestroy
+%{krb5prefix}/man/man1/kdestroy.1*
+%{krb5prefix}/man/man1/kerberos.1*
+%{krb5prefix}/bin/kinit
+%{krb5prefix}/man/man1/kinit.1*
+%{krb5prefix}/bin/klist
+%{krb5prefix}/man/man1/klist.1*
+%{krb5prefix}/bin/kpasswd
+%{krb5prefix}/man/man1/kpasswd.1*
+%{krb5prefix}/bin/krb524init
+%{krb5prefix}/man/man1/krb524init.1*
+%{krb5prefix}/sbin/k5srvutil
+%{krb5prefix}/man/man8/k5srvutil.8*
+%{krb5prefix}/sbin/kadmin
+%{krb5prefix}/man/man8/kadmin.8*
+%{krb5prefix}/sbin/ktutil
+%{krb5prefix}/man/man8/ktutil.8*
+%attr(4755,root,root) %{krb5prefix}/bin/ksu
+%{krb5prefix}/man/man1/ksu.1*
+%{krb5prefix}/bin/kvno
+%{krb5prefix}/man/man1/kvno.1*
+%{krb5prefix}/bin/rcp
+%{krb5prefix}/man/man1/rcp.1*
+%{krb5prefix}/bin/krlogin
+%{krb5prefix}/bin/rlogin
+%{krb5prefix}/man/man1/rlogin.1*
+%{krb5prefix}/bin/krsh
+%{krb5prefix}/bin/rsh
+%{krb5prefix}/man/man1/rsh.1*
+%{krb5prefix}/bin/telnet
+%{krb5prefix}/man/man1/telnet.1*
+%{krb5prefix}/man/man1/tmac.doc*
+%attr(0755,root,root) %{krb5prefix}/bin/v4rcp
+%{krb5prefix}/man/man1/v4rcp.1*
+%{krb5prefix}/bin/sim_client
+%{krb5prefix}/bin/uuclient
+%{krb5prefix}/sbin/login.krb5
+%{krb5prefix}/man/man8/login.krb5.8*
+%{krb5prefix}/sbin/ftpd
+%{krb5prefix}/man/man8/ftpd.8*
+%{krb5prefix}/sbin/gss-server
+%{krb5prefix}/sbin/klogind
+%{krb5prefix}/man/man8/klogind.8*
+%{krb5prefix}/sbin/krb5-send-pr
+%{krb5prefix}/man/man1/krb5-send-pr.1*
+%{krb5prefix}/sbin/kshd
+%{krb5prefix}/man/man8/kshd.8*
+%{krb5prefix}/sbin/telnetd
+%{krb5prefix}/man/man8/telnetd.8*
+%{krb5prefix}/sbin/uuserver
+%{krb5prefix}/man/man5/.k5login.5*
+%{krb5prefix}/man/man5/krb5.conf.5*
+
+%files server
+%defattr(-,root,root)
+
+%config /etc/rc.d/init.d/krb5kdc
+%config /etc/rc.d/init.d/kadmin
+%config /etc/rc.d/init.d/krb524
+%config /etc/rc.d/init.d/kprop
+%config(noreplace) /etc/sysconfig/krb5kdc
+%config(noreplace) /etc/sysconfig/kadmin
+%config(noreplace) /etc/sysconfig/krb524
+
+%docdir %{krb5prefix}/man
+%doc doc/admin*.ps.gz doc/krb5-admin/*.html
+%doc doc/krb425*.ps.gz doc/krb425/*.html
+%doc doc/install*.ps.gz doc/krb5-install/*.html
+%doc README.krb524
+
+%{_infodir}/krb5-admin.info*
+%{_infodir}/krb5-install.info*
+%{_infodir}/krb425.info*
+
+%dir %{_var}/kerberos
+%dir %{_var}/kerberos/krb5kdc
+%config(noreplace) %{_var}/kerberos/krb5kdc/kdc.conf
+%config(noreplace) %{_var}/kerberos/krb5kdc/kadm5.acl
+
+%dir %{krb5prefix}/bin
+%dir %{_libdir}/krb5
+%dir %{_libdir}/krb5/plugins
+%dir %{_libdir}/krb5/plugins/kdb
+%{_libdir}/krb5/plugins/kdb/db2.so
+%dir %{krb5prefix}/man
+%dir %{krb5prefix}/man/man1
+%dir %{krb5prefix}/man/man5
+%dir %{krb5prefix}/man/man8
+%dir %{krb5prefix}/sbin
+
+%{krb5prefix}/man/man5/kdc.conf.5*
+%{krb5prefix}/sbin/kadmin.local
+%{krb5prefix}/man/man8/kadmin.local.8*
+%{krb5prefix}/sbin/kadmind
+%{krb5prefix}/man/man8/kadmind.8*
+%{krb5prefix}/sbin/kdb5_util
+%{krb5prefix}/man/man8/kdb5_util.8*
+%{krb5prefix}/sbin/kprop
+%{krb5prefix}/man/man8/kprop.8*
+%{krb5prefix}/sbin/kpropd
+%{krb5prefix}/man/man8/kpropd.8*
+%{krb5prefix}/sbin/krb524d
+%{krb5prefix}/man/man8/krb524d.8*
+%{krb5prefix}/sbin/krb5kdc
+%{krb5prefix}/man/man8/krb5kdc.8*
+%{krb5prefix}/sbin/sim_server
+# This is here for people who want to test their server, and also 
+# included in devel package for similar reasons.
+%{krb5prefix}/bin/sclient
+%{krb5prefix}/man/man1/sclient.1*
+%{krb5prefix}/sbin/sserver
+%{krb5prefix}/man/man8/sserver.8*
+
+%files libs
+%defattr(-,root,root)
+#%config /etc/rc.d/init.d/kdcrotate
+%config(noreplace) /etc/krb5.conf
+%docdir %{krb5prefix}/man
+%{_libdir}/lib*.so.*
+%dir %{_libdir}/krb5
+%dir %{_libdir}/krb5/plugins
+%{krb5prefix}/share
+
+%files devel
+%defattr(-,root,root)
+
+%config(noreplace) /etc/profile.d/krb5.sh
+%config(noreplace) /etc/profile.d/krb5.csh
+
+%docdir %{krb5prefix}/man
+%doc doc/api
+%doc doc/implement
+%doc doc/kadm5
+%doc doc/kadmin
+%doc doc/krb5-protocol
+%doc doc/rpc
+%doc doc/threads.txt
+
+%dir %{krb5prefix}
+%dir %{krb5prefix}/bin
+%dir %{krb5prefix}/man
+%dir %{krb5prefix}/man/man1
+%dir %{krb5prefix}/man/man8
+%dir %{krb5prefix}/sbin
+
+%{_includedir}/*
+%{_libdir}/lib*.a
+%{_libdir}/lib*.so
+%if %{install_macro}
+%{_datadir}/aclocal/*
+%endif
+
+%{krb5prefix}/bin/krb5-config
+%{krb5prefix}/bin/sclient
+%{krb5prefix}/man/man1/krb5-config.1*
+%{krb5prefix}/man/man1/sclient.1*
+%{krb5prefix}/man/man8/sserver.8*
+%{krb5prefix}/sbin/sserver
Index: branches/fc15-dev/server/fedora/ref-prepatch/kuserok.c
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/kuserok.c	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/kuserok.c	(revision 1803)
@@ -0,0 +1,171 @@
+/*
+ * lib/krb5/os/kuserok.c
+ *
+ * Copyright 1990,1993 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  Furthermore if you modify this software you must label
+ * your software as modified software and not distribute it in such a
+ * fashion that it might be confused with the original M.I.T. software.
+ * M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ * 
+ *
+ * krb5_kuserok()
+ */
+
+#include "k5-int.h"
+#if !defined(_WIN32)		/* Not yet for Windows */
+#include <stdio.h>
+#include <pwd.h>
+
+#if defined(_AIX) && defined(_IBMR2)
+#include <sys/access.h>
+/* xlc has a bug with "const" */
+#define getpwnam(user) getpwnam((char *)user)
+#endif
+
+#define MAX_USERNAME 65
+
+#if defined(__APPLE__) && defined(__MACH__)
+#include <hfs/hfs_mount.h>	/* XXX */
+#define FILE_OWNER_OK(UID)  ((UID) == 0 || (UID) == UNKNOWNUID)
+#else
+#define FILE_OWNER_OK(UID)  ((UID) == 0)
+#endif
+
+/*
+ * Given a Kerberos principal "principal", and a local username "luser",
+ * determine whether user is authorized to login according to the
+ * authorization file ("~luser/.k5login" by default).  Returns TRUE
+ * if authorized, FALSE if not authorized.
+ *
+ * If there is no account for "luser" on the local machine, returns
+ * FALSE.  If there is no authorization file, and the given Kerberos
+ * name "server" translates to the same name as "luser" (using
+ * krb5_aname_to_lname()), returns TRUE.  Otherwise, if the authorization file
+ * can't be accessed, returns FALSE.  Otherwise, the file is read for
+ * a matching principal name, instance, and realm.  If one is found,
+ * returns TRUE, if none is found, returns FALSE.
+ *
+ * The file entries are in the format produced by krb5_unparse_name(),
+ * one entry per line.
+ *
+ */
+
+krb5_boolean KRB5_CALLCONV
+krb5_kuserok(krb5_context context, krb5_principal principal, const char *luser)
+{
+    struct stat sbuf;
+    struct passwd *pwd;
+    char pbuf[MAXPATHLEN];
+    krb5_boolean isok = FALSE;
+    FILE *fp;
+    char kuser[MAX_USERNAME];
+    char *princname;
+    char linebuf[BUFSIZ];
+    char *newline;
+    int gobble;
+
+    /* no account => no access */
+    char pwbuf[BUFSIZ];
+    struct passwd pwx;
+    if (k5_getpwnam_r(luser, &pwx, pwbuf, sizeof(pwbuf), &pwd) != 0)
+	return(FALSE);
+    (void) strncpy(pbuf, pwd->pw_dir, sizeof(pbuf) - 1);
+    pbuf[sizeof(pbuf) - 1] = '\0';
+    (void) strncat(pbuf, "/.k5login", sizeof(pbuf) - 1 - strlen(pbuf));
+
+    if (access(pbuf, F_OK)) {	 /* not accessible */
+	/*
+	 * if he's trying to log in as himself, and there is no .k5login file,
+	 * let him.  To find out, call
+	 * krb5_aname_to_localname to convert the principal to a name
+	 * which we can string compare. 
+	 */
+	if (!(krb5_aname_to_localname(context, principal,
+				      sizeof(kuser), kuser))
+	    && (strcmp(kuser, luser) == 0)) {
+	    return(TRUE);
+	}
+    }
+    if (krb5_unparse_name(context, principal, &princname))
+	return(FALSE);			/* no hope of matching */
+
+    /* open ~/.k5login */
+    if ((fp = fopen(pbuf, "r")) == NULL) {
+	free(princname);
+	return(FALSE);
+    }
+    /*
+     * For security reasons, the .k5login file must be owned either by
+     * the user himself, or by root.  Otherwise, don't grant access.
+     */
+    if (fstat(fileno(fp), &sbuf)) {
+	fclose(fp);
+	free(princname);
+	return(FALSE);
+    }
+    if (sbuf.st_uid != pwd->pw_uid && !FILE_OWNER_OK(sbuf.st_uid)) {
+	fclose(fp);
+	free(princname);
+	return(FALSE);
+    }
+
+    /* check each line */
+    while (!isok && (fgets(linebuf, BUFSIZ, fp) != NULL)) {
+	/* null-terminate the input string */
+	linebuf[BUFSIZ-1] = '\0';
+	newline = NULL;
+	/* nuke the newline if it exists */
+	if ((newline = strchr(linebuf, '\n')))
+	    *newline = '\0';
+	if (!strcmp(linebuf, princname)) {
+	    isok = TRUE;
+	    continue;
+	}
+	/* clean up the rest of the line if necessary */
+	if (!newline)
+	    while (((gobble = getc(fp)) != EOF) && gobble != '\n');
+    }
+    free(princname);
+    fclose(fp);
+    return(isok);
+}
+
+#else /* _WIN32 */
+
+/*
+ * If the given Kerberos name "server" translates to the same name as "luser"
+ * (using * krb5_aname_to_lname()), returns TRUE.
+ */
+krb5_boolean KRB5_CALLCONV
+krb5_kuserok(context, principal, luser)
+    krb5_context context;
+    krb5_principal principal;
+    const char *luser;
+{
+    char kuser[50];
+
+    if (krb5_aname_to_localname(context, principal, sizeof(kuser), kuser))
+        return FALSE;
+
+    if (strcmp(kuser, luser) == 0)
+	    return TRUE;
+
+    return FALSE;
+}
+#endif /* _WIN32 */
Index: branches/fc15-dev/server/fedora/ref-prepatch/suexec.c
===================================================================
--- branches/fc15-dev/server/fedora/ref-prepatch/suexec.c	(revision 1803)
+++ branches/fc15-dev/server/fedora/ref-prepatch/suexec.c	(revision 1803)
@@ -0,0 +1,636 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * suexec.c -- "Wrapper" support program for suEXEC behaviour for Apache
+ *
+ ***********************************************************************
+ *
+ * NOTE! : DO NOT edit this code!!!  Unless you know what you are doing,
+ *         editing this code might open up your system in unexpected
+ *         ways to would-be crackers.  Every precaution has been taken
+ *         to make this code as safe as possible; alter it at your own
+ *         risk.
+ *
+ ***********************************************************************
+ *
+ *
+ */
+
+#include "apr.h"
+#include "ap_config.h"
+#include "suexec.h"
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <string.h>
+#include <time.h>
+#if APR_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif
+
+/*
+ ***********************************************************************
+ * There is no initgroups() in QNX, so I believe this is safe :-)
+ * Use cc -osuexec -3 -O -mf -DQNX suexec.c to compile.
+ *
+ * May 17, 1997.
+ * Igor N. Kovalenko -- infoh mail.wplus.net
+ ***********************************************************************
+ */
+
+#if defined(NEED_INITGROUPS)
+int initgroups(const char *name, gid_t basegid)
+{
+    /* QNX and MPE do not appear to support supplementary groups. */
+    return 0;
+}
+#endif
+
+#if defined(SUNOS4)
+extern char *sys_errlist[];
+#define strerror(x) sys_errlist[(x)]
+#endif
+
+#if defined(PATH_MAX)
+#define AP_MAXPATH PATH_MAX
+#elif defined(MAXPATHLEN)
+#define AP_MAXPATH MAXPATHLEN
+#else
+#define AP_MAXPATH 8192
+#endif
+
+#define AP_ENVBUF 256
+
+extern char **environ;
+static FILE *log = NULL;
+
+static const char *const safe_env_lst[] =
+{
+    /* variable name starts with */
+    "HTTP_",
+    "SSL_",
+
+    /* variable name is */
+    "AUTH_TYPE=",
+    "CONTENT_LENGTH=",
+    "CONTENT_TYPE=",
+    "DATE_GMT=",
+    "DATE_LOCAL=",
+    "DOCUMENT_NAME=",
+    "DOCUMENT_PATH_INFO=",
+    "DOCUMENT_ROOT=",
+    "DOCUMENT_URI=",
+    "GATEWAY_INTERFACE=",
+    "HTTPS=",
+    "LAST_MODIFIED=",
+    "PATH_INFO=",
+    "PATH_TRANSLATED=",
+    "QUERY_STRING=",
+    "QUERY_STRING_UNESCAPED=",
+    "REMOTE_ADDR=",
+    "REMOTE_HOST=",
+    "REMOTE_IDENT=",
+    "REMOTE_PORT=",
+    "REMOTE_USER=",
+    "REDIRECT_HANDLER=",
+    "REDIRECT_QUERY_STRING=",
+    "REDIRECT_REMOTE_USER=",
+    "REDIRECT_STATUS=",
+    "REDIRECT_URL=",
+    "REQUEST_METHOD=",
+    "REQUEST_URI=",
+    "SCRIPT_FILENAME=",
+    "SCRIPT_NAME=",
+    "SCRIPT_URI=",
+    "SCRIPT_URL=",
+    "SERVER_ADMIN=",
+    "SERVER_NAME=",
+    "SERVER_ADDR=",
+    "SERVER_PORT=",
+    "SERVER_PROTOCOL=",
+    "SERVER_SIGNATURE=",
+    "SERVER_SOFTWARE=",
+    "UNIQUE_ID=",
+    "USER_NAME=",
+    "TZ=",
+    NULL
+};
+
+
+static void err_output(int is_error, const char *fmt, va_list ap)
+{
+#ifdef AP_LOG_EXEC
+    time_t timevar;
+    struct tm *lt;
+
+    if (!log) {
+        if ((log = fopen(AP_LOG_EXEC, "a")) == NULL) {
+            fprintf(stderr, "suexec failure: could not open log file\n");
+            perror("fopen");
+            exit(1);
+        }
+    }
+
+    if (is_error) {
+        fprintf(stderr, "suexec policy violation: see suexec log for more "
+                        "details\n");
+    }
+
+    time(&timevar);
+    lt = localtime(&timevar);
+
+    fprintf(log, "[%d-%.2d-%.2d %.2d:%.2d:%.2d]: ",
+            lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday,
+            lt->tm_hour, lt->tm_min, lt->tm_sec);
+
+    vfprintf(log, fmt, ap);
+
+    fflush(log);
+#endif /* AP_LOG_EXEC */
+    return;
+}
+
+static void log_err(const char *fmt,...)
+{
+#ifdef AP_LOG_EXEC
+    va_list ap;
+
+    va_start(ap, fmt);
+    err_output(1, fmt, ap); /* 1 == is_error */
+    va_end(ap);
+#endif /* AP_LOG_EXEC */
+    return;
+}
+
+static void log_no_err(const char *fmt,...)
+{
+#ifdef AP_LOG_EXEC
+    va_list ap;
+
+    va_start(ap, fmt);
+    err_output(0, fmt, ap); /* 0 == !is_error */
+    va_end(ap);
+#endif /* AP_LOG_EXEC */
+    return;
+}
+
+static void clean_env(void)
+{
+    char pathbuf[512];
+    char **cleanenv;
+    char **ep;
+    int cidx = 0;
+    int idx;
+
+    /* While cleaning the environment, the environment should be clean.
+     * (e.g. malloc() may get the name of a file for writing debugging info.
+     * Bad news if MALLOC_DEBUG_FILE is set to /etc/passwd.  Sprintf() may be
+     * susceptible to bad locale settings....)
+     * (from PR 2790)
+     */
+    char **envp = environ;
+    char *empty_ptr = NULL;
+
+    environ = &empty_ptr; /* VERY safe environment */
+
+    if ((cleanenv = (char **) calloc(AP_ENVBUF, sizeof(char *))) == NULL) {
+        log_err("failed to malloc memory for environment\n");
+        exit(120);
+    }
+
+    sprintf(pathbuf, "PATH=%s", AP_SAFE_PATH);
+    cleanenv[cidx] = strdup(pathbuf);
+    cidx++;
+
+    for (ep = envp; *ep && cidx < AP_ENVBUF-1; ep++) {
+        for (idx = 0; safe_env_lst[idx]; idx++) {
+            if (!strncmp(*ep, safe_env_lst[idx],
+                         strlen(safe_env_lst[idx]))) {
+                cleanenv[cidx] = *ep;
+                cidx++;
+                break;
+            }
+        }
+    }
+
+    cleanenv[cidx] = NULL;
+
+    environ = cleanenv;
+}
+
+int main(int argc, char *argv[])
+{
+    int userdir = 0;        /* ~userdir flag             */
+    uid_t uid;              /* user information          */
+    gid_t gid;              /* target group placeholder  */
+    char *target_uname;     /* target user name          */
+    char *target_gname;     /* target group name         */
+    char *target_homedir;   /* target home directory     */
+    char *actual_uname;     /* actual user name          */
+    char *actual_gname;     /* actual group name         */
+    char *prog;             /* name of this program      */
+    char *cmd;              /* command to be executed    */
+    char cwd[AP_MAXPATH];   /* current working directory */
+    char dwd[AP_MAXPATH];   /* docroot working directory */
+    struct passwd *pw;      /* password entry holder     */
+    struct group *gr;       /* group entry holder        */
+    struct stat dir_info;   /* directory info holder     */
+    struct stat prg_info;   /* program info holder       */
+
+    /*
+     * Start with a "clean" environment
+     */
+    clean_env();
+
+    prog = argv[0];
+    /*
+     * Check existence/validity of the UID of the user
+     * running this program.  Error out if invalid.
+     */
+    uid = getuid();
+    if ((pw = getpwuid(uid)) == NULL) {
+        log_err("crit: invalid uid: (%ld)\n", uid);
+        exit(102);
+    }
+    /*
+     * See if this is a 'how were you compiled' request, and
+     * comply if so.
+     */
+    if ((argc > 1)
+        && (! strcmp(argv[1], "-V"))
+        && ((uid == 0)
+#ifdef _OSD_POSIX
+        /* User name comparisons are case insensitive on BS2000/OSD */
+            || (! strcasecmp(AP_HTTPD_USER, pw->pw_name)))
+#else  /* _OSD_POSIX */
+            || (! strcmp(AP_HTTPD_USER, pw->pw_name)))
+#endif /* _OSD_POSIX */
+        ) {
+#ifdef AP_DOC_ROOT
+        fprintf(stderr, " -D AP_DOC_ROOT=\"%s\"\n", AP_DOC_ROOT);
+#endif
+#ifdef AP_GID_MIN
+        fprintf(stderr, " -D AP_GID_MIN=%d\n", AP_GID_MIN);
+#endif
+#ifdef AP_HTTPD_USER
+        fprintf(stderr, " -D AP_HTTPD_USER=\"%s\"\n", AP_HTTPD_USER);
+#endif
+#ifdef AP_LOG_EXEC
+        fprintf(stderr, " -D AP_LOG_EXEC=\"%s\"\n", AP_LOG_EXEC);
+#endif
+#ifdef AP_SAFE_PATH
+        fprintf(stderr, " -D AP_SAFE_PATH=\"%s\"\n", AP_SAFE_PATH);
+#endif
+#ifdef AP_SUEXEC_UMASK
+        fprintf(stderr, " -D AP_SUEXEC_UMASK=%03o\n", AP_SUEXEC_UMASK);
+#endif
+#ifdef AP_UID_MIN
+        fprintf(stderr, " -D AP_UID_MIN=%d\n", AP_UID_MIN);
+#endif
+#ifdef AP_USERDIR_SUFFIX
+        fprintf(stderr, " -D AP_USERDIR_SUFFIX=\"%s\"\n", AP_USERDIR_SUFFIX);
+#endif
+        exit(0);
+    }
+    /*
+     * If there are a proper number of arguments, set
+     * all of them to variables.  Otherwise, error out.
+     */
+    if (argc < 4) {
+        log_err("too few arguments\n");
+        exit(101);
+    }
+    target_uname = argv[1];
+    target_gname = argv[2];
+    cmd = argv[3];
+
+    /*
+     * Check to see if the user running this program
+     * is the user allowed to do so as defined in
+     * suexec.h.  If not the allowed user, error out.
+     */
+#ifdef _OSD_POSIX
+    /* User name comparisons are case insensitive on BS2000/OSD */
+    if (strcasecmp(AP_HTTPD_USER, pw->pw_name)) {
+        log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER);
+        exit(103);
+    }
+#else  /*_OSD_POSIX*/
+    if (strcmp(AP_HTTPD_USER, pw->pw_name)) {
+        log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER);
+        exit(103);
+    }
+#endif /*_OSD_POSIX*/
+
+    /*
+     * Check for a leading '/' (absolute path) in the command to be executed,
+     * or attempts to back up out of the current directory,
+     * to protect against attacks.  If any are
+     * found, error out.  Naughty naughty crackers.
+     */
+    if ((cmd[0] == '/') || (!strncmp(cmd, "../", 3))
+        || (strstr(cmd, "/../") != NULL)) {
+        log_err("invalid command (%s)\n", cmd);
+        exit(104);
+    }
+
+    /*
+     * Check to see if this is a ~userdir request.  If
+     * so, set the flag, and remove the '~' from the
+     * target username.
+     */
+    if (!strncmp("~", target_uname, 1)) {
+        target_uname++;
+        userdir = 1;
+    }
+
+    /*
+     * Error out if the target username is invalid.
+     */
+    if (strspn(target_uname, "1234567890") != strlen(target_uname)) {
+        if ((pw = getpwnam(target_uname)) == NULL) {
+            log_err("invalid target user name: (%s)\n", target_uname);
+            exit(105);
+        }
+    }
+    else {
+        if ((pw = getpwuid(atoi(target_uname))) == NULL) {
+            log_err("invalid target user id: (%s)\n", target_uname);
+            exit(121);
+        }
+    }
+
+    /*
+     * Error out if the target group name is invalid.
+     */
+    if (strspn(target_gname, "1234567890") != strlen(target_gname)) {
+        if ((gr = getgrnam(target_gname)) == NULL) {
+            log_err("invalid target group name: (%s)\n", target_gname);
+            exit(106);
+        }
+        gid = gr->gr_gid;
+        actual_gname = strdup(gr->gr_name);
+    }
+    else {
+        gid = atoi(target_gname);
+        actual_gname = strdup(target_gname);
+    }
+
+#ifdef _OSD_POSIX
+    /*
+     * Initialize BS2000 user environment
+     */
+    {
+        pid_t pid;
+        int status;
+
+        switch (pid = ufork(target_uname)) {
+        case -1:    /* Error */
+            log_err("failed to setup bs2000 environment for user %s: %s\n",
+                    target_uname, strerror(errno));
+            exit(150);
+        case 0:     /* Child */
+            break;
+        default:    /* Father */
+            while (pid != waitpid(pid, &status, 0))
+                ;
+            /* @@@ FIXME: should we deal with STOP signals as well? */
+            if (WIFSIGNALED(status)) {
+                kill (getpid(), WTERMSIG(status));
+            }
+            exit(WEXITSTATUS(status));
+        }
+    }
+#endif /*_OSD_POSIX*/
+
+    /*
+     * Save these for later since initgroups will hose the struct
+     */
+    uid = pw->pw_uid;
+    actual_uname = strdup(pw->pw_name);
+    target_homedir = strdup(pw->pw_dir);
+
+    /*
+     * Log the transaction here to be sure we have an open log
+     * before we setuid().
+     */
+    log_no_err("uid: (%s/%s) gid: (%s/%s) cmd: %s\n",
+               target_uname, actual_uname,
+               target_gname, actual_gname,
+               cmd);
+
+    /*
+     * Error out if attempt is made to execute as root or as
+     * a UID less than AP_UID_MIN.  Tsk tsk.
+     */
+    if ((uid == 0) || (uid < AP_UID_MIN)) {
+        log_err("cannot run as forbidden uid (%d/%s)\n", uid, cmd);
+        exit(107);
+    }
+
+    /*
+     * Error out if attempt is made to execute as root group
+     * or as a GID less than AP_GID_MIN.  Tsk tsk.
+     */
+    if ((gid == 0) || (gid < AP_GID_MIN)) {
+        log_err("cannot run as forbidden gid (%d/%s)\n", gid, cmd);
+        exit(108);
+    }
+
+    /*
+     * Change UID/GID here so that the following tests work over NFS.
+     *
+     * Initialize the group access list for the target user,
+     * and setgid() to the target group. If unsuccessful, error out.
+     */
+    if (((setgid(gid)) != 0) || (initgroups(actual_uname, gid) != 0)) {
+        log_err("failed to setgid (%ld: %s)\n", gid, cmd);
+        exit(109);
+    }
+
+    /*
+     * setuid() to the target user.  Error out on fail.
+     */
+    if ((setuid(uid)) != 0) {
+        log_err("failed to setuid (%ld: %s)\n", uid, cmd);
+        exit(110);
+    }
+
+    /*
+     * Get the current working directory, as well as the proper
+     * document root (dependant upon whether or not it is a
+     * ~userdir request).  Error out if we cannot get either one,
+     * or if the current working directory is not in the docroot.
+     * Use chdir()s and getcwd()s to avoid problems with symlinked
+     * directories.  Yuck.
+     */
+    if (getcwd(cwd, AP_MAXPATH) == NULL) {
+        log_err("cannot get current working directory\n");
+        exit(111);
+    }
+
+    if (userdir) {
+        if (((chdir(target_homedir)) != 0) ||
+            ((chdir(AP_USERDIR_SUFFIX)) != 0) ||
+            ((getcwd(dwd, AP_MAXPATH)) == NULL) ||
+            ((chdir(cwd)) != 0)) {
+            log_err("cannot get docroot information (%s)\n", target_homedir);
+            exit(112);
+        }
+    }
+    else {
+        if (((chdir(AP_DOC_ROOT)) != 0) ||
+            ((getcwd(dwd, AP_MAXPATH)) == NULL) ||
+            ((chdir(cwd)) != 0)) {
+            log_err("cannot get docroot information (%s)\n", AP_DOC_ROOT);
+            exit(113);
+        }
+    }
+
+    if ((strncmp(cwd, dwd, strlen(dwd))) != 0) {
+        log_err("command not in docroot (%s/%s)\n", cwd, cmd);
+        exit(114);
+    }
+
+    /*
+     * Stat the cwd and verify it is a directory, or error out.
+     */
+    if (((lstat(cwd, &dir_info)) != 0) || !(S_ISDIR(dir_info.st_mode))) {
+        log_err("cannot stat directory: (%s)\n", cwd);
+        exit(115);
+    }
+
+    /*
+     * Error out if cwd is writable by others.
+     */
+    if ((dir_info.st_mode & S_IWOTH) || (dir_info.st_mode & S_IWGRP)) {
+        log_err("directory is writable by others: (%s)\n", cwd);
+        exit(116);
+    }
+
+    /*
+     * Error out if we cannot stat the program.
+     */
+    if (((lstat(cmd, &prg_info)) != 0) || (S_ISLNK(prg_info.st_mode))) {
+        log_err("cannot stat program: (%s)\n", cmd);
+        exit(117);
+    }
+
+    /*
+     * Error out if the program is writable by others.
+     */
+    if ((prg_info.st_mode & S_IWOTH) || (prg_info.st_mode & S_IWGRP)) {
+        log_err("file is writable by others: (%s/%s)\n", cwd, cmd);
+        exit(118);
+    }
+
+    /*
+     * Error out if the file is setuid or setgid.
+     */
+    if ((prg_info.st_mode & S_ISUID) || (prg_info.st_mode & S_ISGID)) {
+        log_err("file is either setuid or setgid: (%s/%s)\n", cwd, cmd);
+        exit(119);
+    }
+
+    /*
+     * Error out if the target name/group is different from
+     * the name/group of the cwd or the program.
+     */
+    if ((uid != dir_info.st_uid) ||
+        (gid != dir_info.st_gid) ||
+        (uid != prg_info.st_uid) ||
+        (gid != prg_info.st_gid)) {
+        log_err("target uid/gid (%ld/%ld) mismatch "
+                "with directory (%ld/%ld) or program (%ld/%ld)\n",
+                uid, gid,
+                dir_info.st_uid, dir_info.st_gid,
+                prg_info.st_uid, prg_info.st_gid);
+        exit(120);
+    }
+    /*
+     * Error out if the program is not executable for the user.
+     * Otherwise, she won't find any error in the logs except for
+     * "[error] Premature end of script headers: ..."
+     */
+    if (!(prg_info.st_mode & S_IXUSR)) {
+        log_err("file has no execute permission: (%s/%s)\n", cwd, cmd);
+        exit(121);
+    }
+
+#ifdef AP_SUEXEC_UMASK
+    /*
+     * umask() uses inverse logic; bits are CLEAR for allowed access.
+     */
+    if ((~AP_SUEXEC_UMASK) & 0022) {
+        log_err("notice: AP_SUEXEC_UMASK of %03o allows "
+                "write permission to group and/or other\n", AP_SUEXEC_UMASK);
+    }
+    umask(AP_SUEXEC_UMASK);
+#endif /* AP_SUEXEC_UMASK */
+
+    /*
+     * Be sure to close the log file so the CGI can't
+     * mess with it.  If the exec fails, it will be reopened
+     * automatically when log_err is called.  Note that the log
+     * might not actually be open if AP_LOG_EXEC isn't defined.
+     * However, the "log" cell isn't ifdef'd so let's be defensive
+     * and assume someone might have done something with it
+     * outside an ifdef'd AP_LOG_EXEC block.
+     */
+    if (log != NULL) {
+        fclose(log);
+        log = NULL;
+    }
+
+    /*
+     * Execute the command, replacing our image with its own.
+     */
+#ifdef NEED_HASHBANG_EMUL
+    /* We need the #! emulation when we want to execute scripts */
+    {
+        extern char **environ;
+
+        ap_execve(cmd, &argv[3], environ);
+    }
+#else /*NEED_HASHBANG_EMUL*/
+    execv(cmd, &argv[3]);
+#endif /*NEED_HASHBANG_EMUL*/
+
+    /*
+     * (I can't help myself...sorry.)
+     *
+     * Uh oh.  Still here.  Where's the kaboom?  There was supposed to be an
+     * EARTH-shattering kaboom!
+     *
+     * Oh well, log the failure and error out.
+     */
+    log_err("(%d)%s: exec failed (%s)\n", errno, strerror(errno), cmd);
+    exit(255);
+}
Index: branches/fc15-dev/server/fedora/specs/389-ds-base.spec.patch
===================================================================
--- branches/fc15-dev/server/fedora/specs/389-ds-base.spec.patch	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/389-ds-base.spec.patch	(revision 1803)
@@ -0,0 +1,45 @@
+--- 389-ds-base.spec.orig	2010-12-16 12:22:05.000000000 -0500
++++ 389-ds-base.spec	2010-12-23 21:19:49.000000000 -0500
+@@ -13,7 +13,7 @@
+ Summary:          389 Directory Server (base)
+ Name:             389-ds-base
+ Version:          1.2.7.5
+-Release:          %{?relprefix}1%{?prerel}%{?dist}
++Release:          %{?relprefix}1%{?prerel}.scripts.%{scriptsversion}%{?dist}
+ License:          GPLv2 with exceptions
+ URL:              http://port389.org/
+ Group:            System Environment/Daemons
+@@ -83,11 +83,15 @@
+ Requires(preun): /sbin/chkconfig
+ Requires(preun): /sbin/service
+ 
++Provides:         scripts-389-ds
++
+ Source0:          http://port389.org/sources/%{name}-%{version}%{?prerel}.tar.bz2
+ # 389-ds-git.sh should be used to generate the source tarball from git
+ Source1:          %{name}-git.sh
+ Source2:          %{name}-devel.README
+ 
++Patch0:           389-ds-base-fix-changelog-paths.patch
++
+ %description
+ 389 Directory Server is an LDAPv3 compliant server.  The base package includes
+ the LDAP server and command line utilities for server administration.
+@@ -109,6 +113,7 @@
+ 
+ %prep
+ %setup -q -n %{name}-%{version}%{?prerel}
++%patch0 -p1 -b .fix-changelog-paths
+ cp %{SOURCE2} README.devel
+ 
+ %build
+@@ -300,6 +305,9 @@
+ %{_libdir}/%{pkgname}/*.so
+ 
+ %changelog
++* Thu Dec 23 2010 Mitchell E Berger <mitchb@mit.edu> - 1.2.7.5-1.scripts
++- Correct changelog path logic in MMR plugin
++
+ * Thu Dec 16 2010 Rich Megginson <rmeggins@redhat.com> - 1.2.7.5-1
+ - 1.2.7.5 release - git tag 389-ds-base-1.2.7.5
+ - Bug 663597 - Memory leaks in normalization code
Index: branches/fc15-dev/server/fedora/specs/accountadm.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/accountadm.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/accountadm.spec	(revision 1803)
@@ -0,0 +1,76 @@
+Summary: scripts.mit.edu locker administration system
+Group: Applications/System
+Name: accountadm
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+BuildRequires: scripts-openafs-devel
+BuildRequires: hesinfo
+BuildRequires: openldap-clients
+BuildRequires: krb5-devel
+BuildRequires: sudo
+Requires: hesinfo
+Requires: openldap-clients
+Requires: sudo
+%define debug_package %{nil}
+Prereq: /usr/bin/fs, /usr/bin/pts
+
+%description 
+
+scripts.mit.edu locker administration system
+Contains:
+ - Perl script for checking whether a user is a locker admin <admof>
+ - 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.
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure --with-fs=/usr/bin/fs --with-pts=/usr/bin/pts
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT prefix=/usr/local
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0644, root, root)
+/usr/local/etc/mbashrc
+%defattr(0755, root, root)
+/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
+/usr/local/sbin/ldap-backup
+%defattr(4755, signup, signup)
+/usr/local/sbin/signup-scripts-frontend
+
+%pre
+groupadd -g 102 signup || [ $? -eq 9 ]
+useradd -u 102 -g signup -d /afs/athena.mit.edu/contrib/scripts/signup -M signup || [ $? -eq 9 ]
+
+%postun
+if [ "$1" = "0" ] ; then
+   userdel signup
+fi
+
+%changelog
+* Wed Dec 31 2008  Quentin Smith <quentin@mit.edu> - 0.917-0
+- don't delete signup user on upgrades
+
+* Sat Sep 30 2006  Jeff Arnold <jbarnold@MIT.EDU> 0.00
+- prerelease
Index: branches/fc15-dev/server/fedora/specs/athrun.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/athrun.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/athrun.spec	(revision 1803)
@@ -0,0 +1,37 @@
+Summary: scripts.mit.edu version of Athena athrun utility
+Group: Applications/System
+Name: athrun
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: MIT
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+%define debug_package %{nil}
+
+%description 
+
+scripts.mit.edu version of Athena athrun utility
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT prefix=/usr/local
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0755, root, root)
+/usr/local/bin/athrun
+
+%changelog
+* Wed Jul 01 2009  Mitchell Berger <mitchb@MIT.EDU> 0.00
+- Initial version
Index: branches/fc15-dev/server/fedora/specs/execsys.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/execsys.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/execsys.spec	(revision 1803)
@@ -0,0 +1,70 @@
+Summary: scripts.mit.edu glue associated with file execution
+Group: Applications/System
+Name: execsys
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Requires: xinetd
+Source: %{name}.tar.gz
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+%define debug_package %{nil}
+
+%description
+
+scripts.mit.edu glue associated with file execution
+Contains:
+ - Apache configuration file <execsys.conf>
+ - binfmt_misc init script <execsys-binfmt>
+ - Binary for serving static content <static-cat>
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure --prefix=/usr/local --with-pl=/usr/bin/perl --with-php=/usr/bin/php-cgi --with-py=/usr/bin/python --with-exe=/usr/bin/mono
+make SYSCATDIR=/usr/local/sbin
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT SYSCATDIR=/usr/local/sbin
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0644, root, root)
+/etc/httpd/conf.d/execsys.conf
+%defattr(0755, root, root)
+/usr/local/bin/static-cat
+/etc/init.d/execsys-binfmt
+/usr/local/sbin/ldapize.pl
+/usr/local/sbin/svnproxy.pl
+/usr/libexec/scripts-trusted/svn
+/etc/xinetd.d/scripts-svn
+/usr/local/sbin/gitproxy.pl
+/usr/libexec/scripts-trusted/git
+/etc/xinetd.d/scripts-git
+
+%post
+chkconfig --add execsys-binfmt
+service execsys-binfmt start
+service xinetd reload
+
+%preun
+if [ "$1" = "0" ] ; then
+   service execsys-binfmt stop
+   chkconfig --del execsys-binfmt
+fi
+
+%postun
+service xinetd reload
+
+%changelog
+* Wed Dec 31 2008  Quentin Smith <quentin@mit.edu>
+- don't stop execsys on package updates
+
+* Sat Sep 30 2006  Jeff Arnold <jbarnold@MIT.EDU> 0.00
+- initial prerelease version
Index: branches/fc15-dev/server/fedora/specs/ghc-MonadCatchIO-mtl.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/ghc-MonadCatchIO-mtl.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/ghc-MonadCatchIO-mtl.spec	(revision 1803)
@@ -0,0 +1,64 @@
+%global pkg_name MonadCatchIO-mtl
+
+%global common_summary Haskell %{pkg_name} library
+
+%global common_description A %{pkg_name} library for Haskell.
+
+# add any Haskell library dependencies here:
+%global ghc_pkg_deps ghc-mtl-devel
+
+# add any foreign library dependencies here:
+#%%global ghc_pkg_c_deps @CDEP1@-devel
+
+%bcond_without shared
+
+# debuginfo is not useful for ghc
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        0.3.0.1
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        %{common_summary}
+
+Group:          System Environment/Libraries
+License:        BSD
+URL:            http://hackage.haskell.org/cgi-bin/hackage-scripts/package/%{pkg_name}
+Source0:        http://hackage.haskell.org/packages/archive/%{pkg_name}/%{version}/%{pkg_name}-%{version}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# fedora ghc archs:
+ExclusiveArch:  %{ix86} x86_64 ppc alpha
+BuildRequires:  ghc, ghc-doc, ghc-prof
+BuildRequires:  ghc-rpm-macros >= 0.7.0
+%{?ghc_pkg_deps:BuildRequires:  %{ghc_pkg_deps}, %(echo %{ghc_pkg_deps} | sed -e "s/\(ghc-[^, ]\+\)-devel/\1-doc,\1-prof/g")}
+%{?ghc_pkg_c_deps:BuildRequires:  %{ghc_pkg_c_deps}}
+
+%description
+%{common_description}
+%if %{with shared}
+This package provides the shared library.
+%endif
+
+
+%{?ghc_lib_package}
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%ghc_lib_build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%ghc_lib_install
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%changelog
+* Thu Sep  9 2010 Anders Kaseorg <andersk@mit.edu> - 0.3.0.1-0
+- initial packaging for Fedora automatically generated by cabal2spec-0.22.1
Index: branches/fc15-dev/server/fedora/specs/ghc-cgi.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/ghc-cgi.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/ghc-cgi.spec	(revision 1803)
@@ -0,0 +1,64 @@
+%global pkg_name cgi
+
+%global common_summary Haskell %{pkg_name} library
+
+%global common_description A %{pkg_name} library for Haskell.
+
+# add any Haskell library dependencies here:
+%global ghc_pkg_deps ghc-network-devel, ghc-parsec-devel, ghc-mtl-devel, ghc-MonadCatchIO-mtl-devel, ghc-xhtml-devel
+
+# add any foreign library dependencies here:
+#%%global ghc_pkg_c_deps @CDEP1@-devel
+
+%bcond_without shared
+
+# debuginfo is not useful for ghc
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        3001.1.8.1
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        %{common_summary}
+
+Group:          System Environment/Libraries
+License:        BSD
+URL:            http://hackage.haskell.org/cgi-bin/hackage-scripts/package/%{pkg_name}
+Source0:        http://hackage.haskell.org/packages/archive/%{pkg_name}/%{version}/%{pkg_name}-%{version}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# fedora ghc archs:
+ExclusiveArch:  %{ix86} x86_64 ppc alpha
+BuildRequires:  ghc, ghc-doc, ghc-prof
+BuildRequires:  ghc-rpm-macros >= 0.7.0
+%{?ghc_pkg_deps:BuildRequires:  %{ghc_pkg_deps}, %(echo %{ghc_pkg_deps} | sed -e "s/\(ghc-[^, ]\+\)-devel/\1-doc,\1-prof/g")}
+%{?ghc_pkg_c_deps:BuildRequires:  %{ghc_pkg_c_deps}}
+
+%description
+%{common_description}
+%if %{with shared}
+This package provides the shared library.
+%endif
+
+
+%{?ghc_lib_package}
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%ghc_lib_build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%ghc_lib_install
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%changelog
+* Thu Sep  9 2010 Anders Kaseorg <andersk@mit.edu> - 3001.1.8.1-0
+- initial packaging for Fedora automatically generated by cabal2spec-0.22.1
Index: branches/fc15-dev/server/fedora/specs/ghc-unix-handle.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/ghc-unix-handle.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/ghc-unix-handle.spec	(revision 1803)
@@ -0,0 +1,64 @@
+%global pkg_name unix-handle
+
+%global common_summary Haskell %{pkg_name} library
+
+%global common_description A %{pkg_name} library for Haskell.
+
+# add any Haskell library dependencies here:
+#%%global ghc_pkg_deps ghc-@DEP1@-devel, ghc-@DEP2@-devel
+
+# add any foreign library dependencies here:
+#%%global ghc_pkg_c_deps @CDEP1@-devel
+
+%bcond_without shared
+
+# debuginfo is not useful for ghc
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        0.0.0
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        %{common_summary}
+
+Group:          System Environment/Libraries
+License:        BSD
+URL:            http://hackage.haskell.org/cgi-bin/hackage-scripts/package/%{pkg_name}
+Source0:        http://hackage.haskell.org/packages/archive/%{pkg_name}/%{version}/%{pkg_name}-%{version}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# fedora ghc archs:
+ExclusiveArch:  %{ix86} x86_64 ppc alpha
+BuildRequires:  ghc, ghc-doc, ghc-prof
+BuildRequires:  ghc-rpm-macros >= 0.7.0
+%{?ghc_pkg_deps:BuildRequires:  %{ghc_pkg_deps}, %(echo %{ghc_pkg_deps} | sed -e "s/\(ghc-[^, ]\+\)-devel/\1-doc,\1-prof/g")}
+%{?ghc_pkg_c_deps:BuildRequires:  %{ghc_pkg_c_deps}}
+
+%description
+%{common_description}
+%if %{with shared}
+This package provides the shared library.
+%endif
+
+
+%{?ghc_lib_package}
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%ghc_lib_build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%ghc_lib_install
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%changelog
+* Thu Sep  9 2010 Anders Kaseorg <andersk@mit.edu> - 0.0.0-0
+- initial packaging for Fedora automatically generated by cabal2spec-0.22.1
Index: branches/fc15-dev/server/fedora/specs/httpd.spec.patch
===================================================================
--- branches/fc15-dev/server/fedora/specs/httpd.spec.patch	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/httpd.spec.patch	(revision 1803)
@@ -0,0 +1,71 @@
+--- httpd.spec.orig	2010-10-27 08:26:15.000000000 -0400
++++ httpd.spec	2010-11-18 18:20:43.000000000 -0500
+@@ -7,7 +7,7 @@
+ Summary: Apache HTTP Server
+ Name: httpd
+ Version: 2.2.17
+-Release: 1%{?dist}.1
++Release: 1%{?dist}.1.scripts.%{scriptsversion}
+ URL: http://httpd.apache.org/
+ Source0: http://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2
+ Source1: index.html
+@@ -55,6 +55,14 @@
+ Conflicts: pcre < 4.0
+ Requires: httpd-tools = %{version}-%{release}, apr-util-ldap
+ 
++Provides: scripts-httpd
++Patch1000: httpd-suexec-scripts.patch
++Patch1003: httpd-2.2.x-mod_status-security.patch
++Patch1004: httpd-2.2.x-304.patch
++Patch1005: httpd-2.2.x-mod_ssl-sessioncaching.patch
++Patch1006: httpd-suexec-cloexec.patch
++Patch1007: httpd-fixup-vhost.patch
++
+ %description
+ The Apache HTTP Server is a powerful, efficient, and extensible
+ web server.
+@@ -65,6 +73,7 @@
+ Obsoletes: secureweb-devel, apache-devel, stronghold-apache-devel
+ Requires: apr-devel, apr-util-devel, pkgconfig
+ Requires: httpd = %{version}-%{release}
++Provides: scripts-httpd-devel
+ 
+ %description devel
+ The httpd-devel package contains the APXS binary and other files
+@@ -103,6 +112,7 @@
+ Requires(post): openssl >= 0.9.7f-4, /bin/cat
+ Requires(pre): httpd
+ Requires: httpd = 0:%{version}-%{release}, httpd-mmn = %{mmn}
++Provides: scripts-mod_ssl
+ Obsoletes: stronghold-mod_ssl
+ 
+ %description -n mod_ssl
+@@ -130,6 +140,13 @@
+ # Patch in vendor/release string
+ sed "s/@RELEASE@/%{vstring}/" < %{PATCH20} | patch -p1
+ 
++%patch1000 -p1 -b .scripts
++%patch1003 -p1 -b .permitstatus
++%patch1004 -p1 -b .scripts-304
++%patch1005 -p1 -b .ssl-sessioncache
++%patch1006 -p1 -b .cloexec
++%patch1007 -p1 -b .fixup-vhost
++
+ # Safety check: prevent build if defined MMN does not equal upstream MMN.
+ vmmn=`echo MODULE_MAGIC_NUMBER_MAJOR | cpp -include include/ap_mmn.h | sed -n '/^2/p'`
+ if test "x${vmmn}" != "x%{mmn}"; then
+@@ -177,10 +194,12 @@
+         --with-apr=%{_prefix} --with-apr-util=%{_prefix} \
+ 	--enable-suexec --with-suexec \
+ 	--with-suexec-caller=%{suexec_caller} \
+-	--with-suexec-docroot=%{contentdir} \
++	--with-suexec-docroot=/ \
++	--with-suexec-userdir=web_scripts \
++	--with-suexec-trusteddir=/usr/libexec/scripts-trusted \
+ 	--with-suexec-logfile=%{_localstatedir}/log/httpd/suexec.log \
+ 	--with-suexec-bin=%{_sbindir}/suexec \
+-	--with-suexec-uidmin=500 --with-suexec-gidmin=100 \
++	--with-suexec-uidmin=50 --with-suexec-gidmin=50 \
+         --enable-pie \
+         --with-pcre \
+ 	$*
Index: branches/fc15-dev/server/fedora/specs/httpdmods.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/httpdmods.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/httpdmods.spec	(revision 1803)
@@ -0,0 +1,57 @@
+Summary: scripts.mit.edu custom apache modules
+Group: Applications/System
+Name: httpdmods 
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+BuildRequires: scripts-httpd-devel >= 2.2.15-1.fc11.1.scripts.1606
+Requires: httpd%{?_isa}
+Requires: scripts-httpd >= 2.2.15-1.fc11.1.scripts.1606
+%define debug_package %{nil}
+
+%description 
+
+scripts.mit.edu custom apache modules
+Contains:
+ - module to do authentication based on SSL certificates <mod_auth_sslcert>
+ - module to do authorization based on Athena AFS groups <mod_authz_afsgroup>
+ - module to enable optional authentication <mod_auth_optional>
+ - module to get vhosts from LDAP, taken from Debian <mod_vhost_ldap>
+ - module to use the original destination address of a request that
+     has gone through something like a transparent proxy <mod_original_dst>
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure CFLAGS="-I/usr/include/httpd -I/usr/include/apr-1"
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+install -D .libs/mod_auth_sslcert.so $RPM_BUILD_ROOT/usr/lib64/httpd/modules/mod_auth_sslcert.so
+install -D .libs/mod_authz_afsgroup.so $RPM_BUILD_ROOT/usr/lib64/httpd/modules/mod_authz_afsgroup.so
+install -D .libs/mod_auth_optional.so $RPM_BUILD_ROOT/usr/lib64/httpd/modules/mod_auth_optional.so
+install -D .libs/mod_vhost_ldap.so $RPM_BUILD_ROOT/usr/lib64/httpd/modules/mod_vhost_ldap.so
+install -D .libs/mod_original_dst.so $RPM_BUILD_ROOT/usr/lib64/httpd/modules/mod_original_dst.so
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0755, root, root)
+/usr/lib64/httpd/modules/mod_auth_sslcert.so
+/usr/lib64/httpd/modules/mod_authz_afsgroup.so
+/usr/lib64/httpd/modules/mod_auth_optional.so
+/usr/lib64/httpd/modules/mod_vhost_ldap.so
+/usr/lib64/httpd/modules/mod_original_dst.so
+
+%changelog
+
+* Sun Jan 13 2006  Jeff Arnold <jbarnold@MIT.EDU> 0.00
+- initial prerelease version
Index: branches/fc15-dev/server/fedora/specs/krb5.spec.patch
===================================================================
--- branches/fc15-dev/server/fedora/specs/krb5.spec.patch	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/krb5.spec.patch	(revision 1803)
@@ -0,0 +1,36 @@
+--- krb5.spec.orig	2011-03-25 17:29:24.000000000 -0400
++++ krb5.spec	2011-03-25 17:31:15.000000000 -0400
+@@ -10,7 +10,7 @@
+ Summary: The Kerberos network authentication system
+ Name: krb5
+ Version: 1.7.1
+-Release: 18%{?dist}
++Release: 18%{?dist}.scripts.%{scriptsversion}
+ # Maybe we should explode from the now-available-to-everybody tarball instead?
+ # http://web.mit.edu/kerberos/dist/krb5/1.7/krb5-1.7.1-signed.tar
+ Source0: krb5-%{version}.tar.gz
+@@ -96,6 +96,8 @@
+ Patch107: http://web.mit.edu/kerberos/advisories/2011-002-patch.txt
+ Patch108: http://web.mit.edu/kerberos/advisories/2011-003-patch.txt
+ 
++Patch1000: krb5-kuserok-scripts.patch
++
+ License: MIT
+ URL: http://web.mit.edu/kerberos/www/
+ Group: System Environment/Libraries
+@@ -140,6 +142,7 @@
+ %package libs
+ Summary: The shared libraries used by Kerberos 5
+ Group: System Environment/Libraries
++Provides: scripts-krb5-libs, scripts-krb5-libs%{?_isa}
+ 
+ %description libs
+ Kerberos is a network authentication system. The krb5-libs package
+@@ -1684,6 +1687,7 @@
+ %patch106 -p1 -b .2011-001
+ %patch107 -p1 -b .2011-002
+ %patch108 -p1 -b .2011-003
++%patch1000 -p1 -b .kuserok
+ gzip doc/*.ps
+ 
+ sed -i -e '1s!\[twoside\]!!;s!%\(\\usepackage{hyperref}\)!\1!' doc/api/library.tex
Index: branches/fc15-dev/server/fedora/specs/logview.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/logview.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/logview.spec	(revision 1803)
@@ -0,0 +1,54 @@
+Summary: scripts.mit.edu logview program
+Group: Applications/System
+Name: logview
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+%define debug_package %{nil}
+
+%description 
+
+scripts.mit.edu logview program
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT prefix=/usr/local
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%pre
+useradd logview || [ $? -eq 9 ]
+
+%postun
+if [ "$1" = "0" ] ; then
+   userdel logview
+fi
+
+%files
+%defattr(0755, root, root)
+/usr/local/bin/logview.pl
+%defattr(4755, logview, root)
+/usr/local/bin/logview
+
+%changelog
+* Wed Dec 31 2008  Quentin Smith <quentin@mit.edu>
+- ignore preexisting user
+
+* Wed Dec 31 2008  Quentin Smith <quentin@mit.edu> - 0.917-0
+- don't delete logview user on upgrades
+
+* Tue Jan 30 2006  Jeff Arnold <jbarnold@MIT.EDU> 0.00
+- prerelease
Index: branches/fc15-dev/server/fedora/specs/moira.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/moira.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/moira.spec	(revision 1803)
@@ -0,0 +1,236 @@
+# Make sure to update these to coincide with the most recent debathena-moira
+# release from http://debathena.mit.edu/apt/pool/debathena/d/debathena-moira/
+%define upstreamversion 4.0.0
+%define snapshotversion svn20100405
+Summary: moira libraries, clients, and friends
+Group: Applications/System
+Name: moira
+Version: %{upstreamversion}
+Release: 6.%{scriptsversion}.%{snapshotversion}
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: MIT
+Source: debathena-%{name}_%{upstreamversion}+%{snapshotversion}.orig.tar.gz
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+#TODO: might really need mit-zephyr-devel, something for autotools-dev
+BuildRequires: readline-devel, e2fsprogs-devel, ncurses-devel, krb5-devel, hesiod-devel
+Patch1: moira-update-server.rc.patch
+Patch2: moira-fix-manpage-paths.patch
+
+%description
+The moira library and clients.  Clone of debathena-moira.
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n debathena-%{name}-%{upstreamversion}+%{snapshotversion}
+%patch1
+%patch2 -p1
+
+%build
+# Hack: Add /usr/include/et to put com_err.h on the C include path.
+# Can remove this once the maintainer of the relevant package symlinks
+# com_err.h in /usr/include.
+# (See https://bugzilla.redhat.com/show_bug.cgi?id=550889)
+# TODO: --with-zephyr is currently borked
+%configure --without-krb4 --with-krb5 --with-hesiod --without-zephyr --without-oracle --without-afs --disable-rpath --with-com_err=/usr CFLAGS='-I /usr/include/et'
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+make install DESTDIR=%{buildroot}
+mv %{buildroot}/%{_bindir}/chfn %{buildroot}/%{_bindir}/chfn.moira
+mv %{buildroot}/%{_bindir}/chsh %{buildroot}/%{_bindir}/chsh.moira
+mv %{buildroot}/%{_mandir}/man1/chsh.1 \
+   %{buildroot}/%{_mandir}/man1/chsh.moira.1
+mv %{buildroot}/%{_mandir}/man1/chfn.1 \
+   %{buildroot}/%{_mandir}/man1/chfn.moira.1
+install -m 755 -d %{buildroot}/%{_initddir}
+install -m 755 moira-update-server.init %{buildroot}/%{_initddir}/moira-update-server
+# Hack: These man files are installed but no package uses them
+rm %{buildroot}/%{_mandir}/man8/dcm.8
+rm %{buildroot}/%{_mandir}/man8/moirad.8
+rm %{buildroot}/%{_mandir}/man8/reg_svr.8
+rm %{buildroot}/%{_mandir}/man8/setquota.8
+rm %{buildroot}/%{_mandir}/man8/startdcm.8
+rm %{buildroot}/%{_mandir}/man8/startmoira.8
+rm %{buildroot}/%{_mandir}/man8/startreg.8
+
+%clean
+rm -rf %{buildroot}
+
+# clients
+%package clients
+Summary: Clients for the Moira database
+Group: Applications/System
+# Might need mit-zephyr-devel
+# Requires: mit-zephyr
+%description clients
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains clients such as moira, stella, blanche, etc.
+
+%files clients
+%defattr(755,root,root)
+%{_bindir}/addusr
+%{_bindir}/blanche
+%{_bindir}/chfn.moira
+%{_bindir}/chpobox
+%{_bindir}/chsh.moira
+%{_bindir}/eunice
+%{_bindir}/mitch
+%{_bindir}/namespace
+%{_bindir}/moira
+%{_bindir}/mrcheck
+%{_bindir}/mrtest
+%{_bindir}/stanley
+%{_bindir}/stella
+%{_bindir}/mailmaint
+%{_bindir}/listmaint
+%{_bindir}/dcmmaint
+%{_bindir}/usermaint
+%{_bindir}/update_test
+%defattr(-,root,root)
+%doc %{_mandir}/man1/*
+%doc %{_mandir}/man8/mrtest.8.gz
+
+
+# update-server
+%package update-server
+Summary: Athena update_server
+Group: Applications/System
+# Might need mit-zephyr-devel
+# Requires: mit-zephyr
+Requires(post): chkconfig
+Requires(preun): chkconfig
+%description update-server
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains the update_server daemon, which is used for
+servers that automatically receive information dumps from moira.
+
+%files update-server
+%defattr(-,root,root)
+%doc %{_mandir}/man8/update_server.8.gz
+%config(noreplace) %{_sysconfdir}/moira.conf
+%defattr(755,root,root)
+%{_sbindir}/update_server
+%{_initddir}/moira-update-server
+
+%post update-server
+/sbin/chkconfig --add moira-update-server
+%{_initddir}/moira-update-server condrestart
+
+%preun update-server
+if [ $1 = 0 ] ; then
+    /sbin/service moira-update-server stop >/dev/null 2>&1
+    /sbin/chkconfig --del moira-update-server
+fi
+
+# libmoira0
+%package -n libmoira0
+Summary: The Moira library
+Group: System Environment/Libraries
+%description -n libmoira0
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains the shared Moira library.
+
+%post -n libmoira0 -p /sbin/ldconfig
+%postun -n libmoira0 -p /sbin/ldconfig
+
+%files -n libmoira0
+%defattr(-,root,root)
+%{_libdir}/libmoira.so.*
+
+# libmoira-devel
+%package -n libmoira-devel
+Summary: Development files for Moira library
+Group: Development/Libraries
+# Might need mit-zephyr-devel
+# Requires: mit-zephyr
+Requires: libmoira0 = %{version}-%{release}, e2fsprogs-devel, krb5-devel, hesiod-devel
+%description -n libmoira-devel
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains headers and static libraries for development.
+
+%post -n libmoira-devel -p /sbin/ldconfig
+%postun -n libmoira-devel -p /sbin/ldconfig
+
+%files -n libmoira-devel
+%defattr(-,root,root)
+%{_includedir}/moira
+%exclude %{_includedir}/moira/mrclient.h
+%doc %{_mandir}/man3/*
+%{_libdir}/libmoira.so
+%{_libdir}/libmoira.la
+%{_libdir}/libmoira.a
+
+# libmrclient0
+%package -n libmrclient0
+Summary: The Moira client library
+Group: System Environment/Libraries
+%description -n libmrclient0
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains the shared Moira client library.
+
+%post -n libmrclient0 -p /sbin/ldconfig
+%postun -n libmrclient0 -p /sbin/ldconfig
+
+%files -n libmrclient0
+%defattr(-,root,root)
+%{_libdir}/libmrclient.so.*
+
+# libmrclient-devel
+%package -n libmrclient-devel
+Summary: Development files for Moira client library
+Group: Development/Libraries
+Requires: libmrclient0 = %{version}-%{release}, libmoira-devel = %{version}-%{release}
+%description -n libmrclient-devel
+Moira is the Athena Service Management system.  It serves as the 
+central repository for information about users, groups hosts, print 
+queues, and several other aspects of the Athena environment.
+
+This package contains headers and static libraries for development.
+
+%post -n libmrclient-devel -p /sbin/ldconfig
+%postun -n libmrclient-devel -p /sbin/ldconfig
+
+%files -n libmrclient-devel
+%defattr(-,root,root)
+%{_includedir}/moira/mrclient.h
+%{_libdir}/libmrclient.so
+%{_libdir}/libmrclient.la
+%{_libdir}/libmrclient.a
+
+%changelog
+* Thu Apr 08 2010 Mitchell Berger <mitchb@mit.edu> - 4.0.0-6.1534.svn20100405
+- Update to new original upstream version (svn snapshot)
+
+* Thu Feb 25 2010 Mitchell Berger <mitchb@mit.edu> - 4.0.0-5.1490.svn20100225
+- Update to new original upstream version (svn snapshot)
+
+* Thu Feb 25 2010 Mitchell Berger <mitchb@mit.edu> - 4.0.0-4.1489M.svn20100223
+- Update to new original upstream version (svn snapshot)
+- Drop install-headers patch which was incorporated upstream (from Debathena)
+
+* Tue Jan 05 2010 Mitchell Berger <mitchb@mit.edu> - 4.0.0-3.1405M.svn20100104
+- Update to new original upstream version (svn snapshot)
+- Build and install libmrclient as a shared library (from Debathena)
+
+* Mon Dec 28 2009 Mitchell Berger <mitchb@mit.edu> - 4.0.0-2.1402.cvs20091228
+- Update to new upstream version, including eunice printer client
+
+* Sat Dec 26 2009 Greg Brockman <gdb@mit.edu> - 4.0.0-2.1380.cvs20091116
+- Initial packaging of Moira on Fedora
Index: branches/fc15-dev/server/fedora/specs/nss_nonlocal.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/nss_nonlocal.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/nss_nonlocal.spec	(revision 1803)
@@ -0,0 +1,69 @@
+Summary: nsswitch proxy module to prevent local account spoofing
+Group: System Environment/Libraries
+Name: nss_nonlocal
+Version: 1.11
+Release: 1
+URL: http://debathena.mit.edu/nss_nonlocal/
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: libtool
+License: LGPLv2+
+Source: %{name}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+%description
+This nsswitch module acts as a proxy for other nsswitch modules like hesiod,
+but prevents non-local users from potentially gaining local privileges by
+spoofing local UIDs and GIDs.
+
+%prep
+%setup -q -n %{name}
+
+cat >find_requires.sh <<EOF
+#!/bin/sh
+%{__find_requires} | grep -v GLIBC_PRIVATE
+exit 0
+EOF
+chmod +x find_requires.sh
+%define _use_internal_dependency_generator 0
+%define __find_requires %{_builddir}/%{buildsubdir}/find_requires.sh
+
+%build
+autoreconf -i
+%configure --libdir=/%{_lib}
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+%doc README
+/%{_lib}/libnss_nonlocal.so.*
+
+%pre
+groupadd -r nss-local-users || :
+groupadd -r nss-nonlocal-users || :
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
+
+%changelog
+
+* Sun May  2 2010 Anders Kaseorg <andersk@mit.edu> 1.11-1
+- New upstream version.
+
+* Fri Mar 12 2010 Mitchell Berger <mitchb@mit.edu> 1.9-1
+- Per Fedora packaging guidelines, don't ever remove groups.
+- Rebuild to ensure that the nss-nonlocal-users group is added, even if it was
+  previously rejected by a buggy groupadd with an incorrect name length limit.
+
+* Thu May  8 2008 Anders Kaseorg <andersk@mit.edu> 1.6-0
+- Initial RPM release.
Index: branches/fc15-dev/server/fedora/specs/openafs.spec.patch
===================================================================
--- branches/fc15-dev/server/fedora/specs/openafs.spec.patch	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/openafs.spec.patch	(revision 1803)
@@ -0,0 +1,89 @@
+--- openafs.spec.orig	2010-09-10 18:21:53.000000000 -0400
++++ openafs.spec	2010-09-10 18:34:30.000000000 -0400
+@@ -8,7 +8,7 @@
+ # for beta/rc releases make pkgrel 0.X.<tag>
+ # for real releases make pkgrel 1 (or more for extra releases)
+ #%define pkgrel 0.1.rc1
+-%define pkgrel 0.pre3
++%define pkgrel 0.pre3.99scripts.%{scriptsversion}
+ 
+ %if %{?osvers:0}%{!?osvers:1}
+ %define osvers 1
+@@ -261,6 +261,10 @@
+ %endif
+ ExclusiveArch: %{ix86} x86_64 ia64 s390 s390x sparc64 ppc ppc64
+ 
++Patch1000: openafs-scripts.patch
++Patch1003: openafs-localcsdb.patch
++Patch1005: openafs-numsysnames.patch
++
+ #    http://dl.openafs.org/dl/openafs/candidate/%{afsvers}/...
+ Source0: http://www.openafs.org/dl/openafs/%{afsvers}/openafs-%{afsvers}-src.tar.bz2
+ Source1: http://www.openafs.org/dl/openafs/%{afsvers}/openafs-%{afsvers}-doc.tar.bz2
+@@ -343,6 +347,7 @@
+ %if %{build_userspace}
+ 
+ %package client
++Provides: scripts-openafs-client
+ Requires: binutils, openafs = %{version}
+ 
+ %if %{fedorakmod}
+@@ -403,6 +408,7 @@
+ 
+ %if %{build_authlibs}
+ %package authlibs
++Provides: scripts-openafs-authlibs
+ Summary: OpenAFS authentication shared libraries
+ Group: Networking/Filesystems
+ 
+@@ -419,6 +425,7 @@
+ %endif
+ 
+ %package authlibs-devel
++Provides: scripts-openafs-authlibs-devel
+ %if %{build_authlibs}
+ Requires: openafs-authlibs = %{version}
+ %endif
+@@ -437,6 +444,7 @@
+ libraries.
+ 
+ %package devel
++Provides: scripts-openafs-devel
+ Summary: OpenAFS Development Libraries and Headers
+ Group: Development/Filesystems
+ 
+@@ -465,6 +473,7 @@
+ administrators.
+ 
+ %package kernel-source
++Provides: scripts-openafs-kernel-source
+ Summary: OpenAFS Kernel Module source tree
+ Group: Networking/Filesystems
+ Provides: openafs-kernel = %{version}
+@@ -514,6 +523,7 @@
+ 
+ %if %{krb5support}
+ %package krb5
++Provides: scripts-openafs-krb5
+ Summary: OpenAFS programs to use with krb5
+ Requires: openafs = %{version}
+ Group: Networking/Filesystems
+@@ -540,7 +550,7 @@
+ %if %{build_modules}
+ 
+ %if %{fedorakmod}
+-%{expand:%(%{kmodtool} rpmtemplate %{kmod_name} %{kverrel} %{kvariants} 2>/dev/null)}
++%{expand:%(%{kmodtool} rpmtemplate %{kmod_name} %{kverrel} %{kvariants} | sed '/^%package/ aProvides: scripts-kmod-openafs' 2>/dev/null)}
+ 
+ %else
+ 
+@@ -699,6 +709,9 @@
+ 
+ # Patch openafs to build a kernel module named "openafs" instead of "libafs"
+ %patch0 -p1 -b .kmod26
++%patch1000 -p1 -b .scripts
++%patch1003 -p1 -b .localcsdb
++%patch1005 -p1 -b .numsysnames
+ 
+ ##############################################################################
+ #
Index: branches/fc15-dev/server/fedora/specs/openssh.spec.patch
===================================================================
--- branches/fc15-dev/server/fedora/specs/openssh.spec.patch	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/openssh.spec.patch	(revision 1803)
@@ -0,0 +1,38 @@
+--- openssh.spec.orig	2010-05-31 06:20:02.000000000 -0400
++++ openssh.spec	2010-09-06 21:53:21.000000000 -0400
+@@ -74,7 +74,7 @@
+ Summary: An open source implementation of SSH protocol versions 1 and 2
+ Name: openssh
+ Version: 5.4p1
+-Release: %{openssh_rel}%{?dist}%{?rescue_rel}
++Release: %{openssh_rel}%{?dist}%{?rescue_rel}.scripts.%{scriptsversion}
+ URL: http://www.openssh.com/portable.html
+ #URL1: http://pamsshagentauth.sourceforge.net
+ #Source0: ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz
+@@ -88,6 +88,8 @@
+ Source3: sshd.init
+ Source4: http://prdownloads.sourceforge.net/pamsshagentauth/pam_ssh_agent_auth/pam_ssh_agent_auth-%{pam_ssh_agent_ver}.tar.bz2
+ Source5: pam_ssh_agent-rmheaders
++Patch1001: openssh-4.7p1-gssapi-name-in-env.patch
++Patch1002: openssh-no-spurious-correct-key-incorrect-host-messages.patch
+ Patch0: openssh-5.4p1-redhat.patch
+ Patch2: openssh-5.3p1-skip-initial.patch
+ Patch4: openssh-5.2p1-vendor.patch
+@@ -175,6 +178,7 @@
+ Requires(post): chkconfig >= 0.9, /sbin/service
+ Requires(pre): /usr/sbin/useradd
+ Requires: pam >= 1.0.1-3
++Provides: scripts-openssh-server
+ 
+ %package askpass
+ Summary: A passphrase dialog for OpenSSH and X
+@@ -267,6 +271,9 @@
+ %patch75 -p1 -b .dso
+ %patch76 -p1 -b .bz595935
+ 
++%patch1001 -p1 -b .gssapi-env
++%patch1002 -p1 -b .no-spurious-correct-key-incorrect-host-messages
++
+ autoreconf
+ 
+ %build
Index: branches/fc15-dev/server/fedora/specs/php_scripts.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/php_scripts.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/php_scripts.spec	(revision 1803)
@@ -0,0 +1,41 @@
+Summary: scripts.mit.edu php logging module
+Group: Applications/System
+Name: php_scripts
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+BuildRequires: php-devel
+%define debug_package %{nil}
+
+%description 
+
+scripts.mit.edu php logging module
+
+%prep
+%setup -q -n %{name}
+
+%build
+cp php_scripts-config.m4 config.m4
+phpize
+./configure
+make
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+install -D .libs/scripts.so $RPM_BUILD_ROOT/usr/lib64/php/modules/scripts.so
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0755, root, root)
+/usr/lib64/php/modules/scripts.so
+
+%changelog
+
+* Fri Jul 03 2009  Mitchell Berger <mitchb@MIT.EDU> 0.00
+- initial version
Index: branches/fc15-dev/server/fedora/specs/python-routefs.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/python-routefs.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/python-routefs.spec	(revision 1803)
@@ -0,0 +1,55 @@
+%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+Name:		python-routefs
+Version:	0.0.1
+Release:	1%{?dist}
+Summary:	A FUSE API wrapper based on URL routing
+
+Group:		Development/Languages
+License:	MIT
+URL:		http://ebroder.net/code/python-routefs.git
+Source0:	python-routefs.tar.gz
+BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires:	python-devel
+BuildRequires:	python-routes >= 1.7
+BuildRequires:	fuse-python >= 0.2
+Requires:	python-routes >= 1.7
+Requires:	fuse-python >= 0.2
+
+%description
+
+RouteFS is a base class for developing read-only FUSE filesystems that
+lets you focus on the directory tree instead of the system calls.
+
+RouteFS uses the Routes library developed for Pylons. URLs were
+inspired by filesystems, and now you can have filesystems inspired by
+URLs.
+
+
+%prep
+%setup -q -n %{name}
+
+
+%build
+%{__python} setup.py build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT
+
+ 
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root,-)
+%doc
+%{python_sitelib}/*
+
+
+%changelog
+* Sun Sep 14 2008 Anders Kaseorg <andersk@mit.edu> - 0.0.1
+- Initial RPM release.
Index: branches/fc15-dev/server/fedora/specs/python-zephyr.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/python-zephyr.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/python-zephyr.spec	(revision 1803)
@@ -0,0 +1,50 @@
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
+
+Name:           python-zephyr
+Version:        0.2.0
+%define commit_hash c9a7f05
+%define tag_hash ed65206
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        Python access to zephyr library
+
+Group:          Development/Languages
+License:        MIT
+URL:            http://github.com/ebroder/python-zephyr
+Source0:        http://github.com/ebroder/python-zephyr/tarball/%{version}/ebroder-%{name}-%{version}-0-g%{commit_hash}.tar.gz
+Patch1:         http://github.com/ebroder/python-zephyr/commit/944b3c3a2a2476758268d4b75b65c2ec38fa46e7.patch
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires:  python-devel, python-setuptools, Pyrex, zephyr-devel, libcom_err-devel
+
+%description
+Get at the zephyr library from Python.  Woo.
+
+
+%prep
+%setup -q -n ebroder-%{name}-%{tag_hash}
+%patch1 -p1
+
+
+%build
+CFLAGS="$RPM_OPT_FLAGS" CPPFLAGS="-I%{_includedir}/et" %{__python} setup.py build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT
+
+ 
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root,-)
+%doc
+%{python_sitearch}/*
+
+
+%changelog
+* Sun Sep 19 2010 Anders Kaseorg <andersk@mit.edu> - 0.2.0-0
+- Initial RPM release
+
Index: branches/fc15-dev/server/fedora/specs/scripts-base.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/scripts-base.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/scripts-base.spec	(revision 1803)
@@ -0,0 +1,56 @@
+Summary: scripts.mit.edu base packages
+Group: Applications/System
+Name: scripts-base
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+%define all_archs() %1%{?_isa}, %{?__isa_name: %1(%{__isa_name}-32)}
+Requires: accountadm
+Requires: execsys
+Requires: scripts-kmod-openafs
+Requires: %{all_archs scripts-krb5-libs}
+Requires: scripts-httpd
+Requires: scripts-mod_ssl
+Requires: scripts-openafs-client
+Requires: scripts-openafs-authlibs
+Requires: scripts-openafs-devel
+Requires: scripts-openafs-krb5
+Requires: scripts-openssh-server
+Requires: sql-signup
+Requires: tokensys
+Requires: whoisd
+Requires: logview
+Requires: %{all_archs nss-pam-ldapd}
+Requires: php_scripts
+Requires: zephyr
+Requires: %{all_archs zephyr-libs}
+Requires: httpdmods
+Requires: %{all_archs nss_nonlocal}
+Requires: scripts-389-ds
+%define debug_package %{nil}
+
+%description 
+
+scripts.mit.edu base package
+Contains:
+ - Dependencies to install rpms required for base scripts functionality
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+
+%build
+
+%install
+
+%clean
+
+%files
+
+%changelog
+* Thu Jan  1 2009  Quentin Smith <quentin@mit.edu>
+- prerelease
Index: branches/fc15-dev/server/fedora/specs/scripts-python-path.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/scripts-python-path.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/scripts-python-path.spec	(revision 1803)
@@ -0,0 +1,37 @@
+Summary: scripts.mit.edu python path configuration
+Group: Development/Languages
+Name: scripts-python-path
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz 
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+
+%description 
+
+scripts.mit.edu python path configuration
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT%{python_sitelib}
+install -m 644 00scripts-home.pth $RPM_BUILD_ROOT%{python_sitelib}
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0644, root, root)
+%{python_sitelib}/00scripts-home.pth
+
+%changelog
+* Thu Jul  9 2009  Geoffrey Thomas <geofft@mit.edu>
+- Update to Python 2.6
+* Tue Jan 27 2009  Quentin Smith <quentin@mit.edu>
+- initial release
Index: branches/fc15-dev/server/fedora/specs/scripts-static-cat.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/scripts-static-cat.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/scripts-static-cat.spec	(revision 1803)
@@ -0,0 +1,52 @@
+# link with shared libs
+# andersk: Disabled for 3x faster startup speed.
+#%%bcond_without dynamic
+
+# ghc does not emit debug information
+%global debug_package %{nil}
+
+Name:           scripts-static-cat
+Version:        0.0
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        static-cat for scripts.mit.edu
+
+Group:          Applications/System
+License:        GPL
+URL:            http://scripts.mit.edu/
+Source0:        %{name}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# fedora ghc archs:
+ExclusiveArch:  %{ix86} x86_64 ppc alpha
+BuildRequires:  ghc
+BuildRequires:  ghc-rpm-macros >= 0.7.0
+BuildRequires:  ghc-cgi-devel >= 3001.1.8, ghc-MonadCatchIO-mtl-devel, ghc-unix-handle-devel
+
+%description
+static-cat is a binary for serving static content on scripts.mit.edu.
+
+
+%prep
+%setup -q -n %{name}
+
+
+%build
+%ghc_bin_build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%ghc_bin_install
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root,-)
+%attr(755,root,root) %{_bindir}/static-cat
+
+
+%changelog
+* Thu Sep  9 2010 Anders Kaseorg <andersk@mit.edu> - 0.0-0
+- initial packaging for Fedora automatically generated by cabal2spec-0.22.1
Index: branches/fc15-dev/server/fedora/specs/scripts-wizard.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/scripts-wizard.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/scripts-wizard.spec	(revision 1803)
@@ -0,0 +1,37 @@
+Name:           scripts-wizard
+Version:        0
+Release:        1.%{scriptsversion}%{?dist}
+Summary:        Symlink for the scripts.mit.edu wizard autoinstaller system
+
+Group:          Development/Tools
+License:        MIT
+URL:            http://scripts.mit.edu
+Source0:        %{name}.tar.gz
+
+%define debug_package %{nil}
+
+%description
+
+Symlink for the scripts.mit.edu wizard autoinstaller system
+
+%prep
+%setup -q -n %{name}
+
+%build
+
+%install
+rm -rf %{buildroot}
+mkdir -p %{buildroot}/usr/local/bin
+ln -s /afs/athena.mit.edu/contrib/scripts/wizard/bin/wizard %{buildroot}/usr/local/bin/wizard
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+/usr/local/bin/wizard
+
+%changelog
+* Thu Mar 04 2010 Mitchell Berger <mitchb@mit.edu> - 0-1.1503
+- Initial release
+
Index: branches/fc15-dev/server/fedora/specs/sql-signup.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/sql-signup.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/sql-signup.spec	(revision 1803)
@@ -0,0 +1,44 @@
+Summary:        Signup interface to <sql.mit.edu> for <scripts.mit.edu>.
+Group:			Applications/System
+Name:           sql-signup
+Version:        0.%{scriptsversion}
+Release:        0
+Vendor:			The scripts.mit.edu Team (scripts@mit.edu)
+URL:			http://scripts.mit.edu
+License:        GPL
+Source0:        %{name}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+%define debug_package %{nil}
+
+BuildRequires:  make
+Requires:       pam, usermode
+
+%description
+
+
+%prep
+%setup -q -n %{name}
+
+%build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT prefix=/usr/local
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,-)
+%defattr(755,root,root,-)
+%{_bindir}/sql-signup
+%{_sbindir}/sql-signup
+%defattr(644,root,root,-)
+%config /etc/pam.d/sql-signup
+%config /etc/security/console.apps/sql-signup
+
+%changelog
+
+* Fri Jan 26 2007 Joe Presbrey <presbrey@mit.edu> 0.00
+- prerelease
Index: branches/fc15-dev/server/fedora/specs/tokensys.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/tokensys.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/tokensys.spec	(revision 1803)
@@ -0,0 +1,63 @@
+Summary: scripts.mit.edu AFS administration system
+Group: Applications/System
+Name: tokensys
+Version: 0.%{scriptsversion}
+Release: 0
+Vendor: The scripts.mit.edu Team (scripts@mit.edu)
+URL: http://scripts.mit.edu
+License: GPL
+Source: %{name}.tar.gz
+BuildRoot: %{_tmppath}/%(%{__id_u} -n)-%{name}-%{version}-root
+%define debug_package %{nil}
+Prereq: /usr/kerberos/bin/kinit, /usr/bin/aklog
+
+%description
+
+scripts.mit.edu AFS administration system
+Contains:
+ - A shell script for renewing the scripts AFS credentials <renew>
+ - A crontab for calling the renew script <crontab>
+See http://scripts.mit.edu/wiki for more information.
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure --with-kinit=/usr/kerberos/bin/kinit --with-aklog=/usr/bin/aklog
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+install -D renew $RPM_BUILD_ROOT/home/afsagent/renew
+install -D crontab $RPM_BUILD_ROOT/etc/cron.d/afsagent
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0600, root, root)
+/etc/cron.d/afsagent
+%defattr(0755, afsagent, afsagent)
+/home/afsagent/renew
+
+%pre
+groupadd -g 101 afsagent || [ $? -eq 9 ]
+useradd -u 101 -g 101 afsagent || [ $? -eq 9 ]
+
+%postun
+if [ "$1" = "0" ] ; then
+   userdel -r afsagent
+fi
+
+%changelog
+* Tue Aug 17 2010  Geoffrey Thomas <geofft@mit.edu>
+- aklog csail as well
+
+* Wed Dec 31 2008  Quentin Smith <quentin@mit.edu>
+- only remove afsagent user on erase
+- ignore preexisting user
+
+* Wed Apr 11 2007  Joe Presbrey <presbrey@mit.edu>
+- crontab moved system-wide (/etc/cron.d) to isolate from fail-over cron service
+
+* Sat Sep 30 2006  Jeff Arnold <jbarnold@MIT.EDU> 0.00
+- initial prerelease version
Index: branches/fc15-dev/server/fedora/specs/whoisd.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/whoisd.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/whoisd.spec	(revision 1803)
@@ -0,0 +1,41 @@
+Summary:        whoisd for <scripts.mit.edu> (virtualhost aware)
+Group:			Applications/System
+Name:           whoisd
+Version:        0.%{scriptsversion}
+Release:        0
+Vendor:			The scripts.mit.edu Team (scripts@mit.edu)
+URL:			http://scripts.mit.edu
+License:        GPL
+Source0:        %{name}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+%define debug_package %{nil}
+
+#BuildRequires:  make
+Requires:       python-twisted-core
+
+%description
+
+
+%prep
+%setup -q -n %{name}
+
+%build
+./configure
+
+%install
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT exec_prefix=/usr/local
+
+%clean
+[ $RPM_BUILD_ROOT != / ] && rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(0644,root,root,-)
+/usr/local/libexec/whoisd.tac
+%defattr(0600,root,root)
+/etc/cron.d/whoisd
+
+%changelog
+
+* Tue Jun 03 2008 Joe Presbrey <presbrey@mit.edu> 0.00
+- prerelease
Index: branches/fc15-dev/server/fedora/specs/zephyr.spec
===================================================================
--- branches/fc15-dev/server/fedora/specs/zephyr.spec	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/zephyr.spec	(revision 1803)
@@ -0,0 +1,147 @@
+Name:           zephyr
+Version:        3.0
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        Client programs for the Zephyr real-time messaging system
+
+Group:          Applications/Communications
+License:        MIT
+URL:            http://zephyr.1ts.org/
+Source0:        http://zephyr.1ts.org/export/HEAD/distribution/%{name}-%{version}.tar.gz
+Source1:        zhm.init
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires:  krb5-devel hesiod-devel libss-devel libcom_err-devel readline-devel bison
+Requires:       %{name}-libs = %{version}-%{release}
+Requires(post): chkconfig
+Requires(preun): chkconfig
+Requires(preun): initscripts
+Requires(postun): initscripts
+
+%description
+Zephyr is an institutional/enterprise-scale distributed real-time messaging and
+notification system.  Zephyr's design choices seem to imbue it with a specific
+culture.  It is impossible to explain what Zephyr is, you must experience it
+for yourself.
+
+
+%package        server
+Summary:        Server for the Zephyr real-time messaging system
+Group:          System Environment/Daemons
+
+Requires:       %{name}-libs = %{version}-%{release}
+
+%description    server
+The %{name}-server package contains the server daemon for the Zephyr
+messaging service.  It maintains a location and subscription database
+for all the receiving clients, and routes all zephyrgrams to the
+intended recipients.
+
+
+%package        libs
+Summary:        Shared libraries for Zephyr real-time messaging system
+Group:          System Environment/Libraries
+
+%description    libs
+The %{name}-libs package contains shared libraries for applications
+that use %{name}.
+
+
+%package        devel
+Summary:        Development files for Zephyr real-time messaging system
+Group:          Development/Libraries
+
+Requires:       %{name}-libs = %{version}-%{release}, libcom_err-devel
+
+%description    devel
+The %{name}-devel package contains libraries and header files for
+developing applications that use %{name}.
+
+
+%prep
+%setup -q
+cp -p %{SOURCE1} .
+
+
+%build
+# Mitch wants to make an awesome specfile which makes hesiod/krb5 and friends
+# all fully configurable.  This configure line will have to do for now.
+%configure --with-hesiod --with-krb5 --disable-static
+sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
+sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
+make %{?_smp_mflags}
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT libdir=%{_libdir}
+find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
+
+mkdir -p $RPM_BUILD_ROOT%{_initddir}
+install -m755 zhm.init \
+        $RPM_BUILD_ROOT%{_initddir}/zhm
+
+
+%post
+/sbin/chkconfig --add zhm
+
+
+%preun
+if [ $1 = 0 ] ; then
+    /sbin/service zhm stop >/dev/null 2>&1
+    /sbin/chkconfig --del zhm
+fi
+
+
+%postun
+if [ "$1" -ge "1" ] ; then
+    /sbin/service zhm condrestart >/dev/null 2>&1 || :
+fi
+
+
+%post           libs -p /sbin/ldconfig
+
+%postun         libs -p /sbin/ldconfig
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root,-)
+%doc README USING
+%{_bindir}/*
+%{_sbindir}/zhm
+%{_sbindir}/zshutdown_notify
+%{_mandir}/man1/*
+%{_mandir}/man8/zhm.8*
+%{_mandir}/man8/zstat.8*
+%{_mandir}/man8/zshutdown_notify.8*
+%{_datadir}/zephyr
+%{_initddir}/zhm
+
+
+%files          server
+%doc OPERATING
+%{_sysconfdir}/zephyr
+%{_sbindir}/zephyrd
+%{_mandir}/man8/zephyrd.8*
+
+
+%files          libs
+%{_libdir}/*.so.*
+
+
+%files          devel
+%{_libdir}/*.so
+%{_includedir}/*
+
+
+%changelog
+* Sun Sep 19 2010 Anders Kaseorg <andersk@mit.edu> - 3.0-0
+- Decrease version below a hypothetical Fedora package.
+- Split out -server, -libs, and -devel into subpackages.
+- Disable the static library and remove the libtool archive.
+
+* Thu Sep 09 2010 Edward Z. Yang <ezyang@mit.edu> 3.0-1
+- Initial packaging release, superseding mit-zephyr.
Index: branches/fc15-dev/server/fedora/specs/zhm.init
===================================================================
--- branches/fc15-dev/server/fedora/specs/zhm.init	(revision 1803)
+++ branches/fc15-dev/server/fedora/specs/zhm.init	(revision 1803)
@@ -0,0 +1,107 @@
+#!/bin/sh
+#
+# zhm          Startup script for Zephyr Host Manager
+#
+# chkconfig:   - 20 80
+# description: The Zephyr Host Manager coordinates all incoming
+#              and outgoing messages for a given host.  If it
+#              is not running, you will not be able to send or
+#              receive Zephyr messages.
+
+# XXX needs configuration file support
+
+# XXX this needs to be audited
+### BEGIN INIT INFO
+# Provides: zhm
+# Required-Start: $local_fs $remote_fs $network $named
+# Required-Stop: $local_fs $remote_fs $network
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: start and stop Zephyr Host Manager
+# Description: The Zephyr Host Manager coordinates all incoming
+#              and outgoing messages for a given host.
+### END INIT INFO
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+exec="/usr/sbin/zhm"
+prog="zhm"
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+lockfile=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    echo -n $"Starting $prog: "
+    daemon $exec
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && touch $lockfile
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    killproc $prog
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && rm -f $lockfile
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+force_reload() {
+    restart
+}
+
+rh_status() {
+    # run checks to determine if the service is running or use generic status
+    status $prog
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
+}
+
+
+case "$1" in
+    start)
+        rh_status_q && exit 0
+        $1
+        ;;
+    stop)
+        rh_status_q || exit 0
+        $1
+        ;;
+    restart)
+        $1
+        ;;
+    reload)
+        rh_status_q || exit 7
+        $1
+        ;;
+    force-reload)
+        force_reload
+        ;;
+    status)
+        rh_status
+        ;;
+    condrestart|try-restart)
+        rh_status_q || exit 0
+        restart
+        ;;
+    *)
+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+        exit 2
+esac
+exit $?
Index: branches/fc15-dev/server/fedora/support/deploy.py
===================================================================
--- branches/fc15-dev/server/fedora/support/deploy.py	(revision 1803)
+++ branches/fc15-dev/server/fedora/support/deploy.py	(revision 1803)
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+"""scripts.mit.edu deployment sychronization support
+Copyright (C) 2006, Joe Presbrey <presbrey@mit.edu>
+"""
+
+import sys,os,os.path as path
+import string
+import getopt
+
+class Usage(Exception):
+	def __init__(self, msg):
+		self.msg = msg
+
+def main(argv=None):
+	if argv is None:
+		argv = sys.argv
+	try:
+		try:
+			opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
+		except getopt.error, msg:
+			raise Usage(msg)
+	except Usage, err:
+		print >>sys.stderr, err.msg
+		print >>sys.stderr, "for help use --help"
+		return 2
+
+	for o, a in opts:
+		if o in ("-h", "--help"):
+			print __doc__
+			return 0
+
+if __name__ == "__main__":
+	sys.exit(main())
Index: branches/fc15-dev/server/fedora/support/setup.sh
===================================================================
--- branches/fc15-dev/server/fedora/support/setup.sh	(revision 1803)
+++ branches/fc15-dev/server/fedora/support/setup.sh	(revision 1803)
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+yum -y install nagios-plugins nagios-plugins-disk nagios-plugins-users nagios-plugins-procs nagios-plugins-load net-snmp
+rpm -Uvh http://scripts.mit.edu/src/RPMS/x86_64/nagios-nrpe-2.5.1-1.rf.x86_64.rpm
