1
0
mirror of https://github.com/kmein/niveum synced 2026-03-16 10:11:08 +01:00
This commit is contained in:
2025-12-27 22:22:54 +01:00
parent cb0307e8bf
commit c3db0404b3
139 changed files with 2630 additions and 1976 deletions

View File

@@ -1,50 +1,81 @@
let let
lib = import <nixpkgs/lib>; lib = import <nixpkgs/lib>;
in rec { in
rec {
inherit lib; inherit lib;
input = [ input = [
{ {
x = ["pool" "zfs"]; x = [
y = ["mdadm" "raid1"]; "pool"
"zfs"
];
y = [
"mdadm"
"raid1"
];
} }
{ {
x = ["pool" "zfs"]; x = [
y = ["disk" "sda"]; "pool"
"zfs"
];
y = [
"disk"
"sda"
];
} }
{ {
x = ["mdadm" "raid1"]; x = [
y = ["disk" "sdb"]; "mdadm"
"raid1"
];
y = [
"disk"
"sdb"
];
} }
{ {
x = ["mdadm" "raid1"]; x = [
y = ["disk" "sdc"]; "mdadm"
"raid1"
];
y = [
"disk"
"sdc"
];
} }
]; ];
outNodes = node: graph: outNodes = node: graph: lib.unique (builtins.map (e: e.y) (builtins.filter (v: v.x == node) graph));
lib.unique
(builtins.map (e: e.y)
(builtins.filter (v: v.x == node) graph));
vertices = graph: vertices = graph: lib.unique (builtins.map (x: x.y) graph ++ builtins.map (x: x.x) graph);
lib.unique
(builtins.map (x: x.y) graph ++ builtins.map (x: x.x) graph);
deleteVertex = node: graph: (builtins.filter (v: v.x != node && v.y != node) graph); deleteVertex = node: graph: (builtins.filter (v: v.x != node && v.y != node) graph);
findSink = graph: findSink =
lib.findFirst graph:
(v: outNodes v graph == []) lib.findFirst (v: outNodes v graph == [ ]) (lib.trace graph (builtins.abort "No sink found")) (
(lib.trace graph (builtins.abort "No sink found")) vertices graph
(vertices graph); );
topSort = graph: topSort =
if graph == [] graph:
then [] if graph == [ ] then
else if builtins.length graph == 1 [ ]
then let only = builtins.head graph; in [only.y only.x] else if builtins.length graph == 1 then
else let sink = findSink graph; in [sink] ++ topSort (deleteVertex sink graph); let
only = builtins.head graph;
in
[
only.y
only.x
]
else
let
sink = findSink graph;
in
[ sink ] ++ topSort (deleteVertex sink graph);
output = topSort input; output = topSort input;
} }

View File

