module Main where
import Control.Monad
import GHC.Environment
import System.Directory
import System.Environment
import System.FilePath
import System.Linux.Namespaces
import System.Posix.Process
import System.Posix.User
import System.Process
main :: IO ()
main = do
-- we must get uid/gid before unshare
uid <- getEffectiveUserID
gid <- getEffectiveGroupID
unshare [User, Network, Mount]
writeUserMappings Nothing [UserMapping 0 uid 1]
writeGroupMappings Nothing [GroupMapping 0 gid 1] True
-- needed for creating /run/netns
callCommand "mount -t tmpfs tmpfs /run"
epath <- takeDirectory <$> getExecutablePath -- directory containing executable
fpath <- map takeDirectory . filter (any isPathSeparator) . take 1 <$> getFullArgs
-- directory used for invocation, can differ from above for symlinked executable
let dirs = concat
[ [ epath ]
, [ epath </> "../../../erebos-tester-core/build/erebos-tester-core" ]
, fpath
]
args <- getArgs
mapM_ (\file -> executeFile file False args Nothing) =<<
findExecutablesInDirectories dirs "erebos-tester-core"
when (null fpath) $
mapM_ (\file -> executeFile file False args Nothing) =<<
findExecutables "erebos-tester-core"
fail "core binary not found"