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")
];
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
]);
}

View file

@ -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 "Couldnt get charging state") pure $ parseMaybe onlineParser batteryStateText
batteryLevel <- maybe (fail "Couldnt 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 "Couldnt get charging state") pure $ parseMaybe onlineParser batteryStateText
batteryLevel <- maybe (fail "Couldnt 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 = {

View file

@ -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;
};

View file

@ -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 = {

View file

@ -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

View file

@ -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 {

View file

@ -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 = {

View file

@ -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"
'';
};
}

View file

@ -32,61 +32,88 @@ in {
inherit
(pkgs.vimPlugins)
# coc-tabnine (TODO: Why doesnt 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
;
};

View file

@ -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";

View file

@ -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";

View file

@ -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 = {

View file

@ -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 = {

View file

@ -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"))
}
'';
};

View file

@ -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))

View file

@ -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
'';
}

View file

@ -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;

View file

@ -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: {

View file

@ -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;

View file

@ -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

View file

@ -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];

View file

@ -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 = {

View file

@ -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}";

View file

@ -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);
}

View file

@ -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

View file

@ -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 = {};

View file

@ -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"];
}
];

View file

@ -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 = {

View file

@ -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
// {

View file

@ -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 = {

View file

@ -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];
})
{};
}

View file

@ -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