diff --git a/home-manager/machines.nix b/home-manager/machines.nix index aa65e40d..de3a809e 100644 --- a/home-manager/machines.nix +++ b/home-manager/machines.nix @@ -156,13 +156,13 @@ in { (import ./roles/state.nix "default") ]; hera.default = makeConfig "hera" (on-my-machines - ++ [ - ./roles/fetch-banking-timer.nix - ./roles/weechat - ./roles/mail-sort.nix - ./roles/mail2rss.nix - ./roles/headless-mpd.nix - ./roles/headless.nix - ./roles/create-plans.nix - ]); + ++ [ + ./roles/fetch-banking-timer.nix + ./roles/weechat + ./roles/mail-sort.nix + ./roles/mail2rss.nix + ./roles/headless-mpd.nix + ./roles/headless.nix + ./roles/create-plans.nix + ]); } diff --git a/home-manager/roles/battery.nix b/home-manager/roles/battery.nix index 33bd033b..c16c6000 100644 --- a/home-manager/roles/battery.nix +++ b/home-manager/roles/battery.nix @@ -4,65 +4,66 @@ config, ... }: let - battery-watch = pkgs.writeHaskellScript - { - name = "battery-watch"; - bins = [pkgs.acpi]; - imports = [ - "DBus.Notify" - "Control.Concurrent" - "Text.Megaparsec" - "Text.Megaparsec.Char" - "Text.Megaparsec.Char.Lexer" - "Replace.Megaparsec" - "Data.Maybe" - ]; - } '' - moderateLevel = 50 -- percent - lowLevel = 20 -- percent - criticalLevel = 8 -- percent - minute = 60 * 1000 * 1000 -- threadDelay takes microseconds + battery-watch = + pkgs.writeHaskellScript + { + name = "battery-watch"; + bins = [pkgs.acpi]; + imports = [ + "DBus.Notify" + "Control.Concurrent" + "Text.Megaparsec" + "Text.Megaparsec.Char" + "Text.Megaparsec.Char.Lexer" + "Replace.Megaparsec" + "Data.Maybe" + ]; + } '' + moderateLevel = 50 -- percent + lowLevel = 20 -- percent + criticalLevel = 8 -- percent + minute = 60 * 1000 * 1000 -- threadDelay takes microseconds - main = do - client <- connectSession - let loop = \lastState handleMay -> do - newState <- getState - let noteMay = chooseAction lastState newState - handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay - | otherwise -> pure handleMay - threadDelay $ minute `div` 4 - loop newState handle - loop (BatState True 100) Nothing + main = do + client <- connectSession + let loop = \lastState handleMay -> do + newState <- getState + let noteMay = chooseAction lastState newState + handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay + | otherwise -> pure handleMay + threadDelay $ minute `div` 4 + loop newState handle + loop (BatState True 100) Nothing - data BatState = BatState { charging :: Bool, level :: Int } + data BatState = BatState { charging :: Bool, level :: Int } - getState = do - batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim) - batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim) - chargerOnline <- maybe (fail "Couldn‘t get charging state") pure $ parseMaybe onlineParser batteryStateText - batteryLevel <- maybe (fail "Couldn‘t get battery level") pure $ parseMaybe levelParser batteryLevelText - pure $ BatState chargerOnline batteryLevel + getState = do + batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim) + batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim) + chargerOnline <- maybe (fail "Couldn‘t get charging state") pure $ parseMaybe onlineParser batteryStateText + batteryLevel <- maybe (fail "Couldn‘t get battery level") pure $ parseMaybe levelParser batteryLevelText + pure $ BatState chargerOnline batteryLevel - type Parser = Parsec Text LText + type Parser = Parsec Text LText - onlineParser :: Parser Bool - onlineParser = not . null . rights <$> sepCap (string "on-line") + onlineParser :: Parser Bool + onlineParser = not . null . rights <$> sepCap (string "on-line") - levelParser :: Parser Int - levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%") + levelParser :: Parser Int + levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%") - chooseAction :: BatState -> BatState -> Maybe Note - chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel) - | wasCharging && isCharging = Nothing - | wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." } - | not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 } - | currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" } - | currentLevel <= lowLevel && currentLevel < lastLevel = Just $ myNote{summary = "Battery is low!"} - | ((currentLevel `mod` 5 == 0 && currentLevel <= moderateLevel) || (currentLevel `mod` 10 == 0)) && currentLevel < lastLevel = Just $ myNote{summary = "Battery is discharging."} - | otherwise = Nothing - where - myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]} - ''; + chooseAction :: BatState -> BatState -> Maybe Note + chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel) + | wasCharging && isCharging = Nothing + | wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." } + | not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 } + | currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" } + | currentLevel <= lowLevel && currentLevel < lastLevel = Just $ myNote{summary = "Battery is low!"} + | ((currentLevel `mod` 5 == 0 && currentLevel <= moderateLevel) || (currentLevel `mod` 10 == 0)) && currentLevel < lastLevel = Just $ myNote{summary = "Battery is discharging."} + | otherwise = Nothing + where + myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]} + ''; in { systemd.user = { services.battery = { diff --git a/home-manager/roles/chat.nix b/home-manager/roles/chat.nix index fcd76809..57284ed5 100644 --- a/home-manager/roles/chat.nix +++ b/home-manager/roles/chat.nix @@ -1,9 +1,10 @@ {pkgs, ...}: { - home.packages = builtins.attrValues - { - inherit (pkgs) discord signal-desktop tdesktop element-desktop; - weechat = pkgs.writeShellScriptBin "weechat" "ssh -t hera 'TMUX_TMPDIR=/run/user/1000 tmux -L weechat attach'"; - }; + home.packages = + builtins.attrValues + { + inherit (pkgs) discord signal-desktop tdesktop element-desktop; + weechat = pkgs.writeShellScriptBin "weechat" "ssh -t hera 'TMUX_TMPDIR=/run/user/1000 tmux -L weechat attach'"; + }; xdg.configFile."Element/config.json".text = builtins.toJSON { showLabsSettings = true; }; diff --git a/home-manager/roles/create-plans.nix b/home-manager/roles/create-plans.nix index 62425ed1..0c5c1a39 100644 --- a/home-manager/roles/create-plans.nix +++ b/home-manager/roles/create-plans.nix @@ -1,29 +1,31 @@ {pkgs, ...}: let - plans = pkgs.privateValue - { - "workDay" = "pass"; - "weekend" = "pass"; - } - "plans"; - createPlans = pkgs.writeHaskellScript - { - name = "create-plans"; - bins = [pkgs.khal pkgs.vdirsyncer]; - imports = [ - "Data.Time" - ]; - } '' - main = do - today <- localDay . zonedTimeToLocalTime <$> getZonedTime - [0..7] & fmap (`addDays` today) & mapM_ \day -> do - planned <- khal ["list", "-a", "Planung", show day, "06:00", "24h", "--notstarted"] |> captureTrim - when (LBS.null planned) $ do - say $ "Creating events for " <> show day - if (dayOfWeek day `elem` [Saturday, Sunday]) then do - ${plans.weekend} - else do - ${plans.workDay} - ''; + plans = + pkgs.privateValue + { + "workDay" = "pass"; + "weekend" = "pass"; + } + "plans"; + createPlans = + pkgs.writeHaskellScript + { + name = "create-plans"; + bins = [pkgs.khal pkgs.vdirsyncer]; + imports = [ + "Data.Time" + ]; + } '' + main = do + today <- localDay . zonedTimeToLocalTime <$> getZonedTime + [0..7] & fmap (`addDays` today) & mapM_ \day -> do + planned <- khal ["list", "-a", "Planung", show day, "06:00", "24h", "--notstarted"] |> captureTrim + when (LBS.null planned) $ do + say $ "Creating events for " <> show day + if (dayOfWeek day `elem` [Saturday, Sunday]) then do + ${plans.weekend} + else do + ${plans.workDay} + ''; in { systemd.user = { services.create-plans = { diff --git a/home-manager/roles/daily-driver-programs.nix b/home-manager/roles/daily-driver-programs.nix index 4ed74224..0425d244 100644 --- a/home-manager/roles/daily-driver-programs.nix +++ b/home-manager/roles/daily-driver-programs.nix @@ -20,12 +20,14 @@ inherit (pkgs) # web + chromium mumble upower speedtest-cli acpi # tools & office + feh gimp imagemagick @@ -38,6 +40,7 @@ beets zbar # media + ncpamixer pavucontrol playerctl diff --git a/home-manager/roles/mail-sort.nix b/home-manager/roles/mail-sort.nix index 36dd3982..88dad707 100644 --- a/home-manager/roles/mail-sort.nix +++ b/home-manager/roles/mail-sort.nix @@ -40,77 +40,78 @@ builtins.map filter.simpleSortList lists.sortLists ++ builtins.map filter.stupidList lists.stupidLists ++ builtins.map filter.notifications lists.notifications; - sortMail = pkgs.writeHaskellScript - { - name = "sort-mail-archive"; - bins = [pkgs.notmuch pkgs.coreutils pkgs.mblaze pkgs.findutils]; - imports = [ - "Text.Megaparsec" - "Text.Megaparsec.Char" - "Text.Megaparsec.Char.Lexer" - "qualified Data.List.NonEmpty as NE" - "qualified Data.Text as T" - "System.Environment (setEnv)" - ]; - } '' - reScan = notmuch "new" "--quiet" + sortMail = + pkgs.writeHaskellScript + { + name = "sort-mail-archive"; + bins = [pkgs.notmuch pkgs.coreutils pkgs.mblaze pkgs.findutils]; + imports = [ + "Text.Megaparsec" + "Text.Megaparsec.Char" + "Text.Megaparsec.Char.Lexer" + "qualified Data.List.NonEmpty as NE" + "qualified Data.Text as T" + "System.Environment (setEnv)" + ]; + } '' + reScan = notmuch "new" "--quiet" - findFilterMail :: (Text,Text) -> IO (Maybe (LByteString, Text, Text)) - findFilterMail (filter_, target) = do - files <- notmuch "search" "--output" "files" (toString filter_) "folder:${unsortedSuffix}" |> capture - pure $ if (LBS.length files > 0) then Just (files, filter_, target) else Nothing + findFilterMail :: (Text,Text) -> IO (Maybe (LByteString, Text, Text)) + findFilterMail (filter_, target) = do + files <- notmuch "search" "--output" "files" (toString filter_) "folder:${unsortedSuffix}" |> capture + pure $ if (LBS.length files > 0) then Just (files, filter_, target) else Nothing - executeFilterMail :: (LByteString, Text, Text) -> IO () - executeFilterMail (files, filter_, target) = do - say [i|Sorting "#{filter_}" into #{target}|] - writeOutput files |> mscan - mmkdir ([i|${archive}/#{target}|] :: String) - writeOutput files |> mrefile ([i|${archive}/#{target}|] :: String) + executeFilterMail :: (LByteString, Text, Text) -> IO () + executeFilterMail (files, filter_, target) = do + say [i|Sorting "#{filter_}" into #{target}|] + writeOutput files |> mscan + mmkdir ([i|${archive}/#{target}|] :: String) + writeOutput files |> mrefile ([i|${archive}/#{target}|] :: String) - myFilters :: [(Text,Text)] - myFilters = [${ - lib.concatStringsSep "," - ( - builtins.map ({ - filter, - target, - }: ''("${filter}","${target}")'') - myFilters - ) - }] + myFilters :: [(Text,Text)] + myFilters = [${ + lib.concatStringsSep "," + ( + builtins.map ({ + filter, + target, + }: ''("${filter}","${target}")'') + myFilters + ) + }] - filtersFromTo :: Text -> Maybe (Text,Text) - filtersFromTo = filtersFromField "to" [toToName] - toToName :: Text -> Maybe Text - toToName (T.splitOn "@" -> [name, "maralorn.de"]) - | not (T.isInfixOf "randy" name) = Just . ("to/" <>) . T.intercalate "_" . T.splitOn "." $ name - toToName _ = Nothing - filtersFromField :: Text -> [Text-> Maybe Text] -> Text -> Maybe (Text,Text) - filtersFromField field filters text = fmap ([i|#{field}:#{text}|],) . viaNonEmpty Relude.head . mapMaybe ($ text) $ filters - filtersFromListIDs :: Text -> Maybe (Text,Text) - filtersFromListIDs = filtersFromField "List" [githubNameFolderFromId, gitlabNameFolderFromId] - githubNameFolderFromId :: Text -> Maybe Text - githubNameFolderFromId (reverse . T.splitOn "." -> ("com":"github":org:name)) = Just [i|github/#{org}/#{T.intercalate "_" $ reverse name}|] - githubNameFolderFromId _ = Nothing - gitlabNameFolderFromId :: Text -> Maybe Text - gitlabNameFolderFromId (reverse . T.splitOn "." -> ("de":"ccc":"darmstadt":"git":org:name1:name)) = Just [i|cda-gitlab/#{org}/#{T.intercalate "_" . toList . Relude.tail $ NE.reverse (name1:|name)}|] - gitlabNameFolderFromId _ = Nothing + filtersFromTo :: Text -> Maybe (Text,Text) + filtersFromTo = filtersFromField "to" [toToName] + toToName :: Text -> Maybe Text + toToName (T.splitOn "@" -> [name, "maralorn.de"]) + | not (T.isInfixOf "randy" name) = Just . ("to/" <>) . T.intercalate "_" . T.splitOn "." $ name + toToName _ = Nothing + filtersFromField :: Text -> [Text-> Maybe Text] -> Text -> Maybe (Text,Text) + filtersFromField field filters text = fmap ([i|#{field}:#{text}|],) . viaNonEmpty Relude.head . mapMaybe ($ text) $ filters + filtersFromListIDs :: Text -> Maybe (Text,Text) + filtersFromListIDs = filtersFromField "List" [githubNameFolderFromId, gitlabNameFolderFromId] + githubNameFolderFromId :: Text -> Maybe Text + githubNameFolderFromId (reverse . T.splitOn "." -> ("com":"github":org:name)) = Just [i|github/#{org}/#{T.intercalate "_" $ reverse name}|] + githubNameFolderFromId _ = Nothing + gitlabNameFolderFromId :: Text -> Maybe Text + gitlabNameFolderFromId (reverse . T.splitOn "." -> ("de":"ccc":"darmstadt":"git":org:name1:name)) = Just [i|cda-gitlab/#{org}/#{T.intercalate "_" . toList . Relude.tail $ NE.reverse (name1:|name)}|] + gitlabNameFolderFromId _ = Nothing - type Parser = Parsec Text Text - listId :: Parser Text - listId = manyTill anySingle (char '<') *> (toText <$> manyTill anySingle (char '>')) + type Parser = Parsec Text Text + listId :: Parser Text + listId = manyTill anySingle (char '<') *> (toText <$> manyTill anySingle (char '>')) - main = do - setEnv "MBLAZE_PAGER" "cat" - setEnv "NOTMUCH_CONFIG" "${config.home.sessionVariables.NOTMUCH_CONFIG or ""}" - reScan - (listIDs,tos) <- concurrently (mhdr "-h" "List-ID" "-d" "${unsorted}" |> capture) (mhdr "-h" "To" "-d" "${unsorted}" "-A" |> capture) - let listFilters = mapMaybe filtersFromListIDs . sortNub . mapMaybe (parseMaybe listId) . lines . decodeUtf8 $ listIDs - toFilters = mapMaybe filtersFromTo . sortNub . fmap (\x -> maybe x Relude.id $ parseMaybe listId x) . lines . decodeUtf8 $ tos - applicableFilters <- catMaybes <$> forConcurrently (listFilters <> myFilters <> toFilters) findFilterMail - for_ applicableFilters executeFilterMail - reScan - ''; + main = do + setEnv "MBLAZE_PAGER" "cat" + setEnv "NOTMUCH_CONFIG" "${config.home.sessionVariables.NOTMUCH_CONFIG or ""}" + reScan + (listIDs,tos) <- concurrently (mhdr "-h" "List-ID" "-d" "${unsorted}" |> capture) (mhdr "-h" "To" "-d" "${unsorted}" "-A" |> capture) + let listFilters = mapMaybe filtersFromListIDs . sortNub . mapMaybe (parseMaybe listId) . lines . decodeUtf8 $ listIDs + toFilters = mapMaybe filtersFromTo . sortNub . fmap (\x -> maybe x Relude.id $ parseMaybe listId x) . lines . decodeUtf8 $ tos + applicableFilters <- catMaybes <$> forConcurrently (listFilters <> myFilters <> toFilters) findFilterMail + for_ applicableFilters executeFilterMail + reScan + ''; in { services.mbsync.postExec = "${sortMail}/bin/sort-mail-archive"; accounts.email.accounts = lib.mkIf pkgs.withSecrets { diff --git a/home-manager/roles/mail2rss.nix b/home-manager/roles/mail2rss.nix index 3fe155b7..f97a11c9 100644 --- a/home-manager/roles/mail2rss.nix +++ b/home-manager/roles/mail2rss.nix @@ -4,24 +4,25 @@ config, ... }: let - mail2rss = pkgs.writeHaskellScript - { - name = "mail2rss"; - bins = [pkgs.notmuch pkgs.mblaze pkgs.isync pkgs.logfeed]; - imports = ["System.Environment (setEnv)"]; - } '' - main = do - setEnv "NOTMUCH_CONFIG" "${ - config.home.sessionVariables.NOTMUCH_CONFIG or "" - }" - mbsync "-a" - notmuch "new" "--quiet" - mail2rss "${config.accounts.email.maildirBasePath}" "hera/Move/readlater" &> Truncate "/var/www/rss/mails2.xml" - files <- notmuch "search" "--output" "files" "folder:hera/Move/readlater" |> capture - writeOutput files |> mrefile "${config.accounts.email.maildirBasePath}/hera/Archiv/unsortiert" - mbsync "-a" - notmuch "new" "--quiet" - ''; + mail2rss = + pkgs.writeHaskellScript + { + name = "mail2rss"; + bins = [pkgs.notmuch pkgs.mblaze pkgs.isync pkgs.logfeed]; + imports = ["System.Environment (setEnv)"]; + } '' + main = do + setEnv "NOTMUCH_CONFIG" "${ + config.home.sessionVariables.NOTMUCH_CONFIG or "" + }" + mbsync "-a" + notmuch "new" "--quiet" + mail2rss "${config.accounts.email.maildirBasePath}" "hera/Move/readlater" &> Truncate "/var/www/rss/mails2.xml" + files <- notmuch "search" "--output" "files" "folder:hera/Move/readlater" |> capture + writeOutput files |> mrefile "${config.accounts.email.maildirBasePath}/hera/Archiv/unsortiert" + mbsync "-a" + notmuch "new" "--quiet" + ''; in { systemd.user = { timers.mail2rss = { diff --git a/home-manager/roles/mode-switching.nix b/home-manager/roles/mode-switching.nix index 952c31d4..eccd30d6 100644 --- a/home-manager/roles/mode-switching.nix +++ b/home-manager/roles/mode-switching.nix @@ -34,55 +34,58 @@ in { exe ([i|${modeDir}/#{mode}/activate|] :: String) whenM (elem wallpaperCmd <$> pathBins) $ exe wallpaperCmd ''; - updateModes = pkgs.writeHaskellScript - { - name = "update-modes"; - bins = [activateMode pkgs.git pkgs.nix-output-monitor]; - } '' - params = ["${configPath}/home-manager/target.nix", "-A", "${hostName}"] + updateModes = + pkgs.writeHaskellScript + { + name = "update-modes"; + bins = [activateMode pkgs.git pkgs.nix-output-monitor]; + } '' + params = ["${configPath}/home-manager/target.nix", "-A", "${hostName}"] - main = do - say "Building ~/.modes for ${hostName}" - nixPath <- myNixPath "${configPath}" - setEnv "WITH_SECRETS" "false" - nom_build nixPath (params ++ remoteBuildParams ++ ["--no-out-link"]) - setEnv "WITH_SECRETS" "true" - nom_build nixPath (params ++ ["-o", "${modeDir}"]) - activate_mode - ''; - quickUpdateMode = pkgs.writeHaskellScript - { - name = "quick-update-mode"; - bins = [updateModes pkgs.git pkgs.home-manager pkgs.nix-output-monitor]; - } '' - getMode :: IO Text - getMode = decodeUtf8 <$> (cat "${modeFile}" |> captureTrim) + main = do + say "Building ~/.modes for ${hostName}" + nixPath <- myNixPath "${configPath}" + setEnv "WITH_SECRETS" "false" + nom_build nixPath (params ++ remoteBuildParams ++ ["--no-out-link"]) + setEnv "WITH_SECRETS" "true" + nom_build nixPath (params ++ ["-o", "${modeDir}"]) + activate_mode + ''; + quickUpdateMode = + pkgs.writeHaskellScript + { + name = "quick-update-mode"; + bins = [updateModes pkgs.git pkgs.home-manager pkgs.nix-output-monitor]; + } '' + getMode :: IO Text + getMode = decodeUtf8 <$> (cat "${modeFile}" |> captureTrim) - main = do - nixPath <- myNixPath "${configPath}" - mode <- getMode - say [i|Quick switching to mode #{mode} ...|] - ignoreFailure (home_manager (nixPath <> ["switch", "-A", [i|${hostName}-#{mode}|]])) &!> StdOut |> nom - update_modes - ''; - selectMode = pkgs.writeHaskellScript - { - name = "select-mode"; - bins = [ - pkgs.dialog - activateMode - pkgs.ncurses - pkgs.psmisc - ]; - } '' - main = do - mode <- decodeUtf8 <$> (dialog "--menu" "Select Mode" "20" "80" "5" ${ - lib.concatStrings (map (mode: ''"${mode}" "" '') modes) - } |!> captureTrim) - clear - writeFile "${modeFile}" mode - activate_mode - ignoreFailure $ killall "GeckoMain" - ''; + main = do + nixPath <- myNixPath "${configPath}" + mode <- getMode + say [i|Quick switching to mode #{mode} ...|] + ignoreFailure (home_manager (nixPath <> ["switch", "-A", [i|${hostName}-#{mode}|]])) &!> StdOut |> nom + update_modes + ''; + selectMode = + pkgs.writeHaskellScript + { + name = "select-mode"; + bins = [ + pkgs.dialog + activateMode + pkgs.ncurses + pkgs.psmisc + ]; + } '' + main = do + mode <- decodeUtf8 <$> (dialog "--menu" "Select Mode" "20" "80" "5" ${ + lib.concatStrings (map (mode: ''"${mode}" "" '') modes) + } |!> captureTrim) + clear + writeFile "${modeFile}" mode + activate_mode + ignoreFailure $ killall "GeckoMain" + ''; }; } diff --git a/home-manager/roles/neovim/default.nix b/home-manager/roles/neovim/default.nix index 701337e4..b107a3e6 100644 --- a/home-manager/roles/neovim/default.nix +++ b/home-manager/roles/neovim/default.nix @@ -32,61 +32,88 @@ in { inherit (pkgs.vimPlugins) # coc-tabnine (TODO: Why doesn‘t it work?) + # TODO: tabnine config in home-manager + # TODO: tabnine lsp: nix, rust, pandoc/latex lsp? was noch? + # === + # Basic IDE plugins + coc-nvim airline # same word highlighting when not supported by language + coc-highlight coc-explorer # searches + coc-fzf fzf-vim # general whitespace + vim-trailing-whitespace vim-autoformat # Git + coc-git # statusline, numberline and explorer infos + fugitive # various git commands + # Commenting and Uncommenting + nerdcommenter # Theme + papercolor-theme vim-airline-themes LanguageTool-nvim vim-css-color vista-vim # === + # Languages + # haskell syntax highlighting + haskell-vim vim-hoogle # nix syntax highlighting + vim-nix vim-markdown # latex + vimtex coc-vimtex # not sure if I need two + # ledger + vim-ledger # rust + coc-rls # python + coc-python # css + coc-css # yaml + coc-yaml # json + coc-json # html + coc-html # dhall + dhall-vim ; }; diff --git a/home-manager/roles/night-shutdown.nix b/home-manager/roles/night-shutdown.nix index ecf12c55..ab4324d7 100644 --- a/home-manager/roles/night-shutdown.nix +++ b/home-manager/roles/night-shutdown.nix @@ -1,32 +1,33 @@ {pkgs, ...}: let - night-shutdown = pkgs.writeHaskellScript - { - name = "night-shutdown"; - imports = [ - "Data.Time.LocalTime" - "Data.Time.Format" - "Data.Time.Clock" - "Control.Concurrent" - "Data.Functor" - ]; - bins = [pkgs.libnotify pkgs.systemd]; - } '' - interval = 5 + night-shutdown = + pkgs.writeHaskellScript + { + name = "night-shutdown"; + imports = [ + "Data.Time.LocalTime" + "Data.Time.Format" + "Data.Time.Clock" + "Control.Concurrent" + "Data.Functor" + ]; + bins = [pkgs.libnotify pkgs.systemd]; + } '' + interval = 5 - main = forever $ do - time <- getZonedTime - let tod = localTimeOfDay . zonedTimeToLocalTime$ time - hour = todHour tod - minute = todMin tod - evening = hour == 0 - night = (hour < 6 && hour >= 1) - action - | evening = notify_send "Shutdown alert!" ([i|Rechner fährt in #{59-minute} Minuten runter.|]::String) - | night = systemctl "poweroff" - | otherwise = pass - action - threadDelay $ (interval - (minute `mod` interval)) * 60 * 1000000 - ''; + main = forever $ do + time <- getZonedTime + let tod = localTimeOfDay . zonedTimeToLocalTime$ time + hour = todHour tod + minute = todMin tod + evening = hour == 0 + night = (hour < 6 && hour >= 1) + action + | evening = notify_send "Shutdown alert!" ([i|Rechner fährt in #{59-minute} Minuten runter.|]::String) + | night = systemctl "poweroff" + | otherwise = pass + action + threadDelay $ (interval - (minute `mod` interval)) * 60 * 1000000 + ''; in { systemd.user.services.night-shutdown = { Unit.Description = "Night Shutdown"; diff --git a/home-manager/roles/status-script.nix b/home-manager/roles/status-script.nix index bef61100..90d04dbd 100644 --- a/home-manager/roles/status-script.nix +++ b/home-manager/roles/status-script.nix @@ -1,13 +1,14 @@ {pkgs, ...}: let - status-script = pkgs.writeHaskell "status-script" - { - libraries = builtins.attrValues pkgs.myHaskellScriptPackages; - ghcEnv = { - PATH = "${pkgs.lib.makeBinPath [pkgs.git pkgs.notmuch pkgs.playerctl pkgs.khal]}:$PATH"; - }; - ghcArgs = ["-threaded"]; - } - (builtins.readFile ./status-script.hs); + status-script = + pkgs.writeHaskell "status-script" + { + libraries = builtins.attrValues pkgs.myHaskellScriptPackages; + ghcEnv = { + PATH = "${pkgs.lib.makeBinPath [pkgs.git pkgs.notmuch pkgs.playerctl pkgs.khal]}:$PATH"; + }; + ghcArgs = ["-threaded"]; + } + (builtins.readFile ./status-script.hs); in { systemd.user.services.status-script = { Unit.Description = "Status Script"; diff --git a/home-manager/roles/vdirsyncer.nix b/home-manager/roles/vdirsyncer.nix index c0ea63bc..b65b117d 100644 --- a/home-manager/roles/vdirsyncer.nix +++ b/home-manager/roles/vdirsyncer.nix @@ -85,14 +85,15 @@ }; }; in { - xdg.configFile."vdirsyncer/config".source = mkConfig - ( - pkgs.lib.fold (a: b: a // b) - { - general.status_path = "~/.vdirsyncer/status"; - } - (map mkCalendar calendars ++ map mkAddressbook addressbooks) - ); + xdg.configFile."vdirsyncer/config".source = + mkConfig + ( + pkgs.lib.fold (a: b: a // b) + { + general.status_path = "~/.vdirsyncer/status"; + } + (map mkCalendar calendars ++ map mkAddressbook addressbooks) + ); home.packages = [pkgs.vdirsyncer]; systemd.user = { diff --git a/home-manager/roles/wallpaper.nix b/home-manager/roles/wallpaper.nix index d4c9fe7c..49e22a9f 100644 --- a/home-manager/roles/wallpaper.nix +++ b/home-manager/roles/wallpaper.nix @@ -5,22 +5,23 @@ }: let modeFile = "${config.home.homeDirectory}/.mode"; wallPapers = "${config.home.homeDirectory}/media/images/wallpapers"; - randomWallpaper = pkgs.writeHaskellScript - { - name = "random-wallpaper"; - imports = ["System.Random"]; - bins = [pkgs.coreutils pkgs.glib]; - } '' - main = do - mode <- cat "${modeFile}" |> captureTrim - (lines . decodeUtf8 -> files) <- ls ([i|${wallPapers}/#{mode}|] :: String) |> captureTrim - ((files Unsafe.!!) -> file) <- getStdRandom $ randomR (0, length files - 1) - (decodeUtf8 -> current) <- gsettings "get" "org.gnome.desktop.background" "picture-uri" |> captureTrim - let new = [i|file:///${wallPapers}/#{mode}/#{file}|] :: String - when (new /= current) $ do - gsettings "set" "org.gnome.desktop.background" "picture-uri" new - gsettings "set" "org.gnome.desktop.screensaver" "picture-uri" new - ''; + randomWallpaper = + pkgs.writeHaskellScript + { + name = "random-wallpaper"; + imports = ["System.Random"]; + bins = [pkgs.coreutils pkgs.glib]; + } '' + main = do + mode <- cat "${modeFile}" |> captureTrim + (lines . decodeUtf8 -> files) <- ls ([i|${wallPapers}/#{mode}|] :: String) |> captureTrim + ((files Unsafe.!!) -> file) <- getStdRandom $ randomR (0, length files - 1) + (decodeUtf8 -> current) <- gsettings "get" "org.gnome.desktop.background" "picture-uri" |> captureTrim + let new = [i|file:///${wallPapers}/#{mode}/#{file}|] :: String + when (new /= current) $ do + gsettings "set" "org.gnome.desktop.background" "picture-uri" new + gsettings "set" "org.gnome.desktop.screensaver" "picture-uri" new + ''; in { home.packages = [randomWallpaper]; systemd.user = { diff --git a/home-manager/roles/weechat/default.nix b/home-manager/roles/weechat/default.nix index 09d25656..2b23e1cc 100644 --- a/home-manager/roles/weechat/default.nix +++ b/home-manager/roles/weechat/default.nix @@ -8,10 +8,11 @@ with lib; let weechat = pkgs.wrapWeechat pkgs.weechat-unwrapped { configure = {availablePlugins, ...}: { plugins = builtins.attrValues (availablePlugins - // { - python = availablePlugins.python.withPackages - (_: [pkgs.weechatScripts.weechat-matrix]); - }); + // { + python = + availablePlugins.python.withPackages + (_: [pkgs.weechatScripts.weechat-matrix]); + }); scripts = [pkgs.weechatScripts.weechat-matrix]; }; }; @@ -73,12 +74,12 @@ in { [server] ${ lib.concatStringsSep "\n" (lib.mapAttrsToList - (server: serverConfig: '' - ${server}.address = "${serverConfig.address}" - ${server}.autoconnect = on - ${server}.username = "${serverConfig.user}" - ${server}.password = "${serverConfig.password}" - '') (pkgs.privateValue {} "weechat/matrix")) + (server: serverConfig: '' + ${server}.address = "${serverConfig.address}" + ${server}.autoconnect = on + ${server}.username = "${serverConfig.user}" + ${server}.password = "${serverConfig.password}" + '') (pkgs.privateValue {} "weechat/matrix")) } ''; }; diff --git a/home.nix b/home.nix index dca2b17f..951bf665 100644 --- a/home.nix +++ b/home.nix @@ -3,12 +3,12 @@ let modes = import home-manager/machines.nix; in lib.listToAttrs (lib.flatten (lib.mapAttrsToList - ( - host: - lib.mapAttrsToList - (mode: config: { - name = "${host}-${mode}"; - value = config; - }) - ) - modes)) + ( + host: + lib.mapAttrsToList + (mode: config: { + name = "${host}-${mode}"; + value = config; + }) + ) + modes)) diff --git a/lib/update-system.nix b/lib/update-system.nix index 06408e9b..fcf07daa 100644 --- a/lib/update-system.nix +++ b/lib/update-system.nix @@ -4,20 +4,21 @@ }: let configPath = "/etc/nixos"; in { - update-system = pkgs.writeHaskellScript - { - name = "update-system"; - bins = [nixos-rebuild pkgs.nix-output-monitor pkgs.nvd]; - } '' - main = do - paths <- myNixPath "${configPath}" - args <- getArgs - setEnv "WITH_SECRETS" "false" - nom_build (paths ++ buildSystemParams ++ ["--no-out-link"] ++ remoteBuildParams ++ fmap toString args) - setEnv "WITH_SECRETS" "true" - oldSystem <- readlink "-f" "/run/current-system" |> captureTrim - nixos_rebuild (paths ++ ["switch"] ++ fmap toString args) &!> StdOut |> nom - newSystem <- readlink "-f" "/run/current-system" |> captureTrim - nvd "diff" oldSystem newSystem - ''; + update-system = + pkgs.writeHaskellScript + { + name = "update-system"; + bins = [nixos-rebuild pkgs.nix-output-monitor pkgs.nvd]; + } '' + main = do + paths <- myNixPath "${configPath}" + args <- getArgs + setEnv "WITH_SECRETS" "false" + nom_build (paths ++ buildSystemParams ++ ["--no-out-link"] ++ remoteBuildParams ++ fmap toString args) + setEnv "WITH_SECRETS" "true" + oldSystem <- readlink "-f" "/run/current-system" |> captureTrim + nixos_rebuild (paths ++ ["switch"] ++ fmap toString args) &!> StdOut |> nom + newSystem <- readlink "-f" "/run/current-system" |> captureTrim + nvd "diff" oldSystem newSystem + ''; } diff --git a/nix/sources.nix b/nix/sources.nix index 83d461af..124d0f15 100644 --- a/nix/sources.nix +++ b/nix/sources.nix @@ -36,11 +36,13 @@ let fetch_git = name: spec: let ref = spec.ref - or (if spec ? branch - then "refs/heads/${spec.branch}" - else if spec ? tag - then "refs/tags/${spec.tag}" - else abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"); + or ( + if spec ? branch + then "refs/heads/${spec.branch}" + else if spec ? tag + then "refs/tags/${spec.tag}" + else abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!" + ); in builtins.fetchGit { url = spec.repo; diff --git a/nixos/machines/hera/cloud.nix b/nixos/machines/hera/cloud.nix index 8dee4e5c..cb894e88 100644 --- a/nixos/machines/hera/cloud.nix +++ b/nixos/machines/hera/cloud.nix @@ -5,12 +5,13 @@ ... }: with lib; let - adminCreds = pkgs.privateValue - { - adminpass = ""; - dbpass = ""; - adminuser = ""; - } "nextcloud-admin"; + adminCreds = + pkgs.privateValue + { + adminpass = ""; + dbpass = ""; + adminuser = ""; + } "nextcloud-admin"; inherit (config.m-0) hosts; certPath = "/var/lib/acme"; nextcloudServices = hostname: { diff --git a/nixos/machines/hera/configuration.nix b/nixos/machines/hera/configuration.nix index 699beecb..c9d7d2c1 100644 --- a/nixos/machines/hera/configuration.nix +++ b/nixos/machines/hera/configuration.nix @@ -64,9 +64,10 @@ in { systemd.services = { pg_backup = { - script = lib.concatMapStringsSep "\n" - (name: "${config.services.postgresql.package}/bin/pg_dump ${name} > /var/lib/db-backup-dumps/${name}") - config.services.postgresql.ensureDatabases; + script = + lib.concatMapStringsSep "\n" + (name: "${config.services.postgresql.package}/bin/pg_dump ${name} > /var/lib/db-backup-dumps/${name}") + config.services.postgresql.ensureDatabases; serviceConfig = { User = "postgres"; Type = "oneshot"; @@ -95,10 +96,10 @@ in { }; } // lib.listToAttrs (map (name: { - inherit name; - value = {serviceConfig.Type = "oneshot";}; - }) - backupJobNames); + inherit name; + value = {serviceConfig.Type = "oneshot";}; + }) + backupJobNames); services = { postgresql = { enable = true; diff --git a/nixos/machines/hera/mail.nix b/nixos/machines/hera/mail.nix index 5484eb88..ac976141 100644 --- a/nixos/machines/hera/mail.nix +++ b/nixos/machines/hera/mail.nix @@ -29,8 +29,9 @@ in { }; rspamd.locals = { "multimap.conf".text = let - allow-ip = builtins.toFile "allow-ip.map" '' - ''; + allow-ip = + builtins.toFile "allow-ip.map" '' + ''; allow-host = builtins.toFile "allow-host.map" '' gmx.de web.de diff --git a/nixos/roles/coturn.nix b/nixos/roles/coturn.nix index a7d2156f..d2ca40c9 100644 --- a/nixos/roles/coturn.nix +++ b/nixos/roles/coturn.nix @@ -45,7 +45,7 @@ in { cert = "${key_dir}/fullchain.pem"; static-auth-secret = (pkgs.privateValue {turn_shared_secret = "";} - "matrix/server-secrets") + "matrix/server-secrets") .turn_shared_secret; realm = fqdn; listening-ips = [config.m-0.hosts.hera config.m-0.hosts.hera-v4]; diff --git a/nixos/roles/default.nix b/nixos/roles/default.nix index aa80516e..280266e7 100644 --- a/nixos/roles/default.nix +++ b/nixos/roles/default.nix @@ -19,15 +19,16 @@ resolvconf.dnsExtensionMechanism = false; # this breaks dnssec but is necessary for certain bad-behaved hotspots firewall.allowPing = true; useDHCP = false; # enabled per interface - hosts = lib.zipAttrs - ( - lib.mapAttrsToList - (host: ip: - if builtins.typeOf ip == "set" - then {} - else {"${ip}" = "${host} ${host}.m-0.eu";}) - config.m-0.hosts - ); + hosts = + lib.zipAttrs + ( + lib.mapAttrsToList + (host: ip: + if builtins.typeOf ip == "set" + then {} + else {"${ip}" = "${host} ${host}.m-0.eu";}) + config.m-0.hosts + ); }; security.acme = { diff --git a/nixos/roles/email2matrix.nix b/nixos/roles/email2matrix.nix index 4e271a1b..11bf833d 100644 --- a/nixos/roles/email2matrix.nix +++ b/nixos/roles/email2matrix.nix @@ -9,35 +9,36 @@ IgnoreBody = false; SkipMarkdown = false; }; - email2matrix-config = pkgs.writeText "email2matrix-config.json" - (builtins.toJSON { - Smtp = { - ListenInterface = "[::1]:2525"; - Hostname = "email2matrix.maralorn.de"; - Workers = 10; - }; - Matrix = { - Mappings = [ - (default_mailbox - // { - MailboxName = "notify"; - MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; - }) - (default_mailbox - // { - MailboxName = "subjects"; - MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; - IgnoreBody = true; - }) - (default_mailbox - // { - MailboxName = "weather"; - MatrixRoomId = "!ELeFcSrHXgMqOmwnxg:maralorn.de"; - }) - ]; - }; - Misc = {Debug = true;}; - }); + email2matrix-config = + pkgs.writeText "email2matrix-config.json" + (builtins.toJSON { + Smtp = { + ListenInterface = "[::1]:2525"; + Hostname = "email2matrix.maralorn.de"; + Workers = 10; + }; + Matrix = { + Mappings = [ + (default_mailbox + // { + MailboxName = "notify"; + MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; + }) + (default_mailbox + // { + MailboxName = "subjects"; + MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; + IgnoreBody = true; + }) + (default_mailbox + // { + MailboxName = "weather"; + MatrixRoomId = "!ELeFcSrHXgMqOmwnxg:maralorn.de"; + }) + ]; + }; + Misc = {Debug = true;}; + }); in { systemd.services.email2matrix = { script = "${pkgs.email2matrix}/bin/devture-email2matrix --config ${email2matrix-config}"; diff --git a/nixos/roles/fonts.nix b/nixos/roles/fonts.nix index 1a2a78b9..c5b2116a 100644 --- a/nixos/roles/fonts.nix +++ b/nixos/roles/fonts.nix @@ -20,12 +20,16 @@ inherit (pkgs) # For all my terminal needs. + nerdfonts # nice text font + libertinus # icons in my app + material-icons # sans font, very good for displays + b612 ; }; @@ -38,9 +42,9 @@ font_sources = map (v: v.src) (lib.filter (v: v ? src) config.fonts.fonts); in builtins.listToAttrs (lib.imap0 - (n: source: - lib.nameValuePair "src-cache/fonts/${toString n}" { - inherit source; - }) - font_sources); + (n: source: + lib.nameValuePair "src-cache/fonts/${toString n}" { + inherit source; + }) + font_sources); } diff --git a/nixos/roles/git.nix b/nixos/roles/git.nix index b644941a..c0041444 100644 --- a/nixos/roles/git.nix +++ b/nixos/roles/git.nix @@ -5,39 +5,40 @@ ... }: let gitoliteCfg = config.services.gitolite; - post-update = pkgs.writeHaskellScript - { - name = "post-update"; - bins = [pkgs.git pkgs.laminar]; - imports = [ - "System.Directory (withCurrentDirectory)" - ]; - } '' - checkout :: String -> IO FilePath - checkout path = do - (decodeUtf8 -> repoDir) <- mktemp "-d" |> captureTrim - git "clone" path repoDir - pure repoDir + post-update = + pkgs.writeHaskellScript + { + name = "post-update"; + bins = [pkgs.git pkgs.laminar]; + imports = [ + "System.Directory (withCurrentDirectory)" + ]; + } '' + checkout :: String -> IO FilePath + checkout path = do + (decodeUtf8 -> repoDir) <- mktemp "-d" |> captureTrim + git "clone" path repoDir + pure repoDir - main = do - jobMay <- lookupEnv "GL_OPTION_CI_JOB" - whenJust jobMay $ \job -> do - args <- toString . Text.intercalate " " . fmap toText <$> getArgs - setEnv "LAMINAR_REASON" [i|Build triggered by push to branch #{args}|] - jobName <- decodeUtf8 <$> (laminarc ["queue", job, [i|BRANCH=#{args}|]] |> captureTrim) - say [i|Queued job #{jobName}.\nSee https://ci.maralorn.de/jobs/#{Text.replace ":" "/" jobName}|] - mirrorMay <- lookupEnv "GL_OPTION_MIRROR" - whenJust mirrorMay $ \mirror -> do - say [i|Force pushing all branches to #{mirror}|] - git "push" "--all" "-f" mirror - deployMay <- lookupEnv "GL_OPTION_WEB_DEPLOY" - whenJust deployMay $ \deploy -> do - (maybe [] (\x -> ["-A", x]) -> target) <- lookupEnv "GL_OPTION_WEB_DEPLOY_NIX_TARGET" - (decodeUtf8 -> path) <- pwd |> captureTrim - say [i|Building default.nix #{show target} to /var/www/#{deploy}|] - bracket (checkout path) (rm "-rf") $ \repoDir -> withCurrentDirectory repoDir $ nix_build "-o" ([i|/var/www/#{deploy}|] :: String) target - say "Done" - ''; + main = do + jobMay <- lookupEnv "GL_OPTION_CI_JOB" + whenJust jobMay $ \job -> do + args <- toString . Text.intercalate " " . fmap toText <$> getArgs + setEnv "LAMINAR_REASON" [i|Build triggered by push to branch #{args}|] + jobName <- decodeUtf8 <$> (laminarc ["queue", job, [i|BRANCH=#{args}|]] |> captureTrim) + say [i|Queued job #{jobName}.\nSee https://ci.maralorn.de/jobs/#{Text.replace ":" "/" jobName}|] + mirrorMay <- lookupEnv "GL_OPTION_MIRROR" + whenJust mirrorMay $ \mirror -> do + say [i|Force pushing all branches to #{mirror}|] + git "push" "--all" "-f" mirror + deployMay <- lookupEnv "GL_OPTION_WEB_DEPLOY" + whenJust deployMay $ \deploy -> do + (maybe [] (\x -> ["-A", x]) -> target) <- lookupEnv "GL_OPTION_WEB_DEPLOY_NIX_TARGET" + (decodeUtf8 -> path) <- pwd |> captureTrim + say [i|Building default.nix #{show target} to /var/www/#{deploy}|] + bracket (checkout path) (rm "-rf") $ \repoDir -> withCurrentDirectory repoDir $ nix_build "-o" ([i|/var/www/#{deploy}|] :: String) target + say "Done" + ''; cgitrc = '' enable-git-config=1 remove-suffix=1 diff --git a/nixos/roles/home-assistant/default.nix b/nixos/roles/home-assistant/default.nix index 944d8720..b90a71e0 100644 --- a/nixos/roles/home-assistant/default.nix +++ b/nixos/roles/home-assistant/default.nix @@ -52,13 +52,14 @@ options = {inherit empty heat active force_active only_lights;}; }; }; - fenster = map (name: "binary_sensor.${name}") - [ - "kuechenfenster" - "wohnzimmerfenster" - "schlafzimmerfenster" - "wohnungstuer" - ]; + fenster = + map (name: "binary_sensor.${name}") + [ + "kuechenfenster" + "wohnzimmerfenster" + "schlafzimmerfenster" + "wohnungstuer" + ]; switches = map (name: "switch.${name}") [ "weihnachtsstern_schlafzimmer" "luftentfeuchter" @@ -254,10 +255,10 @@ in { alias = "Backup Lüftungssteuerung Bad"; trigger = [ (triggers.stateTrigger "switch.lueftung_bad" - // { - to = "on"; - for = "02:00:00"; - }) + // { + to = "on"; + for = "02:00:00"; + }) ]; action = [ { @@ -439,14 +440,15 @@ in { ]; action = [ { - service = jinja.if' - (jinja.or - (jinja.isStates (util.modeSelectEntity modes.wohnzimmer) ["force_active" "only_lights"]) - (jinja.and - (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "active") - "state_attr('sun.sun', 'elevation') < 6")) - "homeassistant.turn_on" - "homeassistant.turn_off"; + service = + jinja.if' + (jinja.or + (jinja.isStates (util.modeSelectEntity modes.wohnzimmer) ["force_active" "only_lights"]) + (jinja.and + (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "active") + "state_attr('sun.sun', 'elevation') < 6")) + "homeassistant.turn_on" + "homeassistant.turn_off"; target.entity_id = "group.wohnzimmer_lights"; } ]; @@ -459,14 +461,15 @@ in { ]; action = [ { - service = jinja.if' - (jinja.or - (jinja.isStates (util.modeSelectEntity modes.schlafzimmer) ["force_active" "only_lights"]) - (jinja.and - (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "active") - "state_attr('sun.sun', 'elevation') < 6")) - "homeassistant.turn_on" - "homeassistant.turn_off"; + service = + jinja.if' + (jinja.or + (jinja.isStates (util.modeSelectEntity modes.schlafzimmer) ["force_active" "only_lights"]) + (jinja.and + (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "active") + "state_attr('sun.sun', 'elevation') < 6")) + "homeassistant.turn_on" + "homeassistant.turn_off"; target.entity_id = "group.schlafzimmer_lights"; } ]; @@ -527,12 +530,13 @@ in { } { alias = "Warnung bei niedrigem Akkustand"; - trigger = map - (limit: { - platform = "numeric_state"; - below = toString limit; - entity_id = batteries; - }) [25 20 15 10 5 4 3 2 1 0]; + trigger = + map + (limit: { + platform = "numeric_state"; + below = toString limit; + entity_id = batteries; + }) [25 20 15 10 5 4 3 2 1 0]; action = [(actions.notify "{{ trigger.to_state.name }} ist {{ trigger.to_state.state }}%.")]; } { @@ -560,25 +564,26 @@ in { #} ] ++ (map - (minutes: { - alias = "Warnung bei ${minutes} Minuten offenem Fenster oder offener Tür"; - trigger = map - (name: - triggers.stateTrigger name - // { - to = "on"; - for = "00:${minutes}:00"; - }) - fenster; - condition = { - condition = "numeric_state"; - entity_id = "weather.dwd_darmstadt"; - attribute = "temperature"; - below = 15; - }; - action = [(actions.notify "{{ trigger.to_state.name }} ist seit mehr als ${minutes} Minuten offen.")]; - }) - (map toString [10 20 30 40 50 60])); + (minutes: { + alias = "Warnung bei ${minutes} Minuten offenem Fenster oder offener Tür"; + trigger = + map + (name: + triggers.stateTrigger name + // { + to = "on"; + for = "00:${minutes}:00"; + }) + fenster; + condition = { + condition = "numeric_state"; + entity_id = "weather.dwd_darmstadt"; + attribute = "temperature"; + below = 15; + }; + action = [(actions.notify "{{ trigger.to_state.name }} ist seit mehr als ${minutes} Minuten offen.")]; + }) + (map toString [10 20 30 40 50 60])); history = {}; image = {}; sun = {}; diff --git a/nixos/roles/laminar/test-config.nix b/nixos/roles/laminar/test-config.nix index 04fe9d76..2e7c12c8 100644 --- a/nixos/roles/laminar/test-config.nix +++ b/nixos/roles/laminar/test-config.nix @@ -20,27 +20,29 @@ nix_build $ ["--show-trace", "-o", [i|/var/cache/gc-links/${name}-config-#{hostname}|]] ++ flags ++ ${drv} say [i|Build of ${name} config for #{hostname} was successful.|] ''; - test-system-config = pkgs.writeHaskellScript - { - name = "test-system-config"; - inherit bins; - inherit imports; - } - ( - haskellBody "system" '' - buildSystemParams ++ paths ++ ["-I", [i|nixos-config=#{configDir}/nixos/machines/#{hostname}/configuration.nix|]]'' - ); + test-system-config = + pkgs.writeHaskellScript + { + name = "test-system-config"; + inherit bins; + inherit imports; + } + ( + haskellBody "system" '' + buildSystemParams ++ paths ++ ["-I", [i|nixos-config=#{configDir}/nixos/machines/#{hostname}/configuration.nix|]]'' + ); - test-home-config = pkgs.writeHaskellScript - { - name = "test-home-config"; - inherit bins; - inherit imports; - } - ( - haskellBody "home" - ''paths ++ [[i|#{configDir}/home-manager/target.nix|], "-A", hostname]'' - ); + test-home-config = + pkgs.writeHaskellScript + { + name = "test-home-config"; + inherit bins; + inherit imports; + } + ( + haskellBody "home" + ''paths ++ [[i|#{configDir}/home-manager/target.nix|], "-A", hostname]'' + ); common = '' set -e export PATH=${standardPath}:$PATH @@ -82,30 +84,32 @@ in { services.laminar.cfgFiles.jobs = { "test-config.run" = let - test-config = pkgs.writeHaskell "test-config" - { - libraries = builtins.attrValues pkgs.myHaskellScriptPackages; - ghcEnv = { - HOMES = lib.concatStringsSep " " homes; - SYSTEMS = lib.concatStringsSep " " systems; - DEPLOY = deployCommand; - PATH = "${standardPath}:$PATH"; - }; - ghcArgs = ["-threaded"]; - } - (builtins.readFile ./test-config.hs); + test-config = + pkgs.writeHaskell "test-config" + { + libraries = builtins.attrValues pkgs.myHaskellScriptPackages; + ghcEnv = { + HOMES = lib.concatStringsSep " " homes; + SYSTEMS = lib.concatStringsSep " " systems; + DEPLOY = deployCommand; + PATH = "${standardPath}:$PATH"; + }; + ghcArgs = ["-threaded"]; + } + (builtins.readFile ./test-config.hs); in pkgs.writeShellScript "test-config" '' FLAGS="" PATH=${standardPath}:$PATH ${test-config} ''; "bump-config.run" = let - bump-config = pkgs.writeHaskell "bump-config" - { - libraries = builtins.attrValues pkgs.myHaskellScriptPackages; - ghcEnv.PATH = "${standardPath}:$PATH"; - ghcArgs = ["-threaded"]; - } - (builtins.readFile ./bump-config.hs); + bump-config = + pkgs.writeHaskell "bump-config" + { + libraries = builtins.attrValues pkgs.myHaskellScriptPackages; + ghcEnv.PATH = "${standardPath}:$PATH"; + ghcArgs = ["-threaded"]; + } + (builtins.readFile ./bump-config.hs); in pkgs.writeShellScript "bump-config" '' PATH=${standardPath}:$PATH ${bump-config} @@ -117,14 +121,15 @@ in { allowedCommands = [deployCommand]; in [ { - commands = map - ( - command: { - inherit command; - options = ["NOPASSWD"]; - } - ) - allowedCommands; + commands = + map + ( + command: { + inherit command; + options = ["NOPASSWD"]; + } + ) + allowedCommands; users = ["laminar"]; } ]; diff --git a/nixos/roles/mailman.nix b/nixos/roles/mailman.nix index c912cb36..3616a92c 100644 --- a/nixos/roles/mailman.nix +++ b/nixos/roles/mailman.nix @@ -33,30 +33,31 @@ in { hyperkitty.enable = false; settings = { mailman.default_language = "de"; - "paths.fhs".template_dir = lib.mkForce - ( - pkgs.setToDirectories { - site.de = { - "list:user:notice:goodbye.txt" = builtins.toFile "goodbye" '' - Du erhältst nun keine E-Mails mehr über diese Mailingliste. + "paths.fhs".template_dir = + lib.mkForce + ( + pkgs.setToDirectories { + site.de = { + "list:user:notice:goodbye.txt" = builtins.toFile "goodbye" '' + Du erhältst nun keine E-Mails mehr über diese Mailingliste. - Bei Fragen oder wenn Du doch E-Mails von dieser Liste bekommen möchtest wende Dich an ${admin}. - ''; - "list:member:generic:footer.txt" = builtins.toFile "footer" '' - --- - Du erhältst diese E-Mail über die Mailingliste "$display_name". - Bei Fragen oder wenn Du diese E-Mails nicht mehr bekommen möchtest wende Dich an ${admin}. - ''; + Bei Fragen oder wenn Du doch E-Mails von dieser Liste bekommen möchtest wende Dich an ${admin}. + ''; + "list:member:generic:footer.txt" = builtins.toFile "footer" '' + --- + Du erhältst diese E-Mail über die Mailingliste "$display_name". + Bei Fragen oder wenn Du diese E-Mails nicht mehr bekommen möchtest wende Dich an ${admin}. + ''; - "list:user:notice:welcome.txt" = builtins.toFile "welcome" '' - Herzlich Willkommen auf der Mailingliste "$display_name". + "list:user:notice:welcome.txt" = builtins.toFile "welcome" '' + Herzlich Willkommen auf der Mailingliste "$display_name". - Bei Fragen und wenn Du keine E-Mails von dieser Liste mehr bekommen möchtest wende Dich an ${admin}. - ''; - }; - } - ) - .outPath; + Bei Fragen und wenn Du keine E-Mails von dieser Liste mehr bekommen möchtest wende Dich an ${admin}. + ''; + }; + } + ) + .outPath; }; }; postfix = { diff --git a/nixos/roles/matrix-synapse/default.nix b/nixos/roles/matrix-synapse/default.nix index ece5f9fd..e3c26bff 100644 --- a/nixos/roles/matrix-synapse/default.nix +++ b/nixos/roles/matrix-synapse/default.nix @@ -17,18 +17,19 @@ in { }; synapse-cleanup = { serviceConfig = { - ExecStart = pkgs.writeHaskell "synapse-cleanup" - { - libraries = - builtins.attrValues pkgs.myHaskellScriptPackages - ++ [ - pkgs.haskellPackages.postgresql-simple - pkgs.haskellPackages.HTTP - ]; - ghcEnv.PATH = "${lib.makeBinPath [pkgs.matrix-synapse-tools.rust-synapse-compress-state config.services.postgresql.package]}:$PATH"; - ghcArgs = ["-threaded"]; - } - (builtins.readFile ./synapse-cleanup.hs); + ExecStart = + pkgs.writeHaskell "synapse-cleanup" + { + libraries = + builtins.attrValues pkgs.myHaskellScriptPackages + ++ [ + pkgs.haskellPackages.postgresql-simple + pkgs.haskellPackages.HTTP + ]; + ghcEnv.PATH = "${lib.makeBinPath [pkgs.matrix-synapse-tools.rust-synapse-compress-state config.services.postgresql.package]}:$PATH"; + ghcArgs = ["-threaded"]; + } + (builtins.readFile ./synapse-cleanup.hs); User = "matrix-synapse"; Type = "oneshot"; }; @@ -80,11 +81,12 @@ in { matrix-synapse = { enable = true; settings = let - server-secrets = pkgs.privateValue - { - registration_shared_secret = ""; - macaroon_secret_key = ""; - } "matrix/server-secrets"; + server-secrets = + pkgs.privateValue + { + registration_shared_secret = ""; + macaroon_secret_key = ""; + } "matrix/server-secrets"; in server-secrets // { diff --git a/nixos/roles/standalone/default.nix b/nixos/roles/standalone/default.nix index 44ce4f2f..5b235b92 100644 --- a/nixos/roles/standalone/default.nix +++ b/nixos/roles/standalone/default.nix @@ -30,15 +30,15 @@ environment = { # Put these into an extra file so the essential packages can also be included on non selfadminstrated systems from home-manager systemPackages = builtins.attrValues ({ - inherit - (import ../../../lib/update-system.nix { - inherit pkgs; - inherit (config.system.build) nixos-rebuild; - }) - update-system - ; - } - // pkgs.system-pkgs); + inherit + (import ../../../lib/update-system.nix { + inherit pkgs; + inherit (config.system.build) nixos-rebuild; + }) + update-system + ; + } + // pkgs.system-pkgs); }; programs = { diff --git a/overlays/pass-clip/default.nix b/overlays/pass-clip/default.nix index 5638171a..1818e920 100644 --- a/overlays/pass-clip/default.nix +++ b/overlays/pass-clip/default.nix @@ -1,23 +1,24 @@ self: super: { - pass-clip = self.callPackage - ({ - stdenv, - fetchFromGitHub, - pass-wayland, - }: - stdenv.mkDerivation rec { - name = "${pname}-${version}"; - pname = "pass-clip"; - version = "0.3"; - src = fetchFromGitHub { - owner = "ibizaman"; - repo = "pass-clip"; - rev = "v${version}"; - sha256 = "0myyyw0azci95jp8lwh6bm7xi171fv9vg8j6lzf9m9n7282cmy33"; - }; - dontBuild = true; - installPhase = "PREFIX=$out make install"; - propagatedBuildInputs = [pass-wayland]; - }) - {}; + pass-clip = + self.callPackage + ({ + stdenv, + fetchFromGitHub, + pass-wayland, + }: + stdenv.mkDerivation rec { + name = "${pname}-${version}"; + pname = "pass-clip"; + version = "0.3"; + src = fetchFromGitHub { + owner = "ibizaman"; + repo = "pass-clip"; + rev = "v${version}"; + sha256 = "0myyyw0azci95jp8lwh6bm7xi171fv9vg8j6lzf9m9n7282cmy33"; + }; + dontBuild = true; + installPhase = "PREFIX=$out make install"; + propagatedBuildInputs = [pass-wayland]; + }) + {}; } diff --git a/private.nix b/private.nix index e898657d..bf17d4aa 100644 --- a/private.nix +++ b/private.nix @@ -6,11 +6,14 @@ let explicitUsePrivate = builtins.getEnv var == "true"; explicitNotUsePrivate = builtins.getEnv var == "false"; usePrivate = !explicitNotUsePrivate && (explicitUsePrivate || privateExists); - withSecrets = builtins.trace - (if usePrivate - then assert privateExists; "Building _with_ secrets!" - else "Building _without_ secrets!") - usePrivate; + withSecrets = + builtins.trace + ( + if usePrivate + then assert privateExists; "Building _with_ secrets!" + else "Building _without_ secrets!" + ) + usePrivate; in { inherit withSecrets; privatePath = name: let