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,71 +2,71 @@
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
# ARCHIVE TOOLS # ARCHIVE TOOLS
pkgs.unzip pkgs.unzip
pkgs.unrar pkgs.unrar
pkgs.p7zip pkgs.p7zip
pkgs.sshuttle pkgs.sshuttle
pkgs.zip pkgs.zip
# MONITORS # MONITORS
pkgs.iftop # interface bandwidth monitor pkgs.iftop # interface bandwidth monitor
pkgs.lsof # list open files pkgs.lsof # list open files
# SHELL # SHELL
pkgs.sqlite pkgs.sqlite
pkgs.fd # better find pkgs.fd # better find
pkgs.tree pkgs.tree
pkgs.parallel # for parallel, since moreutils shadows task spooler pkgs.parallel # for parallel, since moreutils shadows task spooler
pkgs.ripgrep # better grep pkgs.ripgrep # better grep
pkgs.rlwrap pkgs.rlwrap
pkgs.progress # display progress bars for pipes pkgs.progress # display progress bars for pipes
pkgs.file # determine file type pkgs.file # determine file type
pkgs.gdu # ncurses disk usage (ncdu is broken) pkgs.gdu # ncurses disk usage (ncdu is broken)
pkgs.rmlint # remove duplicate files pkgs.rmlint # remove duplicate files
pkgs.jq # json toolkit pkgs.jq # json toolkit
pkgs.jless # less(1) for json pkgs.jless # less(1) for json
pkgs.fq # toolkit for yaml, xml and binaries pkgs.fq # toolkit for yaml, xml and binaries
pkgs.bc # calculator pkgs.bc # calculator
pkgs.pari # gp -- better calculator pkgs.pari # gp -- better calculator
pkgs.ts pkgs.ts
pkgs.vimv pkgs.vimv
pkgs.vg pkgs.vg
pkgs.fkill pkgs.fkill
pkgs.cyberlocker-tools pkgs.cyberlocker-tools
pkgs.untilport pkgs.untilport
pkgs.kpaste pkgs.kpaste
# HARDWARE # HARDWARE
pkgs.pciutils # for lspci pkgs.pciutils # for lspci
] ]
++ lib.optionals (!darwin) [ ++ lib.optionals (!darwin) [
pkgs.usbutils # for lsusb pkgs.usbutils # for lsusb
pkgs.lshw # for lshw pkgs.lshw # for lshw
pkgs.iotop # I/O load monitor pkgs.iotop # I/O load monitor
pkgs.psmisc # for killall, pstree pkgs.psmisc # for killall, pstree
]; ];
security.wrappers = {
security.wrappers = { pmount = {
pmount = { setuid = true;
setuid = true; owner = "root";
owner = "root"; group = "root";
group = "root"; source = "${pkgs.pmount}/bin/pmount";
source = "${pkgs.pmount}/bin/pmount";
};
pumount = {
setuid = true;
owner = "root";
group = "root";
source = "${pkgs.pmount}/bin/pumount";
};
}; };
pumount = {
setuid = true;
owner = "root";
group = "root";
source = "${pkgs.pmount}/bin/pumount";
};
};
environment.interactiveShellInit = '' environment.interactiveShellInit = ''
# Use XDG_RUNTIME_DIR for temporary files if available # Use XDG_RUNTIME_DIR for temporary files if available
@@ -75,21 +75,22 @@ in {
fi fi
''; '';
environment.shellAliases = let environment.shellAliases =
take = pkgs.writers.writeDash "take" '' let
mkdir "$1" && cd "$1" take = pkgs.writers.writeDash "take" ''
''; mkdir "$1" && cd "$1"
cdt = pkgs.writers.writeDash "cdt" '' '';
cd $(mktemp -p "$XDG_RUNTIME_DIR" -d "cdt-XXXXXX") cdt = pkgs.writers.writeDash "cdt" ''
pwd cd $(mktemp -p "$XDG_RUNTIME_DIR" -d "cdt-XXXXXX")
''; pwd
wcd = pkgs.writers.writeDash "wcd" '' '';
cd "$(readlink "$(${pkgs.which}/bin/which --skip-alias "$1")" | xargs dirname)/.." wcd = pkgs.writers.writeDash "wcd" ''
''; cd "$(readlink "$(${pkgs.which}/bin/which --skip-alias "$1")" | xargs dirname)/.."
where = pkgs.writers.writeDash "where" '' '';
readlink "$(${pkgs.which}/bin/which --skip-alias "$1")" | xargs dirname where = pkgs.writers.writeDash "where" ''
''; readlink "$(${pkgs.which}/bin/which --skip-alias "$1")" | xargs dirname
in '';
in
{ {
nixi = "nix repl nixpkgs"; nixi = "nix repl nixpkgs";
take = "source ${take}"; take = "source ${take}";
@@ -110,16 +111,17 @@ 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"; {
ip = "${pkgs.iproute2}/bin/ip -c"; "ß" = "${pkgs.util-linux}/bin/setsid";
# systemd ip = "${pkgs.iproute2}/bin/ip -c";
s = "${pkgs.systemd}/bin/systemctl"; # systemd
us = "${pkgs.systemd}/bin/systemctl --user"; s = "${pkgs.systemd}/bin/systemctl";
j = "${pkgs.systemd}/bin/journalctl"; us = "${pkgs.systemd}/bin/systemctl --user";
uj = "${pkgs.systemd}/bin/journalctl --user"; j = "${pkgs.systemd}/bin/journalctl";
} uj = "${pkgs.systemd}/bin/journalctl --user";
}
); );
} }

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,64 +3,69 @@
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 (
from lxml import etree pkgs.writers.writePython3 "random-celan.py" { libraries = [ pkgs.python3Packages.lxml ]; } ''
import random from lxml import etree
import random
def xml_text(elements): def xml_text(elements):
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('${
url = "http://c.krebsco.de/celan.tei.xml"; pkgs.fetchurl {
hash = "sha256-HgNmJYfhuwyfm+FcNtnnYWpJpIIU1ElHLeLiIFjF9mE="; url = "http://c.krebsco.de/celan.tei.xml";
}}') 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"}
poems = root.xpath(".//tei:lg[@type='poem']", namespaces=tei) poems = root.xpath(".//tei:lg[@type='poem']", namespaces=tei)
poem = random.choice(poems) poem = random.choice(poems)
for stanza in poem.xpath("./tei:lg[@type='stanza']", namespaces=tei): for stanza in poem.xpath("./tei:lg[@type='stanza']", namespaces=tei):
for line in stanza.xpath('./tei:l', namespaces=tei): for line in stanza.xpath('./tei:l', namespaces=tei):
if line.text: if line.text:
print(line.text.strip()) print(line.text.strip())
print() print()
current_element = poem current_element = poem
while current_element is not None: while current_element is not None:
if current_element.tag == "{http://www.tei-c.org/ns/1.0}text": if current_element.tag == "{http://www.tei-c.org/ns/1.0}text":
text_element = current_element text_element = current_element
title = xml_text(text_element.xpath("./tei:front/tei:docTitle", title = xml_text(text_element.xpath("./tei:front/tei:docTitle",
namespaces=tei)) namespaces=tei))
print(f"Aus: #{title.replace(" ", "_")}", end=" ") print(f"Aus: #{title.replace(" ", "_")}", end=" ")
if date := xml_text(text_element.xpath("./tei:front/tei:docDate", if date := xml_text(text_element.xpath("./tei:front/tei:docDate",
namespaces=tei)): namespaces=tei)):
print(f"({date})") print(f"({date})")
break break
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 =
pkgs.lib.niveum.tmpfilesConfig { map
type = "d"; (
mode = "0750"; path:
age = "1h"; pkgs.lib.niveum.tmpfilesConfig {
inherit path; type = "d";
}) [reverseDirectory proverbDirectory]; mode = "0750";
age = "1h";
inherit path;
}
)
[
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,31 +3,36 @@
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"
from telegram.ext import Application, ContextTypes, MessageHandler, filters {
from telegram import Update libraries = [ pkgs.python3Packages.python-telegram-bot ];
import random }
import time ''
from telegram.ext import Application, ContextTypes, MessageHandler, filters
from telegram import Update
import random
import time
async def flubber(update: Update, context: ContextTypes.DEFAULT_TYPE): async def flubber(update: Update, context: ContextTypes.DEFAULT_TYPE):
time.sleep(random.randrange(4000) / 1000) time.sleep(random.randrange(4000) / 1000)
await update.message.reply_text("*flubberflubber*") await update.message.reply_text("*flubberflubber*")
with open('${tokenFile}', 'r') as tokenFile: with open('${tokenFile}', 'r') as tokenFile:
token = tokenFile.read().strip() token = tokenFile.read().strip()
application = Application.builder().token(token).build() application = Application.builder().token(token).build()
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,15 +12,17 @@
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 (
set -efu pkgs.writers.writeBash "random-nietzsche" ''
random_number=$(( ($RANDOM % 10) + 1 )) set -efu
if [ "$random_number" -eq 1 ]; then random_number=$(( ($RANDOM % 10) + 1 ))
${pkgs.random-zeno}/bin/random-zeno "/Literatur/M/Nietzsche,+Friedrich" if [ "$random_number" -eq 1 ]; then
else ${pkgs.random-zeno}/bin/random-zeno "/Literatur/M/Nietzsche,+Friedrich"
${pkgs.random-zeno}/bin/random-zeno "/Philosophie/M/Nietzsche,+Friedrich" else
fi ${pkgs.random-zeno}/bin/random-zeno "/Philosophie/M/Nietzsche,+Friedrich"
''); 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,42 +16,44 @@
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 (
set -efu pkgs.writers.writeDash "random-smyth" ''
set -efu
good_curl() { good_curl() {
${pkgs.curl}/bin/curl "$@" \ ${pkgs.curl}/bin/curl "$@" \
--compressed \ --compressed \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
-H 'Accept-Language: en-US,en;q=0.5' \ -H 'Accept-Language: en-US,en;q=0.5' \
-H 'DNT: 1' \ -H 'DNT: 1' \
-H 'Connection: keep-alive' \ -H 'Connection: keep-alive' \
-H 'Upgrade-Insecure-Requests: 1' \ -H 'Upgrade-Insecure-Requests: 1' \
-H 'Sec-Fetch-Dest: document' \ -H 'Sec-Fetch-Dest: document' \
-H 'Sec-Fetch-Mode: navigate' \ -H 'Sec-Fetch-Mode: navigate' \
-H 'Sec-Fetch-Site: cross-site' \ -H 'Sec-Fetch-Site: cross-site' \
-H 'Priority: u=0, i' \ -H 'Priority: u=0, i' \
-H 'Pragma: no-cache' \ -H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' -H 'Cache-Control: no-cache'
} }
RANDOM_SECTION=$( RANDOM_SECTION=$(
good_curl -sSL http://www.perseus.tufts.edu/hopper/xmltoc?doc=Perseus%3Atext%3A1999.04.0007%3Asmythp%3D1 \ good_curl -sSL http://www.perseus.tufts.edu/hopper/xmltoc?doc=Perseus%3Atext%3A1999.04.0007%3Asmythp%3D1 \
| ${pkgs.gnugrep}/bin/grep -o 'ref="[^"]*"' \ | ${pkgs.gnugrep}/bin/grep -o 'ref="[^"]*"' \
| ${pkgs.coreutils}/bin/shuf -n1 \ | ${pkgs.coreutils}/bin/shuf -n1 \
| ${pkgs.gnused}/bin/sed 's/^ref="//;s/"$//' | ${pkgs.gnused}/bin/sed 's/^ref="//;s/"$//'
) )
url="http://www.perseus.tufts.edu/hopper/text?doc=$RANDOM_SECTION" url="http://www.perseus.tufts.edu/hopper/text?doc=$RANDOM_SECTION"
good_curl -sSL "$url"\ good_curl -sSL "$url"\
| ${pkgs.htmlq}/bin/htmlq '#text_main' \ | ${pkgs.htmlq}/bin/htmlq '#text_main' \
| ${pkgs.gnused}/bin/sed 's/<\/\?hr>//g' \ | ${pkgs.gnused}/bin/sed 's/<\/\?hr>//g' \
| ${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,138 +2,153 @@
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";
}; };
script = '' script = ''
set -efux set -efux
chat_id=@tlgwotd chat_id=@tlgwotd
export TELEGRAM_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/telegram-token")" export TELEGRAM_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/telegram-token")"
export MASTODON_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/mastodon-token")" export MASTODON_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/mastodon-token")"
json_data=$(curl -sSL http://stephanus.tlg.uci.edu/Iris/Wotd | recode html..utf8) json_data=$(curl -sSL http://stephanus.tlg.uci.edu/Iris/Wotd | recode html..utf8)
word=$(echo "$json_data" | jq -r '.word') word=$(echo "$json_data" | jq -r '.word')
compact_word=$(echo "$word" | sed 's/,.*$//') compact_word=$(echo "$word" | sed 's/,.*$//')
definition=$(echo "$json_data" | jq -r '.definition | sub("<.*>"; "") | rtrimstr(" ")') definition=$(echo "$json_data" | jq -r '.definition | sub("<.*>"; "") | rtrimstr(" ")')
first_occurrence=$(echo "$json_data" | jq -r '.firstOccurrence') first_occurrence=$(echo "$json_data" | jq -r '.firstOccurrence')
total_occurrences=$(echo "$json_data" | jq -r '.totalOccurrences') total_occurrences=$(echo "$json_data" | jq -r '.totalOccurrences')
telegram_caption="*$word* $definition telegram_caption="*$word* $definition
First occurrence (century): $first_occurrence First occurrence (century): $first_occurrence
Number of occurrences (in all Ancient Greek texts): $total_occurrences" Number of occurrences (in all Ancient Greek texts): $total_occurrences"
mastodon_caption="$word $definition mastodon_caption="$word $definition
First occurrence (century): $first_occurrence First occurrence (century): $first_occurrence
Number of occurrences (in all Ancient Greek texts): $total_occurrences" Number of occurrences (in all Ancient Greek texts): $total_occurrences"
#ancientgreek #classics #wotd #wordoftheday #ancientgreek #classics #wotd #wordoftheday
transliteration=$(${pkgs.writers.writePython3 "translit.py" { transliteration=$(${
libraries = py: [ py.cltk ]; pkgs.writers.writePython3 "translit.py"
} '' {
import sys libraries = py: [ py.cltk ];
from cltk.phonology.grc.transcription import Transcriber }
''
import sys
from cltk.phonology.grc.transcription import Transcriber
probert = Transcriber("Attic", "Probert") probert = Transcriber("Attic", "Probert")
text = " ".join(sys.argv[1:]) text = " ".join(sys.argv[1:])
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
hex_to_rgb() { hex_to_rgb() {
hex="$1" hex="$1"
r=$(printf "%d" "0x$(echo "$hex" | cut -c2-3)") r=$(printf "%d" "0x$(echo "$hex" | cut -c2-3)")
g=$(printf "%d" "0x$(echo "$hex" | cut -c4-5)") g=$(printf "%d" "0x$(echo "$hex" | cut -c4-5)")
b=$(printf "%d" "0x$(echo "$hex" | cut -c6-7)") b=$(printf "%d" "0x$(echo "$hex" | cut -c6-7)")
echo "$r $g $b" echo "$r $g $b"
} }
calculate_luminance() { calculate_luminance() {
r="$1" r="$1"
g="$2" g="$2"
b="$3" b="$3"
r_l=$(echo "$r" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}') r_l=$(echo "$r" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}')
g_l=$(echo "$g" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}') g_l=$(echo "$g" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}')
b_l=$(echo "$b" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}') b_l=$(echo "$b" | awk '{print ($1 / 255 <= 0.03928) ? $1 / 255 / 12.92 : (($1 / 255 + 0.055) / 1.055)^2.4}')
echo "$r_l $g_l $b_l" | awk '{print 0.2126*$1 + 0.7152*$2 + 0.0722*$3}' echo "$r_l $g_l $b_l" | awk '{print 0.2126*$1 + 0.7152*$2 + 0.0722*$3}'
} }
hex_color="#$(echo "$compact_word" | md5sum | cut -c 1-6)" hex_color="#$(echo "$compact_word" | md5sum | cut -c 1-6)"
if echo "$hex_color" | grep -qE '^#[0-9A-Fa-f]{6}$'; then if echo "$hex_color" | grep -qE '^#[0-9A-Fa-f]{6}$'; then
set -- $(hex_to_rgb "$hex_color") set -- $(hex_to_rgb "$hex_color")
r="$1" r="$1"
g="$2" g="$2"
b="$3" b="$3"
fi fi
luminance=$(calculate_luminance "$r" "$g" "$b") luminance=$(calculate_luminance "$r" "$g" "$b")
threshold="0.1" threshold="0.1"
echo "$r $g $b" echo "$r $g $b"
if [ "$(echo "$luminance" | awk -v threshold="$threshold" '{print ($1 > threshold)}')" -eq 1 ]; then if [ "$(echo "$luminance" | awk -v threshold="$threshold" '{print ($1 > threshold)}')" -eq 1 ]; then
color1="black" color1="black"
color2="#333" color2="#333"
else else
color1="white" color1="white"
color2=lightgrey color2=lightgrey
fi fi
magick -size 1400x846 \ magick -size 1400x846 \
xc:"$hex_color" \ xc:"$hex_color" \
-font "${pkgs.gentium}/share/fonts/truetype/GentiumBookPlus-Bold.ttf" \ -font "${pkgs.gentium}/share/fonts/truetype/GentiumBookPlus-Bold.ttf" \
-fill "$color1" \ -fill "$color1" \
-pointsize 150 -gravity west \ -pointsize 150 -gravity west \
-annotate +100-160 "$compact_word" \ -annotate +100-160 "$compact_word" \
-font "${pkgs.gentium}/share/fonts/truetype/GentiumBookPlus-Regular.ttf" \ -font "${pkgs.gentium}/share/fonts/truetype/GentiumBookPlus-Regular.ttf" \
-fill "$color2" \ -fill "$color2" \
-pointsize 60 -gravity west \ -pointsize 60 -gravity west \
-annotate +100+00 "$transliteration" \ -annotate +100+00 "$transliteration" \
-fill "$color1" \ -fill "$color1" \
-annotate +100+120 "$definition" \ -annotate +100+120 "$definition" \
-fill "$color2" \ -fill "$color2" \
-pointsize 40 -gravity southwest \ -pointsize 40 -gravity southwest \
-annotate +100+60 "attested $total_occurrences times" \ -annotate +100+60 "attested $total_occurrences times" \
-pointsize 40 -gravity southeast \ -pointsize 40 -gravity southeast \
-annotate +100+60 "$(date -I)" \ -annotate +100+60 "$(date -I)" \
"$photo_path" "$photo_path"
curl -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendPhoto" \ curl -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendPhoto" \
-F "chat_id=\"$chat_id\"" \ -F "chat_id=\"$chat_id\"" \
-F "photo=@$photo_path" \ -F "photo=@$photo_path" \
-F parse_mode=Markdown \ -F parse_mode=Markdown \
-F caption="$telegram_caption" -F caption="$telegram_caption"
mastodon_upload_response=$(curl -X POST "${mastodonEndpoint}/api/v2/media" \ mastodon_upload_response=$(curl -X POST "${mastodonEndpoint}/api/v2/media" \
-H "Authorization: Bearer $MASTODON_TOKEN" \ -H "Authorization: Bearer $MASTODON_TOKEN" \
-F "file=@$photo_path" \ -F "file=@$photo_path" \
-F "description=$word $definition") -F "description=$word $definition")
mastodon_image_id=$(echo $mastodon_upload_response | jq -r .id) mastodon_image_id=$(echo $mastodon_upload_response | jq -r .id)
curl -X POST "${mastodonEndpoint}/api/v1/statuses" \ curl -X POST "${mastodonEndpoint}/api/v1/statuses" \
-H "Authorization: Bearer $MASTODON_TOKEN" \ -H "Authorization: Bearer $MASTODON_TOKEN" \
-d "status=$mastodon_caption" \ -d "status=$mastodon_caption" \
-d "visibility=public" \ -d "visibility=public" \
-d "media_ids[]=$mastodon_image_id" -d "media_ids[]=$mastodon_image_id"
''; '';
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";

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,19 +53,21 @@ 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 (
set -efu pkgs.writers.writeDash "common-transits" ''
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*//')
date=$(${pkgs.coreutils}/bin/date +'%m %d %Y') date=$(${pkgs.coreutils}/bin/date +'%m %d %Y')
( (
cd ${pkgs.astrolog}/bin cd ${pkgs.astrolog}/bin
# ./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,76 +14,78 @@
home-manager.users.me = { home-manager.users.me = {
programs.firefox = { programs.firefox = {
enable = true; enable = true;
profiles = let profiles =
defaultSettings = { let
"beacon.enabled" = false; defaultSettings = {
"browser.bookmarks.showMobileBookmarks" = true; "beacon.enabled" = false;
"browser.newtab.preload" = false; "browser.bookmarks.showMobileBookmarks" = true;
"browser.search.isUS" = false; "browser.newtab.preload" = false;
"browser.search.region" = "DE"; "browser.search.isUS" = false;
"browser.send_pings" = false; "browser.search.region" = "DE";
"browser.shell.checkDefaultBrowser" = false; "browser.send_pings" = false;
"browser.startup.homepage" = "chrome://browser/content/blanktab.html"; "browser.shell.checkDefaultBrowser" = false;
"browser.uidensity" = 1; "browser.startup.homepage" = "chrome://browser/content/blanktab.html";
"browser.urlbar.placeholderName" = "Search"; "browser.uidensity" = 1;
"datareporting.healthreport.service.enabled" = false; "browser.urlbar.placeholderName" = "Search";
"datareporting.healthreport.uploadEnabled" = false; "datareporting.healthreport.service.enabled" = false;
"datareporting.policy.dataSubmissionEnabled" = false; "datareporting.healthreport.uploadEnabled" = false;
"datareporting.sessions.current.clean" = true; "datareporting.policy.dataSubmissionEnabled" = false;
"distribution.searchplugins.defaultLocale" = "de-DE"; "datareporting.sessions.current.clean" = true;
"general.smoothScroll" = true; "distribution.searchplugins.defaultLocale" = "de-DE";
"identity.fxaccounts.account.device.name" = config.networking.hostName; "general.smoothScroll" = true;
"network.cookie.cookieBehavior" = 1; "identity.fxaccounts.account.device.name" = config.networking.hostName;
"privacy.donottrackheader.enabled" = true; "network.cookie.cookieBehavior" = 1;
"privacy.trackingprotection.enabled" = true; "privacy.donottrackheader.enabled" = true;
"privacy.trackingprotection.pbmode.enabled" = true; "privacy.trackingprotection.enabled" = true;
"privacy.trackingprotection.socialtracking.enabled" = true; "privacy.trackingprotection.pbmode.enabled" = true;
"services.sync.declinedEngines" = "passwords"; "privacy.trackingprotection.socialtracking.enabled" = true;
"services.sync.engine.passwords" = false; "services.sync.declinedEngines" = "passwords";
"signon.autofillForms" = false; "services.sync.engine.passwords" = false;
"signon.rememberSignons" = false; "signon.autofillForms" = false;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true; "signon.rememberSignons" = false;
"toolkit.telemetry.archive.enabled" = false; "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"toolkit.telemetry.bhrPing.enabled" = false; "toolkit.telemetry.archive.enabled" = false;
"toolkit.telemetry.cachedClientID" = ""; "toolkit.telemetry.bhrPing.enabled" = false;
"toolkit.telemetry.enabled" = false; "toolkit.telemetry.cachedClientID" = "";
"toolkit.telemetry.firstShutdownPing.enabled" = false; "toolkit.telemetry.enabled" = false;
"toolkit.telemetry.hybridContent.enabled" = false; "toolkit.telemetry.firstShutdownPing.enabled" = false;
"toolkit.telemetry.newProfilePing.enabled" = false; "toolkit.telemetry.hybridContent.enabled" = false;
"toolkit.telemetry.prompted" = 2; "toolkit.telemetry.newProfilePing.enabled" = false;
"toolkit.telemetry.rejected" = true; "toolkit.telemetry.prompted" = 2;
"toolkit.telemetry.server" = ""; "toolkit.telemetry.rejected" = true;
"toolkit.telemetry.shutdownPingSender.enabled" = false; "toolkit.telemetry.server" = "";
"toolkit.telemetry.unified" = false; "toolkit.telemetry.shutdownPingSender.enabled" = false;
"toolkit.telemetry.unifiedIsOptIn" = false; "toolkit.telemetry.unified" = false;
"toolkit.telemetry.updatePing.enabled" = false; "toolkit.telemetry.unifiedIsOptIn" = false;
"ui.prefersReducedMotion" = 1; "toolkit.telemetry.updatePing.enabled" = false;
"ui.prefersReducedMotion" = 1;
};
in
{
default = {
id = 0;
isDefault = true;
settings = defaultSettings;
# extensions = with pkgs.nur.repos.rycee.firefox-addons; [
# ublock-origin
# darkreader
# sponsorblock
# consent-o-matic
# i-dont-care-about-cookies
# # auto-tab-discard TODO what is this
# ];
userChrome = ''
#TabsToolbar {
visibility: collapse !important;
}
'';
};
}; };
in {
default = {
id = 0;
isDefault = true;
settings = defaultSettings;
# extensions = with pkgs.nur.repos.rycee.firefox-addons; [
# ublock-origin
# darkreader
# sponsorblock
# consent-o-matic
# i-dont-care-about-cookies
# # auto-tab-discard TODO what is this
# ];
userChrome = ''
#TabsToolbar {
visibility: collapse !important;
}
'';
};
};
}; };
}; };
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,27 +15,40 @@
}; };
}; };
systemd.user.tmpfiles.users.me.rules = map pkgs.lib.niveum.tmpfilesConfig [ systemd.user.tmpfiles.users.me.rules =
{ map pkgs.lib.niveum.tmpfilesConfig [
type = "d"; {
mode = "0755"; type = "d";
age = "7d"; mode = "0755";
path = "${config.users.users.me.home}/sync/Downloads"; age = "7d";
} path = "${config.users.users.me.home}/sync/Downloads";
{ }
type = "d"; {
mode = "0755"; type = "d";
age = "7d"; mode = "0755";
path = "${config.users.users.me.home}/cloud/nextcloud/tmp"; age = "7d";
} path = "${config.users.users.me.home}/cloud/nextcloud/tmp";
] ++ map (path: pkgs.lib.niveum.tmpfilesConfig { }
type = "L+"; ]
user = config.users.users.me.name; ++
group = config.users.users.me.group; map
mode = "0755"; (
argument = "${config.users.users.me.home}/sync/${path}"; path:
path = "${config.users.users.me.home}/${path}"; pkgs.lib.niveum.tmpfilesConfig {
}) [".ssh" ".gnupg" ".pki" ".local/share/aerc"]; type = "L+";
user = config.users.users.me.name;
group = config.users.users.me.group;
mode = "0755";
argument = "${config.users.users.me.home}/sync/${path}";
path = "${config.users.users.me.home}/${path}";
}
)
[
".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,20 +62,22 @@
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 =
kieran = { let
user = "kieran"; kieran = {
passwordFile = config.age.secrets.nextcloud-password-kieran.path; user = "kieran";
endpoint = "https://cloud.kmein.de"; passwordFile = config.age.secrets.nextcloud-password-kieran.path;
target = "${config.users.users.me.home}/notes"; endpoint = "https://cloud.kmein.de";
}; target = "${config.users.users.me.home}/notes";
in '' };
mkdir -p ${lib.escapeShellArg kieran.target} in
${pkgs.nextcloud-client}/bin/nextcloudcmd --non-interactive --user ${kieran.user} --password "$(cat ${kieran.passwordFile})" --path /Notes ${lib.escapeShellArg kieran.target} ${kieran.endpoint} ''
''; 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}
'';
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
Restart = "on-failure"; Restart = "on-failure";
@@ -77,13 +93,16 @@
} | ${pkgs.fzf}/bin/fzf)" } | ${pkgs.fzf}/bin/fzf)"
exec ${pkgs.zathura}/bin/zathura "$book" exec ${pkgs.zathura}/bin/zathura "$book"
'') '')
(let (
kieran = { let
user = "kieran.meinhardt@gmail.com"; kieran = {
passwordFile = config.age.secrets.mega-password.path; user = "kieran.meinhardt@gmail.com";
}; passwordFile = config.age.secrets.mega-password.path;
megatools = command: ''${pkgs.megatools}/bin/megatools ${command} --username ${lib.escapeShellArg kieran.user} --password "$(cat ${kieran.passwordFile})"''; };
in megatools =
command:
''${pkgs.megatools}/bin/megatools ${command} --username ${lib.escapeShellArg kieran.user} --password "$(cat ${kieran.passwordFile})"'';
in
pkgs.writers.writeDashBin "book-mega" '' pkgs.writers.writeDashBin "book-mega" ''
set -efu set -efu
selection="$(${megatools "ls"} | ${pkgs.fzf}/bin/fzf)" selection="$(${megatools "ls"} | ${pkgs.fzf}/bin/fzf)"
@@ -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,10 +137,14 @@ in
agent = { agent = {
enable = true; enable = true;
pinentryPackage = pkgs.pinentry-qt; pinentryPackage = pkgs.pinentry-qt;
settings = let defaultCacheTtl = 2 * 60 * 60; in { settings =
default-cache-ttl = defaultCacheTtl; let
max-cache-ttl = 4 * defaultCacheTtl; defaultCacheTtl = 2 * 60 * 60;
}; in
{
default-cache-ttl = defaultCacheTtl;
max-cache-ttl = 4 * defaultCacheTtl;
};
}; };
}; };
@@ -253,16 +257,20 @@ 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 =
enable = true; let
documents = "${config.users.users.me.home}/cloud/nextcloud/Documents"; pictures = "${config.users.users.me.home}/cloud/nextcloud/Bilder";
desktop = "/tmp"; in
download = "${config.users.users.me.home}/sync/Downloads"; {
music = "${config.users.users.me.home}/mobile/audio"; enable = true;
publicShare = "${config.users.users.me.home}/cloud/nextcloud/tmp"; documents = "${config.users.users.me.home}/cloud/nextcloud/Documents";
videos = pictures; desktop = "/tmp";
pictures = pictures; download = "${config.users.users.me.home}/sync/Downloads";
}; music = "${config.users.users.me.home}/mobile/audio";
publicShare = "${config.users.users.me.home}/cloud/nextcloud/tmp";
videos = pictures;
pictures = pictures;
};
}; };
} }
]; ];

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
directory = pkgs.fetchzip arguments; zip-font =
in name: arguments:
pkgs.runCommand name {} '' let
directory = pkgs.fetchzip arguments;
in
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 =
file = pkgs.fetchurl arguments; name: arguments:
in let
pkgs.runCommand name {} '' file = pkgs.fetchurl arguments;
in
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,12 +123,28 @@ 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
inherit emoji; {
}; 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;
};
# xelatex fails with woff files # xelatex fails with woff files
# ref https://tex.stackexchange.com/questions/392144/xelatex-and-fontspec-crash-trying-to-find-woff-file-for-some-fonts-but-not-other # ref https://tex.stackexchange.com/questions/392144/xelatex-and-fontspec-crash-trying-to-find-woff-file-for-some-fonts-but-not-other
fontconfig.localConf = '' fontconfig.localConf = ''

