Index: /trunk/server/common/oursrc/scripts-static-cat/Setup.hs
===================================================================
--- /trunk/server/common/oursrc/scripts-static-cat/Setup.hs	(revision 1590)
+++ /trunk/server/common/oursrc/scripts-static-cat/Setup.hs	(revision 1590)
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
Index: /trunk/server/common/oursrc/scripts-static-cat/StaticCat.hs
===================================================================
--- /trunk/server/common/oursrc/scripts-static-cat/StaticCat.hs	(revision 1590)
+++ /trunk/server/common/oursrc/scripts-static-cat/StaticCat.hs	(revision 1590)
@@ -0,0 +1,192 @@
+{-# 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"),
+         (".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"),
+         (".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)
+      _ -> throw BadRange
+
+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: /trunk/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal
===================================================================
--- /trunk/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal	(revision 1590)
+++ /trunk/server/common/oursrc/scripts-static-cat/scripts-static-cat.cabal	(revision 1590)
@@ -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: /trunk/server/common/patches/httpd-suexec-scripts.patch
===================================================================
--- /trunk/server/common/patches/httpd-suexec-scripts.patch	(revision 1589)
+++ /trunk/server/common/patches/httpd-suexec-scripts.patch	(revision 1590)
@@ -51,5 +51,5 @@
   */
  
-+#define STATIC_CAT_PATH "/usr/local/bin/static-cat"
++#define STATIC_CAT_PATH "/usr/bin/static-cat"
 +#define PHP_PATH "/usr/bin/php-cgi"
 +
@@ -275,12 +275,15 @@
          exit(121);
      }
-@@ -614,6 +730,20 @@
+@@ -614,6 +730,23 @@
      /*
       * Execute the command, replacing our image with its own.
       */
 +    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]);
++        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);
 +    }
Index: /trunk/server/fedora/Makefile
===================================================================
--- /trunk/server/fedora/Makefile	(revision 1589)
+++ /trunk/server/fedora/Makefile	(revision 1590)
@@ -20,6 +20,8 @@
 
 upstream_yum	= krb5 krb5.i586 httpd openssh shadow-utils libpng ghostscript
-upstream	= openafs $(upstream_yum) moira cluster-glue heartbeat pacemaker
-oursrc		= execsys tokensys accountadm httpdmods logview sql-signup nss_nonlocal nss_nonlocal.i586 whoisd mit-zephyr athrun php_scripts scripts-wizard scripts-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
+oursrc		= execsys tokensys accountadm httpdmods logview sql-signup nss_nonlocal nss_nonlocal.i586 whoisd mit-zephyr athrun php_scripts scripts-wizard scripts-base scripts-static-cat
 allsrc		= $(upstream) $(oursrc)
 oursrcdir	= ${PWD}/../common/oursrc
@@ -73,4 +75,7 @@
 	wget -P $(dload) $(pacemaker_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)
 	touch download_stamp
 
@@ -203,6 +208,7 @@
 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) $(mit-zephyr-deps) $(openssh-deps) $(php-deps)
+	yum -y install $(basic-deps) $(oursrc-deps) $(httpdmods-deps) $(httpd-deps) $(krb5-deps) $(openafs-deps) $(mit-zephyr-deps) $(openssh-deps) $(php-deps) $(haskell-deps)
 	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
Index: /trunk/server/fedora/specs/ghc-MonadCatchIO-mtl.spec
===================================================================
--- /trunk/server/fedora/specs/ghc-MonadCatchIO-mtl.spec	(revision 1590)
+++ /trunk/server/fedora/specs/ghc-MonadCatchIO-mtl.spec	(revision 1590)
@@ -0,0 +1,139 @@
+%global pkg_name MonadCatchIO-mtl
+
+%bcond_without doc
+%bcond_without prof
+
+# ghc does not emit debug information
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        0.3.0.1
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        Haskell %{pkg_name} library
+
+Group:          Development/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-rpm-macros
+%if %{with doc}
+BuildRequires:  ghc-doc
+%endif
+%if %{with prof}
+BuildRequires:  ghc-prof
+%endif
+
+%description
+This package provides the Haskell %{pkg_name} library for ghc.
+
+
+%package devel
+Summary:        Haskell %{pkg_name} library
+Group:          Development/Libraries
+Requires:       ghc = %{ghc_version}
+Requires(post): ghc = %{ghc_version}
+Requires(preun): ghc = %{ghc_version}
+
+%description devel
+This package contains the development files for %{name}
+built for ghc-%{ghc_version}.
+
+
+%if %{with doc}
+%package doc
+Summary:        Documentation for %{name}
+Group:          Development/Libraries
+Requires:       ghc-doc = %{ghc_version}
+Requires(post): ghc-doc = %{ghc_version}
+Requires(postun): ghc-doc = %{ghc_version}
+
+%description doc
+This package contains development documentation files for
+the %{name} library.
+%endif
+
+
+%if %{with prof}
+%package prof
+Summary:        Profiling libraries for %{name}
+Group:          Development/Libraries
+Requires:       %{name}-devel = %{version}-%{release}
+Requires:       ghc-prof = %{ghc_version}
+
+%description prof
+This package contains profiling libraries for %{name}
+built for ghc-%{ghc_version}.
+%endif
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%cabal_configure --ghc %{?with_prof:-p}
+%cabal build
+%if %{with doc}
+%cabal haddock
+%endif
+%ghc_gen_scripts
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%cabal_install
+%ghc_install_scripts
+%ghc_gen_filelists %{name}
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%post devel
+%ghc_register_pkg
+
+
+%if %{with doc}
+%post doc
+%ghc_reindex_haddock
+%endif
+
+
+%preun devel
+if [ "$1" -eq 0 ] ; then
+  %ghc_unregister_pkg
+fi
+
+
+%if %{with doc}
+%postun doc
+if [ "$1" -eq 0 ] ; then
+  %ghc_reindex_haddock
+fi
+%endif
+
+
+%files devel -f %{name}-devel.files
+%defattr(-,root,root,-)
+#%{_docdir}/%{name}-%{version}
+
+
+%if %{with doc}
+%files doc -f %{name}-doc.files
+%defattr(-,root,root,-)
+%endif
+
+
+%if %{with prof}
+%files prof -f %{name}-prof.files
+%defattr(-,root,root,-)
+%endif
+
+
+%changelog
+* Mon Mar 15 2010 Anders Kaseorg <andersk@mit.edu> - 0.3.0.1-0
+- initial packaging for Fedora automatically generated by cabal2spec
Index: /trunk/server/fedora/specs/ghc-cgi.spec
===================================================================
--- /trunk/server/fedora/specs/ghc-cgi.spec	(revision 1590)
+++ /trunk/server/fedora/specs/ghc-cgi.spec	(revision 1590)
@@ -0,0 +1,139 @@
+%global pkg_name cgi
+
+%bcond_without doc
+%bcond_without prof
+
+# ghc does not emit debug information
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        3001.1.8.1
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        Haskell %{pkg_name} library
+
+Group:          Development/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-rpm-macros, ghc-MonadCatchIO-mtl-devel
+%if %{with doc}
+BuildRequires:  ghc-doc, ghc-MonadCatchIO-mtl-doc
+%endif
+%if %{with prof}
+BuildRequires:  ghc-prof, ghc-MonadCatchIO-mtl-prof
+%endif
+
+%description
+This package provides the Haskell %{pkg_name} library for ghc.
+
+
+%package devel
+Summary:        Haskell %{pkg_name} library
+Group:          Development/Libraries
+Requires:       ghc = %{ghc_version}, ghc-MonadCatchIO-mtl-devel
+Requires(post): ghc = %{ghc_version}, ghc-MonadCatchIO-mtl-devel
+Requires(preun): ghc = %{ghc_version}, ghc-MonadCatchIO-mtl-devel
+
+%description devel
+This package contains the development files for %{name}
+built for ghc-%{ghc_version}.
+
+
+%if %{with doc}
+%package doc
+Summary:        Documentation for %{name}
+Group:          Development/Libraries
+Requires:       ghc-doc = %{ghc_version}, ghc-MonadCatchIO-mtl-doc
+Requires(post): ghc-doc = %{ghc_version}, ghc-MonadCatchIO-mtl-doc
+Requires(postun): ghc-doc = %{ghc_version}, ghc-MonadCatchIO-mtl-doc
+
+%description doc
+This package contains development documentation files for
+the %{name} library.
+%endif
+
+
+%if %{with prof}
+%package prof
+Summary:        Profiling libraries for %{name}
+Group:          Development/Libraries
+Requires:       %{name}-devel = %{version}-%{release}
+Requires:       ghc-prof = %{ghc_version}, ghc-MonadCatchIO-mtl-prof
+
+%description prof
+This package contains profiling libraries for %{name}
+built for ghc-%{ghc_version}.
+%endif
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%cabal_configure --ghc %{?with_prof:-p}
+%cabal build
+%if %{with doc}
+%cabal haddock
+%endif
+%ghc_gen_scripts
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%cabal_install
+%ghc_install_scripts
+%ghc_gen_filelists %{name}
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%post devel
+%ghc_register_pkg
+
+
+%if %{with doc}
+%post doc
+%ghc_reindex_haddock
+%endif
+
+
+%preun devel
+if [ "$1" -eq 0 ] ; then
+  %ghc_unregister_pkg
+fi
+
+
+%if %{with doc}
+%postun doc
+if [ "$1" -eq 0 ] ; then
+  %ghc_reindex_haddock
+fi
+%endif
+
+
+%files devel -f %{name}-devel.files
+%defattr(-,root,root,-)
+%{_docdir}/%{name}-%{version}
+
+
+%if %{with doc}
+%files doc -f %{name}-doc.files
+%defattr(-,root,root,-)
+%endif
+
+
+%if %{with prof}
+%files prof -f %{name}-prof.files
+%defattr(-,root,root,-)
+%endif
+
+
+%changelog
+* Mon Mar 15 2010 Anders Kaseorg <andersk@mit.edu> - 3001.1.8.1-0
+- initial packaging for Fedora automatically generated by cabal2spec
Index: /trunk/server/fedora/specs/ghc-unix-handle.spec
===================================================================
--- /trunk/server/fedora/specs/ghc-unix-handle.spec	(revision 1590)
+++ /trunk/server/fedora/specs/ghc-unix-handle.spec	(revision 1590)
@@ -0,0 +1,139 @@
+%global pkg_name unix-handle
+
+%bcond_without doc
+%bcond_without prof
+
+# ghc does not emit debug information
+%global debug_package %{nil}
+
+Name:           ghc-%{pkg_name}
+Version:        0.0.0
+Release:        0.%{scriptsversion}%{?dist}
+Summary:        Haskell %{pkg_name} library
+
+Group:          Development/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-rpm-macros
+%if %{with doc}
+BuildRequires:  ghc-doc
+%endif
+%if %{with prof}
+BuildRequires:  ghc-prof
+%endif
+
+%description
+This package provides the Haskell %{pkg_name} library for ghc.
+
+
+%package devel
+Summary:        Haskell %{pkg_name} library
+Group:          Development/Libraries
+Requires:       ghc = %{ghc_version}
+Requires(post): ghc = %{ghc_version}
+Requires(preun): ghc = %{ghc_version}
+
+%description devel
+This package contains the development files for %{name}
+built for ghc-%{ghc_version}.
+
+
+%if %{with doc}
+%package doc
+Summary:        Documentation for %{name}
+Group:          Development/Libraries
+Requires:       ghc-doc = %{ghc_version}
+Requires(post): ghc-doc = %{ghc_version}
+Requires(postun): ghc-doc = %{ghc_version}
+
+%description doc
+This package contains development documentation files for
+the %{name} library.
+%endif
+
+
+%if %{with prof}
+%package prof
+Summary:        Profiling libraries for %{name}
+Group:          Development/Libraries
+Requires:       %{name}-devel = %{version}-%{release}
+Requires:       ghc-prof = %{ghc_version}
+
+%description prof
+This package contains profiling libraries for %{name}
+built for ghc-%{ghc_version}.
+%endif
+
+
+%prep
+%setup -q -n %{pkg_name}-%{version}
+
+
+%build
+%cabal_configure --ghc %{?with_prof:-p}
+%cabal build
+%if %{with doc}
+%cabal haddock
+%endif
+%ghc_gen_scripts
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%cabal_install
+%ghc_install_scripts
+%ghc_gen_filelists %{name}
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%post devel
+%ghc_register_pkg
+
+
+%if %{with doc}
+%post doc
+%ghc_reindex_haddock
+%endif
+
+
+%preun devel
+if [ "$1" -eq 0 ] ; then
+  %ghc_unregister_pkg
+fi
+
+
+%if %{with doc}
+%postun doc
+if [ "$1" -eq 0 ] ; then
+  %ghc_reindex_haddock
+fi
+%endif
+
+
+%files devel -f %{name}-devel.files
+%defattr(-,root,root,-)
+%{_docdir}/%{name}-%{version}
+
+
+%if %{with doc}
+%files doc -f %{name}-doc.files
+%defattr(-,root,root,-)
+%endif
+
+
+%if %{with prof}
+%files prof -f %{name}-prof.files
+%defattr(-,root,root,-)
+%endif
+
+
+%changelog
+* Mon Mar 15 2010 Anders Kaseorg <andersk@mit.edu> - 0.0.0-0
+- initial packaging for Fedora automatically generated by cabal2spec
Index: /trunk/server/fedora/specs/scripts-static-cat.spec
===================================================================
--- /trunk/server/fedora/specs/scripts-static-cat.spec	(revision 1590)
+++ /trunk/server/fedora/specs/scripts-static-cat.spec	(revision 1590)
@@ -0,0 +1,47 @@
+# 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, ghc-rpm-macros, 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
+%cabal_configure --ghc
+%cabal build
+
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%cabal_install
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%files
+%defattr(-,root,root,-)
+%attr(755,root,root) %{_bindir}/static-cat
+
+
+%changelog
+* Sun Mar 14 2010 Anders Kaseorg <andersk@mit.edu> - 0.0-0
+- initial packaging for Fedora automatically generated by cabal2spec