@@ -2,11 +2,12 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
darwin = lib.strings.hasSuffix "-darwin" pkgs.stdenv.hostPlatform.system; darwin = lib.strings.hasSuffix "-darwin" pkgs.stdenv.hostPlatform.system;
in { in
environment.systemPackages = {
[ environment.systemPackages = [
pkgs.htop pkgs.htop
pkgs.w3m pkgs.w3m
pkgs.wget pkgs.wget
@@ -52,7 +53,6 @@ in {
pkgs.psmisc # for killall, pstree pkgs.psmisc # for killall, pstree
]; ];
security.wrappers = { security.wrappers = {
pmount = { pmount = {
setuid = true; setuid = true;
@@ -75,7 +75,8 @@ in {
fi fi
''; '';
environment.shellAliases = let environment.shellAliases =
let
take = pkgs.writers.writeDash "take" '' take = pkgs.writers.writeDash "take" ''
mkdir "$1" && cd "$1" mkdir "$1" && cd "$1"
''; '';
@@ -110,9 +111,10 @@ in {
la = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso --almost-all -l"; la = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso --almost-all -l";
} }
// ( // (
if darwin if darwin then
then {} { }
else { else
{
"ß" = "${pkgs.util-linux}/bin/setsid"; "ß" = "${pkgs.util-linux}/bin/setsid";
ip = "${pkgs.iproute2}/bin/ip -c"; ip = "${pkgs.iproute2}/bin/ip -c";
# systemd # systemd

View File

@@ -2,8 +2,10 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
in { let
in
{
environment.variables.TERMINAL = "alacritty"; environment.variables.TERMINAL = "alacritty";
home-manager.users.me = { home-manager.users.me = {

View File

@@ -1,5 +1,5 @@
{ {
programs.adb.enable = true; programs.adb.enable = true;
users.users.me.extraGroups = ["adbusers"]; users.users.me.extraGroups = [ "adbusers" ];
} }

View File

@@ -1,7 +1,7 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs.bash = { programs.bash = {
promptInit = '' promptInit = ''PS1="$(${pkgs.ncurses}/bin/tput bold)\w \$([[ \$? == 0 ]] && echo \"\[\033[1;32m\]\" || echo \"\[\033[1;31m\]\")\$$(${pkgs.ncurses}/bin/tput sgr0) "'';
PS1="$(${pkgs.ncurses}/bin/tput bold)\w \$([[ \$? == 0 ]] && echo \"\[\033[1;32m\]\" || echo \"\[\033[1;31m\]\")\$$(${pkgs.ncurses}/bin/tput sgr0) "'';
interactiveShellInit = '' interactiveShellInit = ''
set -o vi set -o vi
''; '';

View File

@@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
hardware.bluetooth = { hardware.bluetooth = {
enable = true; enable = true;
settings.general = { settings.general = {

View File

@@ -2,16 +2,18 @@
config, config,
inputs, inputs,
... ...
}: let }:
let
autorenkalender = inputs.autorenkalender.packages.x86_64-linux.default; autorenkalender = inputs.autorenkalender.packages.x86_64-linux.default;
in { in
{
niveum.bots.autorenkalender = { niveum.bots.autorenkalender = {
enable = true; enable = true;
time = "07:00"; time = "07:00";
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["@autorenkalender"]; chatIds = [ "@autorenkalender" ];
parseMode = "Markdown"; parseMode = "Markdown";
}; };
command = "${autorenkalender}/bin/autorenkalender"; command = "${autorenkalender}/bin/autorenkalender";

View File

@@ -3,21 +3,23 @@
lib, lib,
config, config,
... ...
}: { }:
{
niveum.bots.celan = { niveum.bots.celan = {
enable = true; enable = true;
time = "08:00"; time = "08:00";
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["@PaulCelan"]; chatIds = [ "@PaulCelan" ];
}; };
mastodon = { mastodon = {
enable = true; enable = true;
tokenFile = config.age.secrets.mastodon-token-celan.path; tokenFile = config.age.secrets.mastodon-token-celan.path;
language = "de"; language = "de";
}; };
command = toString (pkgs.writers.writePython3 "random-celan.py" { libraries = [pkgs.python3Packages.lxml]; } '' command = toString (
pkgs.writers.writePython3 "random-celan.py" { libraries = [ pkgs.python3Packages.lxml ]; } ''
from lxml import etree from lxml import etree
import random import random
@@ -26,10 +28,12 @@
return "".join("".join(t.itertext()) for t in elements).strip() return "".join("".join(t.itertext()) for t in elements).strip()
tree = etree.parse('${pkgs.fetchurl { tree = etree.parse('${
pkgs.fetchurl {
url = "http://c.krebsco.de/celan.tei.xml"; url = "http://c.krebsco.de/celan.tei.xml";
hash = "sha256-HgNmJYfhuwyfm+FcNtnnYWpJpIIU1ElHLeLiIFjF9mE="; hash = "sha256-HgNmJYfhuwyfm+FcNtnnYWpJpIIU1ElHLeLiIFjF9mE=";
}}') }
}')
root = tree.getroot() root = tree.getroot()
tei = {"tei": "http://www.tei-c.org/ns/1.0"} tei = {"tei": "http://www.tei-c.org/ns/1.0"}
@@ -60,7 +64,8 @@
current_element = current_element.getparent() current_element = current_element.getparent()
print("\n\n#PaulCelan #Celan #Lyrik #poetry") print("\n\n#PaulCelan #Celan #Lyrik #poetry")
''); ''
);
}; };
age.secrets = { age.secrets = {

View File

@@ -4,11 +4,13 @@
lib, lib,
inputs, inputs,
... ...
}: let }:
let
telebots = inputs.telebots.defaultPackage.x86_64-linux; telebots = inputs.telebots.defaultPackage.x86_64-linux;
reverseDirectory = "/run/telegram-reverse"; reverseDirectory = "/run/telegram-reverse";
proverbDirectory = "/run/telegram-proverb"; proverbDirectory = "/run/telegram-proverb";
in { in
{
imports = [ imports = [
./logotheca.nix ./logotheca.nix
./transits.nix ./transits.nix
@@ -25,13 +27,21 @@ in {
telegram-token-kmein.file = ../../secrets/telegram-token-kmein.age; telegram-token-kmein.file = ../../secrets/telegram-token-kmein.age;
}; };
systemd.tmpfiles.rules = map (path: systemd.tmpfiles.rules =
map
(
path:
pkgs.lib.niveum.tmpfilesConfig { pkgs.lib.niveum.tmpfilesConfig {
type = "d"; type = "d";
mode = "0750"; mode = "0750";
age = "1h"; age = "1h";
inherit path; inherit path;
}) [reverseDirectory proverbDirectory]; }
)
[
reverseDirectory
proverbDirectory
];
niveum.passport.services = [ niveum.passport.services = [
{ {
@@ -59,9 +69,9 @@ in {
}; };
systemd.services.telegram-reverse = { systemd.services.telegram-reverse = {
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
description = "Telegram reverse bot"; description = "Telegram reverse bot";
path = [pkgs.ffmpeg]; path = [ pkgs.ffmpeg ];
enable = true; enable = true;
script = '' script = ''
TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-reverse TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-reverse
@@ -72,7 +82,7 @@ in {
}; };
systemd.services.telegram-streaming-link = { systemd.services.telegram-streaming-link = {
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
description = "Telegram bot converting YouTube Music <-> Spotify"; description = "Telegram bot converting YouTube Music <-> Spotify";
enable = true; enable = true;
script = '' script = ''
@@ -83,7 +93,7 @@ in {
}; };
systemd.services.telegram-betacode = { systemd.services.telegram-betacode = {
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
description = "Telegram beta code bot"; description = "Telegram beta code bot";
enable = true; enable = true;
script = '' script = ''
@@ -94,7 +104,7 @@ in {
}; };
systemd.services.telegram-proverb = { systemd.services.telegram-proverb = {
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
description = "Telegram proverb bot"; description = "Telegram proverb bot";
enable = true; enable = true;
script = '' script = ''

View File

@@ -4,9 +4,11 @@
inputs, inputs,
lib, lib,
... ...
}: let }:
let
hesychius = inputs.scripts.outPath + "/hesychius/hesychius.txt"; hesychius = inputs.scripts.outPath + "/hesychius/hesychius.txt";
in { in
{
niveum.bots.hesychius = { niveum.bots.hesychius = {
enable = true; enable = true;
time = "08:00"; time = "08:00";
@@ -18,7 +20,7 @@ in {
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["@HesychiosAlexandreus"]; chatIds = [ "@HesychiosAlexandreus" ];
}; };
command = "${pkgs.coreutils}/bin/shuf -n1 ${hesychius}"; command = "${pkgs.coreutils}/bin/shuf -n1 ${hesychius}";
}; };

View File

@@ -2,14 +2,15 @@
pkgs, pkgs,
config, config,
... ...
}: { }:
{
niveum.bots.logotheca = { niveum.bots.logotheca = {
enable = true; enable = true;
time = "08/6:00"; time = "08/6:00";
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["-1001760262519"]; chatIds = [ "-1001760262519" ];
parseMode = "Markdown"; parseMode = "Markdown";
}; };
matrix = { matrix = {

View File

@@ -3,11 +3,15 @@
config, config,
lib, lib,
... ...
}: let }:
nachtischsatan-bot = {tokenFile}: let
pkgs.writers.writePython3 "nachtischsatan-bot" { nachtischsatan-bot =
libraries = [pkgs.python3Packages.python-telegram-bot]; { tokenFile }:
} '' pkgs.writers.writePython3 "nachtischsatan-bot"
{
libraries = [ pkgs.python3Packages.python-telegram-bot ];
}
''
from telegram.ext import Application, ContextTypes, MessageHandler, filters from telegram.ext import Application, ContextTypes, MessageHandler, filters
from telegram import Update from telegram import Update
import random import random
@@ -25,9 +29,10 @@
application.add_handler(MessageHandler(filters.ALL, flubber)) application.add_handler(MessageHandler(filters.ALL, flubber))
application.run_polling() application.run_polling()
''; '';
in { in
{
systemd.services.telegram-nachtischsatan = { systemd.services.telegram-nachtischsatan = {
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
description = "*flubberflubber*"; description = "*flubberflubber*";
enable = true; enable = true;
script = toString (nachtischsatan-bot { script = toString (nachtischsatan-bot {

View File

@@ -2,7 +2,8 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
{
niveum.bots.nietzsche = { niveum.bots.nietzsche = {
enable = true; enable = true;
time = "08:00"; time = "08:00";
@@ -11,7 +12,8 @@
tokenFile = config.age.secrets.mastodon-token-nietzsche.path; tokenFile = config.age.secrets.mastodon-token-nietzsche.path;
language = "de"; language = "de";
}; };
command = toString (pkgs.writers.writeBash "random-nietzsche" '' command = toString (
pkgs.writers.writeBash "random-nietzsche" ''
set -efu set -efu
random_number=$(( ($RANDOM % 10) + 1 )) random_number=$(( ($RANDOM % 10) + 1 ))
if [ "$random_number" -eq 1 ]; then if [ "$random_number" -eq 1 ]; then
@@ -19,7 +21,8 @@
else else
${pkgs.random-zeno}/bin/random-zeno "/Philosophie/M/Nietzsche,+Friedrich" ${pkgs.random-zeno}/bin/random-zeno "/Philosophie/M/Nietzsche,+Friedrich"
fi fi
''); ''
);
}; };
systemd.timers.bot-nietzsche.timerConfig.RandomizedDelaySec = "10h"; systemd.timers.bot-nietzsche.timerConfig.RandomizedDelaySec = "10h";

View File

@@ -3,7 +3,8 @@
pkgs, pkgs,
lib, lib,
... ...
}: { }:
{
niveum.bots.smyth = { niveum.bots.smyth = {
enable = true; enable = true;
time = "08:00"; time = "08:00";
@@ -15,9 +16,10 @@
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["@HerbertWeirSmyth"]; chatIds = [ "@HerbertWeirSmyth" ];
}; };
command = toString (pkgs.writers.writeDash "random-smyth" '' command = toString (
pkgs.writers.writeDash "random-smyth" ''
set -efu set -efu
good_curl() { good_curl() {
@@ -50,7 +52,8 @@
| ${pkgs.pandoc}/bin/pandoc -f html -t plain --wrap=none | ${pkgs.pandoc}/bin/pandoc -f html -t plain --wrap=none
printf '\n%s\n\n#AncientGreek' "$url" printf '\n%s\n\n#AncientGreek' "$url"
''); ''
);
}; };
systemd.timers.bot-smyth.timerConfig.RandomizedDelaySec = "10h"; systemd.timers.bot-smyth.timerConfig.RandomizedDelaySec = "10h";

View File

@@ -2,16 +2,27 @@
pkgs, pkgs,
config, config,
... ...
}: let }:
let
mastodonEndpoint = "https://social.krebsco.de"; mastodonEndpoint = "https://social.krebsco.de";
in { in
{
systemd.services.bot-tlg-wotd = { systemd.services.bot-tlg-wotd = {
# TODO reenable # TODO reenable
# once https://github.com/NixOS/nixpkgs/pull/462893 is in stable NixOS # once https://github.com/NixOS/nixpkgs/pull/462893 is in stable NixOS
enable = true; enable = true;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
startAt = "9:30"; startAt = "9:30";
path = [ pkgs.jq pkgs.curl pkgs.recode pkgs.deno pkgs.imagemagick pkgs.gawk pkgs.gnugrep pkgs.coreutils ]; path = [
pkgs.jq
pkgs.curl
pkgs.recode
pkgs.deno
pkgs.imagemagick
pkgs.gawk
pkgs.gnugrep
pkgs.coreutils
];
environment = { environment = {
NPM_CONFIG_CACHE = "/tmp"; NPM_CONFIG_CACHE = "/tmp";
CLTK_DATA = "/tmp"; CLTK_DATA = "/tmp";
@@ -42,9 +53,12 @@ in {
#ancientgreek #classics #wotd #wordoftheday #ancientgreek #classics #wotd #wordoftheday
transliteration=$(${pkgs.writers.writePython3 "translit.py" { transliteration=$(${
pkgs.writers.writePython3 "translit.py"
{
libraries = py: [ py.cltk ]; libraries = py: [ py.cltk ];
} '' }
''
import sys import sys
from cltk.phonology.grc.transcription import Transcriber from cltk.phonology.grc.transcription import Transcriber
@@ -53,7 +67,8 @@ in {
ipa = probert.transcribe(text) ipa = probert.transcribe(text)
print(ipa) print(ipa)
''} "$compact_word") ''
} "$compact_word")
photo_path=/tmp/output.png photo_path=/tmp/output.png

View File

@@ -3,7 +3,8 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
toSymbols = pkgs.writers.writeDash "to-symbols" '' toSymbols = pkgs.writers.writeDash "to-symbols" ''
${pkgs.gnused}/bin/sed ' ${pkgs.gnused}/bin/sed '
s/\bTri\b//; s/\bTri\b//;
@@ -40,7 +41,8 @@
s/^\s*// s/^\s*//
' '
''; '';
in { in
{
niveum.bots.transits = { niveum.bots.transits = {
enable = true; enable = true;
time = "*:0/1"; time = "*:0/1";
@@ -51,9 +53,10 @@ in {
telegram = { telegram = {
enable = true; enable = true;
tokenFile = config.age.secrets.telegram-token-kmein.path; tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["-1001796440545"]; chatIds = [ "-1001796440545" ];
}; };
command = toString (pkgs.writers.writeDash "common-transits" '' command = toString (
pkgs.writers.writeDash "common-transits" ''
set -efu set -efu
now=$(${pkgs.coreutils}/bin/date +%_H:%M | ${pkgs.gnused}/bin/sed 's/^\s*//') now=$(${pkgs.coreutils}/bin/date +%_H:%M | ${pkgs.gnused}/bin/sed 's/^\s*//')
@@ -63,7 +66,8 @@ in {
# ./astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $date -R Uranus Neptune Pluto "North Node" # ./astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $date -R Uranus Neptune Pluto "North Node"
./astrolog -qd $date -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto "North Node" -A 2 ./astrolog -qd $date -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto "North Node" -A 2
) | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n | ${pkgs.gnugrep}/bin/grep "^$now" || : ) | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n | ${pkgs.gnugrep}/bin/grep "^$now" || :
''); ''
);
}; };
age.secrets = { age.secrets = {

View File

@@ -2,7 +2,8 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
{
environment.systemPackages = [ environment.systemPackages = [
pkgs.cro pkgs.cro
pkgs.tor-browser pkgs.tor-browser
@@ -13,7 +14,8 @@
home-manager.users.me = { home-manager.users.me = {
programs.firefox = { programs.firefox = {
enable = true; enable = true;
profiles = let profiles =
let
defaultSettings = { defaultSettings = {
"beacon.enabled" = false; "beacon.enabled" = false;
"browser.bookmarks.showMobileBookmarks" = true; "browser.bookmarks.showMobileBookmarks" = true;
@@ -58,7 +60,8 @@
"toolkit.telemetry.updatePing.enabled" = false; "toolkit.telemetry.updatePing.enabled" = false;
"ui.prefersReducedMotion" = 1; "ui.prefersReducedMotion" = 1;
}; };
in { in
{
default = { default = {
id = 0; id = 0;
isDefault = true; isDefault = true;
@@ -82,7 +85,7 @@
}; };
home-manager.users.me = { home-manager.users.me = {
stylix.targets.firefox.profileNames = ["default"]; stylix.targets.firefox.profileNames = [ "default" ];
}; };
environment.variables.BROWSER = "firefox"; environment.variables.BROWSER = "firefox";

View File

@@ -2,6 +2,7 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
{
services.clipmenu.enable = true; services.clipmenu.enable = true;
} }

View File

@@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
systemd.user.services.systemd-tmpfiles-clean = { systemd.user.services.systemd-tmpfiles-clean = {
enable = true; enable = true;
wantedBy = [ "default.target" ]; wantedBy = [ "default.target" ];
@@ -14,7 +15,8 @@
}; };
}; };
systemd.user.tmpfiles.users.me.rules = map pkgs.lib.niveum.tmpfilesConfig [ systemd.user.tmpfiles.users.me.rules =
map pkgs.lib.niveum.tmpfilesConfig [
{ {
type = "d"; type = "d";
mode = "0755"; mode = "0755";
@@ -27,14 +29,26 @@
age = "7d"; age = "7d";
path = "${config.users.users.me.home}/cloud/nextcloud/tmp"; path = "${config.users.users.me.home}/cloud/nextcloud/tmp";
} }
] ++ map (path: pkgs.lib.niveum.tmpfilesConfig { ]
++
map
(
path:
pkgs.lib.niveum.tmpfilesConfig {
type = "L+"; type = "L+";
user = config.users.users.me.name; user = config.users.users.me.name;
group = config.users.users.me.group; group = config.users.users.me.group;
mode = "0755"; mode = "0755";
argument = "${config.users.users.me.home}/sync/${path}"; argument = "${config.users.users.me.home}/sync/${path}";
path = "${config.users.users.me.home}/${path}"; path = "${config.users.users.me.home}/${path}";
}) [".ssh" ".gnupg" ".pki" ".local/share/aerc"]; }
)
[
".ssh"
".gnupg"
".pki"
".local/share/aerc"
];
services.gnome.gnome-keyring.enable = true; services.gnome.gnome-keyring.enable = true;
security.pam.services.lightdm.enableGnomeKeyring = true; security.pam.services.lightdm.enableGnomeKeyring = true;
@@ -48,17 +62,19 @@
systemd.user.services.nextcloud-syncer = { systemd.user.services.nextcloud-syncer = {
enable = false; enable = false;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
wantedBy = ["default.target"]; wantedBy = [ "default.target" ];
startAt = "*:00/10"; startAt = "*:00/10";
script = let script =
let
kieran = { kieran = {
user = "kieran"; user = "kieran";
passwordFile = config.age.secrets.nextcloud-password-kieran.path; passwordFile = config.age.secrets.nextcloud-password-kieran.path;
endpoint = "https://cloud.kmein.de"; endpoint = "https://cloud.kmein.de";
target = "${config.users.users.me.home}/notes"; target = "${config.users.users.me.home}/notes";
}; };
in '' in
''
mkdir -p ${lib.escapeShellArg kieran.target} mkdir -p ${lib.escapeShellArg kieran.target}
${pkgs.nextcloud-client}/bin/nextcloudcmd --non-interactive --user ${kieran.user} --password "$(cat ${kieran.passwordFile})" --path /Notes ${lib.escapeShellArg kieran.target} ${kieran.endpoint} ${pkgs.nextcloud-client}/bin/nextcloudcmd --non-interactive --user ${kieran.user} --password "$(cat ${kieran.passwordFile})" --path /Notes ${lib.escapeShellArg kieran.target} ${kieran.endpoint}
''; '';
@@ -77,12 +93,15 @@
} | ${pkgs.fzf}/bin/fzf)" } | ${pkgs.fzf}/bin/fzf)"
exec ${pkgs.zathura}/bin/zathura "$book" exec ${pkgs.zathura}/bin/zathura "$book"
'') '')
(let (
let
kieran = { kieran = {
user = "kieran.meinhardt@gmail.com"; user = "kieran.meinhardt@gmail.com";
passwordFile = config.age.secrets.mega-password.path; passwordFile = config.age.secrets.mega-password.path;
}; };
megatools = command: ''${pkgs.megatools}/bin/megatools ${command} --username ${lib.escapeShellArg kieran.user} --password "$(cat ${kieran.passwordFile})"''; megatools =
command:
''${pkgs.megatools}/bin/megatools ${command} --username ${lib.escapeShellArg kieran.user} --password "$(cat ${kieran.passwordFile})"'';
in in
pkgs.writers.writeDashBin "book-mega" '' pkgs.writers.writeDashBin "book-mega" ''
set -efu set -efu
@@ -100,7 +119,8 @@
${megatools "get"} "$selection" ${megatools "get"} "$selection"
exec ${pkgs.zathura}/bin/zathura "$(basename "$selection")" exec ${pkgs.zathura}/bin/zathura "$(basename "$selection")"
) )
'') ''
)
]; ];
age.secrets.mega-password = { age.secrets.mega-password = {
@@ -122,13 +142,22 @@
devices = pkgs.lib.niveum.syncthingIds; devices = pkgs.lib.niveum.syncthingIds;
folders = { folders = {
"${config.users.users.me.home}/sync" = { "${config.users.users.me.home}/sync" = {
devices = ["kabsa" "manakish" "fatteh"]; devices = [
"kabsa"
"manakish"
"fatteh"
];
label = "sync"; label = "sync";
versioning.type = "trashcan"; versioning.type = "trashcan";
versioning.params.cleanoutDays = 100; versioning.params.cleanoutDays = 100;
}; };
"${config.users.users.me.home}/mobile" = { "${config.users.users.me.home}/mobile" = {
devices = ["kabsa" "manakish" "fatteh" "kibbeh"]; devices = [
"kabsa"
"manakish"
"fatteh"
"kibbeh"
];
id = "mobile"; id = "mobile";
label = "mobile"; label = "mobile";
versioning.type = "trashcan"; versioning.type = "trashcan";

View File

@@ -137,7 +137,11 @@ in
agent = { agent = {
enable = true; enable = true;
pinentryPackage = pkgs.pinentry-qt; pinentryPackage = pkgs.pinentry-qt;
settings = let defaultCacheTtl = 2 * 60 * 60; in { settings =
let
defaultCacheTtl = 2 * 60 * 60;
in
{
default-cache-ttl = defaultCacheTtl; default-cache-ttl = defaultCacheTtl;
max-cache-ttl = 4 * defaultCacheTtl; max-cache-ttl = 4 * defaultCacheTtl;
}; };
@@ -253,7 +257,11 @@ in
./mastodon-bot.nix ./mastodon-bot.nix
{ {
home-manager.users.me = { home-manager.users.me = {
xdg.userDirs = let pictures = "${config.users.users.me.home}/cloud/nextcloud/Bilder"; in { xdg.userDirs =
let
pictures = "${config.users.users.me.home}/cloud/nextcloud/Bilder";
in
{
enable = true; enable = true;
documents = "${config.users.users.me.home}/cloud/nextcloud/Documents"; documents = "${config.users.users.me.home}/cloud/nextcloud/Documents";
desktop = "/tmp"; desktop = "/tmp";

View File

@@ -1,4 +1,5 @@
{pkgs, ...}: let { pkgs, ... }:
let
nixify = pkgs.writers.writeDashBin "nixify" '' nixify = pkgs.writers.writeDashBin "nixify" ''
set -efuC set -efuC
@@ -16,8 +17,12 @@
''${EDITOR:-vim} shell.nix ''${EDITOR:-vim} shell.nix
fi fi
''; '';
in { in
environment.systemPackages = [pkgs.direnv nixify]; {
environment.systemPackages = [
pkgs.direnv
nixify
];
home-manager.users.me.programs.direnv = { home-manager.users.me.programs.direnv = {
enable = true; enable = true;

View File

@@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
virtualisation.docker = { virtualisation.docker = {
enable = true; enable = true;
# for ICE wifi, ref https://gist.github.com/sunsided/7840e89ff4e11b64a2d7503fafa0290c # for ICE wifi, ref https://gist.github.com/sunsided/7840e89ff4e11b64a2d7503fafa0290c
@@ -11,6 +12,9 @@
"--fixed-cidr=172.39.1.0/25" "--fixed-cidr=172.39.1.0/25"
]; ];
}; };
users.users.me.extraGroups = ["docker"]; users.users.me.extraGroups = [ "docker" ];
environment.systemPackages = [pkgs.docker pkgs.docker-compose]; environment.systemPackages = [
pkgs.docker
pkgs.docker-compose
];
} }

View File

@@ -2,9 +2,11 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
sgr = code: string: ''\u001b[${code}m${string}\u001b[0m''; sgr = code: string: ''\u001b[${code}m${string}\u001b[0m'';
in { in
{
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "notifications" '' (pkgs.writers.writeDashBin "notifications" ''
${pkgs.dunst}/bin/dunstctl history \ ${pkgs.dunst}/bin/dunstctl history \

View File

@@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
home-manager.users.me = { home-manager.users.me = {
services.flameshot = { services.flameshot = {
enable = true; enable = true;

View File

@@ -1,20 +1,25 @@
{ {
pkgs, pkgs,
... ...
}: let }:
zip-font = name: arguments: let let
zip-font =
name: arguments:
let
directory = pkgs.fetchzip arguments; directory = pkgs.fetchzip arguments;
in in
pkgs.runCommand name {} '' pkgs.runCommand name { } ''
mkdir -p $out/share/fonts/{truetype,opentype,woff} mkdir -p $out/share/fonts/{truetype,opentype,woff}
${pkgs.findutils}/bin/find ${directory} -name '*.ttf' -exec install '{}' $out/share/fonts/truetype \; ${pkgs.findutils}/bin/find ${directory} -name '*.ttf' -exec install '{}' $out/share/fonts/truetype \;
${pkgs.findutils}/bin/find ${directory} -name '*.otf' -exec install '{}' $out/share/fonts/opentype \; ${pkgs.findutils}/bin/find ${directory} -name '*.otf' -exec install '{}' $out/share/fonts/opentype \;
${pkgs.findutils}/bin/find ${directory} -name '*.woff' -exec install '{}' $out/share/fonts/woff \; ${pkgs.findutils}/bin/find ${directory} -name '*.woff' -exec install '{}' $out/share/fonts/woff \;
''; '';
simple-ttf = name: arguments: let simple-ttf =
name: arguments:
let
file = pkgs.fetchurl arguments; file = pkgs.fetchurl arguments;
in in
pkgs.runCommand name {} '' pkgs.runCommand name { } ''
mkdir -p $out/share/fonts/truetype mkdir -p $out/share/fonts/truetype
install ${file} $out/share/fonts/truetype install ${file} $out/share/fonts/truetype
''; '';
@@ -57,7 +62,8 @@
url = "https://github.com/microsoft/font-tools/raw/1092cb23520967830001a0807eb21d6a44dda522/EgyptianOpenType/font/eot.ttf"; url = "https://github.com/microsoft/font-tools/raw/1092cb23520967830001a0807eb21d6a44dda522/EgyptianOpenType/font/eot.ttf";
sha256 = "1n294vhcx90270pnsw1dbk6izd61fjvbnjrh4hcf98ff3s540x0c"; sha256 = "1n294vhcx90270pnsw1dbk6izd61fjvbnjrh4hcf98ff3s540x0c";
}; };
in { in
{
fonts = { fonts = {
enableDefaultPackages = true; enableDefaultPackages = true;
fontDir.enable = true; fontDir.enable = true;
@@ -117,10 +123,26 @@ in {
vollkorn vollkorn
zilla-slab zilla-slab
]; # google-fonts league-of-moveable-type ]; # google-fonts league-of-moveable-type
fontconfig.defaultFonts = let emoji = ["Noto Color Emoji"]; in { fontconfig.defaultFonts =
monospace = ["Noto Sans Mono"] ++ emoji; let
serif = ["Noto Serif" "Noto Naskh Arabic" "Noto Serif Devanagari"]; emoji = [ "Noto Color Emoji" ];
sansSerif = ["Noto Sans Display" "Noto Naskh Arabic" "Noto Sans Hebrew" "Noto Sans Devanagari" "Noto Sans CJK JP" "Noto Sans Coptic" "Noto Sans Syriac Western"]; in
{
monospace = [ "Noto Sans Mono" ] ++ emoji;
serif = [
"Noto Serif"
"Noto Naskh Arabic"
"Noto Serif Devanagari"
];
sansSerif = [
"Noto Sans Display"
"Noto Naskh Arabic"
"Noto Sans Hebrew"
"Noto Sans Devanagari"
"Noto Sans CJK JP"
"Noto Sans Coptic"
"Noto Sans Syriac Western"
];
inherit emoji; inherit emoji;
}; };
# xelatex fails with woff files # xelatex fails with woff files

View File

@@ -1,16 +1,19 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs.fzf = { programs.fzf = {
fuzzyCompletion = true; fuzzyCompletion = true;
keybindings = true; keybindings = true;
}; };
home-manager.users.me = { home-manager.users.me = {
programs.fzf = let programs.fzf =
let
defaultCommand = "${pkgs.fd}/bin/fd --type f --strip-cwd-prefix --follow --no-ignore-vcs --exclude .git"; defaultCommand = "${pkgs.fd}/bin/fd --type f --strip-cwd-prefix --follow --no-ignore-vcs --exclude .git";
in { in
{
enable = true; enable = true;
defaultCommand = defaultCommand; defaultCommand = defaultCommand;
defaultOptions = ["--height=40%"]; defaultOptions = [ "--height=40%" ];
changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d"; changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d";
changeDirWidgetOptions = [ changeDirWidgetOptions = [
"--preview='${pkgs.tree}/bin/tree -L 1 {}'" "--preview='${pkgs.tree}/bin/tree -L 1 {}'"
@@ -18,7 +21,7 @@
"--preview-window=hidden" "--preview-window=hidden"
]; ];
fileWidgetCommand = defaultCommand; fileWidgetCommand = defaultCommand;
fileWidgetOptions = ["--preview='head -$LINES {}'"]; fileWidgetOptions = [ "--preview='head -$LINES {}'" ];
}; };
}; };
} }

View File

@@ -1,13 +1,17 @@
{ {
pkgs, pkgs,
... ...
}: let }:
let
ledgerDirectory = "/home/kfm/sync/src/ledger"; ledgerDirectory = "/home/kfm/sync/src/ledger";
hora = pkgs.callPackage ../packages/hora.nix { timeLedger = "${ledgerDirectory}/time.timeclock"; }; hora = pkgs.callPackage ../packages/hora.nix { timeLedger = "${ledgerDirectory}/time.timeclock"; };
in { in
environment.systemPackages = let {
environment.systemPackages =
let
git = "${pkgs.git}/bin/git -C ${ledgerDirectory}"; git = "${pkgs.git}/bin/git -C ${ledgerDirectory}";
in [ in
[
hora hora
pkgs.hledger pkgs.hledger
(pkgs.writers.writeDashBin "hledger-git" '' (pkgs.writers.writeDashBin "hledger-git" ''

View File

@@ -22,8 +22,18 @@
sort_key = "PERCENT_CPU"; sort_key = "PERCENT_CPU";
tree_view = false; tree_view = false;
update_process_names = false; update_process_names = false;
right_meters = ["Uptime" "Tasks" "LoadAverage" "Battery"]; right_meters = [
left_meters = ["LeftCPUs2" "RightCPUs2" "Memory" "Swap"]; "Uptime"
"Tasks"
"LoadAverage"
"Battery"
];
left_meters = [
"LeftCPUs2"
"RightCPUs2"
"Memory"
"Swap"
];
}; };
}; };
}; };

View File

@@ -3,7 +3,8 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
klem = pkgs.klem.override { klem = pkgs.klem.override {
options.dmenu = "${pkgs.dmenu}/bin/dmenu -i -p klem"; options.dmenu = "${pkgs.dmenu}/bin/dmenu -i -p klem";
options.scripts = { options.scripts = {
@@ -51,7 +52,8 @@
''; '';
}; };
}; };
in { in
{
age.secrets = { age.secrets = {
github-token-i3status-rust = { github-token-i3status-rust = {
file = ../secrets/github-token-i3status-rust.age; file = ../secrets/github-token-i3status-rust.age;
@@ -105,7 +107,8 @@ in {
''; '';
}; };
home-manager.users.me = let home-manager.users.me =
let
modifier = "Mod4"; modifier = "Mod4";
infoWorkspace = ""; infoWorkspace = "";
messageWorkspace = ""; messageWorkspace = "";
@@ -122,19 +125,27 @@ in {
titlebar = false; titlebar = false;
border = 1; border = 1;
}; };
bars = let position = "bottom"; in [ bars =
(lib.recursiveUpdate config.home-manager.users.me.stylix.targets.i3.exportedBarConfig let
{ position = "bottom";
in
[
(lib.recursiveUpdate config.home-manager.users.me.stylix.targets.i3.exportedBarConfig {
workspaceButtons = true; workspaceButtons = true;
mode = "hide"; # "dock"; mode = "hide"; # "dock";
inherit position; inherit position;
statusCommand = toString (pkgs.writers.writeDash "i3status-rust" '' statusCommand = toString (
pkgs.writers.writeDash "i3status-rust" ''
export I3RS_GITHUB_TOKEN="$(cat ${config.age.secrets.github-token-i3status-rust.path})" export I3RS_GITHUB_TOKEN="$(cat ${config.age.secrets.github-token-i3status-rust.path})"
export OPENWEATHERMAP_API_KEY="$(cat ${config.age.secrets.openweathermap-api-key.path})" export OPENWEATHERMAP_API_KEY="$(cat ${config.age.secrets.openweathermap-api-key.path})"
exec ${config.home-manager.users.me.programs.i3status-rust.package}/bin/i3status-rs ${config.home-manager.users.me.home.homeDirectory}/.config/i3status-rust/config-${position}.toml exec ${config.home-manager.users.me.programs.i3status-rust.package}/bin/i3status-rs ${config.home-manager.users.me.home.homeDirectory}/.config/i3status-rust/config-${position}.toml
''); ''
);
fonts = { fonts = {
names = ["${config.stylix.fonts.sansSerif.name}" "FontAwesome 6 Free"]; names = [
"${config.stylix.fonts.sansSerif.name}"
"FontAwesome 6 Free"
];
size = config.stylix.fonts.sizes.desktop * 0.8; size = config.stylix.fonts.sizes.desktop * 0.8;
}; };
}) })
@@ -145,19 +156,27 @@ in {
hideEdgeBorders = "smart"; hideEdgeBorders = "smart";
commands = [ commands = [
{ {
criteria = {class = "floating";}; criteria = {
class = "floating";
};
command = "floating enable"; command = "floating enable";
} }
{ {
criteria = {class = "fzfmenu";}; criteria = {
class = "fzfmenu";
};
command = "floating enable"; command = "floating enable";
} }
{ {
criteria = {class = ".*";}; criteria = {
class = ".*";
};
command = "border pixel 2"; command = "border pixel 2";
} }
{ {
criteria = {class = "mpv";}; criteria = {
class = "mpv";
};
command = lib.strings.concatStringsSep ", " [ command = lib.strings.concatStringsSep ", " [
"floating enable" "floating enable"
"sticky enable" "sticky enable"
@@ -168,17 +187,25 @@ in {
} }
]; ];
}; };
colors = let colors =
let
background = config.lib.stylix.colors.withHashtag.base00; background = config.lib.stylix.colors.withHashtag.base00;
in { in
{
unfocused = { unfocused = {
border = lib.mkForce background; border = lib.mkForce background;
childBorder = lib.mkForce background; childBorder = lib.mkForce background;
}; };
}; };
keybindings = keybindings =
lib.listToAttrs (map (x: lib.nameValuePair "${modifier}+Shift+${toString x}" "move container to workspace ${toString x}") (lib.range 1 9)) lib.listToAttrs (
// lib.listToAttrs (map (x: lib.nameValuePair "${modifier}+${toString x}" "workspace ${toString x}") (lib.range 1 9)) map (
x: lib.nameValuePair "${modifier}+Shift+${toString x}" "move container to workspace ${toString x}"
) (lib.range 1 9)
)
// lib.listToAttrs (
map (x: lib.nameValuePair "${modifier}+${toString x}" "workspace ${toString x}") (lib.range 1 9)
)
// { // {
"${modifier}+i" = "workspace ${infoWorkspace}"; "${modifier}+i" = "workspace ${infoWorkspace}";
"${modifier}+m" = "workspace ${messageWorkspace}"; "${modifier}+m" = "workspace ${messageWorkspace}";
@@ -220,12 +247,14 @@ in {
"${modifier}+t" = "exec ${lib.getExe pkgs.niveum-filemanager}"; "${modifier}+t" = "exec ${lib.getExe pkgs.niveum-filemanager}";
"${modifier}+y" = "exec ${lib.getExe pkgs.niveum-browser}"; "${modifier}+y" = "exec ${lib.getExe pkgs.niveum-browser}";
"${modifier}+d" = "exec ${pkgs.writers.writeDash "run" ''exec rofi -modi run,ssh,window -show run''}"; "${modifier}+d" =
"exec ${pkgs.writers.writeDash "run" ''exec rofi -modi run,ssh,window -show run''}";
"${modifier}+Shift+d" = "exec ${pkgs.notemenu}/bin/notemenu"; "${modifier}+Shift+d" = "exec ${pkgs.notemenu}/bin/notemenu";
"${modifier}+p" = "exec rofi-pass"; "${modifier}+p" = "exec rofi-pass";
"${modifier}+Shift+p" = "exec rofi-pass --insert"; "${modifier}+Shift+p" = "exec rofi-pass --insert";
"${modifier}+u" = "exec ${pkgs.unicodmenu}/bin/unicodmenu"; "${modifier}+u" = "exec ${pkgs.unicodmenu}/bin/unicodmenu";
"${modifier}+Shift+u" = "exec ${pkgs.writers.writeDash "last-unicode" ''${pkgs.xdotool}/bin/xdotool type --delay 1000 "$(${pkgs.gawk}/bin/awk 'END{print $1}' ~/.cache/unicodmenu)"''}"; "${modifier}+Shift+u" =
"exec ${pkgs.writers.writeDash "last-unicode" ''${pkgs.xdotool}/bin/xdotool type --delay 1000 "$(${pkgs.gawk}/bin/awk 'END{print $1}' ~/.cache/unicodmenu)"''}";
"${modifier}+F7" = "exec ${pkgs.writers.writeDash "showkeys-toggle" '' "${modifier}+F7" = "exec ${pkgs.writers.writeDash "showkeys-toggle" ''
if ${pkgs.procps}/bin/pgrep screenkey; then if ${pkgs.procps}/bin/pgrep screenkey; then
@@ -259,7 +288,8 @@ in {
# XF86Back # XF86Back
# XF86Launch1 (thinkvantage) # XF86Launch1 (thinkvantage)
}; };
in { in
{
stylix.targets.i3.enable = true; stylix.targets.i3.enable = true;
xsession.windowManager.i3 = { xsession.windowManager.i3 = {
@@ -277,7 +307,15 @@ in {
exec --no-startup-id ${pkgs.xss-lock}/bin/xss-lock -- xsecurelock exec --no-startup-id ${pkgs.xss-lock}/bin/xss-lock -- xsecurelock
''; '';
config = { config = {
inherit modifier gaps modes bars floating window colors; inherit
modifier
gaps
modes
bars
floating
window
colors
;
keybindings = keybindings // { keybindings = keybindings // {
"${modifier}+F6" = "exec ${pkgs.xorg.xkill}/bin/xkill"; "${modifier}+F6" = "exec ${pkgs.xorg.xkill}/bin/xkill";
"${modifier}+F9" = "exec ${pkgs.redshift}/bin/redshift -O 4000 -b 0.85"; "${modifier}+F9" = "exec ${pkgs.redshift}/bin/redshift -O 4000 -b 0.85";

View File

@@ -2,7 +2,8 @@
pkgs, pkgs,
config, config,
... ...
}: { }:
{
age.secrets = { age.secrets = {
miniflux-api-token = { miniflux-api-token = {
file = ../secrets/miniflux-api-token.age; file = ../secrets/miniflux-api-token.age;
@@ -18,9 +19,11 @@
bars.bottom = { bars.bottom = {
icons = "awesome6"; icons = "awesome6";
settings = { settings = {
theme.overrides = let theme.overrides =
let
colours = config.lib.stylix.colors.withHashtag; colours = config.lib.stylix.colors.withHashtag;
in { in
{
idle_bg = colours.base00; idle_bg = colours.base00;
idle_fg = colours.base05; idle_fg = colours.base05;
good_bg = colours.base00; good_bg = colours.base00;
@@ -70,7 +73,7 @@
block = "memory"; block = "memory";
format = "$icon $mem_used.eng(prefix:G)"; format = "$icon $mem_used.eng(prefix:G)";
} }
{block = "load";} { block = "load"; }
{ {
block = "time"; block = "time";
format = "$icon $timestamp.datetime(f:'%Y-%m-%d (%W %a) %H:%M', l:de_DE)"; format = "$icon $timestamp.datetime(f:'%Y-%m-%d (%W %a) %H:%M', l:de_DE)";

View File

@@ -3,14 +3,16 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
davHome = "~/.local/share/dav"; davHome = "~/.local/share/dav";
kmeinCloud = { kmeinCloud = {
davEndpoint = "https://cloud.kmein.de/remote.php/dav"; davEndpoint = "https://cloud.kmein.de/remote.php/dav";
username = "kieran"; username = "kieran";
passwordFile = config.age.secrets.nextcloud-password-kieran.path; passwordFile = config.age.secrets.nextcloud-password-kieran.path;
}; };
in { in
{
age.secrets = { age.secrets = {
nextcloud-password-kieran = { nextcloud-password-kieran = {
file = ../secrets/nextcloud-password-kieran.age; file = ../secrets/nextcloud-password-kieran.age;
@@ -45,8 +47,8 @@ in {
systemd.user.services.vdirsyncer = { systemd.user.services.vdirsyncer = {
enable = true; enable = true;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
wantedBy = ["default.target"]; wantedBy = [ "default.target" ];
startAt = "*:00/10"; startAt = "*:00/10";
script = '' script = ''
${pkgs.vdirsyncer}/bin/vdirsyncer sync && ${pkgs.khal}/bin/khal printcalendars # https://lostpackets.de/khal/configure.html#syncing ${pkgs.vdirsyncer}/bin/vdirsyncer sync && ${pkgs.khal}/bin/khal printcalendars # https://lostpackets.de/khal/configure.html#syncing

View File

@@ -2,10 +2,11 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
systemd.services.lb-subscription = { systemd.services.lb-subscription = {
enable = true; enable = true;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
startAt = "weekly"; startAt = "weekly";
serviceConfig = { serviceConfig = {
user = "kfm"; user = "kfm";

View File

@@ -1,7 +1,8 @@
{pkgs, ...}: { { pkgs, ... }:
{
systemd.services.imaginary-illuminations = { systemd.services.imaginary-illuminations = {
enable = false; enable = false;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
serviceConfig = { serviceConfig = {
User = "kfm"; User = "kfm";
Group = "users"; Group = "users";

View File

@@ -2,7 +2,8 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
{
services.nginx.virtualHosts.default = { services.nginx.virtualHosts.default = {
locations."= /stub_status".extraConfig = "stub_status;"; locations."= /stub_status".extraConfig = "stub_status;";
}; };
@@ -41,12 +42,12 @@
systemd.services.promtail = { systemd.services.promtail = {
description = "Promtail service for Loki"; description = "Promtail service for Loki";
wantedBy = ["multi-user.target"]; wantedBy = [ "multi-user.target" ];
serviceConfig = { serviceConfig = {
ExecStart = '' ExecStart = ''
${pkgs.grafana-loki}/bin/promtail --config.file ${ ${pkgs.grafana-loki}/bin/promtail --config.file ${
(pkgs.formats.yaml {}).generate "promtail.yaml" { (pkgs.formats.yaml { }).generate "promtail.yaml" {
server = { server = {
http_listen_port = 28183; http_listen_port = 28183;
grpc_listen_port = 0; grpc_listen_port = 0;
@@ -55,9 +56,7 @@
clients = [ clients = [
{ {
url = "http://${ url = "http://${
if config.networking.hostName == "makanek" if config.networking.hostName == "makanek" then "127.0.0.1" else "makanek.r"
then "127.0.0.1"
else "makanek.r"
}:3100/loki/api/v1/push"; }:3100/loki/api/v1/push";
} }
]; ];
@@ -71,7 +70,7 @@
}; };
relabel_configs = [ relabel_configs = [
{ {
source_labels = ["__journal__systemd_unit"]; source_labels = [ "__journal__systemd_unit" ];
target_label = "unit"; target_label = "unit";
} }
]; ];

View File

@@ -3,9 +3,11 @@
lib, lib,
config, config,
... ...
}: let }:
let
swallow = command: "${pkgs.swallow}/bin/swallow ${command}"; swallow = command: "${pkgs.swallow}/bin/swallow ${command}";
in { in
{
environment.shellAliases.smpv = swallow "mpv"; environment.shellAliases.smpv = swallow "mpv";
nixpkgs.overlays = [ nixpkgs.overlays = [
@@ -19,7 +21,11 @@ in {
enable = true; enable = true;
config = { config = {
ytdl-format = "bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best"; ytdl-format = "bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best";
ytdl-raw-options = lib.concatStringsSep "," [''sub-lang="de,en"'' "write-sub=" "write-auto-sub="]; ytdl-raw-options = lib.concatStringsSep "," [
''sub-lang="de,en"''
"write-sub="
"write-auto-sub="
];
screenshot-template = "%F-%wH%wM%wS-%#04n"; screenshot-template = "%F-%wH%wM%wS-%#04n";
script-opts = "ytdl_hook-ytdl_path=${pkgs.yt-dlp}/bin/yt-dlp"; script-opts = "ytdl_hook-ytdl_path=${pkgs.yt-dlp}/bin/yt-dlp";
ao = "pulse"; # no pipewire for me :( ao = "pulse"; # no pipewire for me :(

View File

@@ -3,12 +3,16 @@
lib, lib,
config, config,
... ...
}: let }:
vim-kmein = (pkgs.vim-kmein.override { let
vim-kmein = (
pkgs.vim-kmein.override {
# stylixColors = config.lib.stylix.colors; # stylixColors = config.lib.stylix.colors;
colorscheme = "base16-gruvbox-dark-medium"; colorscheme = "base16-gruvbox-dark-medium";
}); }
in { );
in
{
environment.variables.EDITOR = lib.getExe vim-kmein; environment.variables.EDITOR = lib.getExe vim-kmein;
environment.shellAliases.vi = "nvim"; environment.shellAliases.vi = "nvim";
environment.shellAliases.vim = "nvim"; environment.shellAliases.vim = "nvim";

View File

@@ -1,7 +1,8 @@
{ {
pkgs, pkgs,
... ...
}: { }:
{
programs.nm-applet.enable = true; programs.nm-applet.enable = true;
networking.networkmanager = { networking.networkmanager = {
@@ -12,10 +13,10 @@
]; ];
wifi.macAddress = "random"; wifi.macAddress = "random";
ethernet.macAddress = "random"; ethernet.macAddress = "random";
unmanaged = ["docker*"]; unmanaged = [ "docker*" ];
}; };
users.users.me.extraGroups = ["networkmanager"]; users.users.me.extraGroups = [ "networkmanager" ];
environment.systemPackages = [ environment.systemPackages = [
pkgs.speedtest-cli pkgs.speedtest-cli

View File

@@ -2,7 +2,8 @@
pkgs, pkgs,
config, config,
... ...
}: { }:
{
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "miniflux-watch-later" '' (pkgs.writers.writeDashBin "miniflux-watch-later" ''
miniflux_api_token=$(cat ${config.age.secrets.miniflux-api-token.path}) miniflux_api_token=$(cat ${config.age.secrets.miniflux-api-token.path})

View File

@@ -2,13 +2,14 @@
pkgs, pkgs,
inputs, inputs,
... ...
}: { }:
{
nixpkgs = { nixpkgs = {
config.allowUnfree = true; config.allowUnfree = true;
}; };
nix = { nix = {
package = pkgs.nixVersions.stable; package = pkgs.nixVersions.stable;
extraOptions = "experimental-features = nix-command flakes"; extraOptions = "experimental-features = nix-command flakes";
nixPath = ["nixpkgs=${inputs.nixpkgs}"]; nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];
}; };
} }

View File

@@ -2,21 +2,23 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
openweathermap-repo = pkgs.fetchFromGitHub { openweathermap-repo = pkgs.fetchFromGitHub {
owner = "ip1981"; owner = "ip1981";
repo = "openweathermap"; repo = "openweathermap";
rev = "9cfef7b14ac5af7109449b54b1cb352b4c76167a"; rev = "9cfef7b14ac5af7109449b54b1cb352b4c76167a";
sha256 = "0sm43wicvw2fy7nq65s8vch6jjb5bszqr4ilnhibayamj4jcpw53"; sha256 = "0sm43wicvw2fy7nq65s8vch6jjb5bszqr4ilnhibayamj4jcpw53";
}; };
openweathermap = pkgs.haskellPackages.callCabal2nix "openweathermap" openweathermap-repo {}; openweathermap = pkgs.haskellPackages.callCabal2nix "openweathermap" openweathermap-repo { };
openweathermap-key = lib.strings.fileContents <secrets/openweathermap.key>; openweathermap-key = lib.strings.fileContents <secrets/openweathermap.key>;
in { in
{
nixpkgs.config.packageOverrides = pkgs: { nixpkgs.config.packageOverrides = pkgs: {
weather = pkgs.writers.writeDashBin "weather" '' weather = pkgs.writers.writeDashBin "weather" ''
${openweathermap}/bin/openweathermap --api-key ${openweathermap-key} "$@" ${openweathermap}/bin/openweathermap --api-key ${openweathermap-key} "$@"
''; '';
}; };
environment.systemPackages = [pkgs.weather]; environment.systemPackages = [ pkgs.weather ];
} }

View File

@@ -4,13 +4,16 @@
lib, lib,
inputs, inputs,
... ...
}: let }:
worldradio = pkgs.callPackage ../packages/worldradio.nix {}; let
worldradio = pkgs.callPackage ../packages/worldradio.nix { };
zoteroStyle = { zoteroStyle =
{
name, name,
sha256, sha256,
}: { }:
{
name = "${name}.csl"; name = "${name}.csl";
path = pkgs.fetchurl { path = pkgs.fetchurl {
url = "https://www.zotero.org/styles/${name}"; url = "https://www.zotero.org/styles/${name}";
@@ -32,7 +35,8 @@
}) })
]; ];
astrolog = pkgs.astrolog.overrideAttrs (old: astrolog = pkgs.astrolog.overrideAttrs (
old:
old old
// { // {
installPhase = '' installPhase = ''
@@ -51,8 +55,10 @@
/^:I /s/80/120/ # wider text output /^:I /s/80/120/ # wider text output
' $out/astrolog/astrolog.as ' $out/astrolog/astrolog.as
''; '';
}); }
in { );
in
{
home-manager.users.me.home.file = { home-manager.users.me.home.file = {
".csl".source = cslDirectory; ".csl".source = cslDirectory;
".local/share/pandoc/csl".source = cslDirectory; # as of pandoc 2.11, it includes citeproc ".local/share/pandoc/csl".source = cslDirectory; # as of pandoc 2.11, it includes citeproc
@@ -233,7 +239,11 @@ in {
go go
texlive.combined.scheme-full texlive.combined.scheme-full
latexrun latexrun
(aspellWithDicts (dict: [dict.de dict.en dict.en-computers])) (aspellWithDicts (dict: [
dict.de
dict.en
dict.en-computers
]))
# haskellPackages.pandoc-citeproc # haskellPackages.pandoc-citeproc
text2pdf text2pdf
lowdown lowdown

View File

@@ -1,6 +1,8 @@
{config, ...}: let { config, ... }:
let
user = config.users.users.me.name; user = config.users.users.me.name;
in { in
{
security.polkit.extraConfig = '' security.polkit.extraConfig = ''
polkit.addRule(function(action, subject) { polkit.addRule(function(action, subject) {
if (subject.user == "${user}" && action.id == "org.freedesktop.systemd1.manage-units") { if (subject.user == "${user}" && action.id == "org.freedesktop.systemd1.manage-units") {

View File

@@ -2,9 +2,11 @@
pkgs, pkgs,
config, config,
... ...
}: let }:
let
suspend = pkgs.writers.writeDash "suspend" "${pkgs.systemd}/bin/systemctl suspend"; suspend = pkgs.writers.writeDash "suspend" "${pkgs.systemd}/bin/systemctl suspend";
in { in
{
services.power-action = { services.power-action = {
enable = true; enable = true;
plans.suspend = { plans.suspend = {

View File

@@ -1,9 +1,11 @@
{pkgs, lib, ...}: let { pkgs, lib, ... }:
let
hp-driver = pkgs.hplip; hp-driver = pkgs.hplip;
in { in
{
services.printing = { services.printing = {
enable = true; enable = true;
drivers = [hp-driver]; drivers = [ hp-driver ];
}; };
environment.systemPackages = [ environment.systemPackages = [
@@ -30,7 +32,6 @@ in {
]; ];
} }
/* /*
HP/hp-officejet_4650_series.ppd.gz HP/hp-officejet_4650_series.ppd.gz
drv:///hp/hpcups.drv/hp-officejet_4650_series.ppd drv:///hp/hpcups.drv/hp-officejet_4650_series.ppd
*/ */

View File

@@ -2,8 +2,11 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
networking.hosts = {"42:0:ca48:f98f:63d7:31ce:922b:245d" = ["go"];}; {
networking.hosts = {
"42:0:ca48:f98f:63d7:31ce:922b:245d" = [ "go" ];
};
services.tinc.networks.retiolum = { services.tinc.networks.retiolum = {
rsaPrivateKeyFile = config.age.secrets.retiolum-rsa.path; rsaPrivateKeyFile = config.age.secrets.retiolum-rsa.path;

View File

@@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
home-manager.users.me.programs.rofi = { home-manager.users.me.programs.rofi = {
enable = true; enable = true;
pass = { pass = {
@@ -13,6 +14,6 @@
help_color="#FF0000" help_color="#FF0000"
''; # help_color set by https://github.com/mrossinek/dotfiles/commit/13fc5f24caa78c8f20547bf473266879507f13bf ''; # help_color set by https://github.com/mrossinek/dotfiles/commit/13fc5f24caa78c8f20547bf473266879507f13bf
}; };
plugins = [pkgs.rofi-calc]; plugins = [ pkgs.rofi-calc ];
}; };
} }

View File

@@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
services.pipewire = { services.pipewire = {
enable = true; enable = true;
alsa = { alsa = {
@@ -9,7 +10,7 @@
jack.enable = true; jack.enable = true;
}; };
systemd.user.services.pipewire-pulse.path = [pkgs.pulseaudio]; systemd.user.services.pipewire-pulse.path = [ pkgs.pulseaudio ];
services.avahi = { services.avahi = {
enable = true; enable = true;

View File

@@ -3,7 +3,8 @@
lib, lib,
inputs, inputs,
... ...
}: let }:
let
locker = x: "https://c.krebsco.de/${x}"; locker = x: "https://c.krebsco.de/${x}";
dictionaries = { dictionaries = {
lojban = { lojban = {
@@ -105,9 +106,11 @@
sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd"; sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd";
}; };
}; };
sanskrit = let sanskrit =
let
repo = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f"; repo = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f";
in { in
{
BoehtlingkRoth = pkgs.fetchzip { BoehtlingkRoth = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-and-Roth-Grosses-Petersburger-Worterbuch__2021-10-05_14-23-18Z__19MB.tar.gz"; url = "${repo}/sa-head/german-entries/tars/Bohtlingk-and-Roth-Grosses-Petersburger-Worterbuch__2021-10-05_14-23-18Z__19MB.tar.gz";
sha256 = "13414a8rgd7hd5ffar6nl68nk3ys60wjkgb7m11hp0ahaasmf6ly"; sha256 = "13414a8rgd7hd5ffar6nl68nk3ys60wjkgb7m11hp0ahaasmf6ly";
@@ -178,9 +181,11 @@
}; };
}; };
makeStardictDataDir = dicts: pkgs.linkFarm "dictionaries" (lib.mapAttrsToList (name: path: {inherit name path;}) dicts); makeStardictDataDir =
dicts: pkgs.linkFarm "dictionaries" (lib.mapAttrsToList (name: path: { inherit name path; }) dicts);
makeStardict = name: dicts: makeStardict =
name: dicts:
pkgs.writers.writeDashBin name '' pkgs.writers.writeDashBin name ''
set -efu set -efu
export SDCV_PAGER=${toString sdcvPager} export SDCV_PAGER=${toString sdcvPager}
@@ -188,7 +193,13 @@
''; '';
sdcvPager = pkgs.writers.writeDash "sdcvPager" '' sdcvPager = pkgs.writers.writeDash "sdcvPager" ''
export PATH=${lib.makeBinPath [pkgs.gnused pkgs.ncurses pkgs.less]} export PATH=${
lib.makeBinPath [
pkgs.gnused
pkgs.ncurses
pkgs.less
]
}
sed " sed "
s!<sup>1</sup>!¹!gI s!<sup>1</sup>!¹!gI
s!<sup>2</sup>!²!gI s!<sup>2</sup>!²!gI
@@ -291,7 +302,8 @@
s!</\?p[^>]*>!!gI s!</\?p[^>]*>!!gI
" | less -FR " | less -FR
''; '';
in { in
{
# environment.etc.stardict.source = toString (makeStardictDataDir ({ # environment.etc.stardict.source = toString (makeStardictDataDir ({
# Crum = pkgs.fetchzip { # Crum = pkgs.fetchzip {
# url = "http://download.huzheng.org/misc/stardict-Coptic-English_all_dialects-2.4.2.tar.bz2"; # url = "http://download.huzheng.org/misc/stardict-Coptic-English_all_dialects-2.4.2.tar.bz2";
@@ -325,64 +337,63 @@ in {
]; ];
} }
/* /*
https://github.com/latin-dict/Georges1910/releases/download/v1.0/Georges1910-stardict.zip https://github.com/latin-dict/Georges1910/releases/download/v1.0/Georges1910-stardict.zip
https://github.com/nikita-moor/latin-dictionary/releases/download/2020-02-14/LiddellScott1940-stardict.zip https://github.com/nikita-moor/latin-dictionary/releases/download/2020-02-14/LiddellScott1940-stardict.zip
http://download.huzheng.org/bigdict/stardict-Cambridge_Dictionary_of_American_Idioms-2.4.2.tar.bz2 http://download.huzheng.org/bigdict/stardict-Cambridge_Dictionary_of_American_Idioms-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Concise_Oxford_Thesaurus_2nd_Ed-2.4.2.tar.bz2 http://download.huzheng.org/bigdict/stardict-Concise_Oxford_Thesaurus_2nd_Ed-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P1-2.4.2.tar.bz2 http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P1-2.4.2.tar.bz2
http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P2-2.4.2.tar.bz2 http://download.huzheng.org/bigdict/stardict-Urban_Dictionary_P2-2.4.2.tar.bz2
Duden_Rechtschreibung = pkgs.fetchzip { Duden_Rechtschreibung = pkgs.fetchzip {
url = "http://download.huzheng.org/babylon/german/stardict-Duden_Rechtschreibung-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Duden_Rechtschreibung-2.4.2.tar.bz2";
sha256 = "0xiprb45s88w62rn8rlbjrsagbiliay9hszsiy20glwabf6zsfji"; sha256 = "0xiprb45s88w62rn8rlbjrsagbiliay9hszsiy20glwabf6zsfji";
}; };
Duden = pkgs.fetchzip { Duden = pkgs.fetchzip {
url = "http://download.huzheng.org/de/stardict-duden-2.4.2.tar.bz2"; url = "http://download.huzheng.org/de/stardict-duden-2.4.2.tar.bz2";
sha256 = "049i4ynfqqxykv1nlkyks94mvn14s22qdax5gg7hx1ks5y4xw64j"; sha256 = "049i4ynfqqxykv1nlkyks94mvn14s22qdax5gg7hx1ks5y4xw64j";
}; };
FreeOnlineDictionaryOfComputing = pkgs.fetchzip { FreeOnlineDictionaryOfComputing = pkgs.fetchzip {
url = "http://download.huzheng.org/dict.org/stardict-dictd_www.dict.org_foldoc-2.4.2.tar.bz2"; url = "http://download.huzheng.org/dict.org/stardict-dictd_www.dict.org_foldoc-2.4.2.tar.bz2";
sha256 = "1lw2i8dzxpx929cpgvv0x366dnh4drr10wzqmrhcd0kvwglqawgm"; sha256 = "1lw2i8dzxpx929cpgvv0x366dnh4drr10wzqmrhcd0kvwglqawgm";
}; };
Cappeller = pkgs.fetchzip { Cappeller = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/capeller-sanskrit-german__2021-10-05_14-23-18Z__1MB.tar.gz"; url = "${repo}/sa-head/german-entries/tars/capeller-sanskrit-german__2021-10-05_14-23-18Z__1MB.tar.gz";
sha256 = "0jwrj2aih2lrcjg0lqm8jrvq9vsas9s8j4c9ggbg2n0jyz03kci3"; sha256 = "0jwrj2aih2lrcjg0lqm8jrvq9vsas9s8j4c9ggbg2n0jyz03kci3";
stripRoot = false; stripRoot = false;
}; };
Yates = pkgs.fetchzip { Yates = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/yates__2021-10-05_14-23-18Z__2MB.tar.gz"; url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/yates__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "1k7gbalysf48pwa06zfykrqhdk466g35xy64b30k4z8bybgdn8z2"; sha256 = "1k7gbalysf48pwa06zfykrqhdk466g35xy64b30k4z8bybgdn8z2";
stripRoot = false; stripRoot = false;
}; };
Wilson = pkgs.fetchzip { Wilson = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/wilson__2021-10-05_14-23-18Z__3MB.tar.gz"; url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/wilson__2021-10-05_14-23-18Z__3MB.tar.gz";
sha256 = "0r5z1xif56zlw9r2jp3fvwmcjv4f2fhd9r17j30nah9awx2m1isg"; sha256 = "0r5z1xif56zlw9r2jp3fvwmcjv4f2fhd9r17j30nah9awx2m1isg";
stripRoot = false; stripRoot = false;
}; };
SpokenSanskrit = pkgs.fetchzip { SpokenSanskrit = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/spokensanskrit__2019-01-12_05-13-52Z__12MB.tar.gz"; url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/spokensanskrit__2019-01-12_05-13-52Z__12MB.tar.gz";
sha256 = "0x8j657mawvdcyd1knzvf33yp15z77d661n3h6g9hcj7wn9s5xyk"; sha256 = "0x8j657mawvdcyd1knzvf33yp15z77d661n3h6g9hcj7wn9s5xyk";
stripRoot = false; stripRoot = false;
}; };
Grassmann = pkgs.fetchzip { Grassmann = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/grassman-sanskrit-german__2021-10-05_14-23-18Z__2MB.tar.gz"; url = "${repo}/sa-head/german-entries/tars/grassman-sanskrit-german__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0jalsykaxkl6wzrky72lz8g3jdz26lmjpyibbfaf7a5vvnr55k02"; sha256 = "0jalsykaxkl6wzrky72lz8g3jdz26lmjpyibbfaf7a5vvnr55k02";
stripRoot = false; stripRoot = false;
}; };
Benfey = pkgs.fetchzip { Benfey = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/benfey__2021-10-05_14-23-18Z__2MB.tar.gz"; url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/benfey__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0lj3hgphqgnihn482g9kgjwbvdrcd38vc29v1fi36srn08qdhvcb"; sha256 = "0lj3hgphqgnihn482g9kgjwbvdrcd38vc29v1fi36srn08qdhvcb";
stripRoot = false; stripRoot = false;
}; };
ApteSa = pkgs.fetchzip { ApteSa = pkgs.fetchzip {
url = "${repo}/sa-head/en-entries/tars/apte-sa__2021-12-18_13-20-56Z__6MB.tar.gz"; url = "${repo}/sa-head/en-entries/tars/apte-sa__2021-12-18_13-20-56Z__6MB.tar.gz";
sha256 = "0cq1dd02d1pvmjnibbs2cscifjnk2z0nqccf5yzzilxkzsrarh32"; sha256 = "0cq1dd02d1pvmjnibbs2cscifjnk2z0nqccf5yzzilxkzsrarh32";
stripRoot = false; stripRoot = false;
}; };
MacDonell = pkgs.fetchzip { MacDonell = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/macdonell__2021-10-05_14-23-18Z__2MB.tar.gz"; url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/macdonell__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "1yzmj0393mxvjv4n2lnvd2c722v2bmxxiyq7pscdwni3bxip3h8s"; sha256 = "1yzmj0393mxvjv4n2lnvd2c722v2bmxxiyq7pscdwni3bxip3h8s";
stripRoot = false; stripRoot = false;
}; };
*/ */

View File

@@ -4,15 +4,17 @@
lib, lib,
inputs, inputs,
... ...
}: let }:
generatedWallpaper = pkgs.runCommand "wallpaper.png" {} '' let
generatedWallpaper = pkgs.runCommand "wallpaper.png" { } ''
${inputs.wallpaper-generator.packages.x86_64-linux.wp-gen}/bin/wallpaper-generator lines \ ${inputs.wallpaper-generator.packages.x86_64-linux.wp-gen}/bin/wallpaper-generator lines \
--output $out \ --output $out \
${lib.concatMapStringsSep " " ${lib.concatMapStringsSep " " (
(n: "--base0${lib.toHexString n}=${config.lib.stylix.colors.withHashtag."base0${lib.toHexString n}"}") n: "--base0${lib.toHexString n}=${config.lib.stylix.colors.withHashtag."base0${lib.toHexString n}"}"
(lib.range 0 15)} ) (lib.range 0 15)}
''; '';
in { in
{
# https://danth.github.io/stylix/tricks.html # https://danth.github.io/stylix/tricks.html
# stylix.image = inputs.wallpapers.outPath + "/meteora/rodrigo-soares-250630.jpg"; # stylix.image = inputs.wallpapers.outPath + "/meteora/rodrigo-soares-250630.jpg";
stylix.enable = true; stylix.enable = true;

View File

@@ -6,5 +6,5 @@
''; '';
}; };
users.users.me.extraGroups = ["wheel"]; users.users.me.extraGroups = [ "wheel" ];
} }

View File

@@ -2,13 +2,20 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
{
boot.extraModulePackages = with config.boot.kernelPackages; [ boot.extraModulePackages = with config.boot.kernelPackages; [
tp_smapi tp_smapi
acpi_call acpi_call
]; ];
boot.kernelModules = ["tp_smapi" "acpi_call"]; boot.kernelModules = [
environment.systemPackages = [pkgs.tpacpi-bat pkgs.powertop]; "tp_smapi"
"acpi_call"
];
environment.systemPackages = [
pkgs.tpacpi-bat
pkgs.powertop
];
services.tlp = { services.tlp = {
enable = true; enable = true;

View File

@@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
environment.systemPackages = [ environment.systemPackages = [
pkgs.tmuxp pkgs.tmuxp
pkgs.reptyr # move programs over to a tmux session pkgs.reptyr # move programs over to a tmux session

View File

@@ -1,5 +1,9 @@
{pkgs, ...}: { { pkgs, ... }:
{
services.tor.enable = true; services.tor.enable = true;
services.tor.client.enable = true; services.tor.client.enable = true;
environment.systemPackages = [pkgs.tor pkgs.torsocks]; environment.systemPackages = [
pkgs.tor
pkgs.torsocks
];
} }

View File

@@ -3,9 +3,14 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
username = "meinhak99"; username = "meinhak99";
fu-defaults = let mailhost = "mail.zedat.fu-berlin.de"; in { fu-defaults =
let
mailhost = "mail.zedat.fu-berlin.de";
in
{
imap.host = mailhost; imap.host = mailhost;
imap.port = 993; imap.port = 993;
imap.tls.enable = true; imap.tls.enable = true;
@@ -16,7 +21,8 @@
folders.sent = "Gesendet"; folders.sent = "Gesendet";
folders.trash = "Papierkorb"; folders.trash = "Papierkorb";
}; };
in { in
{
home-manager.users.me = { home-manager.users.me = {
programs.ssh = { programs.ssh = {
matchBlocks = { matchBlocks = {
@@ -28,9 +34,7 @@ in {
}; };
}; };
accounts.email.accounts = { accounts.email.accounts = {
letos = letos = lib.recursiveUpdate pkgs.lib.niveum.email.defaults {
lib.recursiveUpdate pkgs.lib.niveum.email.defaults
{
userName = "slfletos"; userName = "slfletos";
address = "letos.sprachlit@hu-berlin.de"; address = "letos.sprachlit@hu-berlin.de";
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-letos.path}"; passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-letos.path}";
@@ -40,19 +44,23 @@ in {
smtp.port = 25; smtp.port = 25;
smtp.tls.useStartTls = true; smtp.tls.useStartTls = true;
}; };
fu = fu = lib.recursiveUpdate pkgs.lib.niveum.email.defaults (
lib.recursiveUpdate pkgs.lib.niveum.email.defaults lib.recursiveUpdate fu-defaults (
(lib.recursiveUpdate fu-defaults let
(let userName = "meinhak99"; in { userName = "meinhak99";
in
{
userName = userName; userName = userName;
address = "kieran.meinhardt@fu-berlin.de"; address = "kieran.meinhardt@fu-berlin.de";
aliases = ["${userName}@fu-berlin.de"]; aliases = [ "${userName}@fu-berlin.de" ];
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-meinhak99.path}"; passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-meinhak99.path}";
himalaya = { himalaya = {
enable = true; enable = true;
settings.backend = "imap"; settings.backend = "imap";
}; };
})); }
)
);
}; };
}; };
@@ -82,7 +90,8 @@ in {
system.fsPackages = [ pkgs.sshfs ]; system.fsPackages = [ pkgs.sshfs ];
# https://www.zedat.fu-berlin.de/tip4u_157.pdf # https://www.zedat.fu-berlin.de/tip4u_157.pdf
fileSystems = let fileSystems =
let
fu-berlin-cifs-options = [ fu-berlin-cifs-options = [
"uid=${toString config.users.users.me.uid}" "uid=${toString config.users.users.me.uid}"
"gid=${toString config.users.groups.users.gid}" "gid=${toString config.users.groups.users.gid}"
@@ -111,30 +120,27 @@ in {
]; ];
}; };
}; };
in home-directory-mount "meinhak99"; in
home-directory-mount "meinhak99";
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "hu-vpn-split" '' (pkgs.writers.writeDashBin "hu-vpn-split" ''
${pkgs.openfortivpn}/bin/openfortivpn \ ${pkgs.openfortivpn}/bin/openfortivpn \
--password="$(cat "${config.age.secrets.email-password-letos.path}")" \ --password="$(cat "${config.age.secrets.email-password-letos.path}")" \
--config=${ --config=${pkgs.writeText "hu-berlin-split.config" ''
pkgs.writeText "hu-berlin-split.config" ''
host = forti-ssl.vpn.hu-berlin.de host = forti-ssl.vpn.hu-berlin.de
port = 443 port = 443
username = slfletos@split_tunnel username = slfletos@split_tunnel
'' ''}
}
'') '')
(pkgs.writers.writeDashBin "hu-vpn-full" '' (pkgs.writers.writeDashBin "hu-vpn-full" ''
${pkgs.openfortivpn}/bin/openfortivpn \ ${pkgs.openfortivpn}/bin/openfortivpn \
--password="$(cat "${config.age.secrets.email-password-letos.path}")" \ --password="$(cat "${config.age.secrets.email-password-letos.path}")" \
--config=${ --config=${pkgs.writeText "hu-berlin-full.config" ''
pkgs.writeText "hu-berlin-full.config" ''
host = forti-ssl.vpn.hu-berlin.de host = forti-ssl.vpn.hu-berlin.de
port = 443 port = 443
username = slfletos@tunnel_all username = slfletos@tunnel_all
'' ''}
}
'') '')
(pkgs.writers.writeDashBin "fu-vpn" '' (pkgs.writers.writeDashBin "fu-vpn" ''
if ${pkgs.wirelesstools}/bin/iwgetid | ${pkgs.gnugrep}/bin/grep --invert-match eduroam if ${pkgs.wirelesstools}/bin/iwgetid | ${pkgs.gnugrep}/bin/grep --invert-match eduroam

View File

@@ -1 +1,4 @@
{pkgs, ...}: {environment.systemPackages = [pkgs.vscode];} { pkgs, ... }:
{
environment.systemPackages = [ pkgs.vscode ];
}

View File

@@ -2,14 +2,16 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
# url = "http://wallpaper.r/realwallpaper-krebs-stars-berlin.png"; # url = "http://wallpaper.r/realwallpaper-krebs-stars-berlin.png";
url = "http://wallpaper.r/realwallpaper-krebs.png"; url = "http://wallpaper.r/realwallpaper-krebs.png";
stateDir = "~/.cache/wallpaper"; stateDir = "~/.cache/wallpaper";
in { in
{
systemd.user.services.wallpaper = { systemd.user.services.wallpaper = {
wantedBy = ["graphical-session.target"]; wantedBy = [ "graphical-session.target" ];
after = ["network.target"]; after = [ "network.target" ];
script = '' script = ''
set -euf set -euf

View File

@@ -2,8 +2,9 @@
config, config,
pkgs, pkgs,
... ...
}: { }:
environment.systemPackages = [pkgs.watson]; {
environment.systemPackages = [ pkgs.watson ];
environment.variables.WATSON_DIR = "${config.users.users.me.home}/cloud/Seafile/Documents/watson"; environment.variables.WATSON_DIR = "${config.users.users.me.home}/cloud/Seafile/Documents/watson";
} }

View File

@@ -2,23 +2,32 @@
config, config,
pkgs, pkgs,
... ...
}: let }:
let
promptColours.success = "cyan"; promptColours.success = "cyan";
promptColours.failure = "red"; promptColours.failure = "red";
in { in
programs.zsh = let {
programs.zsh =
let
zsh-completions = pkgs.fetchFromGitHub { zsh-completions = pkgs.fetchFromGitHub {
owner = "zsh-users"; owner = "zsh-users";
repo = "zsh-completions"; repo = "zsh-completions";
rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb"; rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb";
sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l"; sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l";
}; };
in { in
{
enable = true; enable = true;
enableCompletion = true; enableCompletion = true;
autosuggestions.enable = true; autosuggestions.enable = true;
syntaxHighlighting.enable = true; syntaxHighlighting.enable = true;
syntaxHighlighting.highlighters = ["main" "brackets" "pattern" "line"]; syntaxHighlighting.highlighters = [
"main"
"brackets"
"pattern"
"line"
];
interactiveShellInit = '' interactiveShellInit = ''
setopt INTERACTIVE_COMMENTS CORRECT setopt INTERACTIVE_COMMENTS CORRECT
setopt MULTIOS setopt MULTIOS

View File

@@ -452,6 +452,8 @@
}; };
}; };
formatter = eachSupportedSystem (system: nixpkgs.legacyPackages.${system}.nixfmt-tree);
packages = eachSupportedSystem ( packages = eachSupportedSystem (
system: system:
let let

View File

@@ -2,26 +2,34 @@
pkgs, pkgs,
lib, lib,
... ...
}: { }:
{
# watcher scripts # watcher scripts
url = address: url =
address:
pkgs.writers.writeDash "watch-url" '' pkgs.writers.writeDash "watch-url" ''
${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} \ ${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} \
| ${pkgs.python3Packages.html2text}/bin/html2text --decode-errors=ignore | ${pkgs.python3Packages.html2text}/bin/html2text --decode-errors=ignore
''; '';
urlSelector = selector: address: urlSelector =
selector: address:
pkgs.writers.writeDash "watch-url-selector" '' pkgs.writers.writeDash "watch-url-selector" ''
${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} \ ${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} \
| ${pkgs.htmlq}/bin/htmlq ${lib.escapeShellArg selector} \ | ${pkgs.htmlq}/bin/htmlq ${lib.escapeShellArg selector} \
| ${pkgs.python3Packages.html2text}/bin/html2text | ${pkgs.python3Packages.html2text}/bin/html2text
''; '';
urlJSON = {jqScript ? "."}: address: urlJSON =
{
jqScript ? ".",
}:
address:
pkgs.writers.writeDash "watch-url-json" '' pkgs.writers.writeDash "watch-url-json" ''
${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} | ${pkgs.jq}/bin/jq -f ${pkgs.writeText "script.jq" jqScript} ${pkgs.curl}/bin/curl -sSL ${lib.escapeShellArg address} | ${pkgs.jq}/bin/jq -f ${pkgs.writeText "script.jq" jqScript}
''; '';
# reporter scripts # reporter scripts
kpaste-irc = { kpaste-irc =
{
target, target,
retiolumLink ? false, retiolumLink ? false,
server ? "irc.r", server ? "irc.r",
@@ -30,11 +38,7 @@
}: }:
pkgs.writers.writeDash "kpaste-irc-reporter" '' pkgs.writers.writeDash "kpaste-irc-reporter" ''
KPASTE_CONTENT_TYPE=text/plain ${pkgs.kpaste}/bin/kpaste \ KPASTE_CONTENT_TYPE=text/plain ${pkgs.kpaste}/bin/kpaste \
| ${pkgs.gnused}/bin/sed -n "${ | ${pkgs.gnused}/bin/sed -n "${if retiolumLink then "2" else "3"}s/^/${messagePrefix}/p" \
if retiolumLink
then "2"
else "3"
}s/^/${messagePrefix}/p" \
| ${pkgs.nur.repos.mic92.ircsink}/bin/ircsink \ | ${pkgs.nur.repos.mic92.ircsink}/bin/ircsink \
--nick ${nick} \ --nick ${nick} \
--server ${server} \ --server ${server} \

View File

@@ -84,7 +84,11 @@ in
Type = "simple"; Type = "simple";
ExecStart = '' ExecStart = ''
${lib.getExe cfg.package} \ ${lib.getExe cfg.package} \
${lib.optionalString (cfg.contactInstructions != null) ("--contact " + lib.escapeShellArg cfg.contactInstructions)} \ ${
lib.optionalString (cfg.contactInstructions != null) (
"--contact " + lib.escapeShellArg cfg.contactInstructions
)
} \
--host ${cfg.host} \ --host ${cfg.host} \
--index ${pkgs.writeText "index.html" cfg.homePageTemplate} \ --index ${pkgs.writeText "index.html" cfg.homePageTemplate} \
--listen ${cfg.listenAddress} \ --listen ${cfg.listenAddress} \

View File

@@ -4,18 +4,20 @@
pkgs, pkgs,
... ...
}: }:
with lib; let with lib;
let
cfg = config.services.moodle-dl; cfg = config.services.moodle-dl;
json = pkgs.formats.json {}; json = pkgs.formats.json { };
moodle-dl-json = json.generate "moodle-dl.json" cfg.settings; moodle-dl-json = json.generate "moodle-dl.json" cfg.settings;
stateDirectoryDefault = "/var/lib/moodle-dl"; stateDirectoryDefault = "/var/lib/moodle-dl";
in { in
{
options = { options = {
services.moodle-dl = { services.moodle-dl = {
enable = mkEnableOption "moodle-dl, a Moodle downloader"; enable = mkEnableOption "moodle-dl, a Moodle downloader";
settings = mkOption { settings = mkOption {
default = {}; default = { };
type = json.type; type = json.type;
description = '' description = ''
Configuration for moodle-dl. For a full example, see Configuration for moodle-dl. For a full example, see
@@ -69,11 +71,11 @@ in {
group = "moodle-dl"; group = "moodle-dl";
}; };
users.groups.moodle-dl = {}; users.groups.moodle-dl = { };
systemd.services.moodle-dl = { systemd.services.moodle-dl = {
description = "A Moodle downloader that downloads course content"; description = "A Moodle downloader that downloads course content";
wants = ["network-online.target"]; wants = [ "network-online.target" ];
serviceConfig = mkMerge [ serviceConfig = mkMerge [
{ {
Type = "oneshot"; Type = "oneshot";
@@ -83,11 +85,11 @@ in {
ExecStart = "${cfg.package}/bin/moodle-dl ${lib.optionalString cfg.notifyOnly "--without-downloading-files"}"; ExecStart = "${cfg.package}/bin/moodle-dl ${lib.optionalString cfg.notifyOnly "--without-downloading-files"}";
ExecStartPre = pkgs.writers.writeDash "moodle-dl-config" "${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${toString moodle-dl-json} ${toString cfg.tokensFile} > ${cfg.directory}/config.json"; ExecStartPre = pkgs.writers.writeDash "moodle-dl-config" "${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${toString moodle-dl-json} ${toString cfg.tokensFile} > ${cfg.directory}/config.json";
} }
(mkIf (cfg.directory == stateDirectoryDefault) {StateDirectory = "moodle-dl";}) (mkIf (cfg.directory == stateDirectoryDefault) { StateDirectory = "moodle-dl"; })
]; ];
inherit (cfg) startAt; inherit (cfg) startAt;
}; };
}; };
meta.maintainers = [maintainers.kmein]; meta.maintainers = [ maintainers.kmein ];
} }

View File

@@ -3,11 +3,13 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
options.services.panoptikon = { options.services.panoptikon = {
enable = lib.mkEnableOption "Generic command output / website watcher"; enable = lib.mkEnableOption "Generic command output / website watcher";
watchers = lib.mkOption { watchers = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule (watcher: { type = lib.types.attrsOf (
lib.types.submodule (watcher: {
options = { options = {
script = lib.mkOption { script = lib.mkOption {
type = lib.types.path; type = lib.types.path;
@@ -33,7 +35,7 @@
description = '' description = ''
This can be used to pass secrets to the systemd service without adding them to the nix store. This can be used to pass secrets to the systemd service without adding them to the nix store.
''; '';
default = []; default = [ ];
}; };
reporters = lib.mkOption { reporters = lib.mkOption {
type = lib.types.listOf lib.types.path; type = lib.types.listOf lib.types.path;
@@ -54,12 +56,14 @@
''; '';
}; };
}; };
config = {}; config = { };
})); })
);
}; };
}; };
config = let config =
let
cfg = config.services.panoptikon; cfg = config.services.panoptikon;
in in
lib.mkIf cfg.enable { lib.mkIf cfg.enable {
@@ -70,16 +74,17 @@
group = "panoptikon"; group = "panoptikon";
}; };
users.extraGroups.panoptikon = {}; users.extraGroups.panoptikon = { };
systemd.timers = lib.attrsets.mapAttrs' (watcherName: _: systemd.timers = lib.attrsets.mapAttrs' (
watcherName: _:
lib.nameValuePair "panoptikon-${watcherName}" { lib.nameValuePair "panoptikon-${watcherName}" {
timerConfig.RandomizedDelaySec = toString (60 * 60); timerConfig.RandomizedDelaySec = toString (60 * 60);
}) }
cfg.watchers; ) cfg.watchers;
systemd.services = systemd.services = lib.attrsets.mapAttrs' (
lib.attrsets.mapAttrs' (watcherName: watcherOptions: watcherName: watcherOptions:
lib.nameValuePair "panoptikon-${watcherName}" { lib.nameValuePair "panoptikon-${watcherName}" {
enable = true; enable = true;
startAt = watcherOptions.frequency; startAt = watcherOptions.frequency;
@@ -97,18 +102,22 @@
StartLimitBurst = "5"; StartLimitBurst = "5";
}; };
environment.PANOPTIKON_WATCHER = watcherName; environment.PANOPTIKON_WATCHER = watcherName;
wants = ["network-online.target"]; wants = [ "network-online.target" ];
script = '' script = ''
set -fux set -fux
${watcherOptions.script} > ${lib.escapeShellArg watcherName} ${watcherOptions.script} > ${lib.escapeShellArg watcherName}
diff_output=$(${pkgs.diffutils}/bin/diff --new-file ${lib.escapeShellArg (watcherName + ".old")} ${lib.escapeShellArg watcherName} || :) diff_output=$(${pkgs.diffutils}/bin/diff --new-file ${
lib.escapeShellArg (watcherName + ".old")
} ${lib.escapeShellArg watcherName} || :)
if [ -n "$diff_output" ] if [ -n "$diff_output" ]
then then
${lib.strings.concatMapStringsSep "\n" (reporter: ''echo "$diff_output" | ${reporter} || :'') watcherOptions.reporters} ${lib.strings.concatMapStringsSep "\n" (
reporter: ''echo "$diff_output" | ${reporter} || :''
) watcherOptions.reporters}
fi fi
mv ${lib.escapeShellArg watcherName} ${lib.escapeShellArg (watcherName + ".old")} mv ${lib.escapeShellArg watcherName} ${lib.escapeShellArg (watcherName + ".old")}
''; '';
}) }
cfg.watchers; ) cfg.watchers;
}; };
} }

View File

@@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
cfg = config.niveum.passport; cfg = config.niveum.passport;
sortOn = a: lib.sort (as1: as2: lib.lessThan (lib.getAttr a as1) (lib.getAttr a as2)); sortOn = a: lib.sort (as1: as2: lib.lessThan (lib.getAttr a as1) (lib.getAttr a as2));
css = '' css = ''
@@ -52,20 +53,22 @@
} }
''; '';
in in
with lib; { with lib;
{
options.niveum.passport = { options.niveum.passport = {
enable = mkEnableOption "server passport"; enable = mkEnableOption "server passport";
introductionHTML = mkOption {type = types.str;}; introductionHTML = mkOption { type = types.str; };
virtualHost = mkOption { virtualHost = mkOption {
type = types.str; type = types.str;
}; };
services = mkOption { services = mkOption {
type = types.listOf (types.submodule { type = types.listOf (
types.submodule {
options = { options = {
title = mkOption {type = types.str;}; title = mkOption { type = types.str; };
link = mkOption { link = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
@@ -75,8 +78,9 @@ in
default = ""; default = "";
}; };
}; };
}); }
default = []; );
default = [ ];
}; };
}; };
@@ -132,4 +136,4 @@ in
index index.html; index index.html;
''; '';
}; };
} }

View File

@@ -4,7 +4,8 @@
pkgs, pkgs,
... ...
}: }:
with lib; let with lib;
let
cfg = config.services.power-action; cfg = config.services.power-action;
out = { out = {
@@ -27,7 +28,8 @@ with lib; let
default = "*:0/1"; default = "*:0/1";
}; };
plans = mkOption { plans = mkOption {
type = with types; type =
with types;
attrsOf (submodule { attrsOf (submodule {
options = { options = {
charging = mkOption { charging = mkOption {
@@ -71,14 +73,18 @@ with lib; let
state="$(${state})" state="$(${state})"
${concatStringsSep "\n" (mapAttrsToList writeRule cfg.plans)} ${concatStringsSep "\n" (mapAttrsToList writeRule cfg.plans)}
''; '';
charging_check = plan: charging_check =
if (plan.charging == null) plan:
then "" if (plan.charging == null) then
else if plan.charging ""
then ''&& [ "$state" = "true" ]'' else if plan.charging then
else ''&& ! [ "$state" = "true" ]''; ''&& [ "$state" = "true" ]''
else
''&& ! [ "$state" = "true" ]'';
writeRule = _: plan: "if [ $power -ge ${toString plan.lowerLimit} ] && [ $power -le ${toString plan.upperLimit} ] ${charging_check plan}; then ${plan.action}; fi"; writeRule =
_: plan:
"if [ $power -ge ${toString plan.lowerLimit} ] && [ $power -le ${toString plan.upperLimit} ] ${charging_check plan}; then ${plan.action}; fi";
powerlvl = pkgs.writers.writeDash "powerlvl" '' powerlvl = pkgs.writers.writeDash "powerlvl" ''
cat /sys/class/power_supply/${cfg.battery}/capacity cat /sys/class/power_supply/${cfg.battery}/capacity
@@ -91,4 +97,4 @@ with lib; let
fi fi
''; '';
in in
out out

View File

@@ -4,10 +4,12 @@
lib, lib,
... ...
}: }:
with lib; let with lib;
let
netname = "retiolum"; netname = "retiolum";
cfg = config.networking.retiolum; cfg = config.networking.retiolum;
in { in
{
options = { options = {
networking.retiolum.ipv4 = mkOption { networking.retiolum.ipv4 = mkOption {
type = types.str; type = types.str;
@@ -33,10 +35,9 @@ in {
config = { config = {
services.tinc.networks.${netname} = { services.tinc.networks.${netname} = {
name = cfg.nodename; name = cfg.nodename;
hosts = hosts = builtins.mapAttrs (name: _: builtins.readFile "${<retiolum/hosts>}/${name}") (
builtins.mapAttrs builtins.readDir <retiolum/hosts>
(name: _: builtins.readFile "${<retiolum/hosts>}/${name}") );
(builtins.readDir <retiolum/hosts>);
rsaPrivateKeyFile = toString <system-secrets/retiolum.key>; rsaPrivateKeyFile = toString <system-secrets/retiolum.key>;
ed25519PrivateKeyFile = toString <system-secrets/retiolum.ed25519>; ed25519PrivateKeyFile = toString <system-secrets/retiolum.ed25519>;
extraConfig = '' extraConfig = ''
@@ -47,11 +48,11 @@ in {
networking.extraHosts = builtins.readFile (toString <retiolum/etc.hosts>); networking.extraHosts = builtins.readFile (toString <retiolum/etc.hosts>);
environment.systemPackages = [config.services.tinc.networks.${netname}.package]; environment.systemPackages = [ config.services.tinc.networks.${netname}.package ];
networking.firewall = { networking.firewall = {
allowedTCPPorts = [655]; allowedTCPPorts = [ 655 ];
allowedUDPPorts = [655]; allowedUDPPorts = [ 655 ];
}; };
#services.netdata.portcheck.checks.tinc.port = 655; #services.netdata.portcheck.checks.tinc.port = 655;

View File

@@ -4,13 +4,15 @@
pkgs, pkgs,
... ...
}: }:
with lib; { with lib;
{
options.niveum = { options.niveum = {
wirelessInterface = mkOption {type = types.str;}; wirelessInterface = mkOption { type = types.str; };
batteryName = mkOption {type = types.str;}; batteryName = mkOption { type = types.str; };
promptColours = let promptColours =
let
colours16 = types.enum [ colours16 = types.enum [
"black" "black"
"red" "red"
@@ -21,7 +23,8 @@ with lib; {
"cyan" "cyan"
"white" "white"
]; ];
in { in
{
success = mkOption { success = mkOption {
type = colours16; type = colours16;
default = "green"; default = "green";

View File

@@ -4,24 +4,29 @@
pkgs, pkgs,
... ...
}: }:
with lib; let with lib;
let
cfg = config.niveum.bots; cfg = config.niveum.bots;
botService = name: bot: botService =
name: bot:
nameValuePair "bot-${name}" { nameValuePair "bot-${name}" {
enable = bot.enable; enable = bot.enable;
startAt = bot.time; startAt = bot.time;
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
LoadCredential = lib.optionals (bot.telegram.enable) [ LoadCredential =
lib.optionals (bot.telegram.enable) [
"telegram-token:${bot.telegram.tokenFile}" "telegram-token:${bot.telegram.tokenFile}"
] ++ lib.optionals (bot.mastodon.enable) [ ]
++ lib.optionals (bot.mastodon.enable) [
"mastodon-token:${bot.mastodon.tokenFile}" "mastodon-token:${bot.mastodon.tokenFile}"
] ++ lib.optionals (bot.matrix.enable) [ ]
++ lib.optionals (bot.matrix.enable) [
"matrix-token:${bot.matrix.tokenFile}" "matrix-token:${bot.matrix.tokenFile}"
]; ];
}; };
wants = ["network-online.target"]; wants = [ "network-online.target" ];
script = '' script = ''
QUOTE=$(${bot.command}) QUOTE=$(${bot.command})
if [ -n "$QUOTE" ]; then if [ -n "$QUOTE" ]; then
@@ -30,12 +35,14 @@ with lib; let
${lib.optionalString (bot.matrix.enable) '' ${lib.optionalString (bot.matrix.enable) ''
export MATRIX_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/matrix-token")" export MATRIX_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/matrix-token")"
export JSON_PAYLOAD=$(${pkgs.jq}/bin/jq -n --arg msgtype "m.text" --arg body "$QUOTE" '{msgtype: $msgtype, body: $body}') export JSON_PAYLOAD=$(${pkgs.jq}/bin/jq -n --arg msgtype "m.text" --arg body "$QUOTE" '{msgtype: $msgtype, body: $body}')
${strings.concatStringsSep "\n" (map (chatId: '' ${strings.concatStringsSep "\n" (
map (chatId: ''
${pkgs.curl}/bin/curl -X POST "https://${bot.matrix.homeserver}/_matrix/client/r0/rooms/${chatId}/send/m.room.message" \ ${pkgs.curl}/bin/curl -X POST "https://${bot.matrix.homeserver}/_matrix/client/r0/rooms/${chatId}/send/m.room.message" \
-d "$JSON_PAYLOAD" \ -d "$JSON_PAYLOAD" \
-H "Authorization: Bearer $MATRIX_TOKEN" \ -H "Authorization: Bearer $MATRIX_TOKEN" \
-H "Content-Type: application/json" -H "Content-Type: application/json"
'') bot.matrix.chatIds)} '') bot.matrix.chatIds
)}
''} ''}
${lib.optionalString (bot.mastodon.enable) '' ${lib.optionalString (bot.mastodon.enable) ''
@@ -49,32 +56,36 @@ with lib; let
${lib.optionalString (bot.telegram.enable) '' ${lib.optionalString (bot.telegram.enable) ''
export TELEGRAM_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/telegram-token")" export TELEGRAM_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/telegram-token")"
${strings.concatStringsSep "\n" (map (chatId: '' ${strings.concatStringsSep "\n" (
map (chatId: ''
${pkgs.curl}/bin/curl -X POST "https://api.telegram.org/bot''${TELEGRAM_TOKEN}/sendMessage" \ ${pkgs.curl}/bin/curl -X POST "https://api.telegram.org/bot''${TELEGRAM_TOKEN}/sendMessage" \
-d chat_id="${chatId}" \ -d chat_id="${chatId}" \
-d text="$QUOTE" ${ -d text="$QUOTE" ${
lib.strings.optionalString (bot.telegram.parseMode != null) lib.strings.optionalString (
"-d parse_mode=${bot.telegram.parseMode}" bot.telegram.parseMode != null
) "-d parse_mode=${bot.telegram.parseMode}"
} | ${pkgs.jq}/bin/jq -e .ok } | ${pkgs.jq}/bin/jq -e .ok
'') '') bot.telegram.chatIds
bot.telegram.chatIds)} )}
''} ''}
fi fi
''; '';
}; };
in { in
{
options.niveum.bots = mkOption { options.niveum.bots = mkOption {
type = types.attrsOf (types.submodule { type = types.attrsOf (
types.submodule {
options = { options = {
enable = mkEnableOption "Mastodon and Telegram bot"; enable = mkEnableOption "Mastodon and Telegram bot";
time = mkOption {type = types.str;}; time = mkOption { type = types.str; };
command = mkOption {type = types.str;}; command = mkOption { type = types.str; };
matrix = mkOption { matrix = mkOption {
default = {}; default = { };
type = types.submodule { type = types.submodule {
options = { options = {
enable = mkEnableOption "Posting to Matrix"; enable = mkEnableOption "Posting to Matrix";
tokenFile = mkOption {type = types.path;}; tokenFile = mkOption { type = types.path; };
homeserver = mkOption { homeserver = mkOption {
type = types.str; type = types.str;
}; };
@@ -85,7 +96,7 @@ in {
}; };
}; };
mastodon = mkOption { mastodon = mkOption {
default = {}; default = { };
type = types.submodule { type = types.submodule {
options = { options = {
enable = mkEnableOption "Posting to Mastodon"; enable = mkEnableOption "Posting to Mastodon";
@@ -93,7 +104,7 @@ in {
type = types.str; type = types.str;
default = "en"; default = "en";
}; };
tokenFile = mkOption {type = types.path;}; tokenFile = mkOption { type = types.path; };
homeserver = mkOption { homeserver = mkOption {
type = types.str; type = types.str;
default = "social.krebsco.de"; default = "social.krebsco.de";
@@ -102,25 +113,33 @@ in {
}; };
}; };
telegram = mkOption { telegram = mkOption {
default = {}; default = { };
type = types.submodule { type = types.submodule {
options = { options = {
enable = mkEnableOption "Posting to Telegram"; enable = mkEnableOption "Posting to Telegram";
tokenFile = mkOption {type = types.path;}; tokenFile = mkOption { type = types.path; };
chatIds = mkOption { chatIds = mkOption {
type = types.listOf (types.strMatching "-?[0-9]+|@[A-Za-z0-9]+"); type = types.listOf (types.strMatching "-?[0-9]+|@[A-Za-z0-9]+");
}; };
parseMode = mkOption { parseMode = mkOption {
type = types.nullOr (types.enum ["HTML" "Markdown"]); type = types.nullOr (
types.enum [
"HTML"
"Markdown"
]
);
default = null; default = null;
}; };
}; };
}; };
}; };
}; };
}); }
default = {}; );
default = { };
}; };
config = {systemd.services = attrsets.mapAttrs' botService cfg;}; config = {
systemd.services = attrsets.mapAttrs' botService cfg;
};
} }

View File

@@ -3,14 +3,16 @@
haskell, haskell,
haskellPackages, haskellPackages,
}: }:
writers.writeHaskellBin "betacode" { writers.writeHaskellBin "betacode"
{
libraries = [ libraries = [
(haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode)) (haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode))
haskellPackages.text haskellPackages.text
]; ];
} '' }
''
import qualified Data.Text.IO as T import qualified Data.Text.IO as T
import qualified Data.Text as T import qualified Data.Text as T
import Text.BetaCode import Text.BetaCode
main = T.interact (either (error . T.unpack) id . fromBeta) main = T.interact (either (error . T.unpack) id . fromBeta)
'' ''

View File

@@ -1,4 +1,10 @@
{ writers, flite, netcat, gnused, ... }: {
writers,
flite,
netcat,
gnused,
...
}:
writers.writeDashBin "brainmelter" '' writers.writeDashBin "brainmelter" ''
SERVER="brockman.news" SERVER="brockman.news"
PORT=6667 PORT=6667

View File

@@ -6,8 +6,15 @@
writers.writeDashBin "closest" '' writers.writeDashBin "closest" ''
${ ${
writers.writeHaskellBin "closest" { writers.writeHaskellBin "closest" {
libraries = with haskellPackages; [parallel optparse-applicative edit-distance]; libraries = with haskellPackages; [
ghcArgs = ["-O3" "-threaded"]; parallel
optparse-applicative
edit-distance
];
ghcArgs = [
"-O3"
"-threaded"
];
} (builtins.readFile ./distance.hs) } (builtins.readFile ./distance.hs)
}/bin/closest +RTS -N4 -RTS --dictionary ${ }/bin/closest +RTS -N4 -RTS --dictionary ${
fetchurl { fetchurl {

View File

@@ -1,4 +1,4 @@
{pkgs}: { pkgs }:
pkgs.symlinkJoin { pkgs.symlinkJoin {
name = "cyberlocker-tools"; name = "cyberlocker-tools";
paths = [ paths = [

View File

@@ -1,7 +1,8 @@
{ {
lib, lib,
writeShellScriptBin, writeShellScriptBin,
}: let }:
let
aliasFlag = name: value: "-c alias.${name}=${lib.escapeShellArg value}"; aliasFlag = name: value: "-c alias.${name}=${lib.escapeShellArg value}";
aliases = { aliases = {
eroeffne = "init"; eroeffne = "init";
@@ -23,10 +24,10 @@
zustand = "status"; zustand = "status";
}; };
in in
writeShellScriptBin "depp" '' writeShellScriptBin "depp" ''
if [ $# -gt 0 ]; then if [ $# -gt 0 ]; then
git ${lib.concatStringsSep " " (lib.attrsets.mapAttrsToList aliasFlag aliases)} "$@" git ${lib.concatStringsSep " " (lib.attrsets.mapAttrsToList aliasFlag aliases)} "$@"
else else
printf "${lib.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: n + " " + v) aliases)}\n" printf "${lib.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: n + " " + v) aliases)}\n"
fi fi
'' ''

View File

@@ -1,4 +1,4 @@
{yarn2nix-moretea, lib}: { yarn2nix-moretea, lib }:
yarn2nix-moretea.mkYarnPackage { yarn2nix-moretea.mkYarnPackage {
name = "devanagari"; name = "devanagari";
src = lib.fileset.toSource { src = lib.fileset.toSource {

View File

@@ -4,7 +4,8 @@
linkFarm, linkFarm,
runCommandNoCC, runCommandNoCC,
gnutar, gnutar,
}: rec { }:
rec {
offline_cache = linkFarm "offline" packages; offline_cache = linkFarm "offline" packages;
packages = [ packages = [
{ {

View File

@@ -16,8 +16,8 @@ stdenv.mkDerivation {
sha256 = "0f2jb8knx7lqy6wmf3rchgq2n2dj496lm8vgcs58rppzrmsk59d5"; sha256 = "0f2jb8knx7lqy6wmf3rchgq2n2dj496lm8vgcs58rppzrmsk59d5";
}; };
nativeBuildInputs = [makeWrapper]; nativeBuildInputs = [ makeWrapper ];
buildInputs = [xdo]; buildInputs = [ xdo ];
DESTDIR = "$(out)"; DESTDIR = "$(out)";

View File

@@ -15,7 +15,20 @@
writers.writeDashBin "dmenu-randr" '' writers.writeDashBin "dmenu-randr" ''
#!/bin/sh #!/bin/sh
export PATH=${lib.makeBinPath [dmenu bc psmisc util-linux xorg.xrandr gawk libnotify arandr gnugrep coreutils]} export PATH=${
lib.makeBinPath [
dmenu
bc
psmisc
util-linux
xorg.xrandr
gawk
libnotify
arandr
gnugrep
coreutils
]
}
# A UI for detecting and selecting all displays. Probes xrandr for connected # A UI for detecting and selecting all displays. Probes xrandr for connected
# displays and lets user select one to use. User may also select "manual # displays and lets user select one to use. User may also select "manual

View File

@@ -10,7 +10,15 @@
}: }:
writers.writeDashBin "emailmenu" '' writers.writeDashBin "emailmenu" ''
history_file=$HOME/.cache/emailmenu history_file=$HOME/.cache/emailmenu
PATH=${lib.makeBinPath [coreutils dmenu gawk libnotify xclip]} PATH=${
lib.makeBinPath [
coreutils
dmenu
gawk
libnotify
xclip
]
}
chosen=$(${khard}/bin/khard email --parsable | awk '!seen[$0]++' | dmenu -i -p 📧 -1 -l 10 | tee --append "$history_file" | cut -f1) chosen=$(${khard}/bin/khard email --parsable | awk '!seen[$0]++' | dmenu -i -p 📧 -1 -l 10 | tee --append "$history_file" | cut -f1)
[ "$chosen" != "" ] || exit [ "$chosen" != "" ] || exit
echo "$chosen" | tr -d '\n' | xclip -selection clipboard echo "$chosen" | tr -d '\n' | xclip -selection clipboard

View File

@@ -7,7 +7,14 @@
fzf, fzf,
}: }:
writers.writeBashBin "fkill" '' writers.writeBashBin "fkill" ''
PATH=$PATH:${lib.makeBinPath [procps gawk gnused fzf]} PATH=$PATH:${
lib.makeBinPath [
procps
gawk
gnused
fzf
]
}
if [ "$UID" != "0" ]; then if [ "$UID" != "0" ]; then
pid=$(ps -f -u "$UID" | sed 1d | fzf -m | awk '{print $2}') pid=$(ps -f -u "$UID" | sed 1d | fzf -m | awk '{print $2}')

View File

@@ -10,7 +10,13 @@ writers.writeBashBin "fzfmenu" ''
# https://github.com/junegunn/fzf/wiki/Examples#fzf-as-dmenu-replacement # https://github.com/junegunn/fzf/wiki/Examples#fzf-as-dmenu-replacement
set -efu set -efu
PATH=$PATH:${lib.makeBinPath [st fzf dash]} PATH=$PATH:${
lib.makeBinPath [
st
fzf
dash
]
}
input=$(mktemp -p "$XDG_RUNTIME_DIR" -u --suffix .fzfmenu.input) input=$(mktemp -p "$XDG_RUNTIME_DIR" -u --suffix .fzfmenu.input)
output=$(mktemp -p "$XDG_RUNTIME_DIR" -u --suffix .fzfmenu.output) output=$(mktemp -p "$XDG_RUNTIME_DIR" -u --suffix .fzfmenu.output)

View File

@@ -2,8 +2,10 @@
fetchzip, fetchzip,
symlinkJoin, symlinkJoin,
lib, lib,
}: let }:
gfs-font = name: sha256: let
gfs-font =
name: sha256:
fetchzip { fetchzip {
inherit name sha256; inherit name sha256;
url = "http://www.greekfontsociety-gfs.gr/_assets/fonts/${name}.zip"; url = "http://www.greekfontsociety-gfs.gr/_assets/fonts/${name}.zip";
@@ -14,7 +16,7 @@
''; '';
}; };
in in
symlinkJoin { symlinkJoin {
name = "gfs-fonts"; name = "gfs-fonts";
paths = lib.mapAttrsToList gfs-font { paths = lib.mapAttrsToList gfs-font {
GFS_Artemisia = "1q39086pr2jhv118fjfv6l1li6japv4pdjnhh1scqw06mqrmydf4"; GFS_Artemisia = "1q39086pr2jhv118fjfv6l1li6japv4pdjnhh1scqw06mqrmydf4";
@@ -50,4 +52,4 @@ in
# Garaldus # Garaldus
# Ignacio # Ignacio
}; };
} }

View File

@@ -1,4 +1,10 @@
{ gimp, fetchurl, runCommand, symlinkJoin, writers }: {
gimp,
fetchurl,
runCommand,
symlinkJoin,
writers,
}:
let let
bring-out-the-gimp = fetchurl { bring-out-the-gimp = fetchurl {
url = "https://c.krebsco.de/bring-out-the-gimp.png"; url = "https://c.krebsco.de/bring-out-the-gimp.png";
@@ -8,13 +14,14 @@ let
data-dir = symlinkJoin { data-dir = symlinkJoin {
name = "gimp"; name = "gimp";
paths = [ paths = [
(runCommand "splash" {} '' (runCommand "splash" { } ''
mkdir -p $out/${data-dir-prefix}/images mkdir -p $out/${data-dir-prefix}/images
install ${bring-out-the-gimp} $out/share/gimp/2.0/images/gimp-splash.png install ${bring-out-the-gimp} $out/share/gimp/2.0/images/gimp-splash.png
'') '')
gimp gimp
]; ];
}; };
in writers.writeDashBin "gimp" '' in
writers.writeDashBin "gimp" ''
exec env GIMP2_DATADIR=${data-dir}/${data-dir-prefix} ${gimp}/bin/gimp "$@" exec env GIMP2_DATADIR=${data-dir}/${data-dir-prefix} ${gimp}/bin/gimp "$@"
'' ''

View File

@@ -1,4 +1,8 @@
{ buildGoModule, fetchgit, lib }: {
buildGoModule,
fetchgit,
lib,
}:
buildGoModule { buildGoModule {
pname = "go-webring"; pname = "go-webring";
version = "2024-12-18"; version = "2024-12-18";

View File

@@ -3,12 +3,13 @@
fetchurl, fetchurl,
xan, xan,
util-linux, util-linux,
}: let }:
let
database = fetchurl { database = fetchurl {
url = "http://c.krebsco.de/greek.csv"; url = "http://c.krebsco.de/greek.csv";
hash = "sha256-SYL10kerNI0HzExG6JXh765+CBBCHLO95B6OKErQ/sU="; hash = "sha256-SYL10kerNI0HzExG6JXh765+CBBCHLO95B6OKErQ/sU=";
}; };
in in
writers.writeDashBin "heuretes" '' writers.writeDashBin "heuretes" ''
${xan}/bin/xan search -s simple "$*" ${database} | ${util-linux}/bin/column -s, -t ${xan}/bin/xan search -s simple "$*" ${database} | ${util-linux}/bin/column -s, -t
'' ''

View File

@@ -1,12 +1,13 @@
{ symlinkJoin {
, hledger symlinkJoin,
, writers hledger,
, lib writers,
, git lib,
, coreutils git,
, gnugrep coreutils,
, timeLedger gnugrep,
, ... timeLedger,
...
}: }:
let let
date = "${coreutils}/bin/date +'%Y-%m-%d %H:%M:%S'"; date = "${coreutils}/bin/date +'%Y-%m-%d %H:%M:%S'";

View File

@@ -2,7 +2,8 @@
writers, writers,
lib, lib,
xlockmore, xlockmore,
}: let }:
let
xlockModes = lib.concatStringsSep "\\n" [ xlockModes = lib.concatStringsSep "\\n" [
# "braid" # "braid"
"galaxy" "galaxy"
@@ -12,7 +13,7 @@
"space" "space"
]; ];
in in
writers.writeDashBin "k-lock" '' writers.writeDashBin "k-lock" ''
MODE=$(printf "${xlockModes}" | shuf -n 1) MODE=$(printf "${xlockModes}" | shuf -n 1)
${xlockmore}/bin/xlock \ ${xlockmore}/bin/xlock \
@@ -26,4 +27,4 @@ in
-validate "..." \ -validate "..." \
-invalid "Computer says no." \ -invalid "Computer says no." \
-mode "$MODE" -mode "$MODE"
'' ''

View File

@@ -10,15 +10,20 @@
writers, writers,
options ? { }, options ? { },
... ...
}: let }:
let
eval = lib.evalModules { eval = lib.evalModules {
modules = [ modules = [
{ {
imports = [options]; imports = [ options ];
options = { options = {
selection = lib.mkOption { selection = lib.mkOption {
default = "clipboard"; default = "clipboard";
type = lib.types.enum ["primary" "secondary" "clipboard"]; type = lib.types.enum [
"primary"
"secondary"
"clipboard"
];
}; };
dmenu = lib.mkOption { dmenu = lib.mkOption {
default = "${dmenu}/bin/dmenu -i -p klem"; default = "${dmenu}/bin/dmenu -i -p klem";
@@ -41,19 +46,19 @@
cfg = eval.config; cfg = eval.config;
in in
writers.writeDashBin "klem" '' writers.writeDashBin "klem" ''
set -efu set -efu
${xclip}/bin/xclip -selection ${cfg.selection} -out \ ${xclip}/bin/xclip -selection ${cfg.selection} -out \
| case $(echo "${ | case $(echo "${lib.concatStringsSep "\n" (lib.attrNames cfg.scripts)}" | ${cfg.dmenu}) in
lib.concatStringsSep "\n" (lib.attrNames cfg.scripts) ${lib.concatStringsSep "\n" (
}" | ${cfg.dmenu}) in lib.mapAttrsToList (option: script: ''
${lib.concatStringsSep "\n" (lib.mapAttrsToList (option: script: ''
'${option}') ${toString script} ;; '${option}') ${toString script} ;;
'') cfg.scripts)} '') cfg.scripts
)}
*) ${coreutils}/bin/cat ;; *) ${coreutils}/bin/cat ;;
esac \ esac \
| ${xclip}/bin/xclip -selection ${cfg.selection} -in | ${xclip}/bin/xclip -selection ${cfg.selection} -in
${libnotify}/bin/notify-send --app-name="klem" "Result copied to clipboard." ${libnotify}/bin/notify-send --app-name="klem" "Result copied to clipboard."
'' ''

View File

@@ -6,7 +6,13 @@
gnused, gnused,
}: }:
writers.writeDashBin "literature-quote" '' writers.writeDashBin "literature-quote" ''
PATH=$PATH:${lib.makeBinPath [xan curl gnused]} PATH=$PATH:${
lib.makeBinPath [
xan
curl
gnused
]
}
ROW=$(curl -Ls http://kmein.github.io/logotheca/quotes.csv | shuf -n1) ROW=$(curl -Ls http://kmein.github.io/logotheca/quotes.csv | shuf -n1)
( (
QUOTE="$(echo "$ROW" | xan select 3)" QUOTE="$(echo "$ROW" | xan select 3)"

View File

@@ -1,5 +1,5 @@
{writers}: { writers }:
writers.writeHaskellBin "manual-sort" {} '' writers.writeHaskellBin "manual-sort" { } ''
{-# LANGUAGE LambdaCase #-} {-# LANGUAGE LambdaCase #-}
import Data.Char (toLower) import Data.Char (toLower)
import System.Environment (getArgs) import System.Environment (getArgs)

View File

@@ -1,7 +1,8 @@
{ {
pkgs, pkgs,
lib, lib,
}: let }:
let
m3u-to-tsv = '' m3u-to-tsv = ''
${pkgs.gnused}/bin/sed '/#EXTM3U/d;/#EXTINF/s/.*,//g' $out | ${pkgs.coreutils}/bin/paste -d'\t' - - > $out.tmp ${pkgs.gnused}/bin/sed '/#EXTM3U/d;/#EXTINF/s/.*,//g' $out | ${pkgs.coreutils}/bin/paste -d'\t' - - > $out.tmp
mv $out.tmp $out mv $out.tmp $out
@@ -19,6 +20,6 @@
postFetch = m3u-to-tsv; postFetch = m3u-to-tsv;
}; };
in in
pkgs.writers.writeDashBin "mpv-tv" '' pkgs.writers.writeDashBin "mpv-tv" ''
cat ${kodi-tv} ${live-tv} | ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 | ${pkgs.coreutils}/bin/cut -f2)" cat ${kodi-tv} ${live-tv} | ${pkgs.mpv}/bin/mpv --force-window=yes "$(${pkgs.dmenu}/bin/dmenu -i -l 5 | ${pkgs.coreutils}/bin/cut -f2)"
'' ''

View File

@@ -1,4 +1,9 @@
{ sox, mpv, writers, coreutils }: {
sox,
mpv,
writers,
coreutils,
}:
# ref https://askubuntu.com/a/789472 # ref https://askubuntu.com/a/789472
writers.writeDashBin "noise-waves" '' writers.writeDashBin "noise-waves" ''
file="/tmp/noise-$(${coreutils}/bin/date +%s | ${coreutils}/bin/md5sum | ${coreutils}/bin/cut -d' ' -f1).wav" file="/tmp/noise-$(${coreutils}/bin/date +%s | ${coreutils}/bin/md5sum | ${coreutils}/bin/cut -d' ' -f1).wav"

View File

@@ -6,12 +6,16 @@
coreutils, coreutils,
noteDirectory ? "~/state/obsidian", noteDirectory ? "~/state/obsidian",
currentDates ? false, currentDates ? false,
obsidian-vim obsidian-vim,
}: }:
writers.writeDashBin "notemenu" '' writers.writeDashBin "notemenu" ''
set -efu set -efu
PATH=$PATH:${ PATH=$PATH:${
lib.makeBinPath [rofi findutils coreutils] lib.makeBinPath [
rofi
findutils
coreutils
]
} }
cd ${noteDirectory} cd ${noteDirectory}

View File

@@ -23,9 +23,12 @@ stdenv.mkDerivation (finalAttrs: {
doCheck = true; doCheck = true;
buildInputs = [libogg]; buildInputs = [ libogg ];
nativeBuildInputs = [cmake pkg-config]; nativeBuildInputs = [
cmake
pkg-config
];
meta = with lib; { meta = with lib; {
homepage = "https://github.com/fmang/opustags"; homepage = "https://github.com/fmang/opustags";

View File

@@ -6,8 +6,9 @@
gnused, gnused,
curl, curl,
nur, nur,
downloadDirectory ? "~/mobile/audio/Musik/radiomitschnitt" downloadDirectory ? "~/mobile/audio/Musik/radiomitschnitt",
}: let }:
let
playlistAPI = "https://radio.lassul.us"; playlistAPI = "https://radio.lassul.us";
sendIRC = writers.writeDash "send-irc" '' sendIRC = writers.writeDash "send-irc" ''
@@ -102,7 +103,7 @@
${yt-dlp}/bin/yt-dlp --add-metadata --audio-format mp3 --audio-quality 0 -xic "$@" ${yt-dlp}/bin/yt-dlp --add-metadata --audio-format mp3 --audio-quality 0 -xic "$@"
''; '';
in in
writers.writeDashBin "pls" '' writers.writeDashBin "pls" ''
case "$1" in case "$1" in
good|like|cool|nice|noice|top|yup|yass|yes|+) good|like|cool|nice|noice|top|yup|yass|yes|+)
response=$(${curl}/bin/curl -sS -XPOST "${playlistAPI}/good") response=$(${curl}/bin/curl -sS -XPOST "${playlistAPI}/good")
@@ -140,4 +141,4 @@ in
;; ;;
esac esac
wait wait
'' ''

View File

@@ -1,11 +1,12 @@
{ {
writers, writers,
mpv, mpv,
}: let }:
let
arabicStories = "/home/kfm/cloud/syncthing/music/Arabic/Stories"; arabicStories = "/home/kfm/cloud/syncthing/music/Arabic/Stories";
levantineTextbook = "/home/kfm/cloud/syncthing/music/Arabic/Damaszenisch"; levantineTextbook = "/home/kfm/cloud/syncthing/music/Arabic/Damaszenisch";
in in
writers.writeDashBin "polyglot" '' writers.writeDashBin "polyglot" ''
languages='persian languages='persian
arabic arabic
coptic coptic
@@ -104,4 +105,4 @@ in
hebrew) hebrew)
${mpv}/bin/mpv --shuffle $hebrew;; ${mpv}/bin/mpv --shuffle $hebrew;;
esac esac
'' ''

View File

@@ -15,7 +15,11 @@ buildPythonPackage (finalAttrs: {
rev = "2ea25a03af15937916b6768835e056166986c567"; rev = "2ea25a03af15937916b6768835e056166986c567";
sha256 = "1pcf800hl0zkcffc47mkjq9mizsxdi0hwxlnij5bvbqdshd3w9ll"; sha256 = "1pcf800hl0zkcffc47mkjq9mizsxdi0hwxlnij5bvbqdshd3w9ll";
}; };
patches = [./regex-version.patch]; patches = [ ./regex-version.patch ];
propagatedBuildInputs = [backports_functools_lru_cache selenium regex]; propagatedBuildInputs = [
backports_functools_lru_cache
selenium
regex
];
doCheck = false; doCheck = false;
}) })

View File

@@ -1,6 +1,22 @@
{ writers, lib, todoman, khal, util-linux, wego, pass }: {
writers,
lib,
todoman,
khal,
util-linux,
wego,
pass,
}:
writers.writeDashBin "q" '' writers.writeDashBin "q" ''
export PATH=$PATH:${lib.makeBinPath [todoman khal util-linux wego pass]} export PATH=$PATH:${
lib.makeBinPath [
todoman
khal
util-linux
wego
pass
]
}
(todo list --due 240; echo) & (todo list --due 240; echo) &
(khal list today today; echo) & (khal list today today; echo) &
(cal -3; echo) & (cal -3; echo) &

View File

@@ -1,7 +1,21 @@
{ writers, lib, gnused, curl, jq, yq }: {
writers,
lib,
gnused,
curl,
jq,
yq,
}:
writers.writeBashBin "radio-news" '' writers.writeBashBin "radio-news" ''
set -efu set -efu
PATH=$PATH:${lib.makeBinPath [gnused curl jq yq]} PATH=$PATH:${
lib.makeBinPath [
gnused
curl
jq
yq
]
}
EVENTS=$( EVENTS=$(
curl https://www.goodnewsnetwork.org/feed/ \ curl https://www.goodnewsnetwork.org/feed/ \

View File

@@ -1,8 +1,28 @@
{ writers, lib, curl, pup, gnused, coreutils, pandoc, gawk, jq }: {
writers,
lib,
curl,
pup,
gnused,
coreutils,
pandoc,
gawk,
jq,
}:
writers.writeDashBin "random-zeno" '' writers.writeDashBin "random-zeno" ''
set -efu set -efu
export PATH=${lib.makeBinPath [ curl pup gnused coreutils pandoc gawk jq ]} export PATH=${
lib.makeBinPath [
curl
pup
gnused
coreutils
pandoc
gawk
jq
]
}
root="http://www.zeno.org" root="http://www.zeno.org"
character_limit=350 character_limit=350

View File

@@ -3,10 +3,15 @@
writers, writers,
imagemagick, imagemagick,
ghostscript, ghostscript,
lib lib,
}: }:
writers.writeDashBin "scanned" '' writers.writeDashBin "scanned" ''
export PATH=${lib.makeBinPath [ imagemagick ghostscript ]}:$PATH export PATH=${
lib.makeBinPath [
imagemagick
ghostscript
]
}:$PATH
[ $# -eq 1 -a -f "$1" -a -r "$1" ] || exit 1 [ $# -eq 1 -a -f "$1" -a -r "$1" ] || exit 1

Some files were not shown because too many files have changed in this diff Show More