Update formatting
This commit is contained in:
parent
9593ab0b67
commit
442f90023e
|
@ -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
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -4,65 +4,66 @@
|
|||
config,
|
||||
...
|
||||
}: let
|
||||
battery-watch = pkgs.writeHaskellScript
|
||||
{
|
||||
name = "battery-watch";
|
||||
bins = [pkgs.acpi];
|
||||
imports = [
|
||||
"DBus.Notify"
|
||||
"Control.Concurrent"
|
||||
"Text.Megaparsec"
|
||||
"Text.Megaparsec.Char"
|
||||
"Text.Megaparsec.Char.Lexer"
|
||||
"Replace.Megaparsec"
|
||||
"Data.Maybe"
|
||||
];
|
||||
} ''
|
||||
moderateLevel = 50 -- percent
|
||||
lowLevel = 20 -- percent
|
||||
criticalLevel = 8 -- percent
|
||||
minute = 60 * 1000 * 1000 -- threadDelay takes microseconds
|
||||
battery-watch =
|
||||
pkgs.writeHaskellScript
|
||||
{
|
||||
name = "battery-watch";
|
||||
bins = [pkgs.acpi];
|
||||
imports = [
|
||||
"DBus.Notify"
|
||||
"Control.Concurrent"
|
||||
"Text.Megaparsec"
|
||||
"Text.Megaparsec.Char"
|
||||
"Text.Megaparsec.Char.Lexer"
|
||||
"Replace.Megaparsec"
|
||||
"Data.Maybe"
|
||||
];
|
||||
} ''
|
||||
moderateLevel = 50 -- percent
|
||||
lowLevel = 20 -- percent
|
||||
criticalLevel = 8 -- percent
|
||||
minute = 60 * 1000 * 1000 -- threadDelay takes microseconds
|
||||
|
||||
main = do
|
||||
client <- connectSession
|
||||
let loop = \lastState handleMay -> do
|
||||
newState <- getState
|
||||
let noteMay = chooseAction lastState newState
|
||||
handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay
|
||||
| otherwise -> pure handleMay
|
||||
threadDelay $ minute `div` 4
|
||||
loop newState handle
|
||||
loop (BatState True 100) Nothing
|
||||
main = do
|
||||
client <- connectSession
|
||||
let loop = \lastState handleMay -> do
|
||||
newState <- getState
|
||||
let noteMay = chooseAction lastState newState
|
||||
handle <- if | Just note <- noteMay -> Just <$> maybe (notify client note) (flip (replace client) note) handleMay
|
||||
| otherwise -> pure handleMay
|
||||
threadDelay $ minute `div` 4
|
||||
loop newState handle
|
||||
loop (BatState True 100) Nothing
|
||||
|
||||
data BatState = BatState { charging :: Bool, level :: Int }
|
||||
data BatState = BatState { charging :: Bool, level :: Int }
|
||||
|
||||
getState = do
|
||||
batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim)
|
||||
batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim)
|
||||
chargerOnline <- maybe (fail "Couldn‘t get charging state") pure $ parseMaybe onlineParser batteryStateText
|
||||
batteryLevel <- maybe (fail "Couldn‘t get battery level") pure $ parseMaybe levelParser batteryLevelText
|
||||
pure $ BatState chargerOnline batteryLevel
|
||||
getState = do
|
||||
batteryStateText <- decodeUtf8 <$> (acpi "-a" |> captureTrim)
|
||||
batteryLevelText <- decodeUtf8 <$> (acpi "-b" |> captureTrim)
|
||||
chargerOnline <- maybe (fail "Couldn‘t get charging state") pure $ parseMaybe onlineParser batteryStateText
|
||||
batteryLevel <- maybe (fail "Couldn‘t get battery level") pure $ parseMaybe levelParser batteryLevelText
|
||||
pure $ BatState chargerOnline batteryLevel
|
||||
|
||||
type Parser = Parsec Text LText
|
||||
type Parser = Parsec Text LText
|
||||
|
||||
onlineParser :: Parser Bool
|
||||
onlineParser = not . null . rights <$> sepCap (string "on-line")
|
||||
onlineParser :: Parser Bool
|
||||
onlineParser = not . null . rights <$> sepCap (string "on-line")
|
||||
|
||||
levelParser :: Parser Int
|
||||
levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%")
|
||||
levelParser :: Parser Int
|
||||
levelParser = (maybe (fail "No Number found") pure . listToMaybe . rights) =<< sepCap (decimal <* "%")
|
||||
|
||||
chooseAction :: BatState -> BatState -> Maybe Note
|
||||
chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel)
|
||||
| wasCharging && isCharging = Nothing
|
||||
| wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." }
|
||||
| not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 }
|
||||
| currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" }
|
||||
| currentLevel <= lowLevel && currentLevel < lastLevel = Just $ myNote{summary = "Battery is low!"}
|
||||
| ((currentLevel `mod` 5 == 0 && currentLevel <= moderateLevel) || (currentLevel `mod` 10 == 0)) && currentLevel < lastLevel = Just $ myNote{summary = "Battery is discharging."}
|
||||
| otherwise = Nothing
|
||||
where
|
||||
myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]}
|
||||
'';
|
||||
chooseAction :: BatState -> BatState -> Maybe Note
|
||||
chooseAction (BatState wasCharging lastLevel) (BatState isCharging currentLevel)
|
||||
| wasCharging && isCharging = Nothing
|
||||
| wasCharging && not isCharging = Just $ myNote{summary = "Charger disconnected." }
|
||||
| not wasCharging && isCharging = Just $ myNote{summary = "Charger connected.", expiry = Milliseconds 5000 }
|
||||
| currentLevel <= criticalLevel = Just $ myNote{summary = "Battery is very low!" }
|
||||
| currentLevel <= lowLevel && currentLevel < lastLevel = Just $ myNote{summary = "Battery is low!"}
|
||||
| ((currentLevel `mod` 5 == 0 && currentLevel <= moderateLevel) || (currentLevel `mod` 10 == 0)) && currentLevel < lastLevel = Just $ myNote{summary = "Battery is discharging."}
|
||||
| otherwise = Nothing
|
||||
where
|
||||
myNote = blankNote { body = Just $ Text [i|#{currentLevel}% remaining.|]}
|
||||
'';
|
||||
in {
|
||||
systemd.user = {
|
||||
services.battery = {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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"
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
|
@ -32,61 +32,88 @@ in {
|
|||
inherit
|
||||
(pkgs.vimPlugins)
|
||||
# coc-tabnine (TODO: Why doesn‘t it work?)
|
||||
|
||||
# TODO: tabnine config in home-manager
|
||||
|
||||
# TODO: tabnine lsp: nix, rust, pandoc/latex lsp? was noch?
|
||||
|
||||
# ===
|
||||
|
||||
# Basic IDE plugins
|
||||
|
||||
coc-nvim
|
||||
airline
|
||||
# same word highlighting when not supported by language
|
||||
|
||||
coc-highlight
|
||||
coc-explorer
|
||||
# searches
|
||||
|
||||
coc-fzf
|
||||
fzf-vim
|
||||
# general whitespace
|
||||
|
||||
vim-trailing-whitespace
|
||||
vim-autoformat
|
||||
# Git
|
||||
|
||||
coc-git
|
||||
# statusline, numberline and explorer infos
|
||||
|
||||
fugitive
|
||||
# various git commands
|
||||
|
||||
# Commenting and Uncommenting
|
||||
|
||||
nerdcommenter
|
||||
# Theme
|
||||
|
||||
papercolor-theme
|
||||
vim-airline-themes
|
||||
LanguageTool-nvim
|
||||
vim-css-color
|
||||
vista-vim
|
||||
# ===
|
||||
|
||||
# Languages
|
||||
|
||||
# haskell syntax highlighting
|
||||
|
||||
haskell-vim
|
||||
vim-hoogle
|
||||
# nix syntax highlighting
|
||||
|
||||
vim-nix
|
||||
vim-markdown
|
||||
# latex
|
||||
|
||||
vimtex
|
||||
coc-vimtex
|
||||
# not sure if I need two
|
||||
|
||||
# ledger
|
||||
|
||||
vim-ledger
|
||||
# rust
|
||||
|
||||
coc-rls
|
||||
# python
|
||||
|
||||
coc-python
|
||||
# css
|
||||
|
||||
coc-css
|
||||
# yaml
|
||||
|
||||
coc-yaml
|
||||
# json
|
||||
|
||||
coc-json
|
||||
# html
|
||||
|
||||
coc-html
|
||||
# dhall
|
||||
|
||||
dhall-vim
|
||||
;
|
||||
};
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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"))
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
|
18
home.nix
18
home.nix
|
@ -3,12 +3,12 @@ let
|
|||
modes = import home-manager/machines.nix;
|
||||
in
|
||||
lib.listToAttrs (lib.flatten (lib.mapAttrsToList
|
||||
(
|
||||
host:
|
||||
lib.mapAttrsToList
|
||||
(mode: config: {
|
||||
name = "${host}-${mode}";
|
||||
value = config;
|
||||
})
|
||||
)
|
||||
modes))
|
||||
(
|
||||
host:
|
||||
lib.mapAttrsToList
|
||||
(mode: config: {
|
||||
name = "${host}-${mode}";
|
||||
value = config;
|
||||
})
|
||||
)
|
||||
modes))
|
||||
|
|
|
@ -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
|
||||
'';
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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}";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {};
|
||||
|
|
|
@ -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"];
|
||||
}
|
||||
];
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
// {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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];
|
||||
})
|
||||
{};
|
||||
}
|
||||
|
|
13
private.nix
13
private.nix
|
@ -6,11 +6,14 @@ let
|
|||
explicitUsePrivate = builtins.getEnv var == "true";
|
||||
explicitNotUsePrivate = builtins.getEnv var == "false";
|
||||
usePrivate = !explicitNotUsePrivate && (explicitUsePrivate || privateExists);
|
||||
withSecrets = builtins.trace
|
||||
(if usePrivate
|
||||
then assert privateExists; "Building _with_ secrets!"
|
||||
else "Building _without_ secrets!")
|
||||
usePrivate;
|
||||
withSecrets =
|
||||
builtins.trace
|
||||
(
|
||||
if usePrivate
|
||||
then assert privateExists; "Building _with_ secrets!"
|
||||
else "Building _without_ secrets!"
|
||||
)
|
||||
usePrivate;
|
||||
in {
|
||||
inherit withSecrets;
|
||||
privatePath = name: let
|
||||
|
|
Loading…
Reference in a new issue