summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config-joey.hs2
-rw-r--r--doc/README.mdwn10
-rw-r--r--doc/todo/docker_todo_list.mdwn5
-rw-r--r--propellor.cabal5
-rw-r--r--src/Propellor.hs (renamed from Propellor.hs)0
-rw-r--r--src/Propellor/Attr.hs (renamed from Propellor/Attr.hs)0
-rw-r--r--src/Propellor/CmdLine.hs (renamed from Propellor/CmdLine.hs)31
-rw-r--r--src/Propellor/Engine.hs (renamed from Propellor/Engine.hs)0
-rw-r--r--src/Propellor/Exception.hs (renamed from Propellor/Exception.hs)0
-rw-r--r--src/Propellor/Message.hs (renamed from Propellor/Message.hs)0
-rw-r--r--src/Propellor/PrivData.hs (renamed from Propellor/PrivData.hs)0
-rw-r--r--src/Propellor/Property.hs (renamed from Propellor/Property.hs)0
-rw-r--r--src/Propellor/Property/Apache.hs (renamed from Propellor/Property/Apache.hs)0
-rw-r--r--src/Propellor/Property/Apt.hs (renamed from Propellor/Property/Apt.hs)0
-rw-r--r--src/Propellor/Property/Cmd.hs (renamed from Propellor/Property/Cmd.hs)0
-rw-r--r--src/Propellor/Property/Cron.hs (renamed from Propellor/Property/Cron.hs)0
-rw-r--r--src/Propellor/Property/Dns.hs (renamed from Propellor/Property/Dns.hs)0
-rw-r--r--src/Propellor/Property/Docker.hs (renamed from Propellor/Property/Docker.hs)18
-rw-r--r--src/Propellor/Property/Docker/Shim.hs (renamed from Propellor/Property/Docker/Shim.hs)0
-rw-r--r--src/Propellor/Property/File.hs (renamed from Propellor/Property/File.hs)0
-rw-r--r--src/Propellor/Property/Git.hs (renamed from Propellor/Property/Git.hs)0
-rw-r--r--src/Propellor/Property/Gpg.hs (renamed from Propellor/Property/Gpg.hs)0
-rw-r--r--src/Propellor/Property/Hostname.hs (renamed from Propellor/Property/Hostname.hs)0
-rw-r--r--src/Propellor/Property/Network.hs (renamed from Propellor/Property/Network.hs)0
-rw-r--r--src/Propellor/Property/Obnam.hs (renamed from Propellor/Property/Obnam.hs)0
-rw-r--r--src/Propellor/Property/OpenId.hs (renamed from Propellor/Property/OpenId.hs)0
-rw-r--r--src/Propellor/Property/Postfix.hs (renamed from Propellor/Property/Postfix.hs)0
-rw-r--r--src/Propellor/Property/Reboot.hs (renamed from Propellor/Property/Reboot.hs)0
-rw-r--r--src/Propellor/Property/Scheduled.hs (renamed from Propellor/Property/Scheduled.hs)0
-rw-r--r--src/Propellor/Property/Service.hs (renamed from Propellor/Property/Service.hs)0
-rw-r--r--src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs (renamed from Propellor/Property/SiteSpecific/GitAnnexBuilder.hs)0
-rw-r--r--src/Propellor/Property/SiteSpecific/GitHome.hs (renamed from Propellor/Property/SiteSpecific/GitHome.hs)0
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs (renamed from Propellor/Property/SiteSpecific/JoeySites.hs)0
-rw-r--r--src/Propellor/Property/Ssh.hs (renamed from Propellor/Property/Ssh.hs)0
-rw-r--r--src/Propellor/Property/Sudo.hs (renamed from Propellor/Property/Sudo.hs)0
-rw-r--r--src/Propellor/Property/Tor.hs (renamed from Propellor/Property/Tor.hs)0
-rw-r--r--src/Propellor/Property/User.hs (renamed from Propellor/Property/User.hs)0
-rw-r--r--src/Propellor/SimpleSh.hs (renamed from Propellor/SimpleSh.hs)10
-rw-r--r--src/Propellor/Types.hs (renamed from Propellor/Types.hs)0
-rw-r--r--src/Propellor/Types/Attr.hs (renamed from Propellor/Types/Attr.hs)0
-rw-r--r--src/Propellor/Types/Dns.hs (renamed from Propellor/Types/Dns.hs)0
-rw-r--r--src/Propellor/Types/OS.hs (renamed from Propellor/Types/OS.hs)0
-rw-r--r--src/Utility/Applicative.hs (renamed from Utility/Applicative.hs)0
-rw-r--r--src/Utility/Data.hs (renamed from Utility/Data.hs)0
-rw-r--r--src/Utility/Directory.hs (renamed from Utility/Directory.hs)0
-rw-r--r--src/Utility/Env.hs (renamed from Utility/Env.hs)0
-rw-r--r--src/Utility/Exception.hs (renamed from Utility/Exception.hs)0
-rw-r--r--src/Utility/FileMode.hs (renamed from Utility/FileMode.hs)0
-rw-r--r--src/Utility/FileSystemEncoding.hs (renamed from Utility/FileSystemEncoding.hs)0
-rw-r--r--src/Utility/LinuxMkLibs.hs (renamed from Utility/LinuxMkLibs.hs)0
-rw-r--r--src/Utility/Misc.hs (renamed from Utility/Misc.hs)0
-rw-r--r--src/Utility/Monad.hs (renamed from Utility/Monad.hs)0
-rw-r--r--src/Utility/PartialPrelude.hs (renamed from Utility/PartialPrelude.hs)0
-rw-r--r--src/Utility/Path.hs (renamed from Utility/Path.hs)0
-rw-r--r--src/Utility/PosixFiles.hs (renamed from Utility/PosixFiles.hs)0
-rw-r--r--src/Utility/Process.hs (renamed from Utility/Process.hs)0
-rw-r--r--src/Utility/QuickCheck.hs (renamed from Utility/QuickCheck.hs)0
-rw-r--r--src/Utility/SafeCommand.hs (renamed from Utility/SafeCommand.hs)0
-rw-r--r--src/Utility/Scheduled.hs (renamed from Utility/Scheduled.hs)0
-rw-r--r--src/Utility/ThreadScheduler.hs (renamed from Utility/ThreadScheduler.hs)0
-rw-r--r--src/Utility/Tmp.hs (renamed from Utility/Tmp.hs)0
-rw-r--r--src/Utility/UserInfo.hs (renamed from Utility/UserInfo.hs)0
l---------src/config.hs1
-rw-r--r--src/wrapper.hs (renamed from wrapper.hs)0
64 files changed, 40 insertions, 42 deletions
diff --git a/config-joey.hs b/config-joey.hs
index c7c3f3be..769357ce 100644
--- a/config-joey.hs
+++ b/config-joey.hs
@@ -58,7 +58,7 @@ hosts = -- (o) `
& alias "openid.kitenet.net"
& Docker.docked hosts "openid-provider"
- `requires` Apt.installed ["ntp"]
+ `requires` Apt.serviceInstalledRunning "ntp"
& alias "ancient.kitenet.net"
& Docker.docked hosts "ancient-kitenet"
diff --git a/doc/README.mdwn b/doc/README.mdwn
index d809a760..71b265f5 100644
--- a/doc/README.mdwn
+++ b/doc/README.mdwn
@@ -6,7 +6,8 @@ are satisfied.
Propellor is configured via a git repository, which typically lives
in `~/.propellor/` on your development machine. Propellor clones the
repository to each host it manages, in a
-[secure](http://propellor.branchable.com/security/) way.
+[secure](http://propellor.branchable.com/security/) way. The git repository
+contains the full source code to Propellor, along with its config file.
Properties are defined using Haskell. Edit `~/.propellor/config.hs`
to get started. There is fairly complete
@@ -40,11 +41,12 @@ see [configuration for the Haskell newbie](https://propellor.branchable.com/hask
`apt-get install propellor`
2. Run propellor for the first time. It will set up a `~/.propellor/` git
repository for you.
-3. `cd ~/.propellor/`; use git to push the repository to a central
+3. If you don't have a gpg private key already, generate one: `gpg --gen-key`
+4. Run: `propellor --add-key $KEYID`, which will make propellor trust
+ your gpg key, and will sign your `~/.propellor` repository using it.
+5. `cd ~/.propellor/`; use git to push the repository to a central
server (github, or your own git server). Configure that central
server as the origin remote of the repository.
-4. If you don't have a gpg private key, generate one: `gpg --gen-key`
-5. Run: `propellor --add-key $KEYID`
6. Edit `~/.propellor/config.hs`, and add a host you want to manage.
You can start by not adding any properties, or only a few.
7. Pick a host and run: `propellor --spin $HOST`
diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn
index 9cb9e4da..65762cff 100644
--- a/doc/todo/docker_todo_list.mdwn
+++ b/doc/todo/docker_todo_list.mdwn
@@ -6,8 +6,3 @@
need ntp installed for a good date source.
* Docking a container in a host should add to the host any cnames that
are assigned to the container.
-* It seems that provisionContainer sometimes hangs when the container
- is already running. This seems likely to be a problem with the simpleSh
- socket hack. (I think this was an uncaught exception crashing the
- simpleSh server thread, and if so, it's fixed. Waiting some weeks to see,
- as this bug rarely occurred..)
diff --git a/propellor.cabal b/propellor.cabal
index 507a0d4b..55b7eb60 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -33,9 +33,10 @@ Description:
.
It is configured using haskell.
-Executable propellor
+Executable wrapper
Main-Is: wrapper.hs
GHC-Options: -Wall -threaded
+ Hs-Source-Dirs: src
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
containers, network, async, time, QuickCheck, mtl,
@@ -47,6 +48,7 @@ Executable propellor
Executable config
Main-Is: config.hs
GHC-Options: -Wall -threaded
+ Hs-Source-Dirs: src
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
containers, network, async, time, QuickCheck, mtl,
@@ -57,6 +59,7 @@ Executable config
Library
GHC-Options: -Wall
+ Hs-Source-Dirs: src
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
containers, network, async, time, QuickCheck, mtl,
diff --git a/Propellor.hs b/src/Propellor.hs
index e6312248..e6312248 100644
--- a/Propellor.hs
+++ b/src/Propellor.hs
diff --git a/Propellor/Attr.hs b/src/Propellor/Attr.hs
index 98cfc64d..98cfc64d 100644
--- a/Propellor/Attr.hs
+++ b/src/Propellor/Attr.hs
diff --git a/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index ad04abe6..ab1d7f9e 100644
--- a/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -290,17 +290,26 @@ boot attr ps = do
mainProperties attr ps
addKey :: String -> IO ()
-addKey keyid = exitBool =<< allM id [ gpg, gitadd, gitcommit ]
+addKey keyid = exitBool =<< allM id [ gpg, gitadd, gitconfig, gitcommit ]
where
- gpg = boolSystem "sh"
- [ Param "-c"
- , Param $ "gpg --export " ++ keyid ++ " | gpg " ++
- unwords (gpgopts ++ ["--import"])
- ]
+ gpg = do
+ createDirectoryIfMissing True privDataDir
+ boolSystem "sh"
+ [ Param "-c"
+ , Param $ "gpg --export " ++ keyid ++ " | gpg " ++
+ unwords (gpgopts ++ ["--import"])
+ ]
gitadd = boolSystem "git"
[ Param "add"
, File keyring
]
+
+ gitconfig = boolSystem "git"
+ [ Param "config"
+ , Param "user.signingkey"
+ , Param keyid
+ ]
+
gitcommit = gitCommit
[ File keyring
, Param "-m"
@@ -340,11 +349,11 @@ checkDebugMode = go =<< getEnv "PROPELLOR_DEBUG"
where
go (Just s)
| s == "1" = do
- f <- setFormatter
- <$> streamHandler stderr DEBUG
- <*> pure (simpleLogFormatter "[$time] $msg")
- updateGlobalLogger rootLoggerName $
- setLevel DEBUG . setHandlers [f]
+ f <- setFormatter
+ <$> streamHandler stderr DEBUG
+ <*> pure (simpleLogFormatter "[$time] $msg")
+ updateGlobalLogger rootLoggerName $
+ setLevel DEBUG . setHandlers [f]
go _ = noop
-- Parameters can be passed to both ssh and scp, to enable a ssh connection
diff --git a/Propellor/Engine.hs b/src/Propellor/Engine.hs
index 55ce7f77..55ce7f77 100644
--- a/Propellor/Engine.hs
+++ b/src/Propellor/Engine.hs
diff --git a/Propellor/Exception.hs b/src/Propellor/Exception.hs
index f6fd15f1..f6fd15f1 100644
--- a/Propellor/Exception.hs
+++ b/src/Propellor/Exception.hs
diff --git a/Propellor/Message.hs b/src/Propellor/Message.hs
index 780471c3..780471c3 100644
--- a/Propellor/Message.hs
+++ b/src/Propellor/Message.hs
diff --git a/Propellor/PrivData.hs b/src/Propellor/PrivData.hs
index ad2c8d22..ad2c8d22 100644
--- a/Propellor/PrivData.hs
+++ b/src/Propellor/PrivData.hs
diff --git a/Propellor/Property.hs b/src/Propellor/Property.hs
index 24494654..24494654 100644
--- a/Propellor/Property.hs
+++ b/src/Propellor/Property.hs
diff --git a/Propellor/Property/Apache.hs b/src/Propellor/Property/Apache.hs
index cf3e62cc..cf3e62cc 100644
--- a/Propellor/Property/Apache.hs
+++ b/src/Propellor/Property/Apache.hs
diff --git a/Propellor/Property/Apt.hs b/src/Propellor/Property/Apt.hs
index 7329c7a8..7329c7a8 100644
--- a/Propellor/Property/Apt.hs
+++ b/src/Propellor/Property/Apt.hs
diff --git a/Propellor/Property/Cmd.hs b/src/Propellor/Property/Cmd.hs
index bcd08246..bcd08246 100644
--- a/Propellor/Property/Cmd.hs
+++ b/src/Propellor/Property/Cmd.hs
diff --git a/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
index 5b070eff..5b070eff 100644
--- a/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
diff --git a/Propellor/Property/Dns.hs b/src/Propellor/Property/Dns.hs
index 5c3162cb..5c3162cb 100644
--- a/Propellor/Property/Dns.hs
+++ b/src/Propellor/Property/Dns.hs
diff --git a/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index 6757c7cc..09d7d6a4 100644
--- a/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -335,29 +335,19 @@ provisionContainer cid = containerDesc cid $ property "provision" $ liftIO $ do
go lastline (v:rest) = case v of
StdoutLine s -> do
- debug ["stdout: ", show s]
maybe noop putStrLn lastline
hFlush stdout
go (Just s) rest
StderrLine s -> do
- debug ["stderr: ", show s]
maybe noop putStrLn lastline
hFlush stdout
hPutStrLn stderr s
hFlush stderr
go Nothing rest
- Done -> do
- debug ["reached Done"]
- ret lastline
- go lastline [] = do
- debug ["reached end of output"]
- ret lastline
-
- ret lastline = do
- let v = fromMaybe FailedChange $
- readish =<< lastline
- debug ["provisionContainer returning", show v]
- return v
+ Done -> ret lastline
+ go lastline [] = ret lastline
+
+ ret lastline = pure $ fromMaybe FailedChange $ readish =<< lastline
stopContainer :: ContainerId -> IO Bool
stopContainer cid = boolSystem dockercmd [Param "stop", Param $ fromContainerId cid ]
diff --git a/Propellor/Property/Docker/Shim.hs b/src/Propellor/Property/Docker/Shim.hs
index c2f35d0c..c2f35d0c 100644
--- a/Propellor/Property/Docker/Shim.hs
+++ b/src/Propellor/Property/Docker/Shim.hs
diff --git a/Propellor/Property/File.hs b/src/Propellor/Property/File.hs
index 0b060177..0b060177 100644
--- a/Propellor/Property/File.hs
+++ b/src/Propellor/Property/File.hs
diff --git a/Propellor/Property/Git.hs b/src/Propellor/Property/Git.hs
index e5df7e48..e5df7e48 100644
--- a/Propellor/Property/Git.hs
+++ b/src/Propellor/Property/Git.hs
diff --git a/Propellor/Property/Gpg.hs b/src/Propellor/Property/Gpg.hs
index 64ea9fea..64ea9fea 100644
--- a/Propellor/Property/Gpg.hs
+++ b/src/Propellor/Property/Gpg.hs
diff --git a/Propellor/Property/Hostname.hs b/src/Propellor/Property/Hostname.hs
index 031abb9d..031abb9d 100644
--- a/Propellor/Property/Hostname.hs
+++ b/src/Propellor/Property/Hostname.hs
diff --git a/Propellor/Property/Network.hs b/src/Propellor/Property/Network.hs
index 6009778a..6009778a 100644
--- a/Propellor/Property/Network.hs
+++ b/src/Propellor/Property/Network.hs
diff --git a/Propellor/Property/Obnam.hs b/src/Propellor/Property/Obnam.hs
index 32374b57..32374b57 100644
--- a/Propellor/Property/Obnam.hs
+++ b/src/Propellor/Property/Obnam.hs
diff --git a/Propellor/Property/OpenId.hs b/src/Propellor/Property/OpenId.hs
index 051d6425..051d6425 100644
--- a/Propellor/Property/OpenId.hs
+++ b/src/Propellor/Property/OpenId.hs
diff --git a/Propellor/Property/Postfix.hs b/src/Propellor/Property/Postfix.hs
index 9fa4a2c3..9fa4a2c3 100644
--- a/Propellor/Property/Postfix.hs
+++ b/src/Propellor/Property/Postfix.hs
diff --git a/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs
index 25e53159..25e53159 100644
--- a/Propellor/Property/Reboot.hs
+++ b/src/Propellor/Property/Reboot.hs
diff --git a/Propellor/Property/Scheduled.hs b/src/Propellor/Property/Scheduled.hs
index f2911e50..f2911e50 100644
--- a/Propellor/Property/Scheduled.hs
+++ b/src/Propellor/Property/Scheduled.hs
diff --git a/Propellor/Property/Service.hs b/src/Propellor/Property/Service.hs
index 14e769d0..14e769d0 100644
--- a/Propellor/Property/Service.hs
+++ b/src/Propellor/Property/Service.hs
diff --git a/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
index 677aa760..677aa760 100644
--- a/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
+++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
diff --git a/Propellor/Property/SiteSpecific/GitHome.hs b/src/Propellor/Property/SiteSpecific/GitHome.hs
index 6ed02146..6ed02146 100644
--- a/Propellor/Property/SiteSpecific/GitHome.hs
+++ b/src/Propellor/Property/SiteSpecific/GitHome.hs
diff --git a/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index 28b3dffd..28b3dffd 100644
--- a/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
diff --git a/Propellor/Property/Ssh.hs b/src/Propellor/Property/Ssh.hs
index a4f87678..a4f87678 100644
--- a/Propellor/Property/Ssh.hs
+++ b/src/Propellor/Property/Ssh.hs
diff --git a/Propellor/Property/Sudo.hs b/src/Propellor/Property/Sudo.hs
index 68b56608..68b56608 100644
--- a/Propellor/Property/Sudo.hs
+++ b/src/Propellor/Property/Sudo.hs
diff --git a/Propellor/Property/Tor.hs b/src/Propellor/Property/Tor.hs
index 78e35c89..78e35c89 100644
--- a/Propellor/Property/Tor.hs
+++ b/src/Propellor/Property/Tor.hs
diff --git a/Propellor/Property/User.hs b/src/Propellor/Property/User.hs
index eef2a57e..eef2a57e 100644
--- a/Propellor/Property/User.hs
+++ b/src/Propellor/Property/User.hs
diff --git a/Propellor/SimpleSh.hs b/src/Propellor/SimpleSh.hs
index d99268d1..7ba30b0e 100644
--- a/Propellor/SimpleSh.hs
+++ b/src/Propellor/SimpleSh.hs
@@ -6,7 +6,7 @@
module Propellor.SimpleSh where
import Network.Socket
-import Control.Concurrent.Chan
+import Control.Concurrent
import Control.Concurrent.Async
import System.Process (std_in, std_out, std_err)
@@ -31,8 +31,9 @@ simpleSh namedpipe = do
listen s 2
forever $ do
(client, _addr) <- accept s
- h <- socketToHandle client ReadWriteMode
- maybe noop (run h) . readish =<< hGetLine h
+ forkIO $ do
+ h <- socketToHandle client ReadWriteMode
+ maybe noop (run h) . readish =<< hGetLine h
where
run h (Cmd cmd params) = do
chan <- newChan
@@ -71,16 +72,13 @@ simpleSh namedpipe = do
simpleShClient :: FilePath -> String -> [String] -> ([Resp] -> IO a) -> IO a
simpleShClient namedpipe cmd params handler = do
- debug ["simplesh connecting"]
s <- socket AF_UNIX Stream defaultProtocol
connect s (SockAddrUnix namedpipe)
h <- socketToHandle s ReadWriteMode
hPutStrLn h $ show $ Cmd cmd params
hFlush h
- debug ["simplesh sent command"]
resps <- catMaybes . map readish . lines <$> hGetContents h
v <- hClose h `after` handler resps
- debug ["simplesh processed response"]
return v
simpleShClientRetry :: Int -> FilePath -> String -> [String] -> ([Resp] -> IO a) -> IO a
diff --git a/Propellor/Types.hs b/src/Propellor/Types.hs
index 22df9ddb..22df9ddb 100644
--- a/Propellor/Types.hs
+++ b/src/Propellor/Types.hs
diff --git a/Propellor/Types/Attr.hs b/src/Propellor/Types/Attr.hs
index 8b7d3b09..8b7d3b09 100644
--- a/Propellor/Types/Attr.hs
+++ b/src/Propellor/Types/Attr.hs
diff --git a/Propellor/Types/Dns.hs b/src/Propellor/Types/Dns.hs
index ba6a92dd..ba6a92dd 100644
--- a/Propellor/Types/Dns.hs
+++ b/src/Propellor/Types/Dns.hs
diff --git a/Propellor/Types/OS.hs b/src/Propellor/Types/OS.hs
index 23cc8a29..23cc8a29 100644
--- a/Propellor/Types/OS.hs
+++ b/src/Propellor/Types/OS.hs
diff --git a/Utility/Applicative.hs b/src/Utility/Applicative.hs
index fd8944b2..fd8944b2 100644
--- a/Utility/Applicative.hs
+++ b/src/Utility/Applicative.hs
diff --git a/Utility/Data.hs b/src/Utility/Data.hs
index 2df12b36..2df12b36 100644
--- a/Utility/Data.hs
+++ b/src/Utility/Data.hs
diff --git a/Utility/Directory.hs b/src/Utility/Directory.hs
index d92327c0..d92327c0 100644
--- a/Utility/Directory.hs
+++ b/src/Utility/Directory.hs
diff --git a/Utility/Env.hs b/src/Utility/Env.hs
index 6763c24e..6763c24e 100644
--- a/Utility/Env.hs
+++ b/src/Utility/Env.hs
diff --git a/Utility/Exception.hs b/src/Utility/Exception.hs
index 1fecf65d..1fecf65d 100644
--- a/Utility/Exception.hs
+++ b/src/Utility/Exception.hs
diff --git a/Utility/FileMode.hs b/src/Utility/FileMode.hs
index c2ef683a..c2ef683a 100644
--- a/Utility/FileMode.hs
+++ b/src/Utility/FileMode.hs
diff --git a/Utility/FileSystemEncoding.hs b/src/Utility/FileSystemEncoding.hs
index b81fdc53..b81fdc53 100644
--- a/Utility/FileSystemEncoding.hs
+++ b/src/Utility/FileSystemEncoding.hs
diff --git a/Utility/LinuxMkLibs.hs b/src/Utility/LinuxMkLibs.hs
index 1dc4e1ea..1dc4e1ea 100644
--- a/Utility/LinuxMkLibs.hs
+++ b/src/Utility/LinuxMkLibs.hs
diff --git a/Utility/Misc.hs b/src/Utility/Misc.hs
index 949f41e7..949f41e7 100644
--- a/Utility/Misc.hs
+++ b/src/Utility/Misc.hs
diff --git a/Utility/Monad.hs b/src/Utility/Monad.hs
index eba3c428..eba3c428 100644
--- a/Utility/Monad.hs
+++ b/src/Utility/Monad.hs
diff --git a/Utility/PartialPrelude.hs b/src/Utility/PartialPrelude.hs
index 6efa093f..6efa093f 100644
--- a/Utility/PartialPrelude.hs
+++ b/src/Utility/PartialPrelude.hs
diff --git a/Utility/Path.hs b/src/Utility/Path.hs
index 99c9438b..99c9438b 100644
--- a/Utility/Path.hs
+++ b/src/Utility/Path.hs
diff --git a/Utility/PosixFiles.hs b/src/Utility/PosixFiles.hs
index 5abbb578..5abbb578 100644
--- a/Utility/PosixFiles.hs
+++ b/src/Utility/PosixFiles.hs
diff --git a/Utility/Process.hs b/src/Utility/Process.hs
index 549ae570..549ae570 100644
--- a/Utility/Process.hs
+++ b/src/Utility/Process.hs
diff --git a/Utility/QuickCheck.hs b/src/Utility/QuickCheck.hs
index a498ee61..a498ee61 100644
--- a/Utility/QuickCheck.hs
+++ b/src/Utility/QuickCheck.hs
diff --git a/Utility/SafeCommand.hs b/src/Utility/SafeCommand.hs
index 04fcf390..04fcf390 100644
--- a/Utility/SafeCommand.hs
+++ b/src/Utility/SafeCommand.hs
diff --git a/Utility/Scheduled.hs b/src/Utility/Scheduled.hs
index 305410c5..305410c5 100644
--- a/Utility/Scheduled.hs
+++ b/src/Utility/Scheduled.hs
diff --git a/Utility/ThreadScheduler.hs b/src/Utility/ThreadScheduler.hs
index fc026d7e..fc026d7e 100644
--- a/Utility/ThreadScheduler.hs
+++ b/src/Utility/ThreadScheduler.hs
diff --git a/Utility/Tmp.hs b/src/Utility/Tmp.hs
index 0dc9f2c0..0dc9f2c0 100644
--- a/Utility/Tmp.hs
+++ b/src/Utility/Tmp.hs
diff --git a/Utility/UserInfo.hs b/src/Utility/UserInfo.hs
index 617c3e94..617c3e94 100644
--- a/Utility/UserInfo.hs
+++ b/src/Utility/UserInfo.hs
diff --git a/src/config.hs b/src/config.hs
new file mode 120000
index 00000000..e3af968e
--- /dev/null
+++ b/src/config.hs
@@ -0,0 +1 @@
+../config.hs \ No newline at end of file
diff --git a/wrapper.hs b/src/wrapper.hs
index f180e855..f180e855 100644
--- a/wrapper.hs
+++ b/src/wrapper.hs