View File

@@ -1,24 +1,27 @@
{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 =
defaultCommand = "${pkgs.fd}/bin/fd --type f --strip-cwd-prefix --follow --no-ignore-vcs --exclude .git"; let
in { defaultCommand = "${pkgs.fd}/bin/fd --type f --strip-cwd-prefix --follow --no-ignore-vcs --exclude .git";
enable = true; in
defaultCommand = defaultCommand; {
defaultOptions = ["--height=40%"]; enable = true;
changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d"; defaultCommand = defaultCommand;
changeDirWidgetOptions = [ defaultOptions = [ "--height=40%" ];
"--preview='${pkgs.tree}/bin/tree -L 1 {}'" changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d";
"--bind=space:toggle-preview" changeDirWidgetOptions = [
"--preview-window=hidden" "--preview='${pkgs.tree}/bin/tree -L 1 {}'"
]; "--bind=space:toggle-preview"
fileWidgetCommand = defaultCommand; "--preview-window=hidden"
fileWidgetOptions = ["--preview='head -$LINES {}'"]; ];
}; fileWidgetCommand = defaultCommand;
fileWidgetOptions = [ "--preview='head -$LINES {}'" ];
};
}; };
} }

View File

@@ -1,26 +1,30 @@
{ {
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 {
git = "${pkgs.git}/bin/git -C ${ledgerDirectory}"; environment.systemPackages =
in [ let
hora git = "${pkgs.git}/bin/git -C ${ledgerDirectory}";
pkgs.hledger in
(pkgs.writers.writeDashBin "hledger-git" '' [
if [ "$1" = entry ]; then hora
${pkgs.hledger}/bin/hledger balance -V > "${ledgerDirectory}/balance.txt" pkgs.hledger
${git} add balance.txt (pkgs.writers.writeDashBin "hledger-git" ''
${git} commit --all --message="$(date -Im)" if [ "$1" = entry ]; then
else ${pkgs.hledger}/bin/hledger balance -V > "${ledgerDirectory}/balance.txt"
${git} $* ${git} add balance.txt
fi ${git} commit --all --message="$(date -Im)"
'') else
(pkgs.writers.writeDashBin "hledger-edit" '' ${git} $*
$EDITOR ${ledgerDirectory}/current.journal fi
'') '')
]; (pkgs.writers.writeDashBin "hledger-edit" ''
$EDITOR ${ledgerDirectory}/current.journal
'')
];
} }

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,179 +107,215 @@ in {
''; '';
}; };
home-manager.users.me = let home-manager.users.me =
modifier = "Mod4"; let
infoWorkspace = ""; modifier = "Mod4";
messageWorkspace = ""; infoWorkspace = "";
modes.resize = { messageWorkspace = "";
"Escape" = ''mode "default"''; modes.resize = {
"Return" = ''mode "default"''; "Escape" = ''mode "default"'';
"h" = "resize shrink width 10 px or 5 ppt"; "Return" = ''mode "default"'';
"j" = "resize grow height 10 px or 5 ppt"; "h" = "resize shrink width 10 px or 5 ppt";
"k" = "resize shrink height 10 px or 5 ppt"; "j" = "resize grow height 10 px or 5 ppt";
"l" = "resize grow width 10 px or 5 ppt"; "k" = "resize shrink height 10 px or 5 ppt";
}; "l" = "resize grow width 10 px or 5 ppt";
gaps.inner = 4; };
floating = { gaps.inner = 4;
titlebar = false; floating = {
border = 1; titlebar = false;
}; border = 1;
bars = let position = "bottom"; in [ };
(lib.recursiveUpdate config.home-manager.users.me.stylix.targets.i3.exportedBarConfig bars =
let
position = "bottom";
in
[
(lib.recursiveUpdate config.home-manager.users.me.stylix.targets.i3.exportedBarConfig {
workspaceButtons = true;
mode = "hide"; # "dock";
inherit position;
statusCommand = toString (
pkgs.writers.writeDash "i3status-rust" ''
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})"
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 = {
names = [
"${config.stylix.fonts.sansSerif.name}"
"FontAwesome 6 Free"
];
size = config.stylix.fonts.sizes.desktop * 0.8;
};
})
];
window = {
titlebar = false;
border = 2;
hideEdgeBorders = "smart";
commands = [
{
criteria = {
class = "floating";
};
command = "floating enable";
}
{
criteria = {
class = "fzfmenu";
};
command = "floating enable";
}
{
criteria = {
class = ".*";
};
command = "border pixel 2";
}
{
criteria = {
class = "mpv";
};
command = lib.strings.concatStringsSep ", " [
"floating enable"
"sticky enable"
"fullscreen disable"
"resize set 640 480"
"move position mouse"
];
}
];
};
colors =
let
background = config.lib.stylix.colors.withHashtag.base00;
in
{ {
workspaceButtons = true; unfocused = {
mode = "hide"; # "dock"; border = lib.mkForce background;
inherit position; childBorder = lib.mkForce background;
statusCommand = toString (pkgs.writers.writeDash "i3status-rust" ''
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})"
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 = {
names = ["${config.stylix.fonts.sansSerif.name}" "FontAwesome 6 Free"];
size = config.stylix.fonts.sizes.desktop * 0.8;
}; };
}) };
]; keybindings =
window = { lib.listToAttrs (
titlebar = false; map (
border = 2; x: lib.nameValuePair "${modifier}+Shift+${toString x}" "move container to workspace ${toString x}"
hideEdgeBorders = "smart"; ) (lib.range 1 9)
commands = [ )
{ // lib.listToAttrs (
criteria = {class = "floating";}; map (x: lib.nameValuePair "${modifier}+${toString x}" "workspace ${toString x}") (lib.range 1 9)
command = "floating enable"; )
} // {
{ "${modifier}+i" = "workspace ${infoWorkspace}";
criteria = {class = "fzfmenu";}; "${modifier}+m" = "workspace ${messageWorkspace}";
command = "floating enable";
}
{
criteria = {class = ".*";};
command = "border pixel 2";
}
{
criteria = {class = "mpv";};
command = lib.strings.concatStringsSep ", " [
"floating enable"
"sticky enable"
"fullscreen disable"
"resize set 640 480"
"move position mouse"
];
}
];
};
colors = let
background = config.lib.stylix.colors.withHashtag.base00;
in {
unfocused = {
border = lib.mkForce background;
childBorder = lib.mkForce background;
};
};
keybindings =
lib.listToAttrs (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}+m" = "workspace ${messageWorkspace}";
"${modifier}+Shift+h" = "move left 25 px"; "${modifier}+Shift+h" = "move left 25 px";
"${modifier}+Shift+j" = "move down 25 px"; "${modifier}+Shift+j" = "move down 25 px";
"${modifier}+Shift+k" = "move up 25 px"; "${modifier}+Shift+k" = "move up 25 px";
"${modifier}+Shift+l" = "move right 25 px"; "${modifier}+Shift+l" = "move right 25 px";
"${modifier}+h" = "focus left"; "${modifier}+h" = "focus left";
"${modifier}+j" = "focus down"; "${modifier}+j" = "focus down";
"${modifier}+k" = "focus up"; "${modifier}+k" = "focus up";
"${modifier}+l" = "focus right"; "${modifier}+l" = "focus right";
# "${modifier}+Shift+b" = "move container to workspace prev"; # "${modifier}+Shift+b" = "move container to workspace prev";
# "${modifier}+Shift+n" = "move container to workspace next"; # "${modifier}+Shift+n" = "move container to workspace next";
# "${modifier}+b" = "workspace prev"; # "${modifier}+b" = "workspace prev";
# "${modifier}+n" = "workspace next"; # "${modifier}+n" = "workspace next";
"${modifier}+Shift+c" = "reload"; "${modifier}+Shift+c" = "reload";
"${modifier}+Shift+q" = "kill"; "${modifier}+Shift+q" = "kill";
"${modifier}+Shift+r" = "restart"; "${modifier}+Shift+r" = "restart";
"${modifier}+z" = "sticky toggle"; "${modifier}+z" = "sticky toggle";
"${modifier}+Shift+z" = "floating toggle"; "${modifier}+Shift+z" = "floating toggle";
"${modifier}+Shift+s" = "move scratchpad"; "${modifier}+Shift+s" = "move scratchpad";
"${modifier}+s" = ''[class="^(?i)(?!obsidian).*"] scratchpad show''; "${modifier}+s" = ''[class="^(?i)(?!obsidian).*"] scratchpad show'';
"${modifier}+o" = ''[class="obsidian"] scratchpad show''; "${modifier}+o" = ''[class="obsidian"] scratchpad show'';
"${modifier}+c" = "split h"; "${modifier}+c" = "split h";
"${modifier}+e" = "layout toggle split"; "${modifier}+e" = "layout toggle split";
"${modifier}+f" = "fullscreen toggle"; "${modifier}+f" = "fullscreen toggle";
"${modifier}+r" = "mode resize"; "${modifier}+r" = "mode resize";
"${modifier}+v" = "split v"; "${modifier}+v" = "split v";
"${modifier}+w" = "layout tabbed"; "${modifier}+w" = "layout tabbed";
"${modifier}+q" = "exec ${config.services.clipmenu.package}/bin/clipmenu"; "${modifier}+q" = "exec ${config.services.clipmenu.package}/bin/clipmenu";
"${modifier}+Return" = "exec ${lib.getExe pkgs.niveum-terminal}"; "${modifier}+Return" = "exec ${lib.getExe pkgs.niveum-terminal}";
"${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" =
"${modifier}+Shift+d" = "exec ${pkgs.notemenu}/bin/notemenu"; "exec ${pkgs.writers.writeDash "run" ''exec rofi -modi run,ssh,window -show run''}";
"${modifier}+p" = "exec rofi-pass"; "${modifier}+Shift+d" = "exec ${pkgs.notemenu}/bin/notemenu";
"${modifier}+Shift+p" = "exec rofi-pass --insert"; "${modifier}+p" = "exec rofi-pass";
"${modifier}+u" = "exec ${pkgs.unicodmenu}/bin/unicodmenu"; "${modifier}+Shift+p" = "exec rofi-pass --insert";
"${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}+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}+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
exec ${pkgs.procps}/bin/pkill screenkey exec ${pkgs.procps}/bin/pkill screenkey
else else
exec ${pkgs.screenkey}/bin/screenkey exec ${pkgs.screenkey}/bin/screenkey
fi fi
''}"; ''}";
"${modifier}+F12" = "exec ${klem}/bin/klem"; "${modifier}+F12" = "exec ${klem}/bin/klem";
"XF86AudioLowerVolume" = "exec ${pkgs.pamixer}/bin/pamixer -d 5"; "XF86AudioLowerVolume" = "exec ${pkgs.pamixer}/bin/pamixer -d 5";
"XF86AudioMute" = "exec ${pkgs.pamixer}/bin/pamixer -t"; "XF86AudioMute" = "exec ${pkgs.pamixer}/bin/pamixer -t";
"XF86AudioRaiseVolume" = "exec ${pkgs.pamixer}/bin/pamixer -i 5"; "XF86AudioRaiseVolume" = "exec ${pkgs.pamixer}/bin/pamixer -i 5";
"XF86Calculator" = "exec ${pkgs.st}/bin/st -c floating -e ${pkgs.bc}/bin/bc"; "XF86Calculator" = "exec ${pkgs.st}/bin/st -c floating -e ${pkgs.bc}/bin/bc";
"XF86AudioPause" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; "XF86AudioPause" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; "XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next"; "XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous"; "XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop"; "XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop";
# key names detected with xorg.xev: # key names detected with xorg.xev:
# XF86WakeUp (fn twice) # XF86WakeUp (fn twice)
# XF86Battery (fn f3) # XF86Battery (fn f3)
# XF86Sleep (fn f4) - actually suspends # XF86Sleep (fn f4) - actually suspends
# XF86WLAN # XF86WLAN
# XF86WebCam (fn f6) # XF86WebCam (fn f6)
# XF86TouchpadToggle (fn f8) # XF86TouchpadToggle (fn f8)
# XF86Suspend (fn f12) - actually suspends to disk # XF86Suspend (fn f12) - actually suspends to disk
# Num_Lock (fn Roll) - numlocks # Num_Lock (fn Roll) - numlocks
# XF86Audio{Prev,Next,Mute,Play,Stop} # XF86Audio{Prev,Next,Mute,Play,Stop}
# XF86Forward # XF86Forward
# XF86Back # XF86Back
# XF86Launch1 (thinkvantage) # XF86Launch1 (thinkvantage)
}; };
in { in
stylix.targets.i3.enable = true; {
stylix.targets.i3.enable = true;
xsession.windowManager.i3 = { xsession.windowManager.i3 = {
enable = true; enable = true;
extraConfig = '' extraConfig = ''
bindsym --release ${modifier}+Shift+w exec xsecurelock bindsym --release ${modifier}+Shift+w exec xsecurelock
exec "${pkgs.obsidian}/bin/obsidian" exec "${pkgs.obsidian}/bin/obsidian"
for_window [class="obsidian"] , move scratchpad for_window [class="obsidian"] , move scratchpad
assign [class="message"] ${messageWorkspace} assign [class="message"] ${messageWorkspace}
exec "${pkgs.writers.writeDash "irc" "exec ${pkgs.alacritty}/bin/alacritty --class message -e ssh weechat@makanek -t tmux attach-session -t IM"}" exec "${pkgs.writers.writeDash "irc" "exec ${pkgs.alacritty}/bin/alacritty --class message -e ssh weechat@makanek -t tmux attach-session -t IM"}"
exec "${pkgs.writers.writeDash "email" "exec ${pkgs.alacritty}/bin/alacritty --class message -e aerc"}" exec "${pkgs.writers.writeDash "email" "exec ${pkgs.alacritty}/bin/alacritty --class message -e aerc"}"
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";
@@ -288,7 +326,7 @@ in {
# "${modifier}+x" = "exec ${new-workspace}"; # "${modifier}+x" = "exec ${new-workspace}";
"XF86Display" = "exec ${pkgs.dmenu-randr}/bin/dmenu-randr"; "XF86Display" = "exec ${pkgs.dmenu-randr}/bin/dmenu-randr";
}; };
};
}; };
}; };
};
} }

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,22 +19,24 @@
bars.bottom = { bars.bottom = {
icons = "awesome6"; icons = "awesome6";
settings = { settings = {
theme.overrides = let theme.overrides =
colours = config.lib.stylix.colors.withHashtag; let
in { colours = config.lib.stylix.colors.withHashtag;
idle_bg = colours.base00; in
idle_fg = colours.base05; {
good_bg = colours.base00; idle_bg = colours.base00;
good_fg = colours.base0B; idle_fg = colours.base05;
warning_bg = colours.base00; good_bg = colours.base00;
warning_fg = colours.base0A; good_fg = colours.base0B;
critical_bg = colours.base00; warning_bg = colours.base00;
critical_fg = colours.base09; warning_fg = colours.base0A;
info_bg = colours.base00; critical_bg = colours.base00;
info_fg = colours.base04; critical_fg = colours.base09;
separator_bg = colours.base00; info_bg = colours.base00;
separator = " "; info_fg = colours.base04;
}; separator_bg = colours.base00;
separator = " ";
};
}; };
blocks = [ blocks = [
{ {
@@ -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
# stylixColors = config.lib.stylix.colors; vim-kmein = (
colorscheme = "base16-gruvbox-dark-medium"; pkgs.vim-kmein.override {
}); # stylixColors = config.lib.stylix.colors;
in { colorscheme = "base16-gruvbox-dark-medium";
}
);
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,19 +4,22 @@
lib, lib,
inputs, inputs,
... ...
}: let }:
worldradio = pkgs.callPackage ../packages/worldradio.nix {}; let
worldradio = pkgs.callPackage ../packages/worldradio.nix { };
zoteroStyle = { zoteroStyle =
name, {
sha256, name,
}: { sha256,
name = "${name}.csl"; }:
path = pkgs.fetchurl { {
url = "https://www.zotero.org/styles/${name}"; name = "${name}.csl";
inherit sha256; path = pkgs.fetchurl {
url = "https://www.zotero.org/styles/${name}";
inherit sha256;
};
}; };
};
cslDirectory = pkgs.linkFarm "citation-styles" [ cslDirectory = pkgs.linkFarm "citation-styles" [
(zoteroStyle { (zoteroStyle {
name = "chicago-author-date-de"; name = "chicago-author-date-de";
@@ -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,40 +106,42 @@
sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd"; sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd";
}; };
}; };
sanskrit = let sanskrit =
repo = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f"; let
in { repo = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f";
BoehtlingkRoth = pkgs.fetchzip { in
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-and-Roth-Grosses-Petersburger-Worterbuch__2021-10-05_14-23-18Z__19MB.tar.gz"; {
sha256 = "13414a8rgd7hd5ffar6nl68nk3ys60wjkgb7m11hp0ahaasmf6ly"; BoehtlingkRoth = pkgs.fetchzip {
stripRoot = false; url = "${repo}/sa-head/german-entries/tars/Bohtlingk-and-Roth-Grosses-Petersburger-Worterbuch__2021-10-05_14-23-18Z__19MB.tar.gz";
sha256 = "13414a8rgd7hd5ffar6nl68nk3ys60wjkgb7m11hp0ahaasmf6ly";
stripRoot = false;
};
BoehtlingkRothKurz = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-Sanskrit-Worterbuch-in-kurzerer-Fassung__2021-10-05_14-23-18Z__10MB.tar.gz";
sha256 = "15yx31yrk40k9nn6kaysp4pprzj8dpd13dj3wafklc3izm8lr2wq";
stripRoot = false;
};
MonierWilliams = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/mw-cologne__2021-10-06_00-16-23Z__16MB.tar.gz";
sha256 = "0p99ybxwxmmd94hf035hvm2hhnfy84av7qq79xf28bh2rbx6s9ng";
stripRoot = false;
};
MonierWilliamsEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/mw-english-sanskrit__2021-10-05_14-23-18Z__3MB.tar.gz";
sha256 = "09a61hhii4b1m2fkrlh4rm2xnlgwrllh84iypbc6wyj00w9jkl3x";
stripRoot = false;
};
Borooah = pkgs.fetchzip {
url = "${repo}/en-head/tars/borooah__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0qmmfbynqgv125v48383i51ky9yi69zibhh7vwk95gyar2yrprn2";
stripRoot = false;
};
ApteEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/apte-english-sanskrit-cologne__2021-10-06_00-12-51Z__1MB.tar.gz";
sha256 = "064ysm24ydc534ca689y5i2flnra8jkmh8zn0gsb6n8hdsb0d1lq";
stripRoot = false;
};
}; };
BoehtlingkRothKurz = pkgs.fetchzip {
url = "${repo}/sa-head/german-entries/tars/Bohtlingk-Sanskrit-Worterbuch-in-kurzerer-Fassung__2021-10-05_14-23-18Z__10MB.tar.gz";
sha256 = "15yx31yrk40k9nn6kaysp4pprzj8dpd13dj3wafklc3izm8lr2wq";
stripRoot = false;
};
MonierWilliams = pkgs.fetchzip {
url = "https://github.com/indic-dict/stardict-sanskrit/raw/4ebd2d3db5820f7cbe3a649c3d5aa8f83d19b29f/sa-head/en-entries/tars/mw-cologne__2021-10-06_00-16-23Z__16MB.tar.gz";
sha256 = "0p99ybxwxmmd94hf035hvm2hhnfy84av7qq79xf28bh2rbx6s9ng";
stripRoot = false;
};
MonierWilliamsEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/mw-english-sanskrit__2021-10-05_14-23-18Z__3MB.tar.gz";
sha256 = "09a61hhii4b1m2fkrlh4rm2xnlgwrllh84iypbc6wyj00w9jkl3x";
stripRoot = false;
};
Borooah = pkgs.fetchzip {
url = "${repo}/en-head/tars/borooah__2021-10-05_14-23-18Z__2MB.tar.gz";
sha256 = "0qmmfbynqgv125v48383i51ky9yi69zibhh7vwk95gyar2yrprn2";
stripRoot = false;
};
ApteEnglish = pkgs.fetchzip {
url = "${repo}/en-head/tars/apte-english-sanskrit-cologne__2021-10-06_00-12-51Z__1MB.tar.gz";
sha256 = "064ysm24ydc534ca689y5i2flnra8jkmh8zn0gsb6n8hdsb0d1lq";
stripRoot = false;
};
};
oed = { oed = {
OED1 = pkgs.fetchzip { OED1 = pkgs.fetchzip {
url = locker "stardict-Oxford_English_Dictionary_2nd_Ed._P1-2.4.2.tar.bz2"; url = locker "stardict-Oxford_English_Dictionary_2nd_Ed._P1-2.4.2.tar.bz2";
@@ -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,20 +3,26 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }:
let
username = "meinhak99"; username = "meinhak99";
fu-defaults = let mailhost = "mail.zedat.fu-berlin.de"; in { fu-defaults =
imap.host = mailhost; let
imap.port = 993; mailhost = "mail.zedat.fu-berlin.de";
imap.tls.enable = true; in
smtp.host = mailhost; {
smtp.port = 465; imap.host = mailhost;
smtp.tls.enable = true; imap.port = 993;
folders.drafts = "Entwürfe"; imap.tls.enable = true;
folders.sent = "Gesendet"; smtp.host = mailhost;
folders.trash = "Papierkorb"; smtp.port = 465;
}; smtp.tls.enable = true;
in { folders.drafts = "Entwürfe";
folders.sent = "Gesendet";
folders.trash = "Papierkorb";
};
in
{
home-manager.users.me = { home-manager.users.me = {
programs.ssh = { programs.ssh = {
matchBlocks = { matchBlocks = {
@@ -28,31 +34,33 @@ 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";
{ address = "letos.sprachlit@hu-berlin.de";
userName = "slfletos"; passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-letos.path}";
address = "letos.sprachlit@hu-berlin.de"; imap.host = "mailbox.cms.hu-berlin.de";
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-letos.path}"; imap.port = 993;
imap.host = "mailbox.cms.hu-berlin.de"; smtp.host = "mailhost.cms.hu-berlin.de";
imap.port = 993; smtp.port = 25;
smtp.host = "mailhost.cms.hu-berlin.de"; smtp.tls.useStartTls = true;
smtp.port = 25; };
smtp.tls.useStartTls = true; fu = lib.recursiveUpdate pkgs.lib.niveum.email.defaults (
}; lib.recursiveUpdate fu-defaults (
fu = let
lib.recursiveUpdate pkgs.lib.niveum.email.defaults userName = "meinhak99";
(lib.recursiveUpdate fu-defaults in
(let 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,59 +90,57 @@ 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 =
fu-berlin-cifs-options = [ let
"uid=${toString config.users.users.me.uid}" fu-berlin-cifs-options = [
"gid=${toString config.users.groups.users.gid}" "uid=${toString config.users.users.me.uid}"
"rw" "gid=${toString config.users.groups.users.gid}"
"nounix" "rw"
"domain=fu-berlin" "nounix"
"noauto" "domain=fu-berlin"
"x-systemd.automount" "noauto"
"x-systemd.device-timeout=1" "x-systemd.automount"
"x-systemd.idle-timeout=1min" "x-systemd.device-timeout=1"
]; "x-systemd.idle-timeout=1min"
];
firstCharacter = lib.strings.substring 0 1; firstCharacter = lib.strings.substring 0 1;
home-directory-mount = user: { home-directory-mount = user: {
"${pkgs.lib.niveum.remoteDir}/fu/${user}/home" = { "${pkgs.lib.niveum.remoteDir}/fu/${user}/home" = {
device = "${user}@login.zedat.fu-berlin.de:/home/${firstCharacter user}/${user}"; device = "${user}@login.zedat.fu-berlin.de:/home/${firstCharacter user}/${user}";
fsType = "sshfs"; fsType = "sshfs";
options = [ options = [
"allow_other" "allow_other"
"_netdev" "_netdev"
"x-systemd.automount" "x-systemd.automount"
"reconnect" "reconnect"
"ServerAliveInterval=15" "ServerAliveInterval=15"
"IdentityFile=${config.age.secrets.fu-sftp-key.path}" "IdentityFile=${config.age.secrets.fu-sftp-key.path}"
]; ];
};
}; };
}; in
in home-directory-mount "meinhak99"; 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,88 +2,97 @@
config, config,
pkgs, pkgs,
... ...
}: let }:
let
promptColours.success = "cyan"; promptColours.success = "cyan";
promptColours.failure = "red"; promptColours.failure = "red";
in { in
programs.zsh = let {
zsh-completions = pkgs.fetchFromGitHub { programs.zsh =
owner = "zsh-users"; let
repo = "zsh-completions"; zsh-completions = pkgs.fetchFromGitHub {
rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb"; owner = "zsh-users";
sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l"; repo = "zsh-completions";
rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb";
sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l";
};
in
{
enable = true;
enableCompletion = true;
autosuggestions.enable = true;
syntaxHighlighting.enable = true;
syntaxHighlighting.highlighters = [
"main"
"brackets"
"pattern"
"line"
];
interactiveShellInit = ''
setopt INTERACTIVE_COMMENTS CORRECT
setopt MULTIOS
setopt AUTO_NAME_DIRS
setopt AUTOCD CDABLE_VARS
setopt HIST_IGNORE_ALL_DUPS
setopt VI
setopt AUTO_MENU
setopt COMPLETE_IN_WORD
setopt ALWAYS_TO_END
unsetopt NOMATCH
unsetopt MENU_COMPLETE
zstyle ':completion:*:*:*:*:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' list-colors \'\'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w"
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
export KEYTIMEOUT=1
hash -d nixos=/etc/nixos niveum=${config.users.users.me.home}/sync/src/niveum
autoload -U zmv run-help edit-command-line
fpath=(${zsh-completions}/src $fpath)
'';
promptInit = ''
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' stagedstr '%F{green}+%f'
zstyle ':vcs_info:*' unstagedstr '%F{red}~%f'
zstyle ':vcs_info:*' use-prompt-escapes true
zstyle ':vcs_info:*' formats "%c%u%F{cyan}%b%f"
zstyle ':vcs_info:*' actionformats "(%a) %c%u%F{cyan}%b%f"
precmd () {
vcs_info
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] || [ -n "$SSH_CONNECTION" ]; then
RPROMPT="$(hostname)"
else
RPROMPT="$vcs_info_msg_0_"
fi
if [[ -n $IN_NIX_SHELL ]]; then
PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})λ%f '
else
PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})%#%f '
fi
print -Pn "\e]2;%n@%M:%~\a" # title bar prompt
}
zle-keymap-select zle-line-init () {
case $KEYMAP in
vicmd) print -n '\e]12;green\a';;
viins|main) print -n '\e]12;gray\a';;
esac
}
zle -N zle-line-init
zle -N zle-keymap-select
zle -N edit-command-line
bindkey -M vicmd v edit-command-line
'';
}; };
in {
enable = true;
enableCompletion = true;
autosuggestions.enable = true;
syntaxHighlighting.enable = true;
syntaxHighlighting.highlighters = ["main" "brackets" "pattern" "line"];
interactiveShellInit = ''
setopt INTERACTIVE_COMMENTS CORRECT
setopt MULTIOS
setopt AUTO_NAME_DIRS
setopt AUTOCD CDABLE_VARS
setopt HIST_IGNORE_ALL_DUPS
setopt VI
setopt AUTO_MENU
setopt COMPLETE_IN_WORD
setopt ALWAYS_TO_END
unsetopt NOMATCH
unsetopt MENU_COMPLETE
zstyle ':completion:*:*:*:*:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' list-colors \'\'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w"
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
export KEYTIMEOUT=1
hash -d nixos=/etc/nixos niveum=${config.users.users.me.home}/sync/src/niveum
autoload -U zmv run-help edit-command-line
fpath=(${zsh-completions}/src $fpath)
'';
promptInit = ''
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' stagedstr '%F{green}+%f'
zstyle ':vcs_info:*' unstagedstr '%F{red}~%f'
zstyle ':vcs_info:*' use-prompt-escapes true
zstyle ':vcs_info:*' formats "%c%u%F{cyan}%b%f"
zstyle ':vcs_info:*' actionformats "(%a) %c%u%F{cyan}%b%f"
precmd () {
vcs_info
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] || [ -n "$SSH_CONNECTION" ]; then
RPROMPT="$(hostname)"
else
RPROMPT="$vcs_info_msg_0_"
fi
if [[ -n $IN_NIX_SHELL ]]; then
PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})λ%f '
else
PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})%#%f '
fi
print -Pn "\e]2;%n@%M:%~\a" # title bar prompt
}
zle-keymap-select zle-line-init () {
case $KEYMAP in
vicmd) print -n '\e]12;green\a';;
viins|main) print -n '\e]12;gray\a';;
esac
}
zle -N zle-line-init
zle -N zle-keymap-select
zle -N edit-command-line
bindkey -M vicmd v edit-command-line
'';
};
} }

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,39 +2,43 @@
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, {
retiolumLink ? false, target,
server ? "irc.r", retiolumLink ? false,
messagePrefix ? "change detected: ", server ? "irc.r",
nick ? ''"$PANOPTIKON_WATCHER"-watcher'', messagePrefix ? "change detected: ",
}: nick ? ''"$PANOPTIKON_WATCHER"-watcher'',
}:
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,65 +3,69 @@
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 (
options = { lib.types.submodule (watcher: {
script = lib.mkOption { options = {
type = lib.types.path; script = lib.mkOption {
description = '' type = lib.types.path;
A script whose stdout is to be watched. description = ''
''; A script whose stdout is to be watched.
example = '' '';
pkgs.writers.writeDash "github-meta" ''' example = ''
''${pkgs.curl}/bin/curl -sSL https://api.github.com/meta | ''${pkgs.jq}/bin/jq pkgs.writers.writeDash "github-meta" '''
''' ''${pkgs.curl}/bin/curl -sSL https://api.github.com/meta | ''${pkgs.jq}/bin/jq
''; '''
'';
};
frequency = lib.mkOption {
type = lib.types.str;
description = ''
How often to run the script. See systemd.time(7) for more information about the format.
'';
example = "*:0/3";
default = "daily";
};
loadCredential = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = ''
This can be used to pass secrets to the systemd service without adding them to the nix store.
'';
default = [ ];
};
reporters = lib.mkOption {
type = lib.types.listOf lib.types.path;
description = ''
A list of scripts that take the diff (if any) via stdin and report it (e.g. to IRC, Telegram or Prometheus). The name of the watcher will be in the $PANOPTIKON_WATCHER environment variable.
'';
example = ''
[
(pkgs.writers.writeDash "telegram-reporter" '''
''${pkgs.curl}/bin/curl -X POST https://api.telegram.org/bot''${TOKEN}/sendMessage \
-d chat_id=123456 \
-d text="$(cat)"
''')
(pkgs.writers.writeDash "notify" '''
''${pkgs.libnotify}/bin/notify-send "$PANOPTIKON_WATCHER has changed."
''')
]
'';
};
}; };
frequency = lib.mkOption { config = { };
type = lib.types.str; })
description = '' );
How often to run the script. See systemd.time(7) for more information about the format.
'';
example = "*:0/3";
default = "daily";
};
loadCredential = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = ''
This can be used to pass secrets to the systemd service without adding them to the nix store.
'';
default = [];
};
reporters = lib.mkOption {
type = lib.types.listOf lib.types.path;
description = ''
A list of scripts that take the diff (if any) via stdin and report it (e.g. to IRC, Telegram or Prometheus). The name of the watcher will be in the $PANOPTIKON_WATCHER environment variable.
'';
example = ''
[
(pkgs.writers.writeDash "telegram-reporter" '''
''${pkgs.curl}/bin/curl -X POST https://api.telegram.org/bot''${TOKEN}/sendMessage \
-d chat_id=123456 \
-d text="$(cat)"
''')
(pkgs.writers.writeDash "notify" '''
''${pkgs.libnotify}/bin/notify-send "$PANOPTIKON_WATCHER has changed."
''')
]
'';
};
};
config = {};
}));
}; };
}; };
config = let config =
cfg = config.services.panoptikon; let
in cfg = config.services.panoptikon;
in
lib.mkIf cfg.enable { lib.mkIf cfg.enable {
users.extraUsers.panoptikon = { users.extraUsers.panoptikon = {
isSystemUser = true; isSystemUser = true;
@@ -70,45 +74,50 @@
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;
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
User = "panoptikon"; User = "panoptikon";
Group = "panoptikon"; Group = "panoptikon";
WorkingDirectory = "/var/lib/panoptikon"; WorkingDirectory = "/var/lib/panoptikon";
RestartSec = toString (60 * 60); RestartSec = toString (60 * 60);
Restart = "on-failure"; Restart = "on-failure";
LoadCredential = watcherOptions.loadCredential; LoadCredential = watcherOptions.loadCredential;
}; };
unitConfig = { unitConfig = {
StartLimitIntervalSec = "300"; StartLimitIntervalSec = "300";
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 ${
if [ -n "$diff_output" ] lib.escapeShellArg (watcherName + ".old")
then } ${lib.escapeShellArg watcherName} || :)
${lib.strings.concatMapStringsSep "\n" (reporter: ''echo "$diff_output" | ${reporter} || :'') watcherOptions.reporters} if [ -n "$diff_output" ]
fi then
mv ${lib.escapeShellArg watcherName} ${lib.escapeShellArg (watcherName + ".old")} ${lib.strings.concatMapStringsSep "\n" (
''; reporter: ''echo "$diff_output" | ${reporter} || :''
}) ) watcherOptions.reporters}
cfg.watchers; fi
mv ${lib.escapeShellArg watcherName} ${lib.escapeShellArg (watcherName + ".old")}
'';
}
) 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 = { {
enable = mkEnableOption "server passport"; options.niveum.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,61 +78,62 @@ in
default = ""; default = "";
}; };
}; };
}); }
default = []; );
default = [ ];
};
};
config = mkIf cfg.enable {
services.nginx.enable = true;
services.nginx.virtualHosts."${cfg.virtualHost}".locations."/passport".extraConfig = ''
default_type "text/html";
root ${
pkgs.linkFarm "www" [
{
name = "passport/index.html";
path = pkgs.writeText "index.html" ''
<!doctype html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>${config.networking.hostName} passport</title>
<style>${css}</style>
</head>
<body>
<main>
<section id="server">
<h1>${config.networking.hostName}</h1>
${cfg.introductionHTML}
</section>
<section id="services">
<h2>Services</h2>
<dl>
${lib.strings.concatMapStringsSep "\n" (service: ''
<dt>
${lib.optionalString (service.link != null) "<a href=\"${service.link}\">"}
${service.title}
${lib.optionalString (service.link != null) "</a>"}
</dt>
<dd>
${service.description}
</dd>
'') (sortOn "title" cfg.services)}
</dl>
</section>
</main>
<footer>
<tt>${config.networking.hostName}</tt> is part of the <i><a href="https://github.com/kmein/niveum/tree/master/systems/${config.networking.hostName}">niveum</a></i> network.
</footer>
</body>
'';
}
]
}; };
}; index index.html;
'';
config = mkIf cfg.enable { };
services.nginx.enable = true; }
services.nginx.virtualHosts."${cfg.virtualHost}".locations."/passport".extraConfig = ''
default_type "text/html";
root ${
pkgs.linkFarm "www" [
{
name = "passport/index.html";
path = pkgs.writeText "index.html" ''
<!doctype html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>${config.networking.hostName} passport</title>
<style>${css}</style>
</head>
<body>
<main>
<section id="server">
<h1>${config.networking.hostName}</h1>
${cfg.introductionHTML}
</section>
<section id="services">
<h2>Services</h2>
<dl>
${lib.strings.concatMapStringsSep "\n" (service: ''
<dt>
${lib.optionalString (service.link != null) "<a href=\"${service.link}\">"}
${service.title}
${lib.optionalString (service.link != null) "</a>"}
</dt>
<dd>
${service.description}
</dd>
'') (sortOn "title" cfg.services)}
</dl>
</section>
</main>
<footer>
<tt>${config.networking.hostName}</tt> is part of the <i><a href="https://github.com/kmein/niveum/tree/master/systems/${config.networking.hostName}">niveum</a></i> network.
</footer>
</body>
'';
}
]
};
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,32 +4,35 @@
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 =
colours16 = types.enum [ let
"black" colours16 = types.enum [
"red" "black"
"green" "red"
"yellow" "green"
"blue" "yellow"
"magenta" "blue"
"cyan" "magenta"
"white" "cyan"
]; "white"
in { ];
success = mkOption { in
type = colours16; {
default = "green"; success = mkOption {
type = colours16;
default = "green";
};
failure = mkOption {
type = colours16;
default = "red";
};
}; };
failure = mkOption {
type = colours16;
default = "red";
};
};
}; };
} }

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 =
"telegram-token:${bot.telegram.tokenFile}" lib.optionals (bot.telegram.enable) [
] ++ lib.optionals (bot.mastodon.enable) [ "telegram-token:${bot.telegram.tokenFile}"
"mastodon-token:${bot.mastodon.tokenFile}" ]
] ++ lib.optionals (bot.matrix.enable) [ ++ lib.optionals (bot.mastodon.enable) [
"matrix-token:${bot.matrix.tokenFile}" "mastodon-token:${bot.mastodon.tokenFile}"
]; ]
++ lib.optionals (bot.matrix.enable) [
"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" (
${pkgs.curl}/bin/curl -X POST "https://${bot.matrix.homeserver}/_matrix/client/r0/rooms/${chatId}/send/m.room.message" \ map (chatId: ''
-d "$JSON_PAYLOAD" \ ${pkgs.curl}/bin/curl -X POST "https://${bot.matrix.homeserver}/_matrix/client/r0/rooms/${chatId}/send/m.room.message" \
-H "Authorization: Bearer $MATRIX_TOKEN" \ -d "$JSON_PAYLOAD" \
-H "Content-Type: application/json" -H "Authorization: Bearer $MATRIX_TOKEN" \
'') bot.matrix.chatIds)} -H "Content-Type: application/json"
'') bot.matrix.chatIds
)}
''} ''}
${lib.optionalString (bot.mastodon.enable) '' ${lib.optionalString (bot.mastodon.enable) ''
@@ -49,78 +56,90 @@ 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" (
${pkgs.curl}/bin/curl -X POST "https://api.telegram.org/bot''${TELEGRAM_TOKEN}/sendMessage" \ map (chatId: ''
-d chat_id="${chatId}" \ ${pkgs.curl}/bin/curl -X POST "https://api.telegram.org/bot''${TELEGRAM_TOKEN}/sendMessage" \
-d text="$QUOTE" ${ -d chat_id="${chatId}" \
lib.strings.optionalString (bot.telegram.parseMode != null) -d text="$QUOTE" ${
"-d parse_mode=${bot.telegram.parseMode}" lib.strings.optionalString (
} | ${pkgs.jq}/bin/jq -e .ok bot.telegram.parseMode != null
'') ) "-d parse_mode=${bot.telegram.parseMode}"
bot.telegram.chatIds)} } | ${pkgs.jq}/bin/jq -e .ok
'') bot.telegram.chatIds
)}
''} ''}
fi fi
''; '';
}; };
in { in
{
options.niveum.bots = mkOption { options.niveum.bots = mkOption {
type = types.attrsOf (types.submodule { type = types.attrsOf (
options = { types.submodule {
enable = mkEnableOption "Mastodon and Telegram bot"; options = {
time = mkOption {type = types.str;}; enable = mkEnableOption "Mastodon and Telegram bot";
command = mkOption {type = types.str;}; time = mkOption { type = types.str; };
matrix = mkOption { command = mkOption { type = types.str; };
default = {}; matrix = mkOption {
type = types.submodule { default = { };
options = { type = types.submodule {
enable = mkEnableOption "Posting to Matrix"; options = {
tokenFile = mkOption {type = types.path;}; enable = mkEnableOption "Posting to Matrix";
homeserver = mkOption { tokenFile = mkOption { type = types.path; };
type = types.str; homeserver = mkOption {
type = types.str;
};
chatIds = mkOption {
type = types.listOf types.str;
};
}; };
chatIds = mkOption { };
type = types.listOf types.str; };
mastodon = mkOption {
default = { };
type = types.submodule {
options = {
enable = mkEnableOption "Posting to Mastodon";
language = mkOption {
type = types.str;
default = "en";
};
tokenFile = mkOption { type = types.path; };
homeserver = mkOption {
type = types.str;
default = "social.krebsco.de";
};
};
};
};
telegram = mkOption {
default = { };
type = types.submodule {
options = {
enable = mkEnableOption "Posting to Telegram";
tokenFile = mkOption { type = types.path; };
chatIds = mkOption {
type = types.listOf (types.strMatching "-?[0-9]+|@[A-Za-z0-9]+");
};
parseMode = mkOption {
type = types.nullOr (
types.enum [
"HTML"
"Markdown"
]
);
default = null;
};
}; };
}; };
}; };
}; };
mastodon = mkOption { }
default = {}; );
type = types.submodule { default = { };
options = {
enable = mkEnableOption "Posting to Mastodon";
language = mkOption {
type = types.str;
default = "en";
};
tokenFile = mkOption {type = types.path;};
homeserver = mkOption {
type = types.str;
default = "social.krebsco.de";
};
};
};
};
telegram = mkOption {
default = {};
type = types.submodule {
options = {
enable = mkEnableOption "Posting to Telegram";
tokenFile = mkOption {type = types.path;};
chatIds = mkOption {
type = types.listOf (types.strMatching "-?[0-9]+|@[A-Za-z0-9]+");
};
parseMode = mkOption {
type = types.nullOr (types.enum ["HTML" "Markdown"]);
default = null;
};
};
};
};
};
});
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 = [ {
(haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode)) libraries = [
haskellPackages.text (haskell.lib.unmarkBroken (haskell.lib.doJailbreak haskellPackages.betacode))
]; haskellPackages.text
} '' ];
import qualified Data.Text.IO as T }
import qualified Data.Text as T ''
import Text.BetaCode import qualified Data.Text.IO as T
main = T.interact (either (error . T.unpack) id . fromBeta) import qualified Data.Text as T
'' import Text.BetaCode
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,40 +16,40 @@
''; '';
}; };
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";
GFS_Baskerville = "07gx5b9b43zv74d2lay37sajd4ba2wqn3b7xzvyhn265ds9x7cxk"; GFS_Baskerville = "07gx5b9b43zv74d2lay37sajd4ba2wqn3b7xzvyhn265ds9x7cxk";
GFS_Bodoni = "0jhl0728ikzha1krm01sk52nz3jzibidwmyvgidg61d87l8nbf2p"; GFS_Bodoni = "0jhl0728ikzha1krm01sk52nz3jzibidwmyvgidg61d87l8nbf2p";
GFS_Bodoni_Classic = "06jw2irskn75s50mgwkx08rzwqi82gpc6lgjsimsi8p81566gfrh"; GFS_Bodoni_Classic = "06jw2irskn75s50mgwkx08rzwqi82gpc6lgjsimsi8p81566gfrh";
GFS_Complutum = "1q7dxs2z3yrgchd2pz9h72mjrk62kdc2mmqw8kg9q76k28f8n3p0"; # -> GFSPolyglot.otf GFS_Complutum = "1q7dxs2z3yrgchd2pz9h72mjrk62kdc2mmqw8kg9q76k28f8n3p0"; # -> GFSPolyglot.otf
GFS_Decker = "016v1j5n9ph4i2cpmlk26pcxhp3q2fjwlaryppd5akl84dfkpncl"; GFS_Decker = "016v1j5n9ph4i2cpmlk26pcxhp3q2fjwlaryppd5akl84dfkpncl";
GFS_Didot = "0ysvrp527wm0wxfp6wmlgmxfx7ysr5mwpmjmqp1h605cy44jblfm"; GFS_Didot = "0ysvrp527wm0wxfp6wmlgmxfx7ysr5mwpmjmqp1h605cy44jblfm";
GFS_Didot_Classic = "0n5awqksvday3l3d85yhwmbmfj9bcpxivy4wpd4zrkgl7b85af2c"; GFS_Didot_Classic = "0n5awqksvday3l3d85yhwmbmfj9bcpxivy4wpd4zrkgl7b85af2c";
GFS_Didot_Display = "0n2di2zyc76w6f8mc6hfilc2ir6igks7ldjp9fkw1gjp06330fi7"; GFS_Didot_Display = "0n2di2zyc76w6f8mc6hfilc2ir6igks7ldjp9fkw1gjp06330fi7";
GFS_Elpis = "02l7wd3nbn1kpv7ghxh19k4dbvd49ijyxd6gq83gcr9vlmxcq2s2"; GFS_Elpis = "02l7wd3nbn1kpv7ghxh19k4dbvd49ijyxd6gq83gcr9vlmxcq2s2";
GFS_Gazis = "0x9iwj6pinaykrds0iw6552hf256d0dr41sipdb1jnnlr2d3bf9w"; GFS_Gazis = "0x9iwj6pinaykrds0iw6552hf256d0dr41sipdb1jnnlr2d3bf9w";
GFS_Goschen = "1jvbn33wzq2yj0aygwy9pd2msg3wkmdp0npjzazadrmfjpnpkcy9"; GFS_Goschen = "1jvbn33wzq2yj0aygwy9pd2msg3wkmdp0npjzazadrmfjpnpkcy9";
GFS_NeoHellenic = "1ixm2frdc6i5lbn9h0h4gdsvsw2k4hny75q8ig4kgs28ac3dbzq3"; GFS_NeoHellenic = "1ixm2frdc6i5lbn9h0h4gdsvsw2k4hny75q8ig4kgs28ac3dbzq3";
GFS_Olga = "1qaxaw3ngnbr1gb1xyk5f2z647zklg6sl3bqwi28l47j9mp0f8aj"; GFS_Olga = "1qaxaw3ngnbr1gb1xyk5f2z647zklg6sl3bqwi28l47j9mp0f8aj";
GFS_Orpheus = "18n6fag4pyr8jdwnsz0vixf47jz4ym8mjmppc1w3k7v27cg1z9dz"; GFS_Orpheus = "18n6fag4pyr8jdwnsz0vixf47jz4ym8mjmppc1w3k7v27cg1z9dz";
GFS_Orpheus_Classic = "1rqy1kf7slw56zfhbv264yzarjisnqbqydj4f7hghiknhnmdakps"; GFS_Orpheus_Classic = "1rqy1kf7slw56zfhbv264yzarjisnqbqydj4f7hghiknhnmdakps";
GFS_Orpheus_Sans = "02rh7z8c3h3xyfi52rn47z4finizx636d05bg5g23v0l0mqs6nkg"; GFS_Orpheus_Sans = "02rh7z8c3h3xyfi52rn47z4finizx636d05bg5g23v0l0mqs6nkg";
GFS_Philostratos = "0zh3d0cn6b2fjbwnvmg379z20zh7w626w2bnj19xcazjvqkwhzx1"; GFS_Philostratos = "0zh3d0cn6b2fjbwnvmg379z20zh7w626w2bnj19xcazjvqkwhzx1";
GFS_Porson = "0c2axagkm6wxv8na2q11k6c5dmgkwx5hn9sh9qy82gbips9blnda"; GFS_Porson = "0c2axagkm6wxv8na2q11k6c5dmgkwx5hn9sh9qy82gbips9blnda";
GFS_Pyrsos = "0y0dv7y3n01bbhhnczflx1zcc7by56cffmr2xqixj2rd1nvchx0j"; GFS_Pyrsos = "0y0dv7y3n01bbhhnczflx1zcc7by56cffmr2xqixj2rd1nvchx0j";
GFS_Solomos = "1mpx9mw566awvfjdfx5sbz3wz5gbnjjw56gz30mk1lw06vxf0dxz"; GFS_Solomos = "1mpx9mw566awvfjdfx5sbz3wz5gbnjjw56gz30mk1lw06vxf0dxz";
GFS_Theokritos = "0haasx819x8c8yvna6pqywgi4060av2570jm34cddnz1fgnhv1b8"; GFS_Theokritos = "0haasx819x8c8yvna6pqywgi4060av2570jm34cddnz1fgnhv1b8";
# Heraklit # Heraklit
# Galatea # Galatea
# Georgiou # Georgiou
# Ambrosia # Ambrosia
# Fleischman # Fleischman
# Eustace # Eustace
# Nicefore # Nicefore
# Jackson # Jackson
# 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,18 +13,18 @@
"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 \
-saturation 0.4 \ -saturation 0.4 \
-erasemode no_fade \ -erasemode no_fade \
+description \ +description \
-showdate \ -showdate \
-username " " \ -username " " \
-password " " \ -password " " \
-info " " \ -info " " \
-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 ;; )}
esac \ *) ${coreutils}/bin/cat ;;
| ${xclip}/bin/xclip -selection ${cfg.selection} -in esac \
| ${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,20 +6,24 @@
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}
note_file=$({ note_file=$({
${lib.optionalString currentDates '' ${lib.optionalString currentDates ''
echo $(date -I).md echo $(date -I).md
echo $(date -I -d yesterday).md echo $(date -I -d yesterday).md
''} ''}
find . -not -path '*/.*' -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2- find . -not -path '*/.*' -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2-
} | rofi -dmenu -i -p 'notes') } | rofi -dmenu -i -p 'notes')
if test "$note_file" if test "$note_file"

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,42 +103,42 @@
${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")
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.good)} | shuf -n1 | ${sendIRC} echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.good)} | shuf -n1 | ${sendIRC}
# Download the song if a download URL is provided in the string (youtu.be) # Download the song if a download URL is provided in the string (youtu.be)
downloadUrl=$(echo "$response" | grep -oE 'https?://(www\.)?(youtube\.com|youtu\.be)/[^\s]+') downloadUrl=$(echo "$response" | grep -oE 'https?://(www\.)?(youtube\.com|youtu\.be)/[^\s]+')
if [ -n "$downloadUrl" ]; then if [ -n "$downloadUrl" ]; then
echo "Downloading song from URL: $downloadUrl" echo "Downloading song from URL: $downloadUrl"
mkdir -p ${lib.escapeShellArg downloadDirectory} mkdir -p ${lib.escapeShellArg downloadDirectory}
cd ${lib.escapeShellArg downloadDirectory} cd ${lib.escapeShellArg downloadDirectory}
${download} "$downloadUrl" ${download} "$downloadUrl"
else else
echo "No download URL found in the response: $response" echo "No download URL found in the response: $response"
fi fi
;; ;;
skip|next|bad|sucks|no|nope|flop|-) skip|next|bad|sucks|no|nope|flop|-)
${curl}/bin/curl -sS -XPOST "${playlistAPI}/skip" ${curl}/bin/curl -sS -XPOST "${playlistAPI}/skip"
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.bad)} | shuf -n1 | ${sendIRC} echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.bad)} | shuf -n1 | ${sendIRC}
;; ;;
0|meh|neutral) 0|meh|neutral)
echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.neutral)} | shuf -n1 | ${sendIRC} echo ${lib.escapeShellArg (lib.concatStringsSep "\n" messages.neutral)} | shuf -n1 | ${sendIRC}
;; ;;
say|msg) say|msg)
shift shift
echo "$@" | ${sendIRC} echo "$@" | ${sendIRC}
;; ;;
recent) recent)
${curl}/bin/curl -sS -XGET "${playlistAPI}/recent" | tac | head ${curl}/bin/curl -sS -XGET "${playlistAPI}/recent" | tac | head
;; ;;
*) *)
${curl}/bin/curl -sS -XGET "${playlistAPI}/current" \ ${curl}/bin/curl -sS -XGET "${playlistAPI}/current" \
| ${miller}/bin/mlr --ijson --oxtab cat \ | ${miller}/bin/mlr --ijson --oxtab cat \
| ${gnused}/bin/sed -n '/artist\|title\|youtube/p' | ${gnused}/bin/sed -n '/artist\|title\|youtube/p'
;; ;;
esac esac
wait wait
'' ''

View File

@@ -1,107 +1,108 @@
{ {
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
sanskrit sanskrit
levantine levantine
hebrew' hebrew'
kurdish="https://www.youtube.com/channel/UCvutKJerMREoQtzXiQaDNBQ kurdish="https://www.youtube.com/channel/UCvutKJerMREoQtzXiQaDNBQ
https://www.youtube.com/channel/UCdqSEXLhnsltwN4IESMInDA" https://www.youtube.com/channel/UCdqSEXLhnsltwN4IESMInDA"
persian="https://www.youtube.com/playlist?list=PL4aDVDOklYH5MnXNjCeRalFuRZ46I_p8Q persian="https://www.youtube.com/playlist?list=PL4aDVDOklYH5MnXNjCeRalFuRZ46I_p8Q
https://www.youtube.com/playlist?list=PL4aDVDOklYH404fg2zZoUQR6YcQp4UUrW https://www.youtube.com/playlist?list=PL4aDVDOklYH404fg2zZoUQR6YcQp4UUrW
https://www.youtube.com/playlist?list=PL4aDVDOklYH4FhJZ4cX14HuUVsDJKUifr https://www.youtube.com/playlist?list=PL4aDVDOklYH4FhJZ4cX14HuUVsDJKUifr
https://www.youtube.com/playlist?list=PL4aDVDOklYH6i_Od0zD4ZFNqmZVBOTo4z https://www.youtube.com/playlist?list=PL4aDVDOklYH6i_Od0zD4ZFNqmZVBOTo4z
https://www.youtube.com/playlist?list=PL4aDVDOklYH5NuhQvc52KCPO0X64FU_bd https://www.youtube.com/playlist?list=PL4aDVDOklYH5NuhQvc52KCPO0X64FU_bd
https://www.youtube.com/playlist?list=PL4aDVDOklYH6MFQfuQ5VIJmwuKfR1kgUR https://www.youtube.com/playlist?list=PL4aDVDOklYH6MFQfuQ5VIJmwuKfR1kgUR
https://www.youtube.com/playlist?list=PL4aDVDOklYH48_uuVl-AAPbkemzZFvnHH https://www.youtube.com/playlist?list=PL4aDVDOklYH48_uuVl-AAPbkemzZFvnHH
https://www.youtube.com/playlist?list=PL4aDVDOklYH61WM-WmzjZyTFAE7AILb7j https://www.youtube.com/playlist?list=PL4aDVDOklYH61WM-WmzjZyTFAE7AILb7j
https://www.youtube.com/channel/UCGY0LHNDQjt3GQrrc3r3Atw https://www.youtube.com/channel/UCGY0LHNDQjt3GQrrc3r3Atw
https://www.youtube.com/channel/UC4jgHye1-kjDlY-2StrtVtA https://www.youtube.com/channel/UC4jgHye1-kjDlY-2StrtVtA
https://www.youtube.com/channel/UCf67DKdLhpFW-7c7FZre2Ww https://www.youtube.com/channel/UCf67DKdLhpFW-7c7FZre2Ww
https://www.youtube.com/channel/UCLOGyLCPJL99gNriGAhwl7g https://www.youtube.com/channel/UCLOGyLCPJL99gNriGAhwl7g
https://www.youtube.com/channel/UCxV5ZfGJjJhrzy_9am-S4QQ https://www.youtube.com/channel/UCxV5ZfGJjJhrzy_9am-S4QQ
https://www.youtube.com/channel/UCBSF89JJieetWjJTGZhGKJA https://www.youtube.com/channel/UCBSF89JJieetWjJTGZhGKJA
https://www.youtube.com/channel/UCFGB29XZkEGS1Vw7WplBqIg https://www.youtube.com/channel/UCFGB29XZkEGS1Vw7WplBqIg
https://www.youtube.com/channel/UChiyq4qjnAWMNhwPu2KL4yg https://www.youtube.com/channel/UChiyq4qjnAWMNhwPu2KL4yg
https://www.youtube.com/channel/UCULxPJn3NjsaXt4Nc-sIZrw https://www.youtube.com/channel/UCULxPJn3NjsaXt4Nc-sIZrw
https://www.youtube.com/channel/UCYRyoX3ru_BfMiXVCGgRS6w https://www.youtube.com/channel/UCYRyoX3ru_BfMiXVCGgRS6w
https://www.youtube.com/channel/UCbCvjr0v_-8LmZh9431N84w" https://www.youtube.com/channel/UCbCvjr0v_-8LmZh9431N84w"
hebrew="https://www.youtube.com/playlist?list=PLXU4ackZsIPp2G8XjfpsYso2p3IHyl-bJ hebrew="https://www.youtube.com/playlist?list=PLXU4ackZsIPp2G8XjfpsYso2p3IHyl-bJ
https://www.youtube.com/playlist?list=PLXU4ackZsIPqLOWeWZc1frv3VCAohi90p https://www.youtube.com/playlist?list=PLXU4ackZsIPqLOWeWZc1frv3VCAohi90p
https://www.youtube.com/playlist?list=PLXU4ackZsIPpWWdWvtM3UtZHFKFhmI2mj https://www.youtube.com/playlist?list=PLXU4ackZsIPpWWdWvtM3UtZHFKFhmI2mj
https://www.youtube.com/playlist?list=PLXU4ackZsIPoz05eaLCHsCv4Wrk4n1g34 https://www.youtube.com/playlist?list=PLXU4ackZsIPoz05eaLCHsCv4Wrk4n1g34
https://www.youtube.com/channel/UCrMYJpbMhhQZhXi4ui3FKEw https://www.youtube.com/channel/UCrMYJpbMhhQZhXi4ui3FKEw
https://www.youtube.com/playlist?list=PLXU4ackZsIPombqx98SIPanShjSUSlBW- https://www.youtube.com/playlist?list=PLXU4ackZsIPombqx98SIPanShjSUSlBW-
https://www.youtube.com/playlist?list=PLXU4ackZsIPrdSFUjNdw3eGK-qbtgqt-6 https://www.youtube.com/playlist?list=PLXU4ackZsIPrdSFUjNdw3eGK-qbtgqt-6
https://www.youtube.com/playlist?list=PLXU4ackZsIPrVHjB4P9QrYzJvBKD3MLuA https://www.youtube.com/playlist?list=PLXU4ackZsIPrVHjB4P9QrYzJvBKD3MLuA
https://www.youtube.com/playlist?list=PLXU4ackZsIPp_7fb7TMyOaaX_ORI6vH29 https://www.youtube.com/playlist?list=PLXU4ackZsIPp_7fb7TMyOaaX_ORI6vH29
https://www.youtube.com/channel/UCkKmeTinUEU27syZPKrzWQQ https://www.youtube.com/channel/UCkKmeTinUEU27syZPKrzWQQ
https://www.youtube.com/channel/UC2gy2POCchS7JM_UCsZx5dw https://www.youtube.com/channel/UC2gy2POCchS7JM_UCsZx5dw
https://www.youtube.com/channel/UCb2bkA-kSUz4Mj5YJv0zpJQ" https://www.youtube.com/channel/UCb2bkA-kSUz4Mj5YJv0zpJQ"
arabic="https://www.youtube.com/channel/UCbqqV0gO5QbV9iGITdxp-cw arabic="https://www.youtube.com/channel/UCbqqV0gO5QbV9iGITdxp-cw
https://www.youtube.com/channel/UCxNwNoGEhHg7lGOhthG4r6A https://www.youtube.com/channel/UCxNwNoGEhHg7lGOhthG4r6A
https://www.youtube.com/channel/UCmYYUdR85LRVB5yT1Y7DjFA https://www.youtube.com/channel/UCmYYUdR85LRVB5yT1Y7DjFA
https://www.youtube.com/channel/UCIgFDroRoDYnxBlOGmwJ78A https://www.youtube.com/channel/UCIgFDroRoDYnxBlOGmwJ78A
https://www.youtube.com/channel/UCn5ASYdp7CzbFH2qtqjIJ9w https://www.youtube.com/channel/UCn5ASYdp7CzbFH2qtqjIJ9w
https://www.youtube.com/channel/UCD8N8HjsCkCmykfPnVleVRg https://www.youtube.com/channel/UCD8N8HjsCkCmykfPnVleVRg
https://www.youtube.com/channel/UCEmWUZanVYXEzZXYDHzD-iA https://www.youtube.com/channel/UCEmWUZanVYXEzZXYDHzD-iA
https://www.youtube.com/channel/UC9rnrMdYzfqdjiuNXV7q8oQ https://www.youtube.com/channel/UC9rnrMdYzfqdjiuNXV7q8oQ
https://live-hls-audio-web-aja.getaj.net/VOICE-AJA/01.m3u8 https://live-hls-audio-web-aja.getaj.net/VOICE-AJA/01.m3u8
http://asima.out.airtime.pro:8000/asima_a http://asima.out.airtime.pro:8000/asima_a
http://edge.mixlr.com/channel/qtgru http://edge.mixlr.com/channel/qtgru
http://ninarfm.grtvstream.com:8896/stream http://ninarfm.grtvstream.com:8896/stream
http://andromeda.shoutca.st:8189/stream http://andromeda.shoutca.st:8189/stream
http://www.dreamsiteradiocp4.com:8014/stream http://www.dreamsiteradiocp4.com:8014/stream
http://n02.radiojar.com/sxfbks1vfy8uv.mp3 http://n02.radiojar.com/sxfbks1vfy8uv.mp3
http://stream-025.zeno.fm/5y95pu36sm0uv http://stream-025.zeno.fm/5y95pu36sm0uv
${arabicStories}" ${arabicStories}"
levantine_general="https://www.youtube.com/channel/UCe6YxTdT2zsbhG8ThAEssLw levantine_general="https://www.youtube.com/channel/UCe6YxTdT2zsbhG8ThAEssLw
https://www.youtube.com/channel/UC8IsrQ3Fvg1X2QboSRIMBHA https://www.youtube.com/channel/UC8IsrQ3Fvg1X2QboSRIMBHA
https://www.youtube.com/channel/UCo65IZihlwP204bleDDuAyA https://www.youtube.com/channel/UCo65IZihlwP204bleDDuAyA
https://www.youtube.com/channel/UCDXBymJu72YX2LzKVlZyZaA https://www.youtube.com/channel/UCDXBymJu72YX2LzKVlZyZaA
https://www.youtube.com/channel/UCpovzufzZSP3kCYm16B5Hyw https://www.youtube.com/channel/UCpovzufzZSP3kCYm16B5Hyw
https://www.youtube.com/channel/UCKkKlH7eJFBWhofiP5kQEFQ https://www.youtube.com/channel/UCKkKlH7eJFBWhofiP5kQEFQ
https://www.youtube.com/channel/UC-YYp3mws0sa9vI3VUCWqhw https://www.youtube.com/channel/UC-YYp3mws0sa9vI3VUCWqhw
https://www.youtube.com/channel/UCpa9WD4btPSyn0h-DZSATGw https://www.youtube.com/channel/UCpa9WD4btPSyn0h-DZSATGw
https://www.youtube.com/channel/UCb7oMrqwZnr3ZCayqnkkb8w https://www.youtube.com/channel/UCb7oMrqwZnr3ZCayqnkkb8w
https://www.youtube.com/channel/UCuLNZirpkm2HYxq-tTiXnOA https://www.youtube.com/channel/UCuLNZirpkm2HYxq-tTiXnOA
https://www.youtube.com/channel/UCSGBoIBGUxUmpTYJfYZXs-A https://www.youtube.com/channel/UCSGBoIBGUxUmpTYJfYZXs-A
https://www.youtube.com/channel/UCPINCItSdAc7SBXxi6AcWpw https://www.youtube.com/channel/UCPINCItSdAc7SBXxi6AcWpw
https://www.youtube.com/channel/UCbZvzUBn04a_a95HFMX6eTA https://www.youtube.com/channel/UCbZvzUBn04a_a95HFMX6eTA
https://www.youtube.com/channel/UChJs6Kqju9BmN5FMHhBfRSA https://www.youtube.com/channel/UChJs6Kqju9BmN5FMHhBfRSA
https://www.youtube.com/channel/UCyC7OV3gEQkguVwl9qDGuTQ https://www.youtube.com/channel/UCyC7OV3gEQkguVwl9qDGuTQ
https://www.youtube.com/channel/UCwv1qu4iX6Bm6X-uSSB2eBQ https://www.youtube.com/channel/UCwv1qu4iX6Bm6X-uSSB2eBQ
${levantineTextbook}" ${levantineTextbook}"
sanskrit="https://www.youtube.com/channel/UCTnCQNG_1WIlunxbp1SAOvw sanskrit="https://www.youtube.com/channel/UCTnCQNG_1WIlunxbp1SAOvw
https://stream-23.zeno.fm/m08mkwsyw8quv https://stream-23.zeno.fm/m08mkwsyw8quv
https://www.youtube.com/channel/UCqFg6QnwgtVHo1iFgpxrx-A" https://www.youtube.com/channel/UCqFg6QnwgtVHo1iFgpxrx-A"
language="$(echo "$languages" | shuf -n1)" language="$(echo "$languages" | shuf -n1)"
case "$language" in case "$language" in
arabic) arabic)
${mpv}/bin/mpv --shuffle $arabic;; ${mpv}/bin/mpv --shuffle $arabic;;
persian) persian)
${mpv}/bin/mpv --shuffle $persian;; ${mpv}/bin/mpv --shuffle $persian;;
coptic) coptic)
;; ;;
sanskrit) sanskrit)
${mpv}/bin/mpv --shuffle $sanskrit;; ${mpv}/bin/mpv --shuffle $sanskrit;;
levantine) levantine)
${mpv}/bin/mpv --shuffle $levantine;; ${mpv}/bin/mpv --shuffle $levantine;;
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