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