From 67553d3fb69b4af520a819ecf390dd943eb5880f Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Wed, 19 Jun 2019 12:03:35 -0400 Subject: support for skel-files --- .gitignore | 1 + fsmgr.hs | 19 ++++++++++++++++++- samizdat/samizdat-wip.yaml | 4 ++-- samizdat/samizdat.yaml | 39 ++++++++++++++++++++++++++++++++++++--- src/ConfigFile.hs | 2 ++ 5 files changed, 59 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 1f1fb01..4e096f0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /_build *.btrfs *.btrfs~* +_build/ diff --git a/fsmgr.hs b/fsmgr.hs index 0dc1790..429b0a1 100644 --- a/fsmgr.hs +++ b/fsmgr.hs @@ -23,7 +23,7 @@ import qualified Options.Applicative as Opt ;import Options.Applicative hiding (action, command) import ConfigFile -import System.Directory (createDirectoryIfMissing) +import System.Directory (getCurrentDirectory, createDirectoryIfMissing) import System.Posix.Process (getProcessID) import System.Posix.Types (CUid (..)) import System.Posix.User (getEffectiveUserID) @@ -63,6 +63,12 @@ buildRoot config@DiskImageConfig{..} finalOut = do forM_ (unpack <$> binaries) $ \b -> do p <- fromMaybe (fail $ "not found in ${PATH}: " ++ b) <$> liftIO (pathLocate b) cmd_ "cp -L" [p] [mountpoint "usr/local/bin" b] + {- 3.5 skel -} + forM_ (unpack <$> skelFiles) $ \f -> do + homeDir <- getHomeDir + target <- absPath mountpoint <&> ( "etc/skel") + cmd_ "mkdir -p" [target] + cmd_ (Cwd homeDir) "cp -r --preserve=mode,timestamps -L --parents -t" [target] [f] {- 4. custom setup commands -} forM_ chrootCommands $ \c -> do cmd_ "chroot" [mountpoint] "/bin/sh -c" [unpack c] @@ -78,6 +84,17 @@ buildRoot config@DiskImageConfig{..} finalOut = do cmd_ "btrfstune -S1" [out] cmd_ "mv" [out, finalOut] +absPath :: MonadIO m => FilePath -> m FilePath +absPath f@('/':_) = return f +absPath f = do + wd <- liftIO getCurrentDirectory + return $ wd f + +getHomeDir :: Action FilePath +getHomeDir = do + Stdout homeDir <- cmd ["sh", "-c", "getent passwd \"$SUDO_USER\"|(IFS=: read _ _ _ _ _ d _; printf %s \"$d\")"] + return homeDir + buildInitialImage :: DiskImageConfig -> FilePath -> FilePath -> Action () buildInitialImage DiskImageConfig{..} mountpoint out = do case initialImage of diff --git a/samizdat/samizdat-wip.yaml b/samizdat/samizdat-wip.yaml index 0e506c8..f331a7f 100644 --- a/samizdat/samizdat-wip.yaml +++ b/samizdat/samizdat-wip.yaml @@ -5,11 +5,11 @@ packages: - cron - sshfs - emacs25 +- gpm +- parted binaries: - kiki - cokiki - stack - dhtd - dht -chroot-commands: -- "useradd u -G sudo -m -p '' -s /bin/bash" diff --git a/samizdat/samizdat.yaml b/samizdat/samizdat.yaml index dae433a..14fc9d8 100644 --- a/samizdat/samizdat.yaml +++ b/samizdat/samizdat.yaml @@ -1,5 +1,38 @@ parent: samizdat-wip -packages: -- gpm +packages: [] binaries: [] -chroot-commands: [] +skel-files: +- '.bashrc' +- '.config/git/ignore' +- '.gitconfig' # This embeds my email address so not really suitable + # permanently. +- '.spacemacs' +- '.tmux.conf' +- '.tmux.stage2.conf' +- '.vimrc' +- '.xbindkeysrc' +- '.xinitrc' +- '.Xresources' + +# dev tools +- '.local/bin/stack' +- '.local/bin/rustup' + +# keymap control/recue +- '.local/bin/asdf' +- '.local/bin/aoeu' +- '.local/bin/ASDF' +- '.local/bin/dvorak' +- '.local/bin/qwer' +- '.local/bin/асдф' + +# misc. programs/scripts I wrote +- '.local/bin/google' +- '.local/bin/jack-plumbing' +- '.local/bin/musopen' +- '.local/bin/record' +- '.local/bin/sliceweasel' +- '.local/bin/axis' + +chroot-commands: +- "useradd u -G sudo -m -p '' -s /bin/bash" diff --git a/src/ConfigFile.hs b/src/ConfigFile.hs index 8b23582..a1d3662 100644 --- a/src/ConfigFile.hs +++ b/src/ConfigFile.hs @@ -57,6 +57,7 @@ data DiskImageConfig = DiskImageConfig { , unpackOnly :: Bool , binaries :: Vector Text , chrootCommands :: Vector Text +, skelFiles :: Vector Text } deriving (Show, Read) parsePackageName :: Text -> Package @@ -71,6 +72,7 @@ diskImageConfigParser = object $ <*> defaultField "unpack-only" False bool <*> defaultField "binaries" Vector.empty (array string) <*> defaultField "chroot-commands" Vector.empty (array string) + <*> defaultField "skel-files" Vector.empty (array string) readCfg :: FilePath -> Action DiskImageConfig readCfg yaml = either error id . parse diskImageConfigParser . encodeUtf8 . pack <$> readFile' yaml -- cgit v1.2.3