1
0
Fork 0

Update formatting

This commit is contained in:
Malte Brandy 2022-08-11 11:50:05 +02:00
parent 9593ab0b67
commit 442f90023e
32 changed files with 659 additions and 585 deletions

View file

@ -156,13 +156,13 @@ in {
(import ./roles/state.nix "default") (import ./roles/state.nix "default")
]; ];
hera.default = makeConfig "hera" (on-my-machines hera.default = makeConfig "hera" (on-my-machines
++ [ ++ [
./roles/fetch-banking-timer.nix ./roles/fetch-banking-timer.nix
./roles/weechat ./roles/weechat
./roles/mail-sort.nix ./roles/mail-sort.nix
./roles/mail2rss.nix ./roles/mail2rss.nix
./roles/headless-mpd.nix ./roles/headless-mpd.nix
./roles/headless.nix ./roles/headless.nix
./roles/create-plans.nix ./roles/create-plans.nix
]); ]);
} }

View file

@ -4,65 +4,66 @@
config, config,
... ...
}: let }: let
battery-watch = pkgs.writeHaskellScript battery-watch =
{ pkgs.writeHaskellScript
name = "battery-watch"; {
bins = [pkgs.acpi]; name = "battery-watch";
imports = [ bins = [pkgs.acpi];
"DBus.Notify" imports = [
"Control.Concurrent" "DBus.Notify"
"Text.Megaparsec" "Control.Concurrent"
"Text.Megaparsec.Char" "Text.Megaparsec"
"Text.Megaparsec.Char.Lexer" "Text.Megaparsec.Char"
"Replace.Megaparsec" "Text.Megaparsec.Char.Lexer"
"Data.Maybe" "Replace.Megaparsec"
]; "Data.Maybe"
} '' ];
moderateLevel = 50 -- percent } ''
lowLevel = 20 -- percent moderateLevel = 50 -- percent
criticalLevel = 8 -- percent lowLevel = 20 -- percent
minute = 60 * 1000 * 1000 -- threadDelay takes microseconds criticalLevel = 8 -- percent
minute = 60 * 1000 * 1000 -- threadDelay takes microseconds
main = do main = do
client <- connectSession client <- connectSession
let loop = \lastState handleMay -> do let loop = \lastState handleMay -> do
newState <- getState newState <- getState
let noteMay = chooseAction lastState newState let noteMay = chooseAction lastState newState
handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay
| otherwise -> pure handleMay | otherwise -> pure handleMay
threadDelay $ minute `div` 4 threadDelay $ minute `div` 4
loop newState handle loop newState handle
loop (BatState True 100) Nothing loop (BatState True 100) Nothing
data BatState = BatState { charging :: Bool, level :: Int } data BatState = BatState { charging :: Bool, level :: Int }
getState = do getState = do
batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim) batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim)
batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim) batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim)
chargerOnline <- maybe (fail "Couldnt get charging state") pure $ parseMaybe onlineParser batteryStateText chargerOnline <- maybe (fail "Couldnt get charging state") pure $ parseMaybe onlineParser batteryStateText
batteryLevel <- maybe (fail "Couldnt get battery level") pure $ parseMaybe levelParser batteryLevelText batteryLevel <- maybe (fail "Couldnt get battery level") pure $ parseMaybe levelParser batteryLevelText
pure $ BatState chargerOnline batteryLevel pure $ BatState chargerOnline batteryLevel
type Parser = Parsec Text LText type Parser = Parsec Text LText
onlineParser :: Parser Bool onlineParser :: Parser Bool
onlineParser = not . null . rights <$> sepCap (string "on-line") onlineParser = not . null . rights <$> sepCap (string "on-line")
levelParser :: Parser Int levelParser :: Parser Int
levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%") levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%")
chooseAction :: BatState -> BatState -> Maybe Note chooseAction :: BatState -> BatState -> Maybe Note
chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel) chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel)
| wasCharging && isCharging = Nothing | wasCharging && isCharging = Nothing
| wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." } | wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." }
| not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 } | not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 }
| currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" } | currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" }
| currentLevel <= lowLevel && currentLevel < lastLevel = Just $ myNote{summary = "Battery is 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."} | ((currentLevel `mod` 5 == 0 && currentLevel <= moderateLevel) || (currentLevel `mod` 10 == 0)) && currentLevel < lastLevel = Just $ myNote{summary = "Battery is discharging."}
| otherwise = Nothing | otherwise = Nothing
where where
myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]} myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]}
''; '';
in { in {
systemd.user = { systemd.user = {
services.battery = { services.battery = {

View file

@ -1,9 +1,10 @@
{pkgs, ...}: { {pkgs, ...}: {
home.packages = builtins.attrValues 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'"; 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 { xdg.configFile."Element/config.json".text = builtins.toJSON {
showLabsSettings = true; showLabsSettings = true;
}; };

View file

@ -1,29 +1,31 @@
{pkgs, ...}: let {pkgs, ...}: let
plans = pkgs.privateValue plans =
{ pkgs.privateValue
"workDay" = "pass"; {
"weekend" = "pass"; "workDay" = "pass";
} "weekend" = "pass";
"plans"; }
createPlans = pkgs.writeHaskellScript "plans";
{ createPlans =
name = "create-plans"; pkgs.writeHaskellScript
bins = [pkgs.khal pkgs.vdirsyncer]; {
imports = [ name = "create-plans";
"Data.Time" bins = [pkgs.khal pkgs.vdirsyncer];
]; imports = [
} '' "Data.Time"
main = do ];
today <- localDay . zonedTimeToLocalTime <$> getZonedTime } ''
[0..7] & fmap (`addDays` today) & mapM_ \day -> do main = do
planned <- khal ["list", "-a", "Planung", show day, "06:00", "24h", "--notstarted"] |> captureTrim today <- localDay . zonedTimeToLocalTime <$> getZonedTime
when (LBS.null planned) $ do [0..7] & fmap (`addDays` today) & mapM_ \day -> do
say $ "Creating events for " <> show day planned <- khal ["list", "-a", "Planung", show day, "06:00", "24h", "--notstarted"] |> captureTrim
if (dayOfWeek day `elem` [Saturday, Sunday]) then do when (LBS.null planned) $ do
${plans.weekend} say $ "Creating events for " <> show day
else do if (dayOfWeek day `elem` [Saturday, Sunday]) then do
${plans.workDay} ${plans.weekend}
''; else do
${plans.workDay}
'';
in { in {
systemd.user = { systemd.user = {
services.create-plans = { services.create-plans = {

View file

@ -20,12 +20,14 @@
inherit inherit
(pkgs) (pkgs)
# web # web
chromium chromium
mumble mumble
upower upower
speedtest-cli speedtest-cli
acpi acpi
# tools & office # tools & office
feh feh
gimp gimp
imagemagick imagemagick
@ -38,6 +40,7 @@
beets beets
zbar zbar
# media # media
ncpamixer ncpamixer
pavucontrol pavucontrol
playerctl playerctl

View file

@ -40,77 +40,78 @@
builtins.map filter.simpleSortList lists.sortLists builtins.map filter.simpleSortList lists.sortLists
++ builtins.map filter.stupidList lists.stupidLists ++ builtins.map filter.stupidList lists.stupidLists
++ builtins.map filter.notifications lists.notifications; ++ builtins.map filter.notifications lists.notifications;
sortMail = pkgs.writeHaskellScript sortMail =
{ pkgs.writeHaskellScript
name = "sort-mail-archive"; {
bins = [pkgs.notmuch pkgs.coreutils pkgs.mblaze pkgs.findutils]; name = "sort-mail-archive";
imports = [ bins = [pkgs.notmuch pkgs.coreutils pkgs.mblaze pkgs.findutils];
"Text.Megaparsec" imports = [
"Text.Megaparsec.Char" "Text.Megaparsec"
"Text.Megaparsec.Char.Lexer" "Text.Megaparsec.Char"
"qualified Data.List.NonEmpty as NE" "Text.Megaparsec.Char.Lexer"
"qualified Data.Text as T" "qualified Data.List.NonEmpty as NE"
"System.Environment (setEnv)" "qualified Data.Text as T"
]; "System.Environment (setEnv)"
} '' ];
reScan = notmuch "new" "--quiet" } ''
reScan = notmuch "new" "--quiet"
findFilterMail :: (Text,Text) -> IO (Maybe (LByteString, Text, Text)) findFilterMail :: (Text,Text) -> IO (Maybe (LByteString, Text, Text))
findFilterMail (filter_, target) = do findFilterMail (filter_, target) = do
files <- notmuch "search" "--output" "files" (toString filter_) "folder:${unsortedSuffix}" |> capture files <- notmuch "search" "--output" "files" (toString filter_) "folder:${unsortedSuffix}" |> capture
pure $ if (LBS.length files > 0) then Just (files, filter_, target) else Nothing pure $ if (LBS.length files > 0) then Just (files, filter_, target) else Nothing
executeFilterMail :: (LByteString, Text, Text) -> IO () executeFilterMail :: (LByteString, Text, Text) -> IO ()
executeFilterMail (files, filter_, target) = do executeFilterMail (files, filter_, target) = do
say [i|Sorting "#{filter_}" into #{target}|] say [i|Sorting "#{filter_}" into #{target}|]
writeOutput files |> mscan writeOutput files |> mscan
mmkdir ([i|${archive}/#{target}|] :: String) mmkdir ([i|${archive}/#{target}|] :: String)
writeOutput files |> mrefile ([i|${archive}/#{target}|] :: String) writeOutput files |> mrefile ([i|${archive}/#{target}|] :: String)
myFilters :: [(Text,Text)] myFilters :: [(Text,Text)]
myFilters = [${ myFilters = [${
lib.concatStringsSep "," lib.concatStringsSep ","
( (
builtins.map ({ builtins.map ({
filter, filter,
target, target,
}: ''("${filter}","${target}")'') }: ''("${filter}","${target}")'')
myFilters myFilters
) )
}] }]
filtersFromTo :: Text -> Maybe (Text,Text) filtersFromTo :: Text -> Maybe (Text,Text)
filtersFromTo = filtersFromField "to" [toToName] filtersFromTo = filtersFromField "to" [toToName]
toToName :: Text -> Maybe Text toToName :: Text -> Maybe Text
toToName (T.splitOn "@" -> [name, "maralorn.de"]) toToName (T.splitOn "@" -> [name, "maralorn.de"])
| not (T.isInfixOf "randy" name) = Just . ("to/" <>) . T.intercalate "_" . T.splitOn "." $ name | not (T.isInfixOf "randy" name) = Just . ("to/" <>) . T.intercalate "_" . T.splitOn "." $ name
toToName _ = Nothing toToName _ = Nothing
filtersFromField :: Text -> [Text-> Maybe Text] -> Text -> Maybe (Text,Text) filtersFromField :: Text -> [Text-> Maybe Text] -> Text -> Maybe (Text,Text)
filtersFromField field filters text = fmap ([i|#{field}:#{text}|],) . viaNonEmpty Relude.head . mapMaybe ($ text) $ filters filtersFromField field filters text = fmap ([i|#{field}:#{text}|],) . viaNonEmpty Relude.head . mapMaybe ($ text) $ filters
filtersFromListIDs :: Text -> Maybe (Text,Text) filtersFromListIDs :: Text -> Maybe (Text,Text)
filtersFromListIDs = filtersFromField "List" [githubNameFolderFromId, gitlabNameFolderFromId] filtersFromListIDs = filtersFromField "List" [githubNameFolderFromId, gitlabNameFolderFromId]
githubNameFolderFromId :: Text -> Maybe Text githubNameFolderFromId :: Text -> Maybe Text
githubNameFolderFromId (reverse . T.splitOn "." -> ("com":"github":org:name)) = Just [i|github/#{org}/#{T.intercalate "_" $ reverse name}|] githubNameFolderFromId (reverse . T.splitOn "." -> ("com":"github":org:name)) = Just [i|github/#{org}/#{T.intercalate "_" $ reverse name}|]
githubNameFolderFromId _ = Nothing githubNameFolderFromId _ = Nothing
gitlabNameFolderFromId :: Text -> Maybe Text 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 (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 gitlabNameFolderFromId _ = Nothing
type Parser = Parsec Text Text type Parser = Parsec Text Text
listId :: Parser Text listId :: Parser Text
listId = manyTill anySingle (char '<') *> (toText <$> manyTill anySingle (char '>')) listId = manyTill anySingle (char '<') *> (toText <$> manyTill anySingle (char '>'))
main = do main = do
setEnv "MBLAZE_PAGER" "cat" setEnv "MBLAZE_PAGER" "cat"
setEnv "NOTMUCH_CONFIG" "${config.home.sessionVariables.NOTMUCH_CONFIG or ""}" setEnv "NOTMUCH_CONFIG" "${config.home.sessionVariables.NOTMUCH_CONFIG or ""}"
reScan reScan
(listIDs,tos) <- concurrently (mhdr "-h" "List-ID" "-d" "${unsorted}" |> capture) (mhdr "-h" "To" "-d" "${unsorted}" "-A" |> capture) (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 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 toFilters = mapMaybe filtersFromTo . sortNub . fmap (\x -> maybe x Relude.id $ parseMaybe listId x) . lines . decodeUtf8 $ tos
applicableFilters <- catMaybes <$> forConcurrently (listFilters <> myFilters <> toFilters) findFilterMail applicableFilters <- catMaybes <$> forConcurrently (listFilters <> myFilters <> toFilters) findFilterMail
for_ applicableFilters executeFilterMail for_ applicableFilters executeFilterMail
reScan reScan
''; '';
in { in {
services.mbsync.postExec = "${sortMail}/bin/sort-mail-archive"; services.mbsync.postExec = "${sortMail}/bin/sort-mail-archive";
accounts.email.accounts = lib.mkIf pkgs.withSecrets { accounts.email.accounts = lib.mkIf pkgs.withSecrets {

View file

@ -4,24 +4,25 @@
config, config,
... ...
}: let }: let
mail2rss = pkgs.writeHaskellScript mail2rss =
{ pkgs.writeHaskellScript
name = "mail2rss"; {
bins = [pkgs.notmuch pkgs.mblaze pkgs.isync pkgs.logfeed]; name = "mail2rss";
imports = ["System.Environment (setEnv)"]; bins = [pkgs.notmuch pkgs.mblaze pkgs.isync pkgs.logfeed];
} '' imports = ["System.Environment (setEnv)"];
main = do } ''
setEnv "NOTMUCH_CONFIG" "${ main = do
config.home.sessionVariables.NOTMUCH_CONFIG or "" setEnv "NOTMUCH_CONFIG" "${
}" config.home.sessionVariables.NOTMUCH_CONFIG or ""
mbsync "-a" }"
notmuch "new" "--quiet" mbsync "-a"
mail2rss "${config.accounts.email.maildirBasePath}" "hera/Move/readlater" &> Truncate "/var/www/rss/mails2.xml" notmuch "new" "--quiet"
files <- notmuch "search" "--output" "files" "folder:hera/Move/readlater" |> capture mail2rss "${config.accounts.email.maildirBasePath}" "hera/Move/readlater" &> Truncate "/var/www/rss/mails2.xml"
writeOutput files |> mrefile "${config.accounts.email.maildirBasePath}/hera/Archiv/unsortiert" files <- notmuch "search" "--output" "files" "folder:hera/Move/readlater" |> capture
mbsync "-a" writeOutput files |> mrefile "${config.accounts.email.maildirBasePath}/hera/Archiv/unsortiert"
notmuch "new" "--quiet" mbsync "-a"
''; notmuch "new" "--quiet"
'';
in { in {
systemd.user = { systemd.user = {
timers.mail2rss = { timers.mail2rss = {

View file

@ -34,55 +34,58 @@ in {
exe ([i|${modeDir}/#{mode}/activate|] :: String) exe ([i|${modeDir}/#{mode}/activate|] :: String)
whenM (elem wallpaperCmd <$> pathBins) $ exe wallpaperCmd whenM (elem wallpaperCmd <$> pathBins) $ exe wallpaperCmd
''; '';
updateModes = pkgs.writeHaskellScript updateModes =
{ pkgs.writeHaskellScript
name = "update-modes"; {
bins = [activateMode pkgs.git pkgs.nix-output-monitor]; name = "update-modes";
} '' bins = [activateMode pkgs.git pkgs.nix-output-monitor];
params = ["${configPath}/home-manager/target.nix", "-A", "${hostName}"] } ''
params = ["${configPath}/home-manager/target.nix", "-A", "${hostName}"]
main = do main = do
say "Building ~/.modes for ${hostName}" say "Building ~/.modes for ${hostName}"
nixPath <- myNixPath "${configPath}" nixPath <- myNixPath "${configPath}"
setEnv "WITH_SECRETS" "false" setEnv "WITH_SECRETS" "false"
nom_build nixPath (params ++ remoteBuildParams ++ ["--no-out-link"]) nom_build nixPath (params ++ remoteBuildParams ++ ["--no-out-link"])
setEnv "WITH_SECRETS" "true" setEnv "WITH_SECRETS" "true"
nom_build nixPath (params ++ ["-o", "${modeDir}"]) nom_build nixPath (params ++ ["-o", "${modeDir}"])
activate_mode activate_mode
''; '';
quickUpdateMode = pkgs.writeHaskellScript quickUpdateMode =
{ pkgs.writeHaskellScript
name = "quick-update-mode"; {
bins = [updateModes pkgs.git pkgs.home-manager pkgs.nix-output-monitor]; name = "quick-update-mode";
} '' bins = [updateModes pkgs.git pkgs.home-manager pkgs.nix-output-monitor];
getMode :: IO Text } ''
getMode = decodeUtf8 <$> (cat "${modeFile}" |> captureTrim) getMode :: IO Text
getMode = decodeUtf8 <$> (cat "${modeFile}" |> captureTrim)
main = do main = do
nixPath <- myNixPath "${configPath}" nixPath <- myNixPath "${configPath}"
mode <- getMode mode <- getMode
say [i|Quick switching to mode #{mode} ...|] say [i|Quick switching to mode #{mode} ...|]
ignoreFailure (home_manager (nixPath <> ["switch", "-A", [i|${hostName}-#{mode}|]])) &!> StdOut |> nom ignoreFailure (home_manager (nixPath <> ["switch", "-A", [i|${hostName}-#{mode}|]])) &!> StdOut |> nom
update_modes update_modes
''; '';
selectMode = pkgs.writeHaskellScript selectMode =
{ pkgs.writeHaskellScript
name = "select-mode"; {
bins = [ name = "select-mode";
pkgs.dialog bins = [
activateMode pkgs.dialog
pkgs.ncurses activateMode
pkgs.psmisc pkgs.ncurses
]; pkgs.psmisc
} '' ];
main = do } ''
mode <- decodeUtf8 <$> (dialog "--menu" "Select Mode" "20" "80" "5" ${ main = do
lib.concatStrings (map (mode: ''"${mode}" "" '') modes) mode <- decodeUtf8 <$> (dialog "--menu" "Select Mode" "20" "80" "5" ${
} |!> captureTrim) lib.concatStrings (map (mode: ''"${mode}" "" '') modes)
clear } |!> captureTrim)
writeFile "${modeFile}" mode clear
activate_mode writeFile "${modeFile}" mode
ignoreFailure $ killall "GeckoMain" activate_mode
''; ignoreFailure $ killall "GeckoMain"
'';
}; };
} }

View file

@ -32,61 +32,88 @@ in {
inherit inherit
(pkgs.vimPlugins) (pkgs.vimPlugins)
# coc-tabnine (TODO: Why doesnt it work?) # coc-tabnine (TODO: Why doesnt it work?)
# TODO: tabnine config in home-manager # TODO: tabnine config in home-manager
# TODO: tabnine lsp: nix, rust, pandoc/latex lsp? was noch? # TODO: tabnine lsp: nix, rust, pandoc/latex lsp? was noch?
# === # ===
# Basic IDE plugins # Basic IDE plugins
coc-nvim coc-nvim
airline airline
# same word highlighting when not supported by language # same word highlighting when not supported by language
coc-highlight coc-highlight
coc-explorer coc-explorer
# searches # searches
coc-fzf coc-fzf
fzf-vim fzf-vim
# general whitespace # general whitespace
vim-trailing-whitespace vim-trailing-whitespace
vim-autoformat vim-autoformat
# Git # Git
coc-git coc-git
# statusline, numberline and explorer infos # statusline, numberline and explorer infos
fugitive fugitive
# various git commands # various git commands
# Commenting and Uncommenting # Commenting and Uncommenting
nerdcommenter nerdcommenter
# Theme # Theme
papercolor-theme papercolor-theme
vim-airline-themes vim-airline-themes
LanguageTool-nvim LanguageTool-nvim
vim-css-color vim-css-color
vista-vim vista-vim
# === # ===
# Languages # Languages
# haskell syntax highlighting # haskell syntax highlighting
haskell-vim haskell-vim
vim-hoogle vim-hoogle
# nix syntax highlighting # nix syntax highlighting
vim-nix vim-nix
vim-markdown vim-markdown
# latex # latex
vimtex vimtex
coc-vimtex coc-vimtex
# not sure if I need two # not sure if I need two
# ledger # ledger
vim-ledger vim-ledger
# rust # rust
coc-rls coc-rls
# python # python
coc-python coc-python
# css # css
coc-css coc-css
# yaml # yaml
coc-yaml coc-yaml
# json # json
coc-json coc-json
# html # html
coc-html coc-html
# dhall # dhall
dhall-vim dhall-vim
; ;
}; };

View file

@ -1,32 +1,33 @@
{pkgs, ...}: let {pkgs, ...}: let
night-shutdown = pkgs.writeHaskellScript night-shutdown =
{ pkgs.writeHaskellScript
name = "night-shutdown"; {
imports = [ name = "night-shutdown";
"Data.Time.LocalTime" imports = [
"Data.Time.Format" "Data.Time.LocalTime"
"Data.Time.Clock" "Data.Time.Format"
"Control.Concurrent" "Data.Time.Clock"
"Data.Functor" "Control.Concurrent"
]; "Data.Functor"
bins = [pkgs.libnotify pkgs.systemd]; ];
} '' bins = [pkgs.libnotify pkgs.systemd];
interval = 5 } ''
interval = 5
main = forever $ do main = forever $ do
time <- getZonedTime time <- getZonedTime
let tod = localTimeOfDay . zonedTimeToLocalTime$ time let tod = localTimeOfDay . zonedTimeToLocalTime$ time
hour = todHour tod hour = todHour tod
minute = todMin tod minute = todMin tod
evening = hour == 0 evening = hour == 0
night = (hour < 6 && hour >= 1) night = (hour < 6 && hour >= 1)
action action
| evening = notify_send "Shutdown alert!" ([i|Rechner fährt in #{59-minute} Minuten runter.|]::String) | evening = notify_send "Shutdown alert!" ([i|Rechner fährt in #{59-minute} Minuten runter.|]::String)
| night = systemctl "poweroff" | night = systemctl "poweroff"
| otherwise = pass | otherwise = pass
action action
threadDelay $ (interval - (minute `mod` interval)) * 60 * 1000000 threadDelay $ (interval - (minute `mod` interval)) * 60 * 1000000
''; '';
in { in {
systemd.user.services.night-shutdown = { systemd.user.services.night-shutdown = {
Unit.Description = "Night Shutdown"; Unit.Description = "Night Shutdown";

View file

@ -1,13 +1,14 @@
{pkgs, ...}: let {pkgs, ...}: let
status-script = pkgs.writeHaskell "status-script" status-script =
{ pkgs.writeHaskell "status-script"
libraries = builtins.attrValues pkgs.myHaskellScriptPackages; {
ghcEnv = { libraries = builtins.attrValues pkgs.myHaskellScriptPackages;
PATH = "${pkgs.lib.makeBinPath [pkgs.git pkgs.notmuch pkgs.playerctl pkgs.khal]}:$PATH"; ghcEnv = {
}; PATH = "${pkgs.lib.makeBinPath [pkgs.git pkgs.notmuch pkgs.playerctl pkgs.khal]}:$PATH";
ghcArgs = ["-threaded"]; };
} ghcArgs = ["-threaded"];
(builtins.readFile ./status-script.hs); }
(builtins.readFile ./status-script.hs);
in { in {
systemd.user.services.status-script = { systemd.user.services.status-script = {
Unit.Description = "Status Script"; Unit.Description = "Status Script";

View file

@ -85,14 +85,15 @@
}; };
}; };
in { in {
xdg.configFile."vdirsyncer/config".source = mkConfig xdg.configFile."vdirsyncer/config".source =
( mkConfig
pkgs.lib.fold (a: b: a // b) (
{ pkgs.lib.fold (a: b: a // b)
general.status_path = "~/.vdirsyncer/status"; {
} general.status_path = "~/.vdirsyncer/status";
(map mkCalendar calendars ++ map mkAddressbook addressbooks) }
); (map mkCalendar calendars ++ map mkAddressbook addressbooks)
);
home.packages = [pkgs.vdirsyncer]; home.packages = [pkgs.vdirsyncer];
systemd.user = { systemd.user = {

View file

@ -5,22 +5,23 @@
}: let }: let
modeFile = "${config.home.homeDirectory}/.mode"; modeFile = "${config.home.homeDirectory}/.mode";
wallPapers = "${config.home.homeDirectory}/media/images/wallpapers"; wallPapers = "${config.home.homeDirectory}/media/images/wallpapers";
randomWallpaper = pkgs.writeHaskellScript randomWallpaper =
{ pkgs.writeHaskellScript
name = "random-wallpaper"; {
imports = ["System.Random"]; name = "random-wallpaper";
bins = [pkgs.coreutils pkgs.glib]; imports = ["System.Random"];
} '' bins = [pkgs.coreutils pkgs.glib];
main = do } ''
mode <- cat "${modeFile}" |> captureTrim main = do
(lines . decodeUtf8 -> files) <- ls ([i|${wallPapers}/#{mode}|] :: String) |> captureTrim mode <- cat "${modeFile}" |> captureTrim
((files Unsafe.!!) -> file) <- getStdRandom $ randomR (0, length files - 1) (lines . decodeUtf8 -> files) <- ls ([i|${wallPapers}/#{mode}|] :: String) |> captureTrim
(decodeUtf8 -> current) <- gsettings "get" "org.gnome.desktop.background" "picture-uri" |> captureTrim ((files Unsafe.!!) -> file) <- getStdRandom $ randomR (0, length files - 1)
let new = [i|file:///${wallPapers}/#{mode}/#{file}|] :: String (decodeUtf8 -> current) <- gsettings "get" "org.gnome.desktop.background" "picture-uri" |> captureTrim
when (new /= current) $ do let new = [i|file:///${wallPapers}/#{mode}/#{file}|] :: String
gsettings "set" "org.gnome.desktop.background" "picture-uri" new when (new /= current) $ do
gsettings "set" "org.gnome.desktop.screensaver" "picture-uri" new gsettings "set" "org.gnome.desktop.background" "picture-uri" new
''; gsettings "set" "org.gnome.desktop.screensaver" "picture-uri" new
'';
in { in {
home.packages = [randomWallpaper]; home.packages = [randomWallpaper];
systemd.user = { systemd.user = {

View file

@ -8,10 +8,11 @@ with lib; let
weechat = pkgs.wrapWeechat pkgs.weechat-unwrapped { weechat = pkgs.wrapWeechat pkgs.weechat-unwrapped {
configure = {availablePlugins, ...}: { configure = {availablePlugins, ...}: {
plugins = builtins.attrValues (availablePlugins plugins = builtins.attrValues (availablePlugins
// { // {
python = availablePlugins.python.withPackages python =
(_: [pkgs.weechatScripts.weechat-matrix]); availablePlugins.python.withPackages
}); (_: [pkgs.weechatScripts.weechat-matrix]);
});
scripts = [pkgs.weechatScripts.weechat-matrix]; scripts = [pkgs.weechatScripts.weechat-matrix];
}; };
}; };
@ -73,12 +74,12 @@ in {
[server] [server]
${ ${
lib.concatStringsSep "\n" (lib.mapAttrsToList lib.concatStringsSep "\n" (lib.mapAttrsToList
(server: serverConfig: '' (server: serverConfig: ''
${server}.address = "${serverConfig.address}" ${server}.address = "${serverConfig.address}"
${server}.autoconnect = on ${server}.autoconnect = on
${server}.username = "${serverConfig.user}" ${server}.username = "${serverConfig.user}"
${server}.password = "${serverConfig.password}" ${server}.password = "${serverConfig.password}"
'') (pkgs.privateValue {} "weechat/matrix")) '') (pkgs.privateValue {} "weechat/matrix"))
} }
''; '';
}; };

View file

@ -3,12 +3,12 @@ let
modes = import home-manager/machines.nix; modes = import home-manager/machines.nix;
in in
lib.listToAttrs (lib.flatten (lib.mapAttrsToList lib.listToAttrs (lib.flatten (lib.mapAttrsToList
( (
host: host:
lib.mapAttrsToList lib.mapAttrsToList
(mode: config: { (mode: config: {
name = "${host}-${mode}"; name = "${host}-${mode}";
value = config; value = config;
}) })
) )
modes)) modes))

View file

@ -4,20 +4,21 @@
}: let }: let
configPath = "/etc/nixos"; configPath = "/etc/nixos";
in { in {
update-system = pkgs.writeHaskellScript update-system =
{ pkgs.writeHaskellScript
name = "update-system"; {
bins = [nixos-rebuild pkgs.nix-output-monitor pkgs.nvd]; name = "update-system";
} '' bins = [nixos-rebuild pkgs.nix-output-monitor pkgs.nvd];
main = do } ''
paths <- myNixPath "${configPath}" main = do
args <- getArgs paths <- myNixPath "${configPath}"
setEnv "WITH_SECRETS" "false" args <- getArgs
nom_build (paths ++ buildSystemParams ++ ["--no-out-link"] ++ remoteBuildParams ++ fmap toString args) setEnv "WITH_SECRETS" "false"
setEnv "WITH_SECRETS" "true" nom_build (paths ++ buildSystemParams ++ ["--no-out-link"] ++ remoteBuildParams ++ fmap toString args)
oldSystem <- readlink "-f" "/run/current-system" |> captureTrim setEnv "WITH_SECRETS" "true"
nixos_rebuild (paths ++ ["switch"] ++ fmap toString args) &!> StdOut |> nom oldSystem <- readlink "-f" "/run/current-system" |> captureTrim
newSystem <- readlink "-f" "/run/current-system" |> captureTrim nixos_rebuild (paths ++ ["switch"] ++ fmap toString args) &!> StdOut |> nom
nvd "diff" oldSystem newSystem newSystem <- readlink "-f" "/run/current-system" |> captureTrim
''; nvd "diff" oldSystem newSystem
'';
} }

View file

@ -36,11 +36,13 @@ let
fetch_git = name: spec: let fetch_git = name: spec: let
ref = ref =
spec.ref spec.ref
or (if spec ? branch or (
then "refs/heads/${spec.branch}" if spec ? branch
else if spec ? tag then "refs/heads/${spec.branch}"
then "refs/tags/${spec.tag}" else if spec ? tag
else abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"); then "refs/tags/${spec.tag}"
else abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"
);
in in
builtins.fetchGit { builtins.fetchGit {
url = spec.repo; url = spec.repo;

View file

@ -5,12 +5,13 @@
... ...
}: }:
with lib; let with lib; let
adminCreds = pkgs.privateValue adminCreds =
{ pkgs.privateValue
adminpass = ""; {
dbpass = ""; adminpass = "";
adminuser = ""; dbpass = "";
} "nextcloud-admin"; adminuser = "";
} "nextcloud-admin";
inherit (config.m-0) hosts; inherit (config.m-0) hosts;
certPath = "/var/lib/acme"; certPath = "/var/lib/acme";
nextcloudServices = hostname: { nextcloudServices = hostname: {

View file

@ -64,9 +64,10 @@ in {
systemd.services = systemd.services =
{ {
pg_backup = { pg_backup = {
script = lib.concatMapStringsSep "\n" script =
(name: "${config.services.postgresql.package}/bin/pg_dump ${name} > /var/lib/db-backup-dumps/${name}") lib.concatMapStringsSep "\n"
config.services.postgresql.ensureDatabases; (name: "${config.services.postgresql.package}/bin/pg_dump ${name} > /var/lib/db-backup-dumps/${name}")
config.services.postgresql.ensureDatabases;
serviceConfig = { serviceConfig = {
User = "postgres"; User = "postgres";
Type = "oneshot"; Type = "oneshot";
@ -95,10 +96,10 @@ in {
}; };
} }
// lib.listToAttrs (map (name: { // lib.listToAttrs (map (name: {
inherit name; inherit name;
value = {serviceConfig.Type = "oneshot";}; value = {serviceConfig.Type = "oneshot";};
}) })
backupJobNames); backupJobNames);
services = { services = {
postgresql = { postgresql = {
enable = true; enable = true;

View file

@ -29,8 +29,9 @@ in {
}; };
rspamd.locals = { rspamd.locals = {
"multimap.conf".text = let "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" '' allow-host = builtins.toFile "allow-host.map" ''
gmx.de gmx.de
web.de web.de

View file

@ -45,7 +45,7 @@ in {
cert = "${key_dir}/fullchain.pem"; cert = "${key_dir}/fullchain.pem";
static-auth-secret = static-auth-secret =
(pkgs.privateValue {turn_shared_secret = "";} (pkgs.privateValue {turn_shared_secret = "";}
"matrix/server-secrets") "matrix/server-secrets")
.turn_shared_secret; .turn_shared_secret;
realm = fqdn; realm = fqdn;
listening-ips = [config.m-0.hosts.hera config.m-0.hosts.hera-v4]; listening-ips = [config.m-0.hosts.hera config.m-0.hosts.hera-v4];

View file

@ -19,15 +19,16 @@
resolvconf.dnsExtensionMechanism = false; # this breaks dnssec but is necessary for certain bad-behaved hotspots resolvconf.dnsExtensionMechanism = false; # this breaks dnssec but is necessary for certain bad-behaved hotspots
firewall.allowPing = true; firewall.allowPing = true;
useDHCP = false; # enabled per interface useDHCP = false; # enabled per interface
hosts = lib.zipAttrs hosts =
( lib.zipAttrs
lib.mapAttrsToList (
(host: ip: lib.mapAttrsToList
if builtins.typeOf ip == "set" (host: ip:
then {} if builtins.typeOf ip == "set"
else {"${ip}" = "${host} ${host}.m-0.eu";}) then {}
config.m-0.hosts else {"${ip}" = "${host} ${host}.m-0.eu";})
); config.m-0.hosts
);
}; };
security.acme = { security.acme = {

View file

@ -9,35 +9,36 @@
IgnoreBody = false; IgnoreBody = false;
SkipMarkdown = false; SkipMarkdown = false;
}; };
email2matrix-config = pkgs.writeText "email2matrix-config.json" email2matrix-config =
(builtins.toJSON { pkgs.writeText "email2matrix-config.json"
Smtp = { (builtins.toJSON {
ListenInterface = "[::1]:2525"; Smtp = {
Hostname = "email2matrix.maralorn.de"; ListenInterface = "[::1]:2525";
Workers = 10; Hostname = "email2matrix.maralorn.de";
}; Workers = 10;
Matrix = { };
Mappings = [ Matrix = {
(default_mailbox Mappings = [
// { (default_mailbox
MailboxName = "notify"; // {
MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; MailboxName = "notify";
}) MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de";
(default_mailbox })
// { (default_mailbox
MailboxName = "subjects"; // {
MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de"; MailboxName = "subjects";
IgnoreBody = true; MatrixRoomId = "!kTKVQjRwxjaoMQmcve:maralorn.de";
}) IgnoreBody = true;
(default_mailbox })
// { (default_mailbox
MailboxName = "weather"; // {
MatrixRoomId = "!ELeFcSrHXgMqOmwnxg:maralorn.de"; MailboxName = "weather";
}) MatrixRoomId = "!ELeFcSrHXgMqOmwnxg:maralorn.de";
]; })
}; ];
Misc = {Debug = true;}; };
}); Misc = {Debug = true;};
});
in { in {
systemd.services.email2matrix = { systemd.services.email2matrix = {
script = "${pkgs.email2matrix}/bin/devture-email2matrix --config ${email2matrix-config}"; script = "${pkgs.email2matrix}/bin/devture-email2matrix --config ${email2matrix-config}";

View file

@ -20,12 +20,16 @@
inherit inherit
(pkgs) (pkgs)
# For all my terminal needs. # For all my terminal needs.
nerdfonts nerdfonts
# nice text font # nice text font
libertinus libertinus
# icons in my app # icons in my app
material-icons material-icons
# sans font, very good for displays # sans font, very good for displays
b612 b612
; ;
}; };
@ -38,9 +42,9 @@
font_sources = map (v: v.src) (lib.filter (v: v ? src) config.fonts.fonts); font_sources = map (v: v.src) (lib.filter (v: v ? src) config.fonts.fonts);
in in
builtins.listToAttrs (lib.imap0 builtins.listToAttrs (lib.imap0
(n: source: (n: source:
lib.nameValuePair "src-cache/fonts/${toString n}" { lib.nameValuePair "src-cache/fonts/${toString n}" {
inherit source; inherit source;
}) })
font_sources); font_sources);
} }

View file

@ -5,39 +5,40 @@
... ...
}: let }: let
gitoliteCfg = config.services.gitolite; gitoliteCfg = config.services.gitolite;
post-update = pkgs.writeHaskellScript post-update =
{ pkgs.writeHaskellScript
name = "post-update"; {
bins = [pkgs.git pkgs.laminar]; name = "post-update";
imports = [ bins = [pkgs.git pkgs.laminar];
"System.Directory (withCurrentDirectory)" imports = [
]; "System.Directory (withCurrentDirectory)"
} '' ];
checkout :: String -> IO FilePath } ''
checkout path = do checkout :: String -> IO FilePath
(decodeUtf8 -> repoDir) <- mktemp "-d" |> captureTrim checkout path = do
git "clone" path repoDir (decodeUtf8 -> repoDir) <- mktemp "-d" |> captureTrim
pure repoDir git "clone" path repoDir
pure repoDir
main = do main = do
jobMay <- lookupEnv "GL_OPTION_CI_JOB" jobMay <- lookupEnv "GL_OPTION_CI_JOB"
whenJust jobMay $ \job -> do whenJust jobMay $ \job -> do
args <- toString . Text.intercalate " " . fmap toText <$> getArgs args <- toString . Text.intercalate " " . fmap toText <$> getArgs
setEnv "LAMINAR_REASON" [i|Build triggered by push to branch #{args}|] setEnv "LAMINAR_REASON" [i|Build triggered by push to branch #{args}|]
jobName <- decodeUtf8 <$> (laminarc ["queue", job, [i|BRANCH=#{args}|]] |> captureTrim) jobName <- decodeUtf8 <$> (laminarc ["queue", job, [i|BRANCH=#{args}|]] |> captureTrim)
say [i|Queued job #{jobName}.\nSee https://ci.maralorn.de/jobs/#{Text.replace ":" "/" jobName}|] say [i|Queued job #{jobName}.\nSee https://ci.maralorn.de/jobs/#{Text.replace ":" "/" jobName}|]
mirrorMay <- lookupEnv "GL_OPTION_MIRROR" mirrorMay <- lookupEnv "GL_OPTION_MIRROR"
whenJust mirrorMay $ \mirror -> do whenJust mirrorMay $ \mirror -> do
say [i|Force pushing all branches to #{mirror}|] say [i|Force pushing all branches to #{mirror}|]
git "push" "--all" "-f" mirror git "push" "--all" "-f" mirror
deployMay <- lookupEnv "GL_OPTION_WEB_DEPLOY" deployMay <- lookupEnv "GL_OPTION_WEB_DEPLOY"
whenJust deployMay $ \deploy -> do whenJust deployMay $ \deploy -> do
(maybe [] (\x -> ["-A", x]) -> target) <- lookupEnv "GL_OPTION_WEB_DEPLOY_NIX_TARGET" (maybe [] (\x -> ["-A", x]) -> target) <- lookupEnv "GL_OPTION_WEB_DEPLOY_NIX_TARGET"
(decodeUtf8 -> path) <- pwd |> captureTrim (decodeUtf8 -> path) <- pwd |> captureTrim
say [i|Building default.nix #{show target} to /var/www/#{deploy}|] 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 bracket (checkout path) (rm "-rf") $ \repoDir -> withCurrentDirectory repoDir $ nix_build "-o" ([i|/var/www/#{deploy}|] :: String) target
say "Done" say "Done"
''; '';
cgitrc = '' cgitrc = ''
enable-git-config=1 enable-git-config=1
remove-suffix=1 remove-suffix=1

View file

@ -52,13 +52,14 @@
options = {inherit empty heat active force_active only_lights;}; options = {inherit empty heat active force_active only_lights;};
}; };
}; };
fenster = map (name: "binary_sensor.${name}") fenster =
[ map (name: "binary_sensor.${name}")
"kuechenfenster" [
"wohnzimmerfenster" "kuechenfenster"
"schlafzimmerfenster" "wohnzimmerfenster"
"wohnungstuer" "schlafzimmerfenster"
]; "wohnungstuer"
];
switches = map (name: "switch.${name}") [ switches = map (name: "switch.${name}") [
"weihnachtsstern_schlafzimmer" "weihnachtsstern_schlafzimmer"
"luftentfeuchter" "luftentfeuchter"
@ -254,10 +255,10 @@ in {
alias = "Backup Lüftungssteuerung Bad"; alias = "Backup Lüftungssteuerung Bad";
trigger = [ trigger = [
(triggers.stateTrigger "switch.lueftung_bad" (triggers.stateTrigger "switch.lueftung_bad"
// { // {
to = "on"; to = "on";
for = "02:00:00"; for = "02:00:00";
}) })
]; ];
action = [ action = [
{ {
@ -439,14 +440,15 @@ in {
]; ];
action = [ action = [
{ {
service = jinja.if' service =
(jinja.or jinja.if'
(jinja.isStates (util.modeSelectEntity modes.wohnzimmer) ["force_active" "only_lights"]) (jinja.or
(jinja.and (jinja.isStates (util.modeSelectEntity modes.wohnzimmer) ["force_active" "only_lights"])
(jinja.isState (util.modeSelectEntity modes.wohnzimmer) "active") (jinja.and
"state_attr('sun.sun', 'elevation') < 6")) (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "active")
"homeassistant.turn_on" "state_attr('sun.sun', 'elevation') < 6"))
"homeassistant.turn_off"; "homeassistant.turn_on"
"homeassistant.turn_off";
target.entity_id = "group.wohnzimmer_lights"; target.entity_id = "group.wohnzimmer_lights";
} }
]; ];
@ -459,14 +461,15 @@ in {
]; ];
action = [ action = [
{ {
service = jinja.if' service =
(jinja.or jinja.if'
(jinja.isStates (util.modeSelectEntity modes.schlafzimmer) ["force_active" "only_lights"]) (jinja.or
(jinja.and (jinja.isStates (util.modeSelectEntity modes.schlafzimmer) ["force_active" "only_lights"])
(jinja.isState (util.modeSelectEntity modes.schlafzimmer) "active") (jinja.and
"state_attr('sun.sun', 'elevation') < 6")) (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "active")
"homeassistant.turn_on" "state_attr('sun.sun', 'elevation') < 6"))
"homeassistant.turn_off"; "homeassistant.turn_on"
"homeassistant.turn_off";
target.entity_id = "group.schlafzimmer_lights"; target.entity_id = "group.schlafzimmer_lights";
} }
]; ];
@ -527,12 +530,13 @@ in {
} }
{ {
alias = "Warnung bei niedrigem Akkustand"; alias = "Warnung bei niedrigem Akkustand";
trigger = map trigger =
(limit: { map
platform = "numeric_state"; (limit: {
below = toString limit; platform = "numeric_state";
entity_id = batteries; below = toString limit;
}) [25 20 15 10 5 4 3 2 1 0]; 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 }}%.")]; action = [(actions.notify "{{ trigger.to_state.name }} ist {{ trigger.to_state.state }}%.")];
} }
{ {
@ -560,25 +564,26 @@ in {
#} #}
] ]
++ (map ++ (map
(minutes: { (minutes: {
alias = "Warnung bei ${minutes} Minuten offenem Fenster oder offener Tür"; alias = "Warnung bei ${minutes} Minuten offenem Fenster oder offener Tür";
trigger = map trigger =
(name: map
triggers.stateTrigger name (name:
// { triggers.stateTrigger name
to = "on"; // {
for = "00:${minutes}:00"; to = "on";
}) for = "00:${minutes}:00";
fenster; })
condition = { fenster;
condition = "numeric_state"; condition = {
entity_id = "weather.dwd_darmstadt"; condition = "numeric_state";
attribute = "temperature"; entity_id = "weather.dwd_darmstadt";
below = 15; attribute = "temperature";
}; below = 15;
action = [(actions.notify "{{ trigger.to_state.name }} ist seit mehr als ${minutes} Minuten offen.")]; };
}) action = [(actions.notify "{{ trigger.to_state.name }} ist seit mehr als ${minutes} Minuten offen.")];
(map toString [10 20 30 40 50 60])); })
(map toString [10 20 30 40 50 60]));
history = {}; history = {};
image = {}; image = {};
sun = {}; sun = {};

View file

@ -20,27 +20,29 @@
nix_build $ ["--show-trace", "-o", [i|/var/cache/gc-links/${name}-config-#{hostname}|]] ++ flags ++ ${drv} 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.|] say [i|Build of ${name} config for #{hostname} was successful.|]
''; '';
test-system-config = pkgs.writeHaskellScript test-system-config =
{ pkgs.writeHaskellScript
name = "test-system-config"; {
inherit bins; name = "test-system-config";
inherit imports; inherit bins;
} inherit imports;
( }
haskellBody "system" '' (
buildSystemParams ++ paths ++ ["-I", [i|nixos-config=#{configDir}/nixos/machines/#{hostname}/configuration.nix|]]'' haskellBody "system" ''
); buildSystemParams ++ paths ++ ["-I", [i|nixos-config=#{configDir}/nixos/machines/#{hostname}/configuration.nix|]]''
);
test-home-config = pkgs.writeHaskellScript test-home-config =
{ pkgs.writeHaskellScript
name = "test-home-config"; {
inherit bins; name = "test-home-config";
inherit imports; inherit bins;
} inherit imports;
( }
haskellBody "home" (
''paths ++ [[i|#{configDir}/home-manager/target.nix|], "-A", hostname]'' haskellBody "home"
); ''paths ++ [[i|#{configDir}/home-manager/target.nix|], "-A", hostname]''
);
common = '' common = ''
set -e set -e
export PATH=${standardPath}:$PATH export PATH=${standardPath}:$PATH
@ -82,30 +84,32 @@ in {
services.laminar.cfgFiles.jobs = services.laminar.cfgFiles.jobs =
{ {
"test-config.run" = let "test-config.run" = let
test-config = pkgs.writeHaskell "test-config" test-config =
{ pkgs.writeHaskell "test-config"
libraries = builtins.attrValues pkgs.myHaskellScriptPackages; {
ghcEnv = { libraries = builtins.attrValues pkgs.myHaskellScriptPackages;
HOMES = lib.concatStringsSep " " homes; ghcEnv = {
SYSTEMS = lib.concatStringsSep " " systems; HOMES = lib.concatStringsSep " " homes;
DEPLOY = deployCommand; SYSTEMS = lib.concatStringsSep " " systems;
PATH = "${standardPath}:$PATH"; DEPLOY = deployCommand;
}; PATH = "${standardPath}:$PATH";
ghcArgs = ["-threaded"]; };
} ghcArgs = ["-threaded"];
(builtins.readFile ./test-config.hs); }
(builtins.readFile ./test-config.hs);
in in
pkgs.writeShellScript "test-config" '' pkgs.writeShellScript "test-config" ''
FLAGS="" PATH=${standardPath}:$PATH ${test-config} FLAGS="" PATH=${standardPath}:$PATH ${test-config}
''; '';
"bump-config.run" = let "bump-config.run" = let
bump-config = pkgs.writeHaskell "bump-config" bump-config =
{ pkgs.writeHaskell "bump-config"
libraries = builtins.attrValues pkgs.myHaskellScriptPackages; {
ghcEnv.PATH = "${standardPath}:$PATH"; libraries = builtins.attrValues pkgs.myHaskellScriptPackages;
ghcArgs = ["-threaded"]; ghcEnv.PATH = "${standardPath}:$PATH";
} ghcArgs = ["-threaded"];
(builtins.readFile ./bump-config.hs); }
(builtins.readFile ./bump-config.hs);
in in
pkgs.writeShellScript "bump-config" '' pkgs.writeShellScript "bump-config" ''
PATH=${standardPath}:$PATH ${bump-config} PATH=${standardPath}:$PATH ${bump-config}
@ -117,14 +121,15 @@ in {
allowedCommands = [deployCommand]; allowedCommands = [deployCommand];
in [ in [
{ {
commands = map commands =
( map
command: { (
inherit command; command: {
options = ["NOPASSWD"]; inherit command;
} options = ["NOPASSWD"];
) }
allowedCommands; )
allowedCommands;
users = ["laminar"]; users = ["laminar"];
} }
]; ];

View file

@ -33,30 +33,31 @@ in {
hyperkitty.enable = false; hyperkitty.enable = false;
settings = { settings = {
mailman.default_language = "de"; mailman.default_language = "de";
"paths.fhs".template_dir = lib.mkForce "paths.fhs".template_dir =
( lib.mkForce
pkgs.setToDirectories { (
site.de = { pkgs.setToDirectories {
"list:user:notice:goodbye.txt" = builtins.toFile "goodbye" '' site.de = {
Du erhältst nun keine E-Mails mehr über diese Mailingliste. "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}. 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" '' "list:member:generic:footer.txt" = builtins.toFile "footer" ''
--- ---
Du erhältst diese E-Mail über die Mailingliste "$display_name". 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 diese E-Mails nicht mehr bekommen möchtest wende Dich an ${admin}.
''; '';
"list:user:notice:welcome.txt" = builtins.toFile "welcome" '' "list:user:notice:welcome.txt" = builtins.toFile "welcome" ''
Herzlich Willkommen auf der Mailingliste "$display_name". 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}. Bei Fragen und wenn Du keine E-Mails von dieser Liste mehr bekommen möchtest wende Dich an ${admin}.
''; '';
}; };
} }
) )
.outPath; .outPath;
}; };
}; };
postfix = { postfix = {

View file

@ -17,18 +17,19 @@ in {
}; };
synapse-cleanup = { synapse-cleanup = {
serviceConfig = { serviceConfig = {
ExecStart = pkgs.writeHaskell "synapse-cleanup" ExecStart =
{ pkgs.writeHaskell "synapse-cleanup"
libraries = {
builtins.attrValues pkgs.myHaskellScriptPackages libraries =
++ [ builtins.attrValues pkgs.myHaskellScriptPackages
pkgs.haskellPackages.postgresql-simple ++ [
pkgs.haskellPackages.HTTP 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"]; ghcEnv.PATH = "${lib.makeBinPath [pkgs.matrix-synapse-tools.rust-synapse-compress-state config.services.postgresql.package]}:$PATH";
} ghcArgs = ["-threaded"];
(builtins.readFile ./synapse-cleanup.hs); }
(builtins.readFile ./synapse-cleanup.hs);
User = "matrix-synapse"; User = "matrix-synapse";
Type = "oneshot"; Type = "oneshot";
}; };
@ -80,11 +81,12 @@ in {
matrix-synapse = { matrix-synapse = {
enable = true; enable = true;
settings = let settings = let
server-secrets = pkgs.privateValue server-secrets =
{ pkgs.privateValue
registration_shared_secret = ""; {
macaroon_secret_key = ""; registration_shared_secret = "";
} "matrix/server-secrets"; macaroon_secret_key = "";
} "matrix/server-secrets";
in in
server-secrets server-secrets
// { // {

View file

@ -30,15 +30,15 @@
environment = { environment = {
# Put these into an extra file so the essential packages can also be included on non selfadminstrated systems from home-manager # Put these into an extra file so the essential packages can also be included on non selfadminstrated systems from home-manager
systemPackages = builtins.attrValues ({ systemPackages = builtins.attrValues ({
inherit inherit
(import ../../../lib/update-system.nix { (import ../../../lib/update-system.nix {
inherit pkgs; inherit pkgs;
inherit (config.system.build) nixos-rebuild; inherit (config.system.build) nixos-rebuild;
}) })
update-system update-system
; ;
} }
// pkgs.system-pkgs); // pkgs.system-pkgs);
}; };
programs = { programs = {

View file

@ -1,23 +1,24 @@
self: super: { self: super: {
pass-clip = self.callPackage pass-clip =
({ self.callPackage
stdenv, ({
fetchFromGitHub, stdenv,
pass-wayland, fetchFromGitHub,
}: pass-wayland,
stdenv.mkDerivation rec { }:
name = "${pname}-${version}"; stdenv.mkDerivation rec {
pname = "pass-clip"; name = "${pname}-${version}";
version = "0.3"; pname = "pass-clip";
src = fetchFromGitHub { version = "0.3";
owner = "ibizaman"; src = fetchFromGitHub {
repo = "pass-clip"; owner = "ibizaman";
rev = "v${version}"; repo = "pass-clip";
sha256 = "0myyyw0azci95jp8lwh6bm7xi171fv9vg8j6lzf9m9n7282cmy33"; rev = "v${version}";
}; sha256 = "0myyyw0azci95jp8lwh6bm7xi171fv9vg8j6lzf9m9n7282cmy33";
dontBuild = true; };
installPhase = "PREFIX=$out make install"; dontBuild = true;
propagatedBuildInputs = [pass-wayland]; installPhase = "PREFIX=$out make install";
}) propagatedBuildInputs = [pass-wayland];
{}; })
{};
} }

View file

@ -6,11 +6,14 @@ let
explicitUsePrivate = builtins.getEnv var == "true"; explicitUsePrivate = builtins.getEnv var == "true";
explicitNotUsePrivate = builtins.getEnv var == "false"; explicitNotUsePrivate = builtins.getEnv var == "false";
usePrivate = !explicitNotUsePrivate && (explicitUsePrivate || privateExists); usePrivate = !explicitNotUsePrivate && (explicitUsePrivate || privateExists);
withSecrets = builtins.trace withSecrets =
(if usePrivate builtins.trace
then assert privateExists; "Building _with_ secrets!" (
else "Building _without_ secrets!") if usePrivate
usePrivate; then assert privateExists; "Building _with_ secrets!"
else "Building _without_ secrets!"
)
usePrivate;
in { in {
inherit withSecrets; inherit withSecrets;
privatePath = name: let privatePath = name: let