summaryrefslogtreecommitdiff
path: root/src/Propellor
diff options
context:
space:
mode:
authorJoey Hess2018-02-01 12:27:26 -0400
committerJoey Hess2018-02-01 12:27:26 -0400
commite80ac83657169b973fd8fe25deb42f458da475b9 (patch)
tree885f8e981c9ff941ab959cdcc804a90c53c38509 /src/Propellor
parent81d288629d82e1fa81bb004a74ef9480b3a544a0 (diff)
parent5cd0291025b92ee2e408abd73b2cb4225f22465d (diff)
Merge branch 'joeyconfig'
Diffstat (limited to 'src/Propellor')
-rw-r--r--src/Propellor/Property/Cmd.hs3
-rw-r--r--src/Propellor/Property/FlashKernel.hs7
-rw-r--r--src/Propellor/Property/Gpg.hs6
-rw-r--r--src/Propellor/Property/Grub.hs65
-rw-r--r--src/Propellor/Property/Laptop.hs28
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs4
6 files changed, 105 insertions, 8 deletions
diff --git a/src/Propellor/Property/Cmd.hs b/src/Propellor/Property/Cmd.hs
index f2de1a27..fbe112cc 100644
--- a/src/Propellor/Property/Cmd.hs
+++ b/src/Propellor/Property/Cmd.hs
@@ -94,6 +94,7 @@ scriptProperty script = cmdProperty "sh" ["-c", shellcmd]
-- | A property that can satisfied by running a script
-- as user (cd'd to their home directory).
userScriptProperty :: User -> Script -> UncheckedProperty UnixLike
-userScriptProperty (User user) script = cmdProperty "su" ["--shell", "/bin/sh", "-c", shellcmd, user]
+userScriptProperty (User user) script = cmdProperty "su"
+ ["--login", "--shell", "/bin/sh", "-c", shellcmd, user]
where
shellcmd = intercalate " ; " ("set -e" : "cd" : script)
diff --git a/src/Propellor/Property/FlashKernel.hs b/src/Propellor/Property/FlashKernel.hs
index 3f65f872..1a52621d 100644
--- a/src/Propellor/Property/FlashKernel.hs
+++ b/src/Propellor/Property/FlashKernel.hs
@@ -23,10 +23,15 @@ installed :: Machine -> Property (HasInfo + DebianLike)
installed machine = setInfoProperty go (toInfo [FlashKernelInstalled])
where
go = "/etc/flash-kernel/machine" `File.hasContent` [machine]
- `onChange` (cmdProperty "flash-kernel" [] `assume` MadeChange)
+ `onChange` flashKernel
`requires` File.dirExists "/etc/flash-kernel"
`requires` Apt.installed ["flash-kernel"]
+-- | Runs flash-kernel with whatever machine `installed` configured.
+flashKernel :: Property DebianLike
+flashKernel = tightenTargets $
+ cmdProperty "flash-kernel" [] `assume` MadeChange
+
-- | Runs flash-kernel in the system mounted at a particular directory.
flashKernelMounted :: FilePath -> Property Linux
flashKernelMounted mnt = combineProperties desc $ props
diff --git a/src/Propellor/Property/Gpg.hs b/src/Propellor/Property/Gpg.hs
index 27baa4ba..ac057b2e 100644
--- a/src/Propellor/Property/Gpg.hs
+++ b/src/Propellor/Property/Gpg.hs
@@ -33,7 +33,7 @@ keyImported key@(GpgKeyId keyid) user@(User u) = prop
ifM (liftIO $ hasGpgKey (parse keylines))
( return NoChange
, makeChange $ withHandle StdinHandle createProcessSuccess
- (proc "su" ["-c", "gpg --import", u]) $ \h -> do
+ (proc "su" ["--login", "-c", "gpg --import", u]) $ \h -> do
hPutStr h (unlines keylines)
hClose h
)
@@ -49,11 +49,11 @@ keyImported key@(GpgKeyId keyid) user@(User u) = prop
hasPrivKey :: GpgKeyId -> User -> IO Bool
hasPrivKey (GpgKeyId keyid) (User u) = catchBoolIO $
- snd <$> processTranscript "su" ["-c", "gpg --list-secret-keys " ++ shellEscape keyid, u] Nothing
+ snd <$> processTranscript "su" ["--login", "-c", "gpg --list-secret-keys " ++ shellEscape keyid, u] Nothing
hasPubKey :: GpgKeyId -> User -> IO Bool
hasPubKey (GpgKeyId keyid) (User u) = catchBoolIO $
- snd <$> processTranscript "su" ["-c", "gpg --list-public-keys " ++ shellEscape keyid, u] Nothing
+ snd <$> processTranscript "su" ["--login", "-c", "gpg --list-public-keys " ++ shellEscape keyid, u] Nothing
dotDir :: User -> IO FilePath
dotDir (User u) = do
diff --git a/src/Propellor/Property/Grub.hs b/src/Propellor/Property/Grub.hs
index 5cb9077d..79ecd8c9 100644
--- a/src/Propellor/Property/Grub.hs
+++ b/src/Propellor/Property/Grub.hs
@@ -5,6 +5,8 @@ module Propellor.Property.Grub (
installed,
mkConfig,
installed',
+ configured,
+ cmdline_Linux_default,
boots,
bootsMounted,
TimeoutSecs,
@@ -13,11 +15,15 @@ module Propellor.Property.Grub (
import Propellor.Base
import qualified Propellor.Property.File as File
+import qualified Propellor.Property.ConfFile as ConfFile
import qualified Propellor.Property.Apt as Apt
import Propellor.Property.Mount
import Propellor.Property.Chroot (inChroot)
import Propellor.Types.Info
import Propellor.Types.Bootloader
+import Utility.SafeCommand
+
+import Data.List
-- | Eg, \"hd0,0\" or \"xen/xvda1\"
type GrubDevice = String
@@ -53,6 +59,65 @@ installed' grubtarget = setInfoProperty aptinstall
Coreboot -> "grub-coreboot"
Xen -> "grub-xen"
+-- | Sets a simple confguration value, using grub-mkconfig to update
+-- the grub boot menu accordingly. On Debian, these are written to
+-- </etc/default/grub>
+--
+-- Example:
+--
+-- > & Grub.configured "GRUB_TIMEOUT" "10"
+-- > & Grub.configured "GRUB_TERMINAL_INPUT" "console serial"
+configured :: String -> String -> Property DebianLike
+configured k v = ConfFile.adjustSection
+ ("grub configured with " ++ k ++ "=" ++ v)
+ isline
+ (not . isline)
+ (const [l])
+ (const [l])
+ simpleConfigFile
+ `onChange` mkConfig
+ where
+ isline s = (k ++ "=") `isPrefixOf` s
+ l = k ++ "=" ++ shellEscape v
+
+simpleConfigFile :: FilePath
+simpleConfigFile = "/etc/default/grub"
+
+-- | Adds a word to the default linux command line.
+-- Any other words in the command line will be left unchanged.
+--
+-- Example:
+--
+-- > & Grub.cmdline_Linux_default "i915.enable_psr=1"
+-- > ! Grub.cmdline_Linux_default "quiet"
+cmdline_Linux_default :: String -> RevertableProperty DebianLike DebianLike
+cmdline_Linux_default w = setup <!> undo
+ where
+ setup = ConfFile.adjustSection
+ ("linux command line includes " ++ w)
+ isline
+ (not . isline)
+ (map (mkline . addw . getws))
+ (++ [mkline [w]])
+ simpleConfigFile
+ `onChange` mkConfig
+ undo = ConfFile.adjustSection
+ ("linux command line does not include " ++ w)
+ isline
+ (not . isline)
+ (map (mkline . rmw . getws))
+ (++ [mkline [""]])
+ simpleConfigFile
+ `onChange` mkConfig
+ k = "GRUB_CMDLINE_LINUX_DEFAULT"
+ isline s = (k ++ "=") `isPrefixOf` s
+ mkline ws = k ++ "=" ++ shellEscape (unwords ws)
+ getws = concatMap words . shellUnEscape . drop 1 . dropWhile (/= '=')
+ addw ws
+ | w `elem` ws = ws
+ | otherwise = ws ++ [w]
+ rmw = filter (/= w)
+
-- | Installs grub onto a device's boot loader,
-- so the system can boot from that device.
--
diff --git a/src/Propellor/Property/Laptop.hs b/src/Propellor/Property/Laptop.hs
new file mode 100644
index 00000000..a36bda18
--- /dev/null
+++ b/src/Propellor/Property/Laptop.hs
@@ -0,0 +1,28 @@
+module Propellor.Property.Laptop where
+
+import Propellor.Base
+import qualified Propellor.Property.File as File
+import qualified Propellor.Property.Apt as Apt
+import qualified Propellor.Property.Systemd as Systemd
+
+-- | Makes powertop auto-tune the system for optimal power consumption on
+-- boot.
+powertopAutoTuneOnBoot :: RevertableProperty DebianLike DebianLike
+powertopAutoTuneOnBoot = setup <!> undo
+ `describe` "powertop auto-tune on boot"
+ where
+ setup = Systemd.enabled "powertop"
+ `requires` Apt.installed ["powertop"]
+ `requires` File.hasContent servicefile
+ [ "[Unit]"
+ , "Description=Powertop tunings"
+ , "[Service]"
+ , "ExecStart=/usr/sbin/powertop --auto-tune"
+ , "RemainAfterExit=true"
+ , "[Install]"
+ , "WantedBy=multi-user.target"
+ ]
+ undo = tightenTargets $ File.notPresent servicefile
+ `requires` check (doesFileExist servicefile)
+ (Systemd.disabled "powertop")
+ servicefile = "/etc/systemd/system/powertop.service"
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index f6437c64..b48f613b 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -948,10 +948,9 @@ homePowerMonitor user hosts ctx sshkey = propertyList "home power monitor" $ pro
, "[Install]"
, "WantedBy=multi-user.target"
]
- -- Only upload when eth0 is up; eg the satellite internet is up.
-- Any changes to the rsync command will need my .authorized_keys
-- rsync server command to be updated too.
- rsynccommand = "if ip route | grep '^default' | grep -q eth0; then rsync -e 'ssh -i" ++ sshkeyfile ++ "' -avz rrds/recent/ joey@kitenet.net:/srv/web/homepower.joeyh.name/rrds/recent/; fi"
+ rsynccommand = "rsync -e 'ssh -i" ++ sshkeyfile ++ "' -avz rrds/recent/ joey@kitenet.net:/srv/web/homepower.joeyh.name/rrds/recent/"
-- My home router, running hostapd and dnsmasq for wlan0,
-- with eth0 connected to a satellite modem, and a fallback ppp connection.
@@ -1078,5 +1077,4 @@ devSoftware = Apt.installed
, "hothasktags", "hdevtools", "hlint"
, "gdb", "dpkg-repack", "lintian"
, "pristine-tar", "github-backup"
- , "kvm"
]