1
0
mirror of https://github.com/kmein/niveum synced 2026-03-20 20:01:08 +01:00

2 Commits

Author SHA1 Message Date
d751ecdab7 feat: add grimm dwb scroller 2022-09-08 08:47:11 +02:00
2280b21a75 feat: automate entering ssh passphrase 2022-09-08 08:46:53 +02:00
319 changed files with 5978 additions and 10293 deletions

View File

@@ -1,19 +0,0 @@
#!/bin/sh
directory="$(mktemp -d)"
trap clean EXIT
clean() {
rm -rf "$directory"
}
year=$(date +%Y)
output=/tmp/$year.pdf
for month in $(seq 1 12); do
printf "\r%d" "$month" 1>&2
astrolog -zN Berlin -qm "$month" "$year" -X -K -XA -Xr -Xm -Xb -Xo "$(printf "%s/%02d.bmp" "$directory" "$month")" -Xw 1080 720 2>/dev/null
done
printf "\r"
convert "$directory/*.bmp" "$output"
echo "$output"

View File

@@ -1,43 +0,0 @@
#!/bin/bash
name=$RANDOM
url='http://localhost:9093/api/v1/alerts'
echo "firing up alert $name"
# change url o
curl -XPOST $url -d "[{
\"status\": \"firing\",
\"labels\": {
\"alertname\": \"$name\",
\"service\": \"my-service\",
\"severity\":\"warning\",
\"instance\": \"$name.example.net\"
},
\"annotations\": {
\"summary\": \"High latency is high!\"
},
\"generatorURL\": \"http://prometheus.int.example.net/<generating_expression>\"
}]"
echo ""
echo "press enter to resolve alert"
read
echo "sending resolve"
curl -XPOST $url -d "[{
\"status\": \"resolved\",
\"labels\": {
\"alertname\": \"$name\",
\"service\": \"my-service\",
\"severity\":\"warning\",
\"instance\": \"$name.example.net\"
},
\"annotations\": {
\"summary\": \"High latency is high!\"
},
\"generatorURL\": \"http://prometheus.int.example.net/<generating_expression>\"
}]"
echo ""

View File

@@ -1,5 +0,0 @@
#!/usr/bin/env -S jq -r -f
(map(keys) | add | unique) as $cols
| map(. as $row | $cols | map($row[.])) as $rows
| $cols, $rows[]
| @csv

View File

@@ -1,65 +0,0 @@
#!/bin/sh
lidl() {
echo LIDL
curl -sSL 'https://endpoints.lidl-flyer.com/v3/region-overview/lidl/de-DE/0.json' \
| jq -r '
.categories
| map(select(.name == "Filial-Angebote") | .subcategories | map(.flyers))
| flatten
| flatten
| .[]
| .pdfUrl
'
}
aldi_nord() {
echo ALDI nord
echo 'https://magazine.aldi-nord.de/aldi-nord/aldi-aktuell/GetPDF.ashx'
echo 'https://magazine.aldi-nord.de/aldi-nord/aldi-vorschau/GetPDF.ashx'
}
rewe_berlin() {(
store_id=662366923
publisher_id=1062
echo REWE
curl -sSL 'https://www.bonialserviceswidget.de/de/stores/'$store_id'/brochures?storeId='$store_id'&publisherId='$publisher_id | while read -r brochure_id; do
curl -sSL 'https://www.bonialserviceswidget.de/de/v5/brochureDetails/'"$brochure_id"'?publisherId='$publisher_id | jq -r .pdfUrl
done
)}
kaufland() {(
region_code=8920
echo KAUFLAND
curl -sSL https://filiale.kaufland.de/prospekte.html | htmlq --attribute href '.flyer a' | grep -Eo 'DE_de_KDZ[^/]*' | sed "s/_3000_/_${region_code}_/" | while read -r flyer_id; do
curl -sSL "https://endpoints.leaflets.kaufland.com/v3/$flyer_id/flyer.json?regionCode=$region_code" | jq -r .flyer.pdfUrl
done
)}
netto_schwarz() {
echo 'NETTO (schwarz)'
curl -sSL 'https://squid-api.tjek.com/v2/catalogs?dealer_ids=90f2VL&order_by=created' \
| jq -r '.[] | .id' \
| while read -r flyer_id; do
curl -sSL "https://squid-api.tjek.com/v2/catalogs/$flyer_id/download" \
| jq -r .pdf_url
done
}
dir="$(mktemp -d)"
trap clean EXIT
clean() {
rm -rf "$dir"
}
prospekt_url="$( (
lidl
aldi_nord
rewe_berlin
kaufland
netto_schwarz
) | fzf)"
curl -sSL "$prospekt_url" -o "$dir/prospekt.pdf"
zathura "$dir/prospekt.pdf"

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env nix-shell
#! nix-shell -i sh -p coreutils byzanz xorg.xwininfo gnused
# shellcheck shell=sh
# ref https://gist.github.com/aforemny/0994cb7f06ea30d56c8b9681ff5d2054
set -eux
eval "$(xwininfo | \
sed -n -e 's/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p' \
-e 's/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p' \
-e 's/^ \+Width: \+\([0-9]\+\).*/w=\1/p' \
-e 's/^ \+Height: \+\([0-9]\+\).*/h=\1/p')"
trap "pkill -f 'sleep 360d'" INT
byzanz-record -e "sleep 360d" -c -x $x -y $y -w $w -h $h "$@"

View File

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

View File

@@ -1,18 +0,0 @@
#/usr/bin/env -S deno run -A:q
set -x
session_cache="$HOME/.cache/tt-rss.session"
ttrss_endpoint=https://feed.kmein.de/api/
ttrss_user=k
ttrss_password=$(pass shared/tt-rss/password)
login() {
if [ -f "$session_cache" ]; then
session_id="$(cat "$session_cache")"
else
session_id="$(curl -d '{"op":"login","user":"'"$ttrss_user"'","password":"'"$ttrss_password"'"}' "$ttrss_endpoint" | jq -r .content.session_id)"
echo "$session_id" > "$session_cache"
fi
}
login
curl -d '{"sid":"'"$session_id"'","op":"getUnread"}' "$ttrss_endpoint" | jq .content

View File

@@ -1,16 +0,0 @@
#!/bin/sh
set -efux
expected_max_results=1024 # the upper bound on the number of restaurants
radius=250
echo '[out:json];node(id:260050809)->.cbase;
(
node(around.cbase:'$radius')[amenity=fast_food];
node(around.cbase:'$radius')[amenity=restaurant];
);out;' \
| curl -sSL -d @- -X POST http://overpass-api.de/api/interpreter \
| jq --argjson random "$(shuf -i 0-$expected_max_results -n 1)" '
.elements
| length as $length
| .[$random % $length]
'

View File

@@ -1,8 +0,0 @@
import sys
import unicodedata
for index, character in enumerate(sys.stdin.read().strip()):
try:
print(index, character, hex(ord(character)), unicodedata.category(character), unicodedata.name(character))
except:
print(index, character, hex(ord(character)))

View File

@@ -7,31 +7,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
system: [makanek,manakish,kabsa,zaatar,ful,fatteh] system: [makanek,manakish,kabsa,zaatar,ful]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Install QEMU (ARM) - uses: cachix/install-nix-action@v16
run: sudo apt-get install -y qemu-user-static - run: nix run .#build-${{matrix.system}}
if: ${{ matrix.system == 'ful' }}
- name: Install Nix (ARM)
uses: cachix/install-nix-action@v16
if: ${{ matrix.system == 'ful' }}
with:
extra_nix_config: |
system = aarch64-linux
- name: Install Nix (x86_64)
uses: cachix/install-nix-action@v16
if: ${{ matrix.system != 'ful' }}
- name: nixos-rebuild dry-build
run: |
# remove secrets: ref https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule/36593218
git submodule deinit -f secrets
rm -rf .git/modules/secrets
git rm -f secrets
# recreate secrets
mkdir secrets
cat secrets.txt | while read -r path; do touch $path; done
git add secrets
nix run nixpkgs#nixos-rebuild -- dry-build --flake $GITHUB_WORKSPACE#${{matrix.system}}

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "secrets"]
path = secrets
url = ssh://gitea@code.kmein.de:22022/kfm/niveum-secrets.git

View File

@@ -7,6 +7,4 @@
> 2. Transf., _snow-white, snowy_ (mostly poet.): a similitudine sic: Corpore niveum candorem, aspectu igneum ardorem assequebatur, Auct. Her. 4, 33, 44: lacerti, Verg. A. 8, 387: lac, id. E. 2, 20: hanc si capite niveae agnae exorari judicas, Sen. Q. N. 2, 36: Briseis niveo colore, Hor. C. 2, 4, 3: vestis, Ov. M. 10, 432: candidior nivei folio, Galatea, ligustri, id. ib. 13, 789: dens, id. H. 18, 18: quā notam duxit niveus videri, Hor. C. 4, 2, 59: panis, Juv. 5, 70: flumen, _clear, pellucid_, Sen. Hippol. 504: undae, Mart. 7, 32, 11: tribuni, _clothed in white togas_, Calp. Ecl. 7, 29; so, Quirites, Juv. 10, 45. > 2. Transf., _snow-white, snowy_ (mostly poet.): a similitudine sic: Corpore niveum candorem, aspectu igneum ardorem assequebatur, Auct. Her. 4, 33, 44: lacerti, Verg. A. 8, 387: lac, id. E. 2, 20: hanc si capite niveae agnae exorari judicas, Sen. Q. N. 2, 36: Briseis niveo colore, Hor. C. 2, 4, 3: vestis, Ov. M. 10, 432: candidior nivei folio, Galatea, ligustri, id. ib. 13, 789: dens, id. H. 18, 18: quā notam duxit niveus videri, Hor. C. 4, 2, 59: panis, Juv. 5, 70: flumen, _clear, pellucid_, Sen. Hippol. 504: undae, Mart. 7, 32, 11: tribuni, _clothed in white togas_, Calp. Ecl. 7, 29; so, Quirites, Juv. 10, 45.
## Pressestimmen ## Pressestimmen
> das ist ja pure poesie —[riotbib](https://github.com/riotbib/) > das ist ja pure poesie —[xkey](https://github.com/riotbib)
> Deine Configs sind wunderschön <3 —[flxai](https://github.com/flxai/)

94
ci.nix Normal file
View File

@@ -0,0 +1,94 @@
{
inputs,
system,
name,
}: let
nixpkgs = inputs.nixos-stable;
pkgs = nixpkgs.legacyPackages.${system};
ensureFiles = paths:
pkgs.runCommand "directory" {} ''
set -efu
mkdir $out
cd $out
${
nixpkgs.lib.concatMapStringsSep "\n" (path: ''
mkdir -p "$(dirname ${nixpkgs.lib.escapeShellArg path})"
echo foo > ${nixpkgs.lib.escapeShellArg path}
'')
paths
}
'';
nixPath = nixpkgs.lib.concatStringsSep ":" ([
"niveum=${toString ./.}"
"nixos-config=${toString ./.}/systems/${name}/configuration.nix"
"system-secrets=${systemSecrets}"
"secrets=${sharedSecrets}"
"nixpkgs=${
toString (
if name == "kabsa" || name == "manakish"
then inputs.nixos-unstable
else inputs.nixos-stable
)
}"
]
++ nixpkgs.lib.mapAttrsToList (name: value: "${name}=${value}") inputs);
# cd ~/.password-store/shared && find * -type f | sed 's/.gpg$//'
sharedSecrets = ensureFiles [
"di.fm/key"
"eduroam/identity"
"eduroam/password"
"github/notification.token"
"hass/token"
"mail/cock"
"mail/fastmail"
"mail/gmail/amroplay"
"mail/gmail/kieran.meinhardt"
"mail/meinhaki"
"mail/dslalewa"
"mail/posteo"
"nextcloud-fysi/password"
"nextcloud/password"
"openweathermap.key"
"restic/password"
"traadfri.key"
"wifi/Aether.psk"
"spotify/username"
"spotify/password"
];
systemSecrets = let
basic = ["retiolum.ed25519" "retiolum.key" "syncthing/cert.pem" "syncthing/key.pem"];
in
{
zaatar = ensureFiles (["moodle.token" "telegram/moodle-dl.token" "mpd-web.key"] ++ basic);
kabsa = ensureFiles basic;
manakish = ensureFiles basic;
tahina = ensureFiles basic;
ful = ensureFiles (["root.password"] ++ basic);
makanek = ensureFiles ([
"irc/retiolum"
"irc/hackint"
"irc/libera"
"irc/oftc"
"matrix/nibbana"
"maxmind/license.key"
"moodle-dl/faye.token"
"nextcloud/admin"
"nextcloud/database"
"telegram/nachtischsatan.token"
"telegram/reverse.token"
"telegram/odyssey.token"
"telegram/betacode.token"
"telegram/moodle-dl.token"
"telegram/proverb.token"
"telegram/menstruation.token"
"telegram/cool_village.token"
"telegram/kmein.token"
"telegram/krebs.token"
"telegram/prometheus.token"
"weechat/relay"
]
++ basic);
}
.${name};
in
toString (pkgs.writers.writeDash "build" "NIX_PATH=${nixPath} nix-build '<nixpkgs/nixos>' -A system --dry-run")

View File

@@ -1,102 +0,0 @@
{
pkgs,
niveumPackages,
lib,
...
}: let
darwin = lib.strings.hasSuffix "-darwin" pkgs.system;
in {
environment.systemPackages =
[
pkgs.htop
pkgs.w3m
pkgs.wget
# ARCHIVE TOOLS
pkgs.unzip
pkgs.unrar
pkgs.p7zip
pkgs.zip
# MONITORS
pkgs.iftop # interface bandwidth monitor
pkgs.lsof # list open files
# SHELL
pkgs.sqlite
pkgs.fd # better find
pkgs.tree
pkgs.parallel # for parallel, since moreutils shadows task spooler
pkgs.ripgrep # better grep
pkgs.rlwrap
pkgs.progress # display progress bars for pipes
pkgs.file # determine file type
pkgs.gdu # ncurses disk usage (ncdu is broken)
pkgs.rmlint # remove duplicate files
pkgs.jq # json toolkit
pkgs.jless # less(1) for json
pkgs.fq # toolkit for yaml, xml and binaries
pkgs.bc # calculator
pkgs.pari # gp -- better calculator
pkgs.ts
niveumPackages.vimv
niveumPackages.vg
niveumPackages.fkill
niveumPackages.cyberlocker-tools
niveumPackages.untilport
niveumPackages.kpaste
# HARDWARE
pkgs.pciutils # for lspci
]
++ lib.optionals (!darwin) [
pkgs.usbutils # for lsusb
pkgs.lshw # for lshw
pkgs.iotop # I/O load monitor
pkgs.psmisc # for killall, pstree
];
environment.shellAliases = let
take = pkgs.writers.writeDash "take" ''
mkdir "$1" && cd "$1"
'';
cdt = pkgs.writers.writeDash "cdt" ''
cd "$(mktemp -d)"
pwd
'';
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
'';
in
{
nixi = "nix repl '<nixpkgs>'";
take = "source ${take}";
wcd = "source ${wcd}";
where = "source ${where}";
# temporary files and directories
cdt = "source ${cdt}";
vit = "$EDITOR $(mktemp)";
# file safety
mv = "${pkgs.coreutils}/bin/mv --interactive";
rm = "${pkgs.coreutils}/bin/rm --interactive";
cp = "${pkgs.coreutils}/bin/cp --interactive";
# colours
cat = "${pkgs.bat}/bin/bat --theme=ansi --style=plain";
l = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso --almost-all";
ls = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso";
ll = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso -l";
la = "${pkgs.coreutils}/bin/ls --color=auto --time-style=long-iso --almost-all -l";
}
// (
if darwin
then {}
else {
"ß" = "${pkgs.util-linux}/bin/setsid";
ip = "${pkgs.iproute2}/bin/ip -c";
# systemd
s = "${pkgs.systemd}/bin/systemctl";
us = "${pkgs.systemd}/bin/systemctl --user";
j = "${pkgs.systemd}/bin/journalctl";
uj = "${pkgs.systemd}/bin/journalctl --user";
}
);
}

View File

@@ -1,303 +0,0 @@
{
pkgs,
config,
lib,
niveumPackages,
...
}: let
inherit (import ../lib/email.nix) defaults thunderbirdProfile;
in {
age.secrets = {
email-password-cock = {
file = ../secrets/email-password-cock.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
email-password-posteo = {
file = ../secrets/email-password-posteo.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
home-manager.users.me = {
accounts.email.maildirBasePath = "${config.users.users.me.home}/state/Maildir";
services.mbsync = {
enable = true;
frequency = "daily";
preExec = "${pkgs.coreutils}/bin/mkdir -p ${config.home-manager.users.me.accounts.email.maildirBasePath}";
postExec = "${pkgs.notmuch}/bin/notmuch new";
};
programs.notmuch = {
enable = true;
extraConfig = {
database.path = config.home-manager.users.me.accounts.email.maildirBasePath;
new.tags = "";
user.name = defaults.realName;
user.primary_email = config.home-manager.users.me.accounts.email.accounts.posteo.address;
};
};
programs.mbsync = {
enable = true;
extraConfig = lib.concatStringsSep "\n\n" (lib.mapAttrsToList (name: account: ''
IMAPAccount ${name}
CertificateFile /etc/ssl/certs/ca-certificates.crt
Host ${account.imap.host}
PassCmd "${toString account.passwordCommand}"
User ${account.userName}
SSLType IMAPS
${lib.optionalString (lib.isInt account.imap.port) "Port ${toString account.imap.port}"}
IMAPStore ${name}-remote
Account ${name}
MaildirStore ${name}-local
Path ${config.home-manager.users.me.accounts.email.maildirBasePath}/${name}/
SubFolders Verbatim
Channel ${name}
Create Near
Expunge None
Far :${name}-remote:
Near :${name}-local:
Patterns *
Remove None
SyncState *
'')
config.home-manager.users.me.accounts.email.accounts);
};
accounts.email.accounts = {
cock =
lib.recursiveUpdate defaults
rec {
address = "2210@cock.li";
userName = address;
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-cock.path}";
realName = "";
imap.host = "mail.cock.li";
smtp.host = imap.host;
};
posteo =
lib.recursiveUpdate defaults
rec {
address = "kieran.meinhardt@posteo.net";
aliases = ["kmein@posteo.de"];
userName = address;
imap.host = "posteo.de";
imap.port = 993;
imap.tls.enable = true;
smtp.host = imap.host;
smtp.port = 465;
smtp.tls.enable = true;
primary = true;
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-posteo.path}";
himalaya = {
enable = true;
backend = "imap";
sender = "smtp";
};
aerc.extraAccounts.pgp-key-id = "9EDE82CC72A343A95266D0F444857074A3ACC8B7";
};
};
programs.himalaya.enable = true;
programs.thunderbird = {
enable = true;
settings = {
};
profiles.${thunderbirdProfile} = {
isDefault = true;
settings = {
"mail.default_send_format" = 1;
"msgcompose.default_colors" = false;
"msgcompose.text_color" = config.lib.stylix.colors.withHashtag.base00;
"msgcompose.background_color" = config.lib.stylix.colors.withHashtag.base05;
};
userChrome = ''
'';
userContent = ''
'';
withExternalGnupg = false;
};
};
programs.aerc = {
enable = true;
extraBinds = {
# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
global = {
"<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab <Enter>";
"<C-t>" = ":term<Enter>";
"?" = ":help keys<Enter>";
};
messages = {
q = ":quit<Enter>";
j = ":next <Enter>";
"<Down>" = ":next<Enter>";
"<C-d>" = ":next 50%<Enter>";
"<C-f>" = ":next 100%<Enter>";
"<PgDn>" = ":next 100%<Enter>";
k = ":prev <Enter>";
"<Up>" = ":prev<Enter>";
"<C-u>" = ":prev 50%<Enter>";
"<C-b>" = ":prev 100%<Enter>";
"<PgUp>" = ":prev 100%<Enter>";
g = ":select 0 <Enter>";
G = ":select -1<Enter>";
J = ":next-folder <Enter>";
K = ":prev-folder<Enter>";
H = ":collapse-folder<Enter>";
L = ":expand-folder<Enter>";
"<space>" = ":read -t<Enter>:next<Enter>";
v = ":mark -t<Enter>";
V = ":mark -v<Enter>";
F = ":flag -t<Enter>";
T = ":toggle-threads<Enter>";
"<Enter>" = ":view<Enter>";
d = ":prompt 'Delete? ' 'delete-message'<Enter>";
D = ":move Trash<Enter>";
A = ":archive flat<Enter>";
C = ":compose<Enter>";
rr = ":reply -a<Enter>";
rq = ":reply -aq<Enter>";
Rr = ":reply<Enter>";
Rq = ":reply -q<Enter>";
c = ":cf<space>";
"$" = ":term<space>";
"!" = ":term<space>";
"|" = ":pipe<space>";
"/" = ":search<space>";
"\\" = ":filter <space>";
n = ":next-result<Enter>";
N = ":prev-result<Enter>";
"<Esc>" = ":clear<Enter>";
"*" = ":filter -x Flagged<Enter>";
};
view = {
tr = ":pipe ${niveumPackages.trans}/bin/trans -show-original n -b -no-autocorrect<Enter>"; # https://man.sr.ht/~rjarry/aerc/integrations/translator.md
"/" = ":toggle-key-passthrough <Enter> /";
q = ":close<Enter>";
O = ":open<Enter>";
S = ":save<space>";
"|" = ":pipe<space>";
D = ":move Trash<Enter>";
A = ":archive flat<Enter>";
"<C-l>" = ":open-link <space>";
f = ":forward <Enter>";
rr = ":reply -a<Enter>";
rq = ":reply -aq<Enter>";
Rr = ":reply<Enter>";
Rq = ":reply -q<Enter>";
H = ":toggle-headers<Enter>";
"<C-k>" = ":prev-part<Enter>";
"<C-j>" = ":next-part<Enter>";
J = ":next <Enter>";
K = ":prev<Enter>";
};
"view::passthrough" = {
"$noinherit" = "true";
"$ex" = "<C-x>";
"<Esc>" = ":toggle-key-passthrough<Enter>";
};
compose = {
# Keybindings used when the embedded terminal is not selected in the compose
# view
"$noinherit" = "true";
"$ex" = "<C-x>";
"<C-k>" = ":prev-field<Enter>";
"<C-j>" = ":next-field<Enter>";
"<tab>" = ":next-field<Enter>";
"<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>";
};
"compose::editor" = {
# Keybindings used when the embedded terminal is selected in the compose view
"$noinherit" = "true";
"$ex" = "<C-x>";
"<C-k>" = ":prev-field<Enter>";
"<C-j>" = ":next-field<Enter>";
"<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>";
};
"compose::review" = {
# Keybindings used when reviewing a message to be sent
y = ":send <Enter>";
n = ":abort<Enter>";
p = ":postpone<Enter>";
q = ":choose -o d discard abort -o p postpone postpone<Enter>";
e = ":edit<Enter>";
a = ":attach<space>";
d = ":detach<space>";
};
terminal = {
"$noinherit" = "true";
"$ex" = "<C-x>";
"<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>";
};
};
extraConfig = {
ui.sort = "-r date";
ui.timestamp-format = "2006-01-02 15:04";
ui.mouse-enabled = true;
ui.spinner = ". , .";
general.unsafe-accounts-conf = true;
general.pgp-provider = "gpg";
viewer = {pager = "${pkgs.less}/bin/less -R";};
compose = {
# address-book-cmd = "khard email --remove-first-line --parsable '%s'";
no-attachment-warning = "(attach|attached|attachments?|anbei|Anhang|angehängt|beigefügt)";
};
filters = {
"text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
"text/calendar" = "${pkgs.aerc}/libexec/aerc/filters/calendar";
"text/html" = "${pkgs.aerc}/libexec/aerc/filters/html"; # Requires w3m, dante
# "text/html" =
# "${pkgs.aerc}/share/aerc/filters/html | ${pkgs.aerc}/share/aerc/filters/colorize";
# "text/*" =
# ''${pkgs.bat}/bin/bat -fP --theme=ansi --file-name="$AERC_FILENAME "'';
"message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
"message/rfc822" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
"application/x-sh" = "${pkgs.bat}/bin/bat -fP -l sh";
};
openers = let
as-pdf = pkgs.writers.writeDash "as-pdf" ''
d=$(mktemp -d)
trap clean EXIT
clean() {
rm -rf "$d"
}
${pkgs.libreoffice}/bin/libreoffice --headless --convert-to pdf "$1" --outdir "$d"
${pkgs.zathura}/bin/zathura "$d"/*.pdf
'';
in {
"image/*" = "${pkgs.nsxiv}/bin/nsxiv";
"application/pdf" = "${pkgs.zathura}/bin/zathura";
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" = toString as-pdf;
"application/vnd.oasis.opendocument.text" = toString as-pdf;
"video/*" = "${pkgs.mpv}/bin/mpv";
"audio/*" = "${pkgs.mpv}/bin/mpv";
};
};
templates = {
# new_message = "hello!";
};
};
};
}

View File

@@ -6,11 +6,7 @@
}: let }: let
alacritty-cfg = theme: alacritty-cfg = theme:
(pkgs.formats.yaml {}).generate "alacritty.yml" { (pkgs.formats.yaml {}).generate "alacritty.yml" {
bell = { window.opacity = 0.95;
animation = "EaseOut";
duration = 100;
color = "#ffffff";
};
font = { font = {
normal.family = "Monospace"; normal.family = "Monospace";
size = 6; size = 6;
@@ -46,8 +42,7 @@
alacritty-pkg = pkgs.symlinkJoin { alacritty-pkg = pkgs.symlinkJoin {
name = "alacritty"; name = "alacritty";
paths = [ paths = [
(pkgs.writers.writeDashBin "alacritty" '' (pkgs.writeDashBin "alacritty" ''
${pkgs.alacritty}/bin/alacritty --config-file /var/theme/config/alacritty.yml msg create-window "$@" ||
${pkgs.alacritty}/bin/alacritty --config-file /var/theme/config/alacritty.yml "$@" ${pkgs.alacritty}/bin/alacritty --config-file /var/theme/config/alacritty.yml "$@"
'') '')
pkgs.alacritty pkgs.alacritty
@@ -56,28 +51,12 @@
in { in {
environment.variables.TERMINAL = "alacritty"; environment.variables.TERMINAL = "alacritty";
home-manager.users.me = { environment.systemPackages = [
programs.alacritty = { alacritty-pkg
enable = true; ];
settings = {
key_bindings = [ environment.etc = {
{ "themes/dark/alacritty.yml".source = alacritty-cfg (import <niveum/lib/colours/ayu-dark.nix>);
key = "Plus"; "themes/light/alacritty.yml".source = alacritty-cfg (import <niveum/lib/colours/ayu-light.nix>);
mods = "Control";
action = "IncreaseFontSize";
}
{
key = "Minus";
mods = "Control";
action = "DecreaseFontSize";
}
{
key = "Key0";
mods = "Control";
action = "ResetFontSize";
}
];
};
};
}; };
} }

View File

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

View File

@@ -3,7 +3,7 @@
config, config,
... ...
}: let }: let
inherit (import ../lib) restic; inherit (import <niveum/lib>) restic;
in { in {
services.restic.backups.niveum = { services.restic.backups.niveum = {
initialize = true; initialize = true;
@@ -12,17 +12,15 @@ in {
OnCalendar = "8:00"; OnCalendar = "8:00";
RandomizedDelaySec = "1h"; RandomizedDelaySec = "1h";
}; };
passwordFile = config.age.secrets.restic.path; passwordFile = toString <secrets/restic/password>;
extraBackupArgs = [ extraBackupArgs = [
"--exclude=/home/kfm/sync/src/nixpkgs/.git" "--exclude=/home/kfm/projects/nixpkgs/.git"
"--exclude=node_modules" "--exclude=node_modules"
"--exclude=.parcel-cache"
]; ];
paths = [ paths = [
"/home/kfm/sync" "/home/kfm/work"
"/home/kfm/state" "/home/kfm/projects"
"/home/kfm/cloud" "/home/kfm/cloud"
"/home/kfm/mobile"
"/home/kfm/.gnupg" "/home/kfm/.gnupg"
"/home/kfm/.ssh" "/home/kfm/.ssh"
]; ];
@@ -37,7 +35,7 @@ in {
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "restic-niveum" '' (pkgs.writers.writeDashBin "restic-niveum" ''
${pkgs.restic}/bin/restic -r ${restic.repository} -p ${config.age.secrets.restic.path} "$@" ${pkgs.restic}/bin/restic -r ${restic.repository} -p ${<secrets/restic/password>} "$@"
'') '')
(pkgs.writers.writeDashBin "restic-mount" '' (pkgs.writers.writeDashBin "restic-mount" ''
mountdir=$(mktemp -d) mountdir=$(mktemp -d)
@@ -45,7 +43,7 @@ in {
clean() { clean() {
rm -r "$mountdir" rm -r "$mountdir"
} }
${pkgs.restic}/bin/restic -r ${restic.repository} -p ${config.age.secrets.restic.path} mount "$mountdir" ${pkgs.restic}/bin/restic -r ${restic.repository} -p ${<secrets/restic/password>} mount "$mountdir"
'') '')
]; ];
} }

View File

@@ -1,7 +1,7 @@
{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="$(tput bold)\w \$([[ \$? == 0 ]] && echo \"\[\033[1;32m\]\" || echo \"\[\033[1;31m\]\")\$$(tput sgr0) "'';
interactiveShellInit = '' interactiveShellInit = ''
set -o vi set -o vi
''; '';

14
configs/beets.nix Normal file
View File

@@ -0,0 +1,14 @@
{
lib,
pkgs,
...
}: {
environment.systemPackages = [pkgs.beets];
home-manager.users.me.xdg.configFile = {
"beets/config.yaml".source = (pkgs.formats.yaml {}).generate "config.yaml" {
directory = "~/cloud/syncthing/music";
library = "~/cloud/syncthing/common/music.db";
plugins = toString ["fetchart" "lastgenre"];
};
};
}

View File

@@ -1,9 +1,12 @@
{pkgs, ...}: { {
pkgs,
lib,
...
}: {
hardware.bluetooth = { hardware.bluetooth = {
enable = true; enable = true;
settings.general = { settings.General.Enable =
enable = "Source,Sink,Media,Socket"; lib.concatStringsSep "," ["Source" "Sink" "Media" "Socket"];
};
}; };
services.blueman.enable = true; services.blueman.enable = true;

View File

@@ -1,92 +0,0 @@
{
pkgs,
config,
...
}: let
inherit (import ../lib) tmpfilesConfig;
in {
environment.systemPackages = [
(pkgs.writers.writeDashBin "cro" ''
${pkgs.chromium}/bin/chromium \
--disable-sync \
--no-default-browser-check \
--no-first-run \
--user-data-dir="$(mktemp -d)" \
--incognito \
"$@"
'')
];
home-manager.users.me = {
programs.firefox = {
enable = true;
profiles = let
defaultSettings = {
"beacon.enabled" = false;
"browser.bookmarks.showMobileBookmarks" = true;
"browser.newtab.preload" = false;
"browser.search.isUS" = false;
"browser.search.region" = "DE";
"browser.send_pings" = false;
"browser.shell.checkDefaultBrowser" = false;
"browser.startup.homepage" = "chrome://browser/content/blanktab.html";
"browser.uidensity" = 1;
"browser.urlbar.placeholderName" = "Search";
"datareporting.healthreport.service.enabled" = false;
"datareporting.healthreport.uploadEnabled" = false;
"datareporting.policy.dataSubmissionEnabled" = false;
"datareporting.sessions.current.clean" = true;
"distribution.searchplugins.defaultLocale" = "de-DE";
"general.smoothScroll" = true;
"identity.fxaccounts.account.device.name" = config.networking.hostName;
"network.cookie.cookieBehavior" = 1;
"privacy.donottrackheader.enabled" = true;
"privacy.trackingprotection.enabled" = true;
"privacy.trackingprotection.pbmode.enabled" = true;
"privacy.trackingprotection.socialtracking.enabled" = true;
"services.sync.declinedEngines" = "passwords";
"services.sync.engine.passwords" = false;
"signon.autofillForms" = false;
"signon.rememberSignons" = false;
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"toolkit.telemetry.archive.enabled" = false;
"toolkit.telemetry.bhrPing.enabled" = false;
"toolkit.telemetry.cachedClientID" = "";
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.firstShutdownPing.enabled" = false;
"toolkit.telemetry.hybridContent.enabled" = false;
"toolkit.telemetry.newProfilePing.enabled" = false;
"toolkit.telemetry.prompted" = 2;
"toolkit.telemetry.rejected" = true;
"toolkit.telemetry.server" = "";
"toolkit.telemetry.shutdownPingSender.enabled" = false;
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.unifiedIsOptIn" = false;
"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;
}
'';
};
};
};
};
environment.variables.BROWSER = "firefox";
}

17
configs/chromium.nix Normal file
View File

@@ -0,0 +1,17 @@
{pkgs, ...}: {
programs.chromium = {
enable = true;
extensions = [
# "ihlenndgcmojhcghmfjfneahoeklbjjh" # cVim
# "fpnmgdkabkmnadcjpehmlllkndpkmiak" # Wayback Machine
"cjpalhdlnbpafiamejdnhcphjbkeiagm" # uBlock Origin
"pjjgklgkfeoeiebjogplpnibpfnffkng" # undistracted
"nhdogjmejiglipccpnnnanhbledajbpd" # vuejs devtools
"eimadpbcbfnmbkopoojfekhnkhdbieeh" # dark reader
];
};
environment.systemPackages = [pkgs.brave];
environment.variables.BROWSER = "brave";
}

View File

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

View File

@@ -4,59 +4,54 @@
pkgs, pkgs,
... ...
}: let }: let
inherit (import ../lib) tmpfilesConfig; inherit (import <niveum/lib>) tmpfilesConfig;
in { in {
systemd.user.tmpfiles.users.me.rules = map tmpfilesConfig [ imports = [
<niveum/modules/dropbox.nix>
];
niveum = {
dropbox.enable = false;
};
systemd.tmpfiles.rules = map tmpfilesConfig [
{ {
type = "d";
mode = "0755";
age = "7d";
path = "${config.users.users.me.home}/sync/Downloads";
}
{
type = "d";
mode = "0755";
age = "7d";
path = "${config.users.users.me.home}/cloud/nextcloud/tmp";
}
] ++ map (path: tmpfilesConfig {
type = "L+"; type = "L+";
user = config.users.users.me.name; user = config.users.users.me.name;
group = config.users.users.me.group; group = "users";
mode = "0755"; mode = "0755";
argument = "${config.users.users.me.home}/sync/${path}"; argument = "${config.users.users.me.home}/cloud/Seafile/Wiki";
path = "${config.users.users.me.home}/${path}"; path = "${config.users.users.me.home}/notes";
}) [".ssh" ".gnupg" ".pki" ".local/share/aerc"]; }
{
services.gnome.gnome-keyring.enable = true; type = "L+";
security.pam.services.lightdm.enableGnomeKeyring = true; user = config.users.users.me.name;
group = "users";
mode = "0755";
argument = "${config.users.users.me.home}/cloud/Seafile/Uni";
path = "${config.users.users.me.home}/uni";
}
{
type = "L+";
user = config.users.users.me.name;
group = "users";
mode = "0755";
argument = "${config.users.users.me.home}/cloud/syncthing/common/mahlzeit";
path = "${config.users.users.me.home}/mahlzeit";
}
];
home-manager.users.me = { home-manager.users.me = {
services.gnome-keyring.enable = true;
services.nextcloud-client = { services.nextcloud-client = {
enable = true; enable = true;
startInBackground = true; startInBackground = true;
}; };
}; systemd.user.services.nextcloud-client = {
Unit = {
systemd.user.services.nextcloud-syncer = { Wants = ["gnome-keyring.service"];
enable = false; After = ["gnome-keyring.service"];
wants = ["network-online.target"];
wantedBy = ["default.target"];
startAt = "*:00/10";
script = let
kieran = {
user = "kieran";
passwordFile = config.age.secrets.nextcloud-password-kieran.path;
endpoint = "https://cloud.kmein.de";
target = "${config.users.users.me.home}/notes";
}; };
in ''
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 = {
Type = "oneshot";
Restart = "on-failure";
}; };
}; };
@@ -65,67 +60,40 @@ in {
set -efu set -efu
book="$({ book="$({
${pkgs.findutils}/bin/find ${config.users.users.me.home}/cloud/syncthing/library -type f ${pkgs.findutils}/bin/find ${config.users.users.me.home}/cloud/syncthing/library -type f
${pkgs.findutils}/bin/find ${config.users.users.me.home}/cloud/nextcloud/Books -type f ${pkgs.findutils}/bin/find ${config.users.users.me.home}/cloud/Seafile/Books -type f
} | ${pkgs.fzf}/bin/fzf)" } | ${pkgs.fzf}/bin/fzf)"
exec ${pkgs.zathura}/bin/zathura "$book" ${pkgs.zathura}/bin/zathura "$book"
'') '')
(let
kieran = {
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
pkgs.writers.writeDashBin "book-mega" ''
set -efu
selection="$(${megatools "ls"} | ${pkgs.fzf}/bin/fzf)"
test -n "$selection" || exit 1
tmpdir="$(mktemp -d)"
trap clean EXIT
clean() {
rm -rf "$tmpdir"
}
(
cd "$tmpdir"
${megatools "get"} "$selection"
exec ${pkgs.zathura}/bin/zathura "$(basename "$selection")"
)
'')
]; ];
age.secrets.mega-password = { fileSystems."/media/moodle" = {
file = ../secrets/mega-password.age; device = "zaatar.r:/moodle";
owner = config.users.users.me.name; fsType = "nfs";
group = config.users.users.me.group; options = [
mode = "400"; "x-systemd.idle-timeout=600"
"noauto"
"x-systemd.automount"
];
}; };
services.syncthing = { services.syncthing = rec {
enable = true; enable = true;
user = "kfm"; user = "kfm";
openDefaultPorts = true; openDefaultPorts = true;
configDir = "/home/kfm/.config/syncthing"; configDir = "/home/kfm/.config/syncthing";
dataDir = "/home/kfm/.config/syncthing"; dataDir = "/home/kfm/.config/syncthing";
cert = config.age.secrets.syncthing-cert.path; cert = toString <system-secrets/syncthing/cert.pem>;
key = config.age.secrets.syncthing-key.path; key = toString <system-secrets/syncthing/key.pem>;
settings = { inherit ((import <niveum/lib>).syncthing) devices;
inherit ((import ../lib).syncthing) devices; folders = let
folders = { cloud-dir = "${config.users.users.me.home}/cloud";
"${config.users.users.me.home}/sync" = { in {
devices = ["kabsa" "manakish" "fatteh"]; "${cloud-dir}/syncthing/common".devices = ["kabsa" "manakish"];
label = "sync"; "${cloud-dir}/syncthing/library".devices = ["kabsa" "manakish" "heym"];
versioning.type = "trashcan"; "${cloud-dir}/syncthing/mundoiu".devices = ["kabsa" "manakish" "heym"];
versioning.params.cleanoutDays = 100; "${cloud-dir}/syncthing/music" = {
}; devices = ["kabsa" "manakish" "heym" "zaatar"];
"${config.users.users.me.home}/mobile" = { id = "music";
devices = ["kabsa" "manakish" "fatteh" "kibbeh"];
id = "mobile";
label = "mobile";
versioning.type = "trashcan";
versioning.params.cleanoutDays = 100;
};
}; };
}; };
}; };

8
configs/compton.nix Normal file
View File

@@ -0,0 +1,8 @@
{
services.compton = {
enable = true;
shadow = true;
menuOpacity = 0.9;
shadowOpacity = 0.3;
};
}

40
configs/copyq.nix Normal file
View File

@@ -0,0 +1,40 @@
{
config,
pkgs,
...
}: let
copyqConfig = pkgs.writers.writeDash "copyq-config" ''
${pkgs.copyq}/bin/copyq config check_clipboard true
${pkgs.copyq}/bin/copyq config check_selection false
${pkgs.copyq}/bin/copyq config copy_clipboard true
${pkgs.copyq}/bin/copyq config copy_selection false
${pkgs.copyq}/bin/copyq config activate_closes true
${pkgs.copyq}/bin/copyq config clipboard_notification_lines 0
${pkgs.copyq}/bin/copyq config clipboard_tab \&clipboard
${pkgs.copyq}/bin/copyq config disable_tray false
${pkgs.copyq}/bin/copyq config hide_tabs false
${pkgs.copyq}/bin/copyq config hide_toolbar false
${pkgs.copyq}/bin/copyq config item_popup_interval true
${pkgs.copyq}/bin/copyq config maxitems 1000
${pkgs.copyq}/bin/copyq config move true
${pkgs.copyq}/bin/copyq config text_wrap true
'';
in {
environment.systemPackages = [pkgs.copyq];
systemd.user.services.copyq = {
wantedBy = ["graphical-session.target"];
environment = {
DISPLAY = ":${toString config.services.xserver.display}";
};
serviceConfig = {
SyslogIdentifier = "copyq";
ExecStart = "${pkgs.copyq}/bin/copyq";
ExecStartPost = copyqConfig;
Restart = "always";
RestartSec = "15s";
StartLimitBurst = 0;
};
};
}

View File

@@ -2,79 +2,68 @@
pkgs, pkgs,
lib, lib,
config, config,
niveumPackages, options,
inputs,
... ...
}: let }: let
inherit (lib.strings) makeBinPath; inherit (lib.strings) makeBinPath;
inherit (import ../lib) localAddresses kieran remoteDir; inherit (import <niveum/lib>) localAddresses kieran;
defaultApplications = (import ../lib).defaultApplications {inherit pkgs;};
in { in {
imports = [ imports = [
inputs.self.nixosModules.system-dependent <home-manager/nixos>
inputs.self.nixosModules.power-action <niveum/modules/system-dependent.nix>
{ {
boot.supportedFilesystems = ["ntfs"]; boot.supportedFilesystems = ["ntfs"];
} }
{
nix.nixPath = [
"/var/src"
"nixpkgs-overlays=${toString ../overlays}"
];
}
{ {
nixpkgs = { nixpkgs = {
config = { config = {
allowUnfree = true; allowUnfree = true;
packageOverrides = pkgs: { packageOverrides = pkgs: {
dmenu = pkgs.writers.writeDashBin "dmenu" ''exec ${pkgs.rofi}/bin/rofi -dmenu "$@"''; dmenu = pkgs.writers.writeDashBin "dmenu" ''exec ${pkgs.rofi}/bin/rofi -dmenu "$@"'';
gfs-fonts = pkgs.callPackage <niveum/packages/gfs-fonts.nix> {};
tocharian-font = pkgs.callPackage <niveum/packages/tocharian-font.nix> {};
iolanguage = pkgs.callPackage <niveum/packages/iolanguage.nix> {};
ix = pkgs.callPackage <niveum/packages/ix.nix> {};
rofi-pass = pkgs.rofi-pass.overrideAttrs (final: previous: {
patches = [
# password store androi
<niveum/packages/rofi-pass.patch>
];
});
}; };
permittedInsecurePackages = [
"qtwebkit-5.212.0-alpha4"
"zotero-6.0.26"
"electron-25.9.0"
];
}; };
overlays = [
(self: super: {
scripts = import <niveum/packages/scripts> {
pkgs = super;
lib = super.lib;
};
})
];
}; };
} }
{ {
boot.tmp.cleanOnBoot = true; boot.cleanTmpDir = true;
boot.loader.timeout = 1; boot.loader.timeout = 1;
} }
{
age.secrets = {
di-fm-key = {
file = ../secrets/di-fm-key.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
restic = {
file = ../secrets/restic.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
}
{ {
home-manager.users.me = { home-manager.users.me = {
programs.zathura = { programs.zathura = {
enable = true; enable = true;
options = { options = {
selection-clipboard = "clipboard"; selection-clipboard = "clipboard";
recolor-keephue = true;
# first-page-column = "1:1"; # makes side-by-side mode start on the left side # first-page-column = "1:1"; # makes side-by-side mode start on the left side
}; };
}; };
}; };
} }
{
environment.systemPackages = [
pkgs.capitaine-cursors
];
home-manager.users.me = {
home.pointerCursor = {
name = "capitaine-cursors-white";
package = pkgs.capitaine-cursors;
size = 12;
};
};
}
{ {
users.mutableUsers = false; users.mutableUsers = false;
@@ -83,31 +72,84 @@ in {
users.users.me = { users.users.me = {
name = "kfm"; name = "kfm";
description = kieran.name; description = kieran.name;
hashedPasswordFile = config.age.secrets.kfm-password.path; hashedPassword = "$6$w9hXyGFl/.IZBXk$5OiWzS1G.5hImhh1YQmZiCXYNAJhi3X6Y3uSLupJNYYXPLMsQpx2fwF4Xr2uYzGMV8Foqh8TgUavx1APD9rcb/";
isNormalUser = true; isNormalUser = true;
uid = 1000; uid = 1000;
extraGroups = ["pipewire" "audio"];
};
age.secrets = {
kfm-password.file = ../secrets/kfm-password.age;
}; };
home-manager.users.me.xdg.enable = true; home-manager.users.me.xdg.enable = true;
home-manager.users.me.dconf.enable = false;
} }
{ {
environment.interactiveShellInit = "export PATH=$PATH"; sound.enable = true;
hardware.pulseaudio = {
enable = true;
package = pkgs.pulseaudioFull;
# copy server:/run/pulse/.config/pulse/cookie to client:~/.config/pulse/cookie to authenticate a client machine
zeroconf.discovery.enable = true;
extraConfig = ''
load-module ${
toString [
"module-tunnel-sink-new"
"server=zaatar.r"
"sink_name=zaatar"
"channels=2"
"rate=44100"
]
}
'';
};
users.users.me.extraGroups = ["audio"];
environment.systemPackages = [pkgs.pavucontrol pkgs.ncpamixer pkgs.pamixer pkgs.pulsemixer];
}
{
environment.interactiveShellInit = "export PATH=$PATH:$HOME/projects/niveum";
environment.shellAliases = let environment.shellAliases = let
swallow = command: "${niveumPackages.swallow}/bin/swallow ${command}"; 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
'';
take = pkgs.writers.writeDash "take" ''
mkdir "$1" && cd "$1"
'';
cdt = pkgs.writers.writeDash "cdt" ''
cd "$(mktemp -d)"
pwd
'';
swallow = command: "${pkgs.scripts.swallow}/bin/swallow ${command}";
in { in {
o = "${pkgs.xdg-utils}/bin/xdg-open"; "ß" = "${pkgs.utillinux}/bin/setsid";
cat = "${pkgs.bat}/bin/bat --style=plain";
chromium-incognito = "chromium --user-data-dir=$(mktemp -d /tmp/chr.XXXXXX) --no-first-run --incognito";
cp = "cp --interactive";
ip = "${pkgs.iproute}/bin/ip -c";
l = "ls --color=auto --time-style=long-iso --almost-all";
ls = "ls --color=auto --time-style=long-iso";
ll = "ls --color=auto --time-style=long-iso -l";
la = "ls --color=auto --time-style=long-iso --almost-all -l";
mv = "mv --interactive";
nixi = "nix repl '<nixpkgs>'";
ns = "nix-shell --run zsh"; ns = "nix-shell --run zsh";
o = "${pkgs.xdg_utils}/bin/xdg-open";
pbcopy = "${pkgs.xclip}/bin/xclip -selection clipboard -in"; pbcopy = "${pkgs.xclip}/bin/xclip -selection clipboard -in";
pbpaste = "${pkgs.xclip}/bin/xclip -selection clipboard -out"; pbpaste = "${pkgs.xclip}/bin/xclip -selection clipboard -out";
rm = "rm --interactive";
s = "${pkgs.systemd}/bin/systemctl";
take = "source ${take}";
cdt = "source ${cdt}";
vit = "$EDITOR $(mktemp)";
tmux = "${pkgs.tmux}/bin/tmux -2"; tmux = "${pkgs.tmux}/bin/tmux -2";
sxiv = swallow "${pkgs.nsxiv}/bin/nsxiv"; sxiv = swallow "${pkgs.nsxiv}/bin/nsxiv";
zathura = swallow "${pkgs.zathura}/bin/zathura"; zathura = swallow "${pkgs.zathura}/bin/zathura";
us = "${pkgs.systemd}/bin/systemctl --user";
wcd = "source ${wcd}";
im = "${pkgs.openssh}/bin/ssh weechat@makanek -t tmux attach-session -t IM"; im = "${pkgs.openssh}/bin/ssh weechat@makanek -t tmux attach-session -t IM";
where = "source ${where}";
yt = "${pkgs.yt-dlp}/bin/yt-dlp --add-metadata -ic"; # Download video link yt = "${pkgs.yt-dlp}/bin/yt-dlp --add-metadata -ic"; # Download video link
yta = "${pkgs.yt-dlp}/bin/yt-dlp --add-metadata -xic"; # Download with audio yta = "${pkgs.yt-dlp}/bin/yt-dlp --add-metadata -xic"; # Download with audio
}; };
@@ -154,14 +196,7 @@ in {
} }
{programs.command-not-found.enable = true;} {programs.command-not-found.enable = true;}
{ {
home-manager.users.me = { programs.gnupg.agent.enable = true;
services.gpg-agent = rec {
enable = true;
enableZshIntegration = true;
defaultCacheTtl = 2 * 60 * 60;
maxCacheTtl = 4 * defaultCacheTtl;
};
};
environment.systemPackages = [ environment.systemPackages = [
pkgs.gnupg pkgs.gnupg
@@ -188,39 +223,19 @@ in {
{ {
home-manager.users.me.home.stateVersion = "22.05"; home-manager.users.me.home.stateVersion = "22.05";
} }
{
systemd.user.services.udiskie = {
after = ["udisks2.service"];
wants = ["udisks2.service"];
wantedBy = ["graphical-session.target"];
serviceConfig = {
ExecStart = "${pkgs.udiskie}/bin/udiskie --verbose --no-config --notify";
};
};
services.udisks2.enable = true;
programs.dconf.enable = true;
home-manager.users.me = {
dconf.enable = true;
dconf.settings = {
# Change the default terminal for Nemo
"org/cinnamon/desktop/applications/terminal".exec = defaultApplications.terminal;
};
};
}
./android.nix
./admin-essentials.nix
./stylix.nix
./alacritty.nix ./alacritty.nix
./backup.nix ./backup.nix
./bash.nix ./bash.nix
./beets.nix
./bluetooth.nix ./bluetooth.nix
./aerc.nix
./ccc.nix ./ccc.nix
./khal.nix ./khal.nix
./browser.nix ./chromium.nix
./clipboard.nix
./cloud.nix ./cloud.nix
./copyq.nix
./compton.nix
./direnv.nix ./direnv.nix
./distrobump.nix
./docker.nix ./docker.nix
./dunst.nix ./dunst.nix
./flix.nix ./flix.nix
@@ -230,79 +245,39 @@ in {
./hledger.nix ./hledger.nix
./htop.nix ./htop.nix
./hu-berlin.nix ./hu-berlin.nix
./fu-berlin.nix
./fysi.nix
./i3.nix ./i3.nix
./i3status-rust.nix
./keyboard.nix ./keyboard.nix
{home-manager.users.me.home.file.".XCompose".source = ../lib/keyboards/XCompose;}
./lb.nix ./lb.nix
./mpv.nix ./mpv.nix
./mime.nix ./mime.nix
./neovim.nix ./neovim.nix
./neomutt.nix
./nix.nix ./nix.nix
./newsboat.nix ./newsboat.nix
./flameshot.nix ./flameshot-once.nix
./packages.nix ./packages.nix
./picom.nix
./stardict.nix ./stardict.nix
./polkit.nix ./polkit.nix
./power-action.nix
./printing.nix ./printing.nix
# ./openweathermap.nix
./wallpaper.nix
./redshift.nix ./redshift.nix
./retiolum.nix ./retiolum.nix
./rofi.nix ./rofi.nix
./spacetime.nix ./spacetime.nix
./seafile.nix
./ssh.nix ./ssh.nix
./sshd.nix ./sshd.nix
./sound.nix
./sudo.nix ./sudo.nix
./nsxiv.nix
./themes.nix
./tmux.nix ./tmux.nix
./traadfri.nix
./unclutter.nix ./unclutter.nix
./vscode.nix ./vscode.nix
./watson.nix ./watson.nix
./wallpaper.nix
./zsh.nix ./zsh.nix
./tor.nix ./tor.nix
./stw-berlin.nix
./mastodon-bot.nix
{
fileSystems."${remoteDir}/fritz" = {
device = "//192.168.178.1/FRITZ.NAS/Backup";
fsType = "cifs";
options = [
"username=ftpuser"
"password=ftppassword"
"noauto"
"nounix"
"rw"
# "noserverino" # ref https://askubuntu.com/a/1265165
"uid=${toString config.users.users.me.uid}"
"gid=${toString config.users.groups.users.gid}"
"x-systemd.automount"
"x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min"
];
};
}
{
home-manager.users.me = {
xdg.userDirs = rec {
enable = true;
documents = "${config.users.users.me.home}/cloud/nextcloud/Documents";
desktop = "/tmp";
download = "${config.users.users.me.home}/sync/Download";
music = "${config.users.users.me.home}/mobile/audio";
pictures = "${config.users.users.me.home}/cloud/nextcloud/Bilder";
publicShare = "${config.users.users.me.home}/cloud/nextcloud/tmp";
videos = pictures;
};
};
}
{
home-manager.users.me = {
services.kdeconnect.enable = true;
services.kdeconnect.indicator = true;
};
}
]; ];
} }

View File

@@ -10,7 +10,7 @@
cat > shell.nix <<'EOF' cat > shell.nix <<'EOF'
{ pkgs ? import <nixpkgs> {} }: { pkgs ? import <nixpkgs> {} }:
pkgs.mkShell { pkgs.mkShell {
packages = []; buildInputs = [];
} }
EOF EOF
''${EDITOR:-vim} shell.nix ''${EDITOR:-vim} shell.nix

View File

@@ -3,7 +3,7 @@
pkgs, pkgs,
... ...
}: let }: let
inherit (import ../lib) defaultApplications theme; inherit (import <niveum/lib>) defaultApplications colours theme;
in { in {
home-manager.users.me.services.dunst = { home-manager.users.me.services.dunst = {
enable = true; enable = true;
@@ -11,13 +11,16 @@ in {
settings = { settings = {
global = { global = {
transparency = 10; transparency = 10;
font = "Monospace 8";
geometry = "200x5-30+20"; geometry = "200x5-30+20";
frame_color = colours.foreground;
follow = "mouse"; follow = "mouse";
indicate_hidden = true; indicate_hidden = true;
notification_height = 0; notification_height = 0;
separator_height = 2; separator_height = 2;
padding = 8; padding = 8;
horizontal_padding = 8; horizontal_padding = 8;
separator_color = "auto";
sort = true; sort = true;
markup = "full"; markup = "full";
format = "%a\\n<b>%s</b>\\n%b"; format = "%a\\n<b>%s</b>\\n%b";
@@ -40,13 +43,22 @@ in {
mouse_right_click = "close_current"; mouse_right_click = "close_current";
mouse_middle_click = "close_all"; mouse_middle_click = "close_all";
}; };
urgency_low = { urgency_low = rec {
frame_color = background;
background = colours.foreground;
foreground = colours.background;
timeout = 5; timeout = 5;
}; };
urgency_normal = { urgency_normal = rec {
frame_color = background;
background = colours.foreground;
foreground = colours.background;
timeout = 10; timeout = 10;
}; };
urgency_critical = { urgency_critical = rec {
frame_color = background;
background = colours.red.dark;
foreground = colours.background;
timeout = 0; timeout = 0;
}; };
}; };

View File

@@ -0,0 +1,45 @@
{
lib,
pkgs,
...
}: let
inherit (import <niveum/lib>) defaultApplications;
flameshot-once =
pkgs.callPackage <stockholm/krebs/5pkgs/simple/flameshot-once> {};
in {
environment.systemPackages = [
(flameshot-once.override {
config = {
imgur = {
enable = true;
createUrl = "http://p.r/image";
deleteUrl = "http://p.r/image/delete/%1";
xdg-open.browser = (defaultApplications pkgs).browser;
};
timeout = 1000;
drawColor = "#ff0000";
drawThickness = 2;
showDesktopNotification = true;
buttons = [
"ARROW"
"BLUR"
"CIRCLE"
"CIRCLECOUNT"
"COPY"
"DRAWER"
"EXIT"
"IMAGEUPLOADER"
"MARKER"
"MOVESELECTION"
"PENCIL"
"RECTANGLE"
"SAVE"
"SELECTION"
"SELECTIONINDICATOR"
"TEXT"
"UNDO"
];
};
})
];
}

View File

@@ -1,23 +0,0 @@
{
lib,
pkgs,
...
}: {
home-manager.users.me = {
services.flameshot = {
enable = true;
settings.General = {
autoCloseIdleDaemon = true;
drawColor = "#ff0000";
drawThickness = 2;
checkForUpdates = false;
showDesktopNotification = true;
disabledTrayIcon = true;
showHelp = false;
squareMagnifier = true;
uploadWithoutConfirmation = true;
buttons = ''@Variant(\0\0\0\x7f\0\0\0\vQList<int>\0\0\0\0\x10\0\0\0\x2\0\0\0\x5\0\0\0\x13\0\0\0\xa\0\0\0\x1\0\0\0\xc\0\0\0\xd\0\0\0\x6\0\0\0\x8\0\0\0\0\0\0\0\xf\0\0\0\x4\0\0\0\xb\0\0\0\x3\0\0\0\x12\0\0\0\x9)'';
};
};
};
}

View File

@@ -4,16 +4,14 @@
... ...
}: let }: let
flixLocation = "/media/flix"; flixLocation = "/media/flix";
flixLocationNew = "/media/flix-new";
cacheLocation = "/var/cache/flix"; cacheLocation = "/var/cache/flix";
indexFilename = "index"; indexFilename = "index";
indexFilenameNew = "index-new";
flixUser = "flix"; flixUser = "flix";
flixGroup = "users"; flixGroup = "users";
inherit (import ../lib) tmpfilesConfig; inherit (import <niveum/lib>) tmpfilesConfig;
in { in {
fileSystems.${flixLocation} = { fileSystems.${flixLocation} = {
device = "prism.r:/export/download"; device = "prism.r:/export";
fsType = "nfs"; fsType = "nfs";
options = [ options = [
"noauto" "noauto"
@@ -28,20 +26,6 @@ in {
]; ];
}; };
fileSystems.${flixLocationNew} = {
device = "//yellow.r/public";
fsType = "cifs";
options = [
"guest"
"nofail"
"noauto"
"ro"
"x-systemd.automount"
"x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min"
];
};
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
(tmpfilesConfig { (tmpfilesConfig {
type = "d"; type = "d";
@@ -55,10 +39,7 @@ in {
systemd.services.flix-index = { systemd.services.flix-index = {
description = "Flix indexing service"; description = "Flix indexing service";
wants = ["network-online.target"]; wants = ["network-online.target"];
script = '' script = "cp ${flixLocation}/download/index ./${indexFilename}";
cp ${flixLocation}/index ./${indexFilename}
cp ${flixLocationNew}/index ./${indexFilenameNew}
'';
startAt = "hourly"; startAt = "hourly";
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
@@ -88,11 +69,12 @@ in {
'') '')
(pkgs.writers.writeDashBin "flixmenu" '' (pkgs.writers.writeDashBin "flixmenu" ''
set -efu set -efu
( cd "${flixLocation}/download"
${pkgs.gnused}/bin/sed 's#^\.#${flixLocation}#' ${cacheLocation}/${indexFilename}
${pkgs.gnused}/bin/sed 's#^\.#${flixLocationNew}#' ${cacheLocation}/${indexFilenameNew} [ -f "${cacheLocation}/${indexFilename}" ] || exit 1
) | ${pkgs.dmenu}/bin/dmenu -i -p flix -l 5 "$@" \
| ${pkgs.findutils}/bin/xargs -I '{}' ${pkgs.util-linux}/bin/setsid ${pkgs.xdg-utils}/bin/xdg-open '{}' ${pkgs.dmenu}/bin/dmenu -i -p flix -l 5 "$@" < ${cacheLocation}/${indexFilename} \
| ${pkgs.findutils}/bin/xargs -I '{}' ${pkgs.utillinux}/bin/setsid ${pkgs.xdg_utils}/bin/xdg-open '{}'
'') '')
]; ];
} }

View File

@@ -1,102 +1,25 @@
{ {pkgs, ...}: {
pkgs,
niveumPackages,
...
}: let
zip-font = name: arguments: let
directory = pkgs.fetchzip arguments;
in
pkgs.runCommand name {} ''
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 '*.otf' -exec install '{}' $out/share/fonts/opentype \;
${pkgs.findutils}/bin/find ${directory} -name '*.woff' -exec install '{}' $out/share/fonts/woff \;
'';
simple-ttf = name: arguments: let
file = pkgs.fetchurl arguments;
in
pkgs.runCommand name {} ''
mkdir -p $out/share/fonts/truetype
install ${file} $out/share/fonts/truetype
'';
egyptianHiero = zip-font "EgyptianHiero" {
url = "https://github.com/MKilani/Djehuty/archive/master.zip";
sha256 = "sha256-KbY4vedm757NWfDlgmNhslbZd+2Vs+o5PjtMMGDt61Y=";
};
antinoou = zip-font "Antinoou" {
url = "https://www.evertype.com/fonts/coptic/AntinoouFont.zip";
sha256 = "0jwihj08n4yrshcx07dnaml2x9yws6dgyjkvg19jqbz17drbp3sw";
stripRoot = false;
};
newGardiner = zip-font "NewGardiner" {
url = "https://mjn.host.cs.st-andrews.ac.uk/egyptian/fonts/NewGardiner.zip";
hash = "sha256-nP0y4ILt+0mlkDRdCNSeO2Gequ8wyix/qQdmujTNw3Y=";
stripRoot = false;
};
junicode2 = zip-font "JunicodeTwo" {
url = "https://github.com/psb1558/Junicode-font/archive/48bf476db278c844c67542b04d1e0e4c71f139d2.zip";
sha256 = "1ryicc155vkvgv3315ddliigwa01afwyb4c4f6pnqcns03af001i";
};
newAthenaUnicode = zip-font "NewAthenaUnicode" {
url = "https://classicalstudies.org/sites/default/files/userfiles/files/NAU5_005.zip";
sha256 = "1g7qk9gl4nq2dz41bvck1nzilhin44j8691cxax3dlp77bbn9bxr";
};
jsesh = simple-ttf "JSesh" {
url = "http://files.qenherkhopeshef.org/jsesh/JSeshFont.ttf";
sha256 = "1203jrk2xzvgckcc5hx88kja1i3h8gm1wiyla5j6gspc0hbv56ry";
};
egyptianTextBeta = simple-ttf "EgyptianText-1.0beta" {
url = "http://c.krebsco.de/EgyptianText-v1.0-beta.ttf";
sha256 = "0cfjbk7xxnxhlp6v922psm5j1xzrv6wfk226ji2wz2yfrnkbcbsv";
};
coranica = simple-ttf "Coranica" {
url = "https://corpuscoranicum.de/fonts/coranica_1164.ttf";
sha256 = "0igi8q8b2p38x9jq8c98afsl7bf8rj32zj2052yyjgj9r88y4yi5";
};
koineGreek = simple-ttf "KoineGreek.ttf" {
url = "https://github.com/Center-for-New-Testament-Restoration/font/raw/af83eed50105344edaa5e5eddaf87696e271468c/KoineGreek.ttf";
hash = "sha256-YtC+nj7+Jl8k00rqAAqySYc8iTAOL7PixXc+LfSmnS0=";
};
egyptianText = simple-ttf "EgyptianText" {
url = "https://github.com/microsoft/font-tools/raw/1092cb23520967830001a0807eb21d6a44dda522/EgyptianOpenType/font/eot.ttf";
sha256 = "1n294vhcx90270pnsw1dbk6izd61fjvbnjrh4hcf98ff3s540x0c";
};
in {
fonts = { fonts = {
enableDefaultPackages = true; enableDefaultFonts = true;
fontDir.enable = true; fontDir.enable = true;
packages = with pkgs; [ fonts = with pkgs; [
alegreya alegreya
alegreya-sans alegreya-sans
amiri amiri
annapurna-sil annapurna-sil
antinoou
cantarell-fonts cantarell-fonts
cardo
charis-sil charis-sil
doulos-sil
newAthenaUnicode
coranica
corefonts corefonts
crimson crimson
eb-garamond eb-garamond
ipaexfont
jsesh
egyptianHiero
egyptianText
egyptianTextBeta
font-awesome_6 font-awesome_6
etBook etBook
newGardiner
junicode2
koineGreek
ezra-sil ezra-sil
fira fira
font-awesome font-awesome
galatia-sil galatia-sil
gentium gentium
# niveumPackages.gfs-fonts gfs-fonts
gyre-fonts gyre-fonts
ibm-plex ibm-plex
jetbrains-mono jetbrains-mono
@@ -116,28 +39,16 @@ in {
source-sans-pro source-sans-pro
source-serif-pro source-serif-pro
theano theano
niveumPackages.tocharian-font tocharian-font
vistafonts vistafonts
vollkorn vollkorn
zilla-slab zilla-slab
]; # google-fonts league-of-moveable-type ]; # google-fonts league-of-moveable-type
fontconfig.defaultFonts = rec { fontconfig.defaultFonts = {
monospace = ["Noto Sans Mono"] ++ emoji; monospace = ["Noto Sans Mono"];
serif = ["Noto Serif" "Noto Naskh Arabic" "Noto Serif Devanagari"]; 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"]; sansSerif = ["Noto Sans Display" "Noto Kufi Arabic" "Noto Sans Devanagari" "Noto Sans CJK JP"];
emoji = ["Noto Color Emoji"]; emoji = ["Noto Color Emoji" "Noto Emoji"];
}; };
# 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
fontconfig.localConf = ''
<fontconfig>
<!-- Reject WOFF fonts We don't register WOFF(2) fonts with fontconfig because of the W3C spec -->
<selectfont>
<rejectfont>
<glob>*.woff*</glob>
</rejectfont>
</selectfont>
</fontconfig>
'';
}; };
} }

View File

@@ -1,142 +0,0 @@
{
config,
pkgs,
lib,
...
}: let
username = "meinhak99";
inherit (import ../lib/email.nix) defaults pronouns;
inherit (import ../lib) remoteDir;
fu-defaults = rec {
imap.host = "mail.zedat.fu-berlin.de";
imap.port = 993;
imap.tls.enable = true;
smtp.host = imap.host;
smtp.port = 465;
smtp.tls.enable = true;
folders.drafts = "Entwürfe";
folders.sent = "Gesendet";
folders.trash = "Papierkorb";
};
in {
home-manager.users.me = {
programs.ssh = {
matchBlocks = {
fu-berlin = {
user = username;
hostname = "login.zedat.fu-berlin.de";
setEnv.TERM = "xterm";
};
};
};
accounts.email.accounts = {
fu-student =
lib.recursiveUpdate defaults
(lib.recursiveUpdate fu-defaults
rec {
userName = "meinhak99";
address = "kieran.meinhardt@fu-berlin.de";
aliases = ["${userName}@fu-berlin.de"];
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-meinhak99.path}";
aerc.extraAccounts.signature-file = toString (pkgs.writeText "signature" signature.text);
signature = {
showSignature = "append";
text = ''
${defaults.realName}
${pronouns}
---
Studentische Hilfskraft / ZODIAC
Freie Universität Berlin
Telefon: +49 30 838 58118
Arnimallee 10, Raum 106, 14195 Berlin
'';
};
himalaya = {
enable = true;
backend = "imap";
sender = "smtp";
};
});
};
};
age.secrets = {
email-password-meinhak99 = {
file = ../secrets/email-password-meinhak99.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
fu-sftp-key = {
file = ../secrets/fu-sftp-key.age;
owner = "root";
group = "root";
mode = "400";
};
};
# if it fails with "connection reset by peer" run `sudo sshfs ... ... -o ...` manually
# it needs to say 'yes' to the server's fingerprint
system.fsPackages = [ pkgs.sshfs ];
# https://www.zedat.fu-berlin.de/tip4u_157.pdf
fileSystems = let
fu-berlin-cifs-options = [
"uid=${toString config.users.users.me.uid}"
"gid=${toString config.users.groups.users.gid}"
"rw"
"nounix"
"domain=fu-berlin"
"noauto"
"x-systemd.automount"
"x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min"
];
firstCharacter = lib.strings.substring 0 1;
home-directory-mount = user: {
"${remoteDir}/fu/${user}/home" = {
device = "${user}@login.zedat.fu-berlin.de:/home/${firstCharacter user}/${user}";
fsType = "sshfs";
options = [
"allow_other"
"_netdev"
"x-systemd.automount"
"reconnect"
"ServerAliveInterval=15"
"IdentityFile=${config.age.secrets.fu-sftp-key.path}"
];
};
};
in {
"${remoteDir}/fu/zodiac" = {
device = "//trove.storage.fu-berlin.de/GESCHKULT";
fsType = "cifs";
options =
fu-berlin-cifs-options
++ [
"credentials=${config.age.secrets.cifs-credentials-zodiac.path}"
];
};
} // home-directory-mount "meinhak99"
// home-directory-mount "xm7234fu";
age.secrets = {
cifs-credentials-zodiac.file = ../secrets/cifs-credentials-zodiac.age;
};
systemd.services.fu-vpn = {
enable = true;
wants = ["network-online.target"];
serviceConfig.LoadCredential = "password:${config.age.secrets.email-password-meinhak99.path}";
script = ''
if ${pkgs.wirelesstools}/bin/iwgetid | ${pkgs.gnugrep}/bin/grep --invert-match eduroam
then
cat "$CREDENTIALS_DIRECTORY/password" | ${pkgs.openconnect}/bin/openconnect vpn.fu-berlin.de --user ${username} --passwd-on-stdin
fi
'';
};
}

View File

@@ -1,55 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
inherit (import ../lib/email.nix) defaults;
sshIdentity = name: "${config.users.users.me.home}/.ssh/${name}";
in {
age.secrets = {
email-password-fysi = {
file = ../secrets/email-password-fysi.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
home-manager.users.me = {
accounts.email.accounts = {
fysi =
lib.recursiveUpdate defaults
rec {
address = "kieran@fysi.tech";
userName = address;
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-fysi.path}";
flavor = "fastmail.com";
};
};
programs.ssh.matchBlocks = rec {
"nextcloud.fysi.dev" = {
hostname = "116.203.82.203";
user = "root";
};
"lingua.miaengiadina.ch" = {
hostname = "135.181.85.233";
user = "root";
};
"cms-dev.woc2023.app".identityFile = sshIdentity "fysiweb";
"cms-master.woc2023.app".identityFile = sshIdentity "fysiweb";
"fysi-dev1" = {
hostname = "94.130.229.139";
user = "root";
identityFile = sshIdentity "fysiweb";
};
${fysi-dev1.hostname} = fysi-dev1;
"fysi-shared0" = {
hostname = "49.12.205.235";
user = "root";
identityFile = sshIdentity "fysiweb";
};
};
};
}

View File

@@ -1,22 +1,36 @@
{pkgs, ...}: { {
programs.fzf = { pkgs,
fuzzyCompletion = true; lib,
keybindings = true; ...
}; }: {
environment = {
home-manager.users.me = { systemPackages = [pkgs.fzf];
programs.fzf = rec { variables = {
enable = true; FZF_DEFAULT_OPTS =
defaultCommand = "${pkgs.fd}/bin/fd --type f --strip-cwd-prefix --follow --no-ignore-vcs --exclude .git"; lib.escapeShellArgs ["--height=40%" "--layout=reverse"];
defaultOptions = ["--height=40%"]; FZF_ALT_C_COMMAND = "${pkgs.fd}/bin/fd --type d";
changeDirWidgetCommand = "${pkgs.fd}/bin/fd --type d"; FZF_ALT_C_OPTS = lib.escapeShellArgs [
changeDirWidgetOptions = [ "--preview='${pkgs.tree}/bin/tree -L 1 \"{}\"'"
"--preview='${pkgs.tree}/bin/tree -L 1 {}'"
"--bind=space:toggle-preview" "--bind=space:toggle-preview"
"--preview-window=hidden" "--preview-window=hidden"
]; ];
fileWidgetCommand = defaultCommand; FZF_CTRL_T_COMMAND = "${pkgs.fd}/bin/fd --type f";
fileWidgetOptions = ["--preview='head -$LINES {}'"]; FZF_CTRL_T_OPTS =
lib.escapeShellArgs ["--preview='${pkgs.bat}/bin/bat \"{}\"'"];
}; };
}; };
programs.zsh.interactiveShellInit = ''
if [[ $options[zle] = on ]]; then
. ${pkgs.fzf}/share/fzf/completion.zsh
. ${pkgs.fzf}/share/fzf/key-bindings.zsh
fi
'';
programs.bash.interactiveShellInit = ''
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then
. ${pkgs.fzf}/share/fzf/completion.bash
. ${pkgs.fzf}/share/fzf/key-bindings.bash
fi
'';
} }

View File

@@ -1,23 +1,23 @@
{ {
pkgs, pkgs,
inputs, config,
lib,
... ...
}: let }: let
inherit (import ../lib) kieran ignorePaths; inherit (import <niveum/lib>) kieran ignorePaths;
in { in {
environment.systemPackages = [ environment.systemPackages = [
pkgs.mr pkgs.mr
pkgs.gitFull pkgs.git
pkgs.git-crypt pkgs.gitAndTools.gitflow
pkgs.gitflow pkgs.gitAndTools.gh
pkgs.gh pkgs.gitAndTools.git-extras
pkgs.git-extras pkgs.gitAndTools.git-trim
# pkgs.git-trim pkgs.gitAndTools.git-absorb
pkgs.git-absorb
pkgs.gitstats pkgs.gitstats
pkgs.patch pkgs.patch
pkgs.patchutils pkgs.patchutils
inputs.self.packages.${pkgs.system}.git-preview pkgs.git-preview
]; ];
environment.shellAliases = { environment.shellAliases = {
@@ -28,7 +28,7 @@ in {
home-manager.users.me = { home-manager.users.me = {
programs.git = { programs.git = {
enable = true; enable = true;
package = pkgs.gitFull; package = pkgs.gitAndTools.gitFull;
userName = kieran.name; userName = kieran.name;
userEmail = kieran.email; userEmail = kieran.email;
aliases = { aliases = {
@@ -49,7 +49,6 @@ in {
pull.ff = "only"; pull.ff = "only";
rebase.autoStash = true; rebase.autoStash = true;
merge.autoStash = true; merge.autoStash = true;
push.autoSetupRemote = true;
# # ref https://github.com/dandavison/delta # # ref https://github.com/dandavison/delta
# core.pager = "${pkgs.delta}/bin/delta"; # core.pager = "${pkgs.delta}/bin/delta";

View File

@@ -1,5 +0,0 @@
{
services.xserver.enable = true;
services.xserver.displayManager.lightdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
}

View File

@@ -1,26 +1,36 @@
{ {
config,
pkgs, pkgs,
... ...
}: let }: {
ledgerDirectory = "/home/kfm/sync/src/ledger"; imports = [<niveum/modules/hledger.nix>];
hora = pkgs.callPackage ../packages/hora.nix { timeLedger = "${ledgerDirectory}/time.timeclock"; };
in {
environment.systemPackages = let environment.systemPackages = let
git = "${pkgs.git}/bin/git -C ${ledgerDirectory}"; timeLedger = "$HOME/projects/ledger/time.timeclock";
in [ in [
hora (pkgs.writers.writeDashBin "hora-edit" ''
pkgs.hledger $EDITOR + "${timeLedger}" && ${pkgs.git}/bin/git -C "$(${pkgs.coreutils}/bin/dirname ${timeLedger})" commit --all --message "$(${pkgs.coreutils}/bin/date -Im)"
(pkgs.writers.writeDashBin "hledger-git" ''
if [ "$1" = entry ]; then
${pkgs.hledger}/bin/hledger balance -V > "${ledgerDirectory}/balance.txt"
${git} add balance.txt
${git} commit --all --message="$(date -Im)"
else
${git} $*
fi
'') '')
(pkgs.writers.writeDashBin "hledger-edit" '' (pkgs.writers.writeDashBin "hora" ''
$EDITOR ${ledgerDirectory}/current.journal ${pkgs.hledger}/bin/hledger -f "${timeLedger}" "$@"
'')
(pkgs.writers.writeDashBin "hora-filli" ''
${pkgs.hledger}/bin/hledger -f "${timeLedger}" register fillidefilla -O csv \
-b "$(date -d "$(date +%Y-%m)-20 last month" +%Y-%m-%d)" \
-e "$(date -d "$(date +%Y-%m)-20" +%Y-%m-%d)" \
| sed 's/(fillidefilla:\(.*\))/\1/g' \
| xsv select date,amount,total,account,description
'') '')
]; ];
niveum.hledger = {
enable = true;
ledgerFile = "$HOME/projects/ledger/all.journal";
server = {
enable = false;
user = config.users.users.me;
package = pkgs.hledger-web;
};
package = pkgs.hledger;
};
} }

View File

@@ -20,7 +20,7 @@
show_thread_names = false; show_thread_names = false;
sort_descending = true; sort_descending = true;
sort_key = "PERCENT_CPU"; sort_key = "PERCENT_CPU";
tree_view = false; tree_view = true;
update_process_names = false; update_process_names = false;
right_meters = ["Uptime" "Tasks" "LoadAverage" "Battery"]; right_meters = ["Uptime" "Tasks" "LoadAverage" "Battery"];
left_meters = ["LeftCPUs2" "RightCPUs2" "Memory" "Swap"]; left_meters = ["LeftCPUs2" "RightCPUs2" "Memory" "Swap"];

View File

@@ -4,111 +4,45 @@
lib, lib,
... ...
}: let }: let
inherit (import ../lib/email.nix) defaults pronouns; inherit (lib.strings) fileContents;
inherit (import ../lib) remoteDir; inherit (import <niveum/lib>) sshPort;
hu-defaults = { eduroam = {
imap.host = "mailbox.cms.hu-berlin.de"; identity = fileContents <secrets/eduroam/identity>;
imap.port = 993; password = fileContents <secrets/eduroam/password>;
smtp.host = "mailhost.cms.hu-berlin.de";
smtp.port = 25;
smtp.tls.useStartTls = true;
}; };
hu-berlin-cifs-options = [ hu-berlin-cifs-options = [
"uid=${toString config.users.users.me.uid}" "uid=${toString config.users.users.me.uid}"
"gid=${toString config.users.groups.users.gid}" "gid=${toString config.users.groups.users.gid}"
"sec=ntlmv2" "sec=ntlmv2"
"workgroup=german" "workgroup=german"
"credentials=${config.age.secrets.cifs-credentials-hu-berlin.path}" "username=meinhaki"
"password=${lib.strings.fileContents <secrets/mail/meinhaki>}"
"noauto" "noauto"
"x-systemd.requires=hu-vpn.service"
"x-systemd.automount" "x-systemd.automount"
"x-systemd.device-timeout=1" "x-systemd.device-timeout=1"
"x-systemd.idle-timeout=1min" "x-systemd.idle-timeout=1min"
]; ];
in { in {
fileSystems."${remoteDir}/hu/germpro2" = { fileSystems."/media/hu-berlin/germpro2" = {
device = "//hugerm31c.user.hu-berlin.de/germpro2/ling"; device = "//hugerm31c.user.hu-berlin.de/germpro2/ling";
fsType = "cifs"; fsType = "cifs";
options = hu-berlin-cifs-options; options = hu-berlin-cifs-options;
}; };
fileSystems."${remoteDir}/hu/meinhaki/home" = { fileSystems."/media/hu-berlin/germhome" = {
device = "//hugerm31c.user.hu-berlin.de/germhome/ling/meinhaki"; device = "//hugerm31c.user.hu-berlin.de/germhome/ling/meinhaki";
fsType = "cifs"; fsType = "cifs";
options = hu-berlin-cifs-options; options = hu-berlin-cifs-options;
}; };
age.secrets = { home-manager.users.me.programs.ssh = {
cifs-credentials-hu-berlin.file = ../secrets/cifs-credentials-hu-berlin.age; matchBlocks = {
email-password-meinhaki = { "alew.hu-berlin.de" = {
file = ../secrets/email-password-meinhaki.age; user = "centos";
owner = config.users.users.me.name; hostname = "141.20.187.219";
group = config.users.users.me.group;
mode = "400";
};
email-password-dslalewa = {
file = ../secrets/email-password-dslalewa.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
home-manager.users.me = {
programs.ssh = {
matchBlocks = {
"alew.hu-berlin.de" = {
user = "centos";
hostname = "141.20.187.219";
};
}; };
}; };
accounts.email.accounts = rec {
hu-employee =
lib.recursiveUpdate defaults
(lib.recursiveUpdate hu-defaults
rec {
userName = "meinhaki";
address = "kieran.meinhardt@hu-berlin.de";
aliases = ["${userName}@hu-berlin.de"];
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-meinhaki.path}";
aerc.extraAccounts.signature-file = toString (pkgs.writeText "signature" signature.text);
himalaya = {
enable = true;
backend = "imap";
sender = "smtp";
};
signature = {
showSignature = "append";
text = ''
${defaults.realName}
${pronouns}
Studentische Hilfskraft / Administrator ALEW
Humboldt-Universität zu Berlin
Telefon: +49 (0)30 2093 9634
Raum 3.212, Dorotheenstraße 24, 10117 Berlin-Mitte
https://alew.hu-berlin.de
'';
};
});
hu-admin =
lib.recursiveUpdate defaults
(lib.recursiveUpdate hu-defaults
rec {
userName = "dslalewa";
address = "admin.alew.vglsprwi@hu-berlin.de";
himalaya = {
enable = true;
backend = "imap";
sender = "smtp";
};
aliases = ["${userName}@hu-berlin.de"];
passwordCommand = "${pkgs.coreutils}/bin/cat ${config.age.secrets.email-password-dslalewa.path}";
inherit (hu-employee) signature;
aerc.extraAccounts.signature-file = toString (pkgs.writeText "signature" signature.text);
});
};
}; };
environment.systemPackages = [ environment.systemPackages = [
@@ -128,23 +62,34 @@ in {
) )
]; ];
# ref https://github.com/NixOS/nixpkgs/issues/231038#issuecomment-1591888919
environment.etc."ppp/options".text = "ipcp-accept-remote";
systemd.services.hu-vpn = { systemd.services.hu-vpn = {
enable = true; enable = true;
wants = ["network-online.target"]; wants = ["network-online.target"];
serviceConfig.LoadCredential = "password:${config.age.secrets.email-password-meinhaki.path}"; conflicts = ["openvpn-hu-berlin.service"];
script = '' script = ''
${pkgs.openfortivpn}/bin/openfortivpn \ ${pkgs.openfortivpn}/bin/openfortivpn -c ${
--password="$(cat "$CREDENTIALS_DIRECTORY/password")" \
--config=${
pkgs.writeText "hu-berlin.config" '' pkgs.writeText "hu-berlin.config" ''
host = forti-ssl.vpn.hu-berlin.de host = forti-ssl.vpn.hu-berlin.de
port = 443 port = 443
username = meinhaki trusted-cert = 42193a913d276d9eb86217612956e1e6464d6f07bed5393a4787c87adc4bd359
username = ${eduroam.identity}@split_tunnel
password = ${eduroam.password}
'' ''
} }
''; '';
}; };
systemd.services.openvpn-hu-berlin.conflicts = ["hu-vpn.service"];
services.openvpn.servers.hu-berlin = {
autoStart = false;
authUserPass = {
username = eduroam.identity;
password = eduroam.password;
};
config = fileContents (pkgs.fetchurl {
url = "https://www.cms.hu-berlin.de/de/dl/netze/vpn/openvpn/hu-berlin.ovpn";
sha256 = "15b55aibik5460svjq2gwxrcyh6ay4k8savd6cd5lncgndmd8p8h";
});
};
} }

View File

@@ -2,34 +2,17 @@
config, config,
pkgs, pkgs,
lib, lib,
niveumPackages,
... ...
}: let }: let
dashboard = pkgs.writers.writeDashBin "dashboard" '' inherit (import <niveum/lib>) defaultApplications colours;
${pkgs.alacritty}/bin/alacritty --class wtf --command ${pkgs.writers.writeDash "dashboard-inner" '' klem = import <niveum/packages/scripts/klem.nix> {
export WTF_OWM_API_KEY="$(cat ${config.age.secrets.openweathermap-api-key.path})" inherit pkgs lib;
export WTF_MINIFLUX_API_KEY="$(cat ${config.age.secrets.miniflux-api-token.path})"
exec ${niveumPackages.dashboard}/bin/dashboard
''}
'';
inherit (import ../lib) defaultApplications;
klem = niveumPackages.klem.override {
config.dmenu = "${pkgs.dmenu}/bin/dmenu -i -p klem";
config.scripts = { config.scripts = {
"p.r" = pkgs.writers.writeDash "p.r" '' "p.r" = pkgs.writers.writeDash "p.r" ''
${pkgs.curl}/bin/curl -fSs http://p.r --data-binary @- \ ${pkgs.curl}/bin/curl -fSs http://p.r --data-binary @- \
| ${pkgs.coreutils}/bin/tail --lines=1 \ | ${pkgs.coreutils}/bin/tail --lines=1 \
| ${pkgs.gnused}/bin/sed 's/\\<r\\>/krebsco.de/' | ${pkgs.gnused}/bin/sed 's/\\<r\\>/krebsco.de/'
''; '';
# "envs.sh host" = pkgs.writers.writeDash "envs-host" ''
# ${pkgs.curl}/bin/curl -F "file=$(${pkgs.coreutils}/bin/cat)" https://envs.sh
# '';
"envs.sh mirror" = pkgs.writers.writeDash "envs-mirror" ''
${pkgs.curl}/bin/curl -F "url=$(${pkgs.coreutils}/bin/cat)" https://envs.sh
'';
"envs.sh shorten" = pkgs.writers.writeDash "envs-shorten" ''
${pkgs.curl}/bin/curl -F "shorten=$(${pkgs.coreutils}/bin/cat)" https://envs.sh
'';
"ix.io" = pkgs.writers.writeDash "ix.io" '' "ix.io" = pkgs.writers.writeDash "ix.io" ''
${pkgs.curl}/bin/curl -fSs -F 'f:1=<-' ix.io ${pkgs.curl}/bin/curl -fSs -F 'f:1=<-' ix.io
''; '';
@@ -43,54 +26,31 @@
${pkgs.coreutils}/bin/tr '[A-Za-z]' '[N-ZA-Mn-za-m]' ${pkgs.coreutils}/bin/tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
''; '';
"ipa" = pkgs.writers.writeDash "ipa" '' "ipa" = pkgs.writers.writeDash "ipa" ''
${niveumPackages.ipa}/bin/ipa ${pkgs.scripts.ipa}/bin/ipa
''; '';
"betacode" = pkgs.writers.writeDash "betacode" '' "betacode" = pkgs.writers.writeDash "betacode" ''
${niveumPackages.betacode}/bin/betacode ${pkgs.scripts.betacode}/bin/betacode
''; '';
"devanagari" = pkgs.writers.writeDash "devanagari" ''
${pkgs.scripts.devanagari}/bin/devanagari
'';
"avesta" = pkgs.writeScript "avesta" (builtins.readFile <niveum/packages/scripts/avesta.sed>);
"curl" = pkgs.writers.writeDash "curl" '' "curl" = pkgs.writers.writeDash "curl" ''
${pkgs.curl}/bin/curl -fSs "$(${pkgs.coreutils}/bin/cat)" ${pkgs.curl}/bin/curl -fSs "$(${pkgs.coreutils}/bin/cat)"
''; '';
ocr = pkgs.writers.writeDash "ocr" '' ocr = pkgs.writers.writeDash "ocr" ''
${pkgs.tesseract4}/bin/tesseract -l eng+deu - stdout ${pkgs.tesseract4}/bin/tesseract -l eng+deu - stdout
''; '';
emojai = pkgs.writers.writeDash "emojai" ''
${pkgs.curl}/bin/curl https://www.emojai.app/api/generate -X POST -H 'Content-Type: application/json' --data-raw "$(${pkgs.jq}/bin/jq -sR '{emoji:.}')" | ${pkgs.jq}/bin/jq -r .result
'';
"gpt-3.5" = pkgs.writers.writeDash "gpt" ''
${niveumPackages.gpt35}/bin/gpt
'';
gpt-4 = pkgs.writers.writeDash "gpt" ''
${niveumPackages.gpt4}/bin/gpt
'';
}; };
}; };
new-workspace = pkgs.writers.writeDash "new-workspace" ''
i3-msg workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1))
'';
move-to-new-workspace = pkgs.writers.writeDash "new-workspace" ''
i3-msg move container to workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1))
'';
in { in {
age.secrets = {
github-token-i3status-rust = {
file = ../secrets/github-token-i3status-rust.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
openweathermap-api-key = {
file = ../secrets/openweathermap-api-key.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
miniflux-api-token = {
file = ../secrets/miniflux-api-token.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
programs.slock.enable = true;
environment.systemPackages = [dashboard];
services.xserver = { services.xserver = {
displayManager.defaultSession = "none+i3"; displayManager.defaultSession = "none+i3";
windowManager.i3 = { windowManager.i3 = {
@@ -114,84 +74,117 @@ in {
''; '';
}; };
home-manager.users.me = let home-manager.users.me.xsession.windowManager.i3 = {
modifier = "Mod4"; enable = true;
infoWorkspace = ""; config = rec {
messageWorkspace = ""; fonts = {
modes.resize = { names = ["Sans"];
"Escape" = ''mode "default"''; size = 10.0;
"Return" = ''mode "default"''; };
"h" = "resize shrink width 10 px or 5 ppt"; modifier = "Mod4";
"j" = "resize grow height 10 px or 5 ppt"; window = {
"k" = "resize shrink height 10 px or 5 ppt"; titlebar = false;
"l" = "resize grow width 10 px or 5 ppt"; border = 1;
}; hideEdgeBorders = "smart";
gaps.inner = 4; commands = [
floating = { {
titlebar = false; criteria = {class = "floating";};
border = 1; command = "floating enable";
}; }
bars = [ {
(config.home-manager.users.me.lib.stylix.i3.bar criteria = {class = "fzfmenu";};
// rec { command = "floating enable";
workspaceButtons = true; }
mode = "hide"; # "dock"; {
position = "bottom"; criteria = {class = "mpv";};
statusCommand = toString (pkgs.writers.writeDash "i3status-rust" '' command = lib.strings.concatStringsSep ", " [
export I3RS_GITHUB_TOKEN="$(cat ${config.age.secrets.github-token-i3status-rust.path})" "floating enable"
export OPENWEATHERMAP_API_KEY="$(cat ${config.age.secrets.openweathermap-api-key.path})" "sticky enable"
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 "fullscreen disable"
''); "resize set 640 480"
fonts = { "move position mouse"
names = ["${config.stylix.fonts.sansSerif.name}" "FontAwesome 6 Free"]; ];
size = config.stylix.fonts.sizes.desktop * 0.8; }
];
};
gaps.inner = 4;
floating = {
titlebar = false;
border = 1;
};
colors = let
scheme = {
background = colours.background;
text = colours.foreground;
};
in rec {
focused =
scheme
// {
border = colours.cyan.bright;
indicator = colours.cyan.bright;
childBorder = colours.cyan.bright;
}; };
}) unfocused =
]; scheme
window = { // {
titlebar = false; border = colours.background;
border = 2; indicator = colours.background;
hideEdgeBorders = "smart"; childBorder = colours.background;
commands = [ };
focusedInactive = unfocused;
urgent =
scheme
// {
border = colours.red.bright;
indicator = colours.red.bright;
childBorder = colours.red.bright;
};
placeholder =
scheme
// {
border = colours.green.bright;
indicator = colours.green.bright;
childBorder = colours.green.bright;
};
};
bars = [
{ {
criteria = {class = "floating";}; workspaceButtons = false;
command = "floating enable"; fonts = {
} names = ["Monospace" "Font Awesome 6 Free"];
{ size = 8.0;
criteria = {class = "fzfmenu";}; };
command = "floating enable"; mode = "hide"; # "dock"
} position = "bottom";
{ colors = rec {
criteria = {class = ".*";}; background = colours.background;
command = "border pixel 2"; separator = background;
} statusline = colours.foreground;
{ bindingMode = {
criteria = {class = "mpv";}; background = colours.red.bright;
command = lib.strings.concatStringsSep ", " [ border = colours.background;
"floating enable" text = colours.foreground;
"sticky enable" };
"fullscreen disable" };
"resize set 640 480" statusCommand = "env I3RS_GITHUB_TOKEN=${lib.strings.fileContents <secrets/github/notification.token>} ${pkgs.i3status-rust}/bin/i3status-rs ${
"move position mouse" (pkgs.formats.toml {}).generate "i3status-rust.toml" (import <niveum/lib/i3status-rust.nix> {
]; inherit (config.niveum) batteryName wirelessInterface;
inherit colours;
inherit pkgs;
})
}";
} }
]; ];
}; modes.resize = {
colors = let "Escape" = ''mode "default"'';
background = config.lib.stylix.colors.withHashtag.base00; "Return" = ''mode "default"'';
in { "h" = "resize shrink width 10 px or 5 ppt";
unfocused = { "j" = "resize grow height 10 px or 5 ppt";
border = lib.mkForce background; "k" = "resize shrink height 10 px or 5 ppt";
childBorder = lib.mkForce background; "l" = "resize grow width 10 px or 5 ppt";
}; };
}; keybindings = {
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";
@@ -201,10 +194,12 @@ in {
"${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 window to workspace prev";
# "${modifier}+Shift+n" = "move container to workspace next"; "${modifier}+Shift+n" = "move window to workspace next";
# "${modifier}+b" = "workspace prev"; "${modifier}+Shift+x" = "exec --no-startup-id ${move-to-new-workspace}";
# "${modifier}+n" = "workspace next"; "${modifier}+b" = "workspace prev";
"${modifier}+n" = "workspace next";
"${modifier}+x" = "exec --no-startup-id ${new-workspace}";
"${modifier}+Shift+c" = "reload"; "${modifier}+Shift+c" = "reload";
"${modifier}+Shift+q" = "kill"; "${modifier}+Shift+q" = "kill";
@@ -213,9 +208,8 @@ in {
"${modifier}+z" = "sticky toggle"; "${modifier}+z" = "sticky toggle";
"${modifier}+Shift+z" = "floating toggle"; "${modifier}+Shift+z" = "floating toggle";
"${modifier}+s" = "scratchpad show";
"${modifier}+Shift+s" = "move scratchpad"; "${modifier}+Shift+s" = "move scratchpad";
"${modifier}+s" = ''[class="^(?i)(?!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";
@@ -223,36 +217,62 @@ in {
"${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 ${pkgs.writers.writeDash "newsboat-sync" ''
notify-send --app-name="newsboat" "Updating ..."
newsboat -x reload
notify-send --app-name="newsboat" "Finished updating."
''}";
# "${modifier}+Shift+y" = "exec ${pkgs.qutebrowser}/bin/qutebrowser";
"${modifier}+Return" = "exec ${(defaultApplications pkgs).terminal}"; "${modifier}+Return" = "exec ${(defaultApplications pkgs).terminal}";
"${modifier}+t" = "exec ${(defaultApplications pkgs).fileManager}"; "${modifier}+t" = "exec ${(defaultApplications pkgs).fileManager}";
"${modifier}+y" = "exec ${(defaultApplications pkgs).browser}"; "${modifier}+y" = "exec ${(defaultApplications pkgs).browser}";
"${modifier}+0" = "exec ${pkgs.scripts.menu-calc}/bin/=";
"${modifier}+d" = "exec ${pkgs.writers.writeDash "run" ''exec rofi -modi run,ssh,window -show run''}"; "${modifier}+Shift+w" = "exec ${pkgs.scripts.k-lock}/bin/k-lock";
"${modifier}+Shift+d" = "exec ${niveumPackages.notemenu}/bin/notemenu"; "${modifier}+d" = "exec ${pkgs.writers.writeDash "run" ''exec ${pkgs.rofi}/bin/rofi -modi run,window,ssh,filebrowser -show run''}";
"${modifier}+p" = "exec rofi-pass"; "${modifier}+Shift+d" = "exec ${
"${modifier}+Shift+p" = "exec rofi-pass --insert"; pkgs.writers.writeDash "notemenu" ''
"${modifier}+u" = "exec ${niveumPackages.unicodmenu}/bin/unicodmenu"; set -efu
PATH=$PATH:${
lib.makeBinPath [pkgs.rofi pkgs.findutils pkgs.coreutils]
}
"${modifier}+F7" = "exec ${pkgs.writers.writeDash "showkeys-toggle" '' cd ~/notes
if ${pkgs.procps}/bin/pgrep screenkey; then note_file=$({
exec ${pkgs.procps}/bin/pkill screenkey echo diary/$(date -I).md
else echo diary/$(date -I -d yesterday).md
exec ${pkgs.screenkey}/bin/screenkey find . -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2
fi } | rofi -dmenu -i -p 'notes')
''}"; if test "$note_file"
then
i3-sensible-terminal -e "$EDITOR" "$note_file"
fi
''
}";
"${modifier}+p" = "exec --no-startup-id ${pkgs.rofi-pass}/bin/rofi-pass";
"${modifier}+u" = "exec ${pkgs.scripts.unicodmenu}/bin/unicodmenu";
"${modifier}+F6" = "exec ${pkgs.xorg.xkill}/bin/xkill";
"${modifier}+F7" = "exec ${pkgs.scripts.showkeys-toggle}/bin/showkeys-toggle";
"${modifier}+F8" = "exec switch-theme toggle";
"${modifier}+F9" = "exec ${pkgs.redshift}/bin/redshift -O 4000 -b 0.85";
"${modifier}+F10" = "exec ${pkgs.redshift}/bin/redshift -x";
"${modifier}+F11" = "exec ${pkgs.xcalib}/bin/xcalib -invert -alter";
"${modifier}+F12" = "exec ${klem}/bin/klem"; "${modifier}+F12" = "exec ${klem}/bin/klem";
"XF86AudioLowerVolume" = "exec ${pkgs.pamixer}/bin/pamixer -d 5"; "Print" = "exec flameshot-once";
"XF86AudioMute" = "exec ${pkgs.pamixer}/bin/pamixer -t"; "XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5";
"XF86AudioRaiseVolume" = "exec ${pkgs.pamixer}/bin/pamixer -i 5"; "XF86AudioMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t";
"XF86AudioRaiseVolume" = "exec --no-startup-id ${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 --no-startup-id ${pkgs.playerctl}/bin/playerctl pause";
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; "XF86AudioPlay" = "exec --no-startup-id ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next"; "XF86AudioNext" = "exec --no-startup-id ${pkgs.playerctl}/bin/playerctl next";
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous"; "XF86AudioPrev" = "exec --no-startup-id ${pkgs.playerctl}/bin/playerctl previous";
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop"; "XF86AudioStop" = "exec --no-startup-id ${pkgs.playerctl}/bin/playerctl stop";
"XF86ScreenSaver" = "exec ${niveumPackages.k-lock}/bin/k-lock"; "XF86ScreenSaver" = "exec ${pkgs.scripts.k-lock}/bin/k-lock";
"XF86Display" = "exec ${pkgs.scripts.dmenurandr}/bin/dmenurandr";
# key names detected with xorg.xev: # key names detected with xorg.xev:
# XF86WakeUp (fn twice) # XF86WakeUp (fn twice)
@@ -268,74 +288,6 @@ in {
# XF86Back # XF86Back
# XF86Launch1 (thinkvantage) # XF86Launch1 (thinkvantage)
}; };
in {
wayland.windowManager.sway = {
enable = true;
config = {
menu = "rofi -modi run,ssh,window -show run";
inherit modifier modes gaps bars floating window colors keybindings;
input = {
"*" = {
xkb_layout = "de";
xkb_variant = "T3";
};
};
terminal = (defaultApplications pkgs).terminal;
up = "k";
down = "j";
left = "h";
right = "l";
seat = {
"*" = {
hide_cursor = "when-typing enable";
};
};
startup = [
{command = "echo hello";}
];
};
};
xsession.windowManager.i3 = {
enable = true;
extraConfig = ''
bindsym --release ${modifier}+Shift+w exec /run/wrappers/bin/slock
exec "${pkgs.obsidian}/bin/obsidian"
for_window [class="obsidian"] , move scratchpad
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 "email" "exec ${pkgs.alacritty}/bin/alacritty --class message -e aerc"}"
assign [class="wtf"] ${infoWorkspace}
exec ${dashboard}/bin/dashboard
'';
config = lib.mkMerge [
{
inherit modifier gaps modes bars floating window colors keybindings;
}
{
keybindings = let
new-workspace = pkgs.writers.writeDash "new-workspace" ''
i3-msg workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1))
'';
move-to-new-workspace = pkgs.writers.writeDash "new-workspace" ''
i3-msg move container to workspace $(($(i3-msg -t get_workspaces | tr , '\n' | grep '"num":' | cut -d : -f 2 | sort -rn | head -1) + 1))
'';
in {
"${modifier}+ß" = "exec ${niveumPackages.menu-calc}/bin/=";
"${modifier}+F6" = "exec ${pkgs.xorg.xkill}/bin/xkill";
"${modifier}+F9" = "exec ${pkgs.redshift}/bin/redshift -O 4000 -b 0.85";
"${modifier}+F10" = "exec ${pkgs.redshift}/bin/redshift -x";
"${modifier}+F11" = "exec ${pkgs.xcalib}/bin/xcalib -invert -alter";
"Print" = "exec flameshot gui";
# "${modifier}+Shift+x" = "exec ${move-to-new-workspace}";
# "${modifier}+x" = "exec ${new-workspace}";
"XF86Display" = "exec ${niveumPackages.dmenu-randr}/bin/dmenu-randr";
};
}
];
}; };
}; };
} }

View File

@@ -1,80 +0,0 @@
{
pkgs,
config,
...
}: {
age.secrets = {
miniflux-api-token = {
file = ../secrets/miniflux-api-token.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
home-manager.users.me = {
programs.i3status-rust = {
enable = true;
bars.bottom = {
icons = "awesome6";
settings = {
theme.overrides = let
colours = config.lib.stylix.colors.withHashtag;
in {
idle_bg = colours.base00;
idle_fg = colours.base05;
good_bg = colours.base00;
good_fg = colours.base0B;
warning_bg = colours.base00;
warning_fg = colours.base0A;
critical_bg = colours.base00;
critical_fg = colours.base09;
info_bg = colours.base00;
info_fg = colours.base04;
separator_bg = colours.base00;
separator = " ";
};
};
blocks = [
{
block = "music";
format = "{$icon $combo $play |}";
separator = " ";
}
{
block = "net";
format = " $icon HU";
missing_format = "";
device = "ppp0";
}
{
block = "net";
format = " $icon FU";
missing_format = "";
device = "tun0";
}
{
block = "battery";
device = config.niveum.batteryName;
}
{
block = "sound";
}
{
block = "disk_space";
format = "$icon $available";
}
{
block = "memory";
format = "$icon $mem_used.eng(prefix:G)";
}
{block = "load";}
{
block = "time";
format = "$icon $timestamp.datetime(f:'%Y-%m-%d (%W %a) %H:%M', l:de_DE)";
}
];
};
};
};
}

View File

@@ -9,52 +9,21 @@
de = "T3"; de = "T3";
gr = "polytonic"; gr = "polytonic";
ru = "phonetic"; ru = "phonetic";
arabic = ""; ara = "buckwalter";
coptic = "";
avestan = "";
gothic = "";
"in" = "san-kagapa";
il = "phonetic";
}; };
defaultLanguage = "de"; defaultLanguage = "de";
in { in {
# man 7 xkeyboard-config # man 7 xkeyboard-config
services.xserver = { services.xserver = {
exportConfiguration = true; # link /usr/share/X11 properly
layout = "de"; layout = "de";
# T3: https://upload.wikimedia.org/wikipedia/commons/a/a9/German-Keyboard-Layout-T3-Version1-large.png # T3: https://upload.wikimedia.org/wikipedia/commons/a/a9/German-Keyboard-Layout-T3-Version1-large.png
# buckwalter: http://www.qamus.org/transliteration.htm # buckwalter: http://www.qamus.org/transliteration.htm
xkbVariant = "T3"; xkbVariant = "T3";
xkbOptions = commaSep xkbOptions; xkbOptions =
commaSep xkbOptions;
libinput.enable = true; libinput.enable = true;
xkbDir = pkgs.symlinkJoin {
name = "x-keyboard-directory";
paths = [
"${pkgs.xkeyboard_config}/etc/X11/xkb"
(pkgs.linkFarm "custom-x-keyboards" [
{
name = "symbols/arabic";
path = ../lib/keyboards/arabic;
}
{
name = "symbols/coptic";
path = ../lib/keyboards/coptic;
}
{
name = "symbols/gothic";
path = ../lib/keyboards/gothic;
}
{
name = "symbols/avestan";
path = ../lib/keyboards/avestan;
}
])
];
};
}; };
environment.etc."x11-locale".source = toString pkgs.xorg.libX11 + "share/X11/locale";
console.keyMap = "de"; console.keyMap = "de";
environment.systemPackages = environment.systemPackages =

View File

@@ -6,47 +6,17 @@
}: let }: let
davHome = "~/.local/share/dav"; davHome = "~/.local/share/dav";
kmeinCloud = { kmeinCloud = {
davEndpoint = "https://cloud.kmein.de/remote.php/dav"; davEndpoint = "https://cloud.xn--kiern-0qa.de/remote.php/dav";
username = "kieran"; username = "kieran";
passwordFile = config.age.secrets.nextcloud-password-kieran.path; password = lib.fileContents <secrets/nextcloud/password>;
}; };
fysiCloud = { fysiCloud = {
davEndpoint = "https://nextcloud.fysi.dev/remote.php/dav"; davEndpoint = "https://nextcloud.fysi.dev/remote.php/dav";
username = "kmein"; username = "kmein";
passwordFile = config.age.secrets.nextcloud-password-fysi.path; password = lib.fileContents <secrets/nextcloud-fysi/password>;
}; };
in { in {
age.secrets = { environment.systemPackages = [pkgs.khal pkgs.vdirsyncer pkgs.khard pkgs.todoman];
nextcloud-password-kieran = {
file = ../secrets/nextcloud-password-kieran.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
nextcloud-password-fysi = {
file = ../secrets/nextcloud-password-fysi.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
};
environment.systemPackages = [
pkgs.khal
pkgs.vdirsyncer
pkgs.khard
pkgs.todoman
(pkgs.writers.writeDashBin "todo-procrastinate" ''
[ $# -eq 1 ] || {
echo "Usage: $0 TODO_ID" >&2
exit 1
}
todo_id=$1
new_timestamp=$(${pkgs.todoman}/bin/todo --porcelain show "$todo_id" | ${pkgs.jq}/bin/jq '.due + 24 * 60 * 60')
new_date=$(${pkgs.coreutils}/bin/date +"%Y-%m-%d %H:%M" -d "@$new_timestamp")
${pkgs.todoman}/bin/todo edit "$todo_id" --due "$new_date"
'')
];
systemd.user.services.vdirsyncer = { systemd.user.services.vdirsyncer = {
enable = true; enable = true;
@@ -54,7 +24,8 @@ in {
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
''; '';
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
@@ -103,9 +74,30 @@ in {
"khal/config".text = '' "khal/config".text = ''
[calendars] [calendars]
[[kalender_local]] [[alew]]
path = ${davHome}/calendar/* path = ${davHome}/calendar/alew
type = discover color = "light gray"
[[personal]]
path = ${davHome}/calendar/personal
color = "light cyan"
[[uni]]
path = ${davHome}/calendar/uni-1
color = "yellow"
[[fysi]]
path = ${davHome}/calendar/fysi-1
color = "light magenta"
[[fysi_team]]
path = ${davHome}/calendar/personal_shared_by_fdf
color = "light red"
[[birthdays]]
path = ${davHome}/contacts/contacts
type = birthdays
color = "light green"
[default] [default]
highlight_event_days = True highlight_event_days = True
@@ -137,7 +129,13 @@ in {
[pair kalender] [pair kalender]
a = "kalender_local" a = "kalender_local"
b = "kalender_cloud" b = "kalender_cloud"
collections = ["from b"] collections = ["personal", "alew", "uni-1"]
conflict_resolution = "b wins"
[pair fysi]
a = "kalender_local"
b = "fysi_cloud"
collections = ["fysi-1", "personal_shared_by_fdf"]
conflict_resolution = "b wins" conflict_resolution = "b wins"
[storage kontakte_local] [storage kontakte_local]
@@ -154,13 +152,19 @@ in {
type = "carddav" type = "carddav"
url = "${kmeinCloud.davEndpoint}/addressbooks/users/${kmeinCloud.username}/" url = "${kmeinCloud.davEndpoint}/addressbooks/users/${kmeinCloud.username}/"
username = "${kmeinCloud.username}" username = "${kmeinCloud.username}"
password.fetch = ["command", "cat", "${kmeinCloud.passwordFile}"] password = "${kmeinCloud.password}"
[storage kalender_cloud] [storage kalender_cloud]
type = "caldav" type = "caldav"
url = "${kmeinCloud.davEndpoint}/calendars/${kmeinCloud.username}/" url = "${kmeinCloud.davEndpoint}/calendars/${kmeinCloud.username}/"
username = "${kmeinCloud.username}" username = "${kmeinCloud.username}"
password.fetch = ["command", "cat", "${kmeinCloud.passwordFile}"] password = "${kmeinCloud.password}"
[storage fysi_cloud]
type = "caldav"
url = "${fysiCloud.davEndpoint}/calendars/${fysiCloud.username}/"
username = "${fysiCloud.username}"
password = "${fysiCloud.password}"
''; '';
}; };
}; };

View File

@@ -9,7 +9,7 @@
startAt = "weekly"; startAt = "weekly";
serviceConfig = { serviceConfig = {
user = "kfm"; user = "kfm";
WorkingDirectory = "/home/kfm/cloud/nextcloud/Books/Germanistik/LB"; WorkingDirectory = "/home/kfm/cloud/Seafile/Books/Germanistik/LB";
}; };
script = '' script = ''
first_year=2019 first_year=2019

View File

@@ -1,19 +0,0 @@
{pkgs, ...}: {
systemd.services.imaginary-illuminations = {
enable = false;
wants = ["network-online.target"];
serviceConfig = {
User = "kfm";
Group = "users";
WorkingDirectory = "/home/kfm/cloud/Seafile/Documents/Media/imaginary-illuminations";
Restart = "on-failure";
RestartSec = "15s";
};
startAt = "7:00";
script = ''
${pkgs.deno}/bin/deno run -A post.ts
'';
};
systemd.timers.imaginary-illuminations.timerConfig.RandomizedDelaySec = "14h";
}

View File

@@ -2,13 +2,6 @@
home-manager.users.me = { home-manager.users.me = {
xdg.mimeApps = { xdg.mimeApps = {
enable = true; enable = true;
associations = {
added = {
"x-scheme-handler/tg" = "org.telegram.desktop.desktop";
};
removed = {
};
};
defaultApplications = { defaultApplications = {
"application/epub+zip" = "org.pwmt.zathura.desktop"; "application/epub+zip" = "org.pwmt.zathura.desktop";
"application/pdf" = "org.pwmt.zathura.desktop"; "application/pdf" = "org.pwmt.zathura.desktop";
@@ -17,16 +10,16 @@
"image/jpeg" = "nsxiv.desktop"; "image/jpeg" = "nsxiv.desktop";
"image/png" = "nsxiv.desktop"; "image/png" = "nsxiv.desktop";
"image/vnd.djvu+multipage" = "org.pwmt.zathura.desktop"; "image/vnd.djvu+multipage" = "org.pwmt.zathura.desktop";
"text/html" = "firefox.desktop"; "text/html" = "brave-browser.desktop";
"text/markdown" = "nvim.desktop"; "text/markdown" = "nvim.desktop";
"text/plain" = "nvim.desktop"; "text/plain" = "nvim.desktop";
"x-scheme-handler/about" = "firefox.desktop"; "x-scheme-handler/about" = "brave-browser.desktop";
"x-scheme-handler/http" = "firefox.desktop"; "x-scheme-handler/http" = "brave-browser.desktop";
"x-scheme-handler/https" = "firefox.desktop"; "x-scheme-handler/https" = "brave-browser.desktop";
"x-scheme-handler/mailto" = "firefox.desktop"; "x-scheme-handler/mailto" = "brave-browser.desktop";
"x-scheme-handler/unknown" = "firefox.desktop"; "x-scheme-handler/unknown" = "brave-browser.desktop";
"x-scheme-handler/webcal" = "firefox.desktop"; "x-scheme-handler/webcal" = "brave-browser.desktop";
"x-scheme-handler/tg" = "org.telegram.desktop.desktop"; "inode/directory" = "pcmanfm.desktop";
}; };
}; };
}; };

View File

@@ -14,7 +14,6 @@
nginx.enable = false; nginx.enable = false;
node = { node = {
enable = true; enable = true;
openFirewall = true;
enabledCollectors = [ enabledCollectors = [
"conntrack" "conntrack"
"diskstats" "diskstats"
@@ -39,6 +38,8 @@
}; };
}; };
networking.firewall.allowedTCPPorts = [config.services.prometheus.exporters.node.port];
systemd.services.promtail = { systemd.services.promtail = {
description = "Promtail service for Loki"; description = "Promtail service for Loki";
wantedBy = ["multi-user.target"]; wantedBy = ["multi-user.target"];

View File

@@ -2,10 +2,9 @@
pkgs, pkgs,
lib, lib,
config, config,
niveumPackages,
... ...
}: let }: let
swallow = command: "${niveumPackages.swallow}/bin/swallow ${command}"; swallow = command: "${pkgs.scripts.swallow}/bin/swallow ${command}";
in { in {
environment.shellAliases.smpv = swallow "mpv"; environment.shellAliases.smpv = swallow "mpv";
@@ -23,7 +22,6 @@ in {
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 :(
}; };
bindings = { bindings = {
"Alt+RIGHT" = "add video-rotate 90"; "Alt+RIGHT" = "add video-rotate 90";
@@ -36,8 +34,8 @@ in {
"Alt+j" = "add video-pan-y -0.05"; "Alt+j" = "add video-pan-y -0.05";
}; };
scripts = [ scripts = [
pkgs.mpvScripts.quality-menu pkgs.mpvScripts.youtube-quality
niveumPackages.mpv-visualizer (pkgs.callPackage <niveum/packages/mpv-visualizer.nix> {})
]; ];
}; };
}; };

164
configs/neomutt.nix Normal file
View File

@@ -0,0 +1,164 @@
{
pkgs,
lib,
...
}: let
mainMailbox = "posteo";
accounts = import <niveum/lib/email.nix> {inherit lib mainMailbox;};
in {
environment.systemPackages = [pkgs.neomutt];
environment.shellAliases.mua = "${pkgs.neomutt}/bin/neomutt -f ${mainMailbox}";
home-manager.users.me.xdg.configFile."neomutt/neomuttrc".text = let
as-pdf = pkgs.writers.writeDash "as-pdf" ''
d=$(mktemp -d)
trap clean EXIT
clean() {
rm -rf "$d"
}
${pkgs.libreoffice}/bin/libreoffice --headless --convert-to pdf "$1" --outdir "$d"
${pkgs.zathura}/bin/zathura "$d"/*.pdf
'';
in ''
set mailcap_path = ${
pkgs.writeText "mailcap" ''
text/plain; $EDITOR %s ;
text/html; ${pkgs.lynx}/bin/lynx -assume_charset=%{charset} -display_charset=utf-8 -dump %s; nametemplate=%s.html; copiousoutput;
image/*; ${pkgs.nsxiv}/bin/nsxiv %s ;
video/*; ${pkgs.utillinux}/bin/setsid ${pkgs.mpv}/bin/mpv --quiet %s &; copiousoutput
audio/*; ${pkgs.mpv}/bin/mpv %s ;
application/pdf; ${pkgs.zathura}/bin/zathura %s ;
application/pgp-encrypted; ${pkgs.gnupg}/bin/gpg -d '%s'; copiousoutput;
application/pgp-keys; ${pkgs.gnupg}/bin/gpg --import '%s'; copiousoutput;
application/vnd.openxmlformats-officedocument.wordprocessingml.document; ${as-pdf} %s;
application/vnd.oasis.opendocument.text; ${as-pdf} %s;
application/vnd.openxmlformats*; ${pkgs.libreoffice}/bin/soffice '%s';
''
}:$mailcap_path
set sidebar_visible
set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S"
set sidebar_width = 25 # Plenty of space
set sidebar_divider_char = '' # Pretty line-drawing character
set mail_check_stats
set index_format="%2C %Z %D %-15.15L %s"
set date_format="%F %R"
set sort = 'reverse-date'
set sleep_time = 0 # Pause 0 seconds for informational messages
set markers = no # Disables the `+` displayed at line wraps
set mark_old = no # Unread mail stay unread until read
set wait_key = no # mutt won't ask "press key to continue"
set fast_reply # skip to compose when replying
set forward_format = "Fwd: %s" # format of subject when forwarding
set reverse_name # reply as whomever it was to
set include=ask-no # don't include message in replies
auto_view text/html # automatically show html (mailcap uses lynx)
auto_view application/pgp-encrypted
alternative_order text/plain text/enriched text/html
set abort_noattach abort_noattach_regex="\<(attach|attached|attachments?|anbei|Anhang|angehängt)\>"
set attach_save_dir=/tmp
set fast_reply
set narrow_tree # narrow threads for more depth
bind index,pager B sidebar-toggle-visible # Use 'B' to switch the Sidebar on and off
bind index,pager \Ck sidebar-prev
bind index,pager \Cj sidebar-next
bind index,pager \Co sidebar-open
bind index,pager \Cp sidebar-prev-new
bind index,pager \Cn sidebar-next-new
macro index * <limit>~F\r
macro index + <limit>all\r
set query_command = "khard email --parsable %s"
bind editor <Tab> complete-query
bind editor ^T complete
set mail_check = 90
set timeout = 15
# set imap_check_subscribed
set use_from
set header_cache="~/.cache/mutt" message_cachedir="~/.cache/mutt"
source ${
pkgs.writeText "accounts.neomuttrc" ''
set realname = "Kierán Meinhardt"
account-hook . 'unset imap_user imap_pass smtp_user smtp_pass'
# set accordingly: postponed trash record
${
lib.concatStringsSep "\n\n" (lib.mapAttrsToList (name: account: let
imapRoot = "imaps://${account.user}@${account.imap}";
in ''
account-hook ${account.user}@${account.imap} 'set imap_user="${account.user}" imap_pass="${account.password}"'
account-hook ${account.user}@${account.smtp} 'set smtp_user="${account.user}" smtp_pass="${account.password}"'
folder-hook ${account.user}@${account.imap} 'set smtp_url="${account.smtpSettings "${account.user}@${account.smtp}"}" from="${account.address}" record="${imapRoot}/${account.folders.sent}" postponed="${imapRoot}/${account.folders.drafts}" trash="${imapRoot}/${account.folders.trash}"'
named-mailboxes "${name}" "${imapRoot}" "${name}" "${imapRoot}/${account.folders.sent}"
'')
accounts)
}
''
}
set spoolfile="${mainMailbox}"
source ${
pkgs.writeText "colors.neomuttrc" ''
# Default index colors:
color index_number blue default
color index red default '.*'
color index_flags lightcyan default '.*'
color index_author yellow default '.*'
color index_subject default default '.*'
# New mail is boldened:
color index_author lightyellow default "~N"
color index_subject lightwhite default "~N"
# Flagged mail is highlighted:
color index_flags lightmagenta default '~F'
# Other colors and aesthetic settings:
mono bold bold
mono underline underline
mono error bold
mono indicator reverse
# color sidebar_flagged red black
mono sidebar_new bold
color error red default
color message cyan default
color search brightmagenta default
color hdrdefault lightblack default
color quoted green default
color quoted1 blue default
color quoted2 cyan default
color quoted3 yellow default
color quoted4 red default
color quoted5 brightred default
color signature lightblack default
color tree color235 default
# Regex highlighting:
color header red default "^(Date)"
color header yellow default "^(From)"
color header white default "^(B?CC)"
color header brightwhite default "^(Subject)"
color body cyan default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL
color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow
color body red default "(BAD signature)|^gpg: BAD signature from.*"
color body brightgreen default "(Good signature)|^gpg: Good signature .*"
color body brightyellow default "^gpg: "
mono body bold "^gpg: Good signature"
mono body bold "^gpg: BAD signature from.*"
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
''
}
'';
}

View File

@@ -1,40 +1,78 @@
{ {pkgs, ...}: {
pkgs,
niveumPackages,
...
}: {
environment.variables.EDITOR = pkgs.lib.mkForce "nvim"; environment.variables.EDITOR = pkgs.lib.mkForce "nvim";
environment.shellAliases.vi = "nvim"; environment.shellAliases.vi = "nvim";
environment.shellAliases.vim = "nvim"; environment.shellAliases.vim = "nvim";
environment.shellAliases.view = "nvim -R"; environment.shellAliases.view = "nvim -R";
home-manager.users.me = { nixpkgs.config.packageOverrides = pkgs: {
editorconfig = { vimPlugins =
enable = true; pkgs.vimPlugins
settings = { // {
"*" = { cheat-sh-vim = pkgs.callPackage <niveum/packages/vimPlugins/cheat-sh.nix> {};
charset = "utf-8"; vim-fetch = pkgs.callPackage <niveum/packages/vimPlugins/vim-fetch.nix> {};
end_of_line = "lf"; vim-colors-paramount = pkgs.callPackage <niveum/packages/vimPlugins/vim-colors-paramount.nix> {};
trim_trailing_whitespace = true; vim-256noir = pkgs.callPackage <niveum/packages/vimPlugins/vim-256noir.nix> {};
insert_final_newline = true; icalendar-vim = pkgs.callPackage <niveum/packages/vimPlugins/icalendar-vim.nix> {};
indent_style = "space"; jq-vim = pkgs.callPackage <niveum/packages/vimPlugins/jq-vim.nix> {};
indent_size = 2; vim-fsharp = pkgs.callPackage <niveum/packages/vimPlugins/vim-fsharp.nix> {};
}; vim-reason-plus = pkgs.callPackage <niveum/packages/vimPlugins/vim-reason-plus.nix> {};
"*.py" = { vim-mail = pkgs.callPackage <niveum/packages/vimPlugins/vim-mail.nix> {};
indent_size = 4;
};
Makefile = {
indent_style = "tab";
};
"*.md" = {
trim_trailing_whitespace = false;
};
}; };
};
}; };
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "vim" ''neovim "$@"'') (pkgs.writers.writeDashBin "vim" ''neovim "$@"'')
niveumPackages.vim (pkgs.neovim.override {
configure = {
customRC = builtins.readFile <niveum/lib/vim/init.vim>;
packages.nvim = with pkgs.vimPlugins; {
start = [
ale
fzf-vim
fzfWrapper
supertab
undotree
tabular
# vimwiki
vim-colors-paramount
vim-commentary
vim-css-color
vim-eunuch
vim-fetch
vim-fugitive
vim-gitgutter
vim-repeat
vim-sensible
vim-surround
(pkgs.vimUtils.buildVimPlugin {
name = "vim-dim-1.1.0";
src = pkgs.fetchFromGitHub {
owner = "jeffkreeftmeijer";
repo = "vim-dim";
rev = "1.1.0";
sha256 = "sha256-lyTZUgqUEEJRrzGo1FD8/t8KBioPrtB3MmGvPeEVI/g=";
};
})
];
opt = [
csv
elm-vim
emmet-vim
haskell-vim
icalendar-vim
jq-vim
rust-vim
typescript-vim
vim-javascript
vim-ledger
vim-nix
vimtex
vim-pandoc
vim-pandoc-syntax
vim-256noir
];
};
};
})
]; ];
} }

View File

@@ -42,6 +42,8 @@
}; };
}; };
in { in {
imports = [<niveum/modules/networkmanager-declarative.nix>];
programs.nm-applet.enable = true; programs.nm-applet.enable = true;
networking.networkmanager = { networking.networkmanager = {
@@ -53,6 +55,39 @@ in {
wifi.macAddress = "random"; wifi.macAddress = "random";
ethernet.macAddress = "random"; ethernet.macAddress = "random";
unmanaged = ["docker*"]; unmanaged = ["docker*"];
profiles = lib.mapAttrs profile {
Aether = {
connection.uuid = "7138bb0f-1aeb-4905-890e-a6628427aa21";
ipv6.addr-gen-mode = "stable";
wifi.cloned-mac-address = "stable";
wifi-security = {
psk = lib.strings.fileContents <secrets/wifi/Aether.psk>;
auth-alg = "open";
key-mgmt = "wpa-psk";
};
};
FactoryCommunityGuest = {
connection.uuid = "fb1f2e52-651e-48b5-a72c-1accddf31afb";
connection.timestamp = "1631885129";
wifi.seen-bssids = "54:EC:2F:19:30:DC;54:EC:2F:19:5C:9C;54:EC:2F:58:E4:3C;";
wifi-security = {
psk = "Factory4ever";
auth-alg = "open";
key-mgmt = "wpa-psk";
};
};
o2-WLAN66 = {
connection.uuid = "c563aec3-f344-4ffb-8d1c-60a6cdac8fe0";
wifi-security = {
psk = "PK3468KV488T934U";
auth-alg = "open";
key-mgmt = "wpa-psk";
};
};
"WIFI@DB".connection.uuid = "4eff4e94-8850-4e9f-a338-1787d0d90479";
eduroam = eduroamProfile;
eduroam_5GHz = eduroamProfile;
};
}; };
users.users.me.extraGroups = ["networkmanager"]; users.users.me.extraGroups = ["networkmanager"];

View File

@@ -1,7 +1,6 @@
{ {
pkgs, pkgs,
config, config,
lib,
... ...
}: let }: let
ytdl-format = "'bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best'"; ytdl-format = "'bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best'";
@@ -9,32 +8,10 @@
youtube-download = "${pkgs.ts}/bin/ts ${pkgs.yt-dlp}/bin/yt-dlp -f ${ytdl-format} --add-metadata"; youtube-download = "${pkgs.ts}/bin/ts ${pkgs.yt-dlp}/bin/yt-dlp -f ${ytdl-format} --add-metadata";
newsboat-home = "${config.users.users.me.home}/cloud/Seafile/Documents/newsboat"; newsboat-home = "${config.users.users.me.home}/cloud/Seafile/Documents/newsboat";
linkhandler = pkgs.writers.writeDash "linkhandler" '' linkhandler-bin = "${pkgs.scripts.linkhandler}/bin/linkhandler";
# Feed script a url or file location.
# If an image, it will view in sxiv,
# if a video or gif, it will view in mpv
# if a music file or pdf, it will download,
# otherwise it opens link in browser.
# If no url given. Opens browser. For using script as $BROWSER.
[ -z "$1" ] && { "$BROWSER"; exit; }
case "$1" in
*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*)
setsid -f ${pkgs.mpv}/bin/mpv -quiet "$1" >/dev/null 2>&1 ;;
*png|*jpg|*jpe|*jpeg|*gif)
curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///")" >/dev/null 2>&1 & ;;
*mp3|*flac|*opus|*mp3?source*)
setsid -f tsp curl -LO "$1" >/dev/null 2>&1 ;;
*)
if [ -f "$1" ]; then "$TERMINAL" -e "$EDITOR" "$1"
else setsid -f "$BROWSER" "$1" >/dev/null 2>&1; fi ;;
esac
'';
newsboat-config = pkgs.writeText "config" '' newsboat-config = pkgs.writeText "config" ''
auto-reload no auto-reload no
reload-threads 8
prepopulate-query-feeds yes prepopulate-query-feeds yes
# dont keep a search history # dont keep a search history
@@ -44,12 +21,12 @@
text-width 85 text-width 85
external-url-viewer "${pkgs.urlscan}/bin/urlscan -dc -r '${linkhandler} {}'" external-url-viewer "${pkgs.urlscan}/bin/urlscan -dc -r '${linkhandler-bin} {}'"
browser ${linkhandler} browser ${linkhandler-bin}
macro , open-in-browser macro , open-in-browser
macro c set browser "${pkgs.xsel}/bin/xsel -b <<<" ; open-in-browser ; set browser ${linkhandler} macro c set browser "${pkgs.xsel}/bin/xsel -b <<<" ; open-in-browser ; set browser ${linkhandler-bin}
macro v set browser "${pkgs.util-linux}/bin/setsid -f ${pkgs.mpv}/bin/mpv" ; open-in-browser ; set browser ${linkhandler} macro v set browser "${pkgs.utillinux}/bin/setsid -f ${pkgs.mpv}/bin/mpv" ; open-in-browser ; set browser ${linkhandler-bin}
macro y set browser "${youtube-download}" ; open-in-browser ; set browser ${linkhandler} macro y set browser "${youtube-download}" ; open-in-browser ; set browser ${linkhandler-bin}
bind-key j down bind-key j down
bind-key k up bind-key k up
@@ -84,15 +61,16 @@
color listfocus blue default color listfocus blue default
color listfocus_unread blue default bold color listfocus_unread blue default bold
color info red default bold color info red default bold
urls-source "miniflux"
miniflux-url "https://feed.kmein.de"
miniflux-login "kfm"
miniflux-password "${lib.strings.fileContents <secrets/miniflux/password>}"
''; '';
newsboat-sql = "${pkgs.sqlite}/bin/sqlite3 ${newsboat-home}/cache.db"; newsboat-sql = "${pkgs.sqlite}/bin/sqlite3 ${newsboat-home}/cache.db";
in { in {
nixpkgs.config.packageOverrides = pkgs: {
newsboat = pkgs.writers.writeDashBin "newsboat" ''
${pkgs.newsboat}/bin/newsboat -C ${newsboat-config} -c ${newsboat-home}/cache.db -u ${newsboat-home}/urls "$@"
'';
};
environment.systemPackages = [ environment.systemPackages = [
pkgs.newsboat pkgs.newsboat
(pkgs.writers.writeDashBin "newsboat-unread-count" '' (pkgs.writers.writeDashBin "newsboat-unread-count" ''

View File

@@ -1,14 +1,24 @@
{ {pkgs, ...}: {
pkgs,
inputs,
...
}: {
nixpkgs = { nixpkgs = {
config.allowUnfree = true; config.allowUnfree = true;
overlays = [
(import <nix-writers/pkgs>)
(import <stockholm/krebs/5pkgs>)
];
}; };
nix = { nix = {
package = pkgs.nixFlakes; package = pkgs.nixUnstable;
extraOptions = "experimental-features = nix-command flakes"; extraOptions = "experimental-features = nix-command flakes";
nixPath = ["nixpkgs=${inputs.nixpkgs}"]; settings = {
substituters = [
"http://cache.prism.r"
"https://cache.nixos.org/"
];
trusted-public-keys = [
"cache.prism-1:+S+6Lo/n27XEtvdlQKuJIcb1yO5NUqUCE2lolmTgNJU="
"cache.prism-2:YwmCm3/s/D+SxrPKN/ETjlpw/219pNUbpnluatp6FKI="
"hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs="
];
};
}; };
} }

66
configs/nsxiv.nix Normal file
View File

@@ -0,0 +1,66 @@
{
pkgs,
lib,
...
}: let
important-directories = pkgs.writeText "directories" ''
h ~/
d ~/cloud/Dropbox/
g ~/cloud/gdrive/
s ~/cloud/Seafile/
kk ~/cloud/keybase/private/kmein/
kp ~/cloud/keybase/public/kmein/
t /tmp
D ~/Downloads
cf ''${XDG_CONFIG_HOME:-$HOME/.config}
'';
in {
environment.systemPackages = [pkgs.nsxiv];
# TODO fix
home-manager.users.me.xdg.configFile."nsxiv/exec/key-handler".source = pkgs.writers.writeDash "key-handler" ''
PATH=$PATH:${
lib.makeBinPath [
pkgs.gnused
pkgs.gawk
pkgs.dmenu
pkgs.coreutils
pkgs.libnotify
pkgs.imagemagick
pkgs.xclip
]
}
echo >&2 key "$1" pressed
while read file; do
case "$1" in
"c")
[ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ${important-directories} | awk '{print $2}' | dmenu -l 20 -i -p "Copy file(s) to where?" | sed "s|~|$HOME|g")"
[ -z "$destdir" ] && exit
[ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit
cp "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file copied to $destdir." &
;;
"m")
[ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ${important-directories} | awk '{print $2}' | dmenu -l 20 -i -p "Move file(s) to where?" | sed "s|~|$HOME|g")"
[ -z "$destdir" ] && exit
[ ! -d "$destdir" ] && notify-send "$destdir is not a directory, cancelled." && exit
mv "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file moved to $destdir." &
;;
"r")
convert -rotate 90 "$file" "$file" ;;
"R")
convert -rotate -90 "$file" "$file" ;;
"f")
convert -flop "$file" "$file" ;;
"y")
echo -n "$file" | xclip -selection clipboard &&
notify-send "$file copied to clipboard" & ;;
"Y")
readlink -f "$file" | xclip -selection clipboard &&
notify-send "$(readlink -f "$file") copied to clipboard" & ;;
"d")
[ "$(printf "No\\nYes" | dmenu -i -p "Really delete $file?")" = "Yes" ] && rm "$file" && notify-send "$file deleted." ;;
esac
done
'';
}

View File

@@ -1,13 +1,12 @@
{ {
config,
pkgs, pkgs,
lib, lib,
inputs,
niveumPackages,
unstablePackages,
... ...
}: let }: let
worldradio = pkgs.callPackage ../packages/worldradio.nix {}; hc = pkgs.callPackage <stockholm/tv/5pkgs/simple/hc.nix> {};
worldradio = pkgs.callPackage <niveum/packages/worldradio.nix> {};
menstruation = pkgs.callPackage <menstruation-backend> {};
pandoc-doc = pkgs.callPackage <niveum/packages/man/pandoc.nix> {};
zoteroStyle = { zoteroStyle = {
name, name,
@@ -30,7 +29,7 @@
}) })
(zoteroStyle { (zoteroStyle {
name = "apa"; name = "apa";
sha256 = "sha256-sUf0Ov5c9aTUoLsYSRbQl3Qs9ELkb5/Tky35kH7pKuE="; sha256 = "sha256-yq4fW6hQknycLjaj5fPbXLrQlGBp5myXiOSHBU90jEc=";
}) })
]; ];
@@ -54,6 +53,8 @@
' $out/astrolog/astrolog.as ' $out/astrolog/astrolog.as
''; '';
}); });
recht = pkgs.callPackage <recht> {};
in { in {
home-manager.users.me.home.file = { home-manager.users.me.home.file = {
".csl".source = cslDirectory; ".csl".source = cslDirectory;
@@ -65,7 +66,8 @@ in {
aria2 aria2
firefox firefox
tdesktop tdesktop
gomuks w3m
wget
whois whois
dnsutils dnsutils
# FILE MANAGERS # FILE MANAGERS
@@ -75,22 +77,43 @@ in {
ffmpeg ffmpeg
imagemagick imagemagick
exiftool exiftool
nsxiv # ARCHIVE TOOLS
graphviz unzip
unrar
p7zip
zip
# MONITORS
htop
iotop # I/O load monitor
iftop # interface bandwidth monitor
lsof # list open files
psmisc # for killall, pstree
# SHELL # SHELL
bat # better cat bat # better cat
fd # better find
file # determine file type
dos2unix dos2unix
genpass # generate passwords genpass # generate passwords
gcc ncdu # ncurses disk usage
rmlint # remove duplicate files
python3Packages.jsonschema # json validation python3Packages.jsonschema # json validation
jq # json toolkit
pup # html toolkit pup # html toolkit
htmlq htmlq
xsv # csv toolkit xsv # csv toolkit
xmlstarlet # xml toolkit
man-pages man-pages
man-pages-posix posix_man_pages
tree
exfat # to mount windows drives exfat # to mount windows drives
parallel # for parallel, since moreutils shadows task spooler
ripgrep # better grep
rlwrap
progress # display progress bars for pipes
# HARDWARE TOOLS # HARDWARE TOOLS
gnome.gnome-disk-utility usbutils # for lsusb
pciutils # for lspci
lshw # for lshw
arandr # xrandr for noobs arandr # xrandr for noobs
libnotify # for notify-send libnotify # for notify-send
xclip # clipboard CLI xclip # clipboard CLI
@@ -100,10 +123,7 @@ in {
calibre calibre
electrum electrum
inkscape inkscape
krita
gthumb
astrolog astrolog
obsidian
anki-bin # flashcards anki-bin # flashcards
jbofihe # lojbanic software jbofihe # lojbanic software
zoom-us # video conferencing zoom-us # video conferencing
@@ -112,68 +132,69 @@ in {
pdftk # pdf toolkit pdftk # pdf toolkit
mupdf mupdf
poppler_utils # pdf toolkit poppler_utils # pdf toolkit
foxitreader # for viewing pdf annotations
okular # the word is nucular okular # the word is nucular
xournalpp # for annotating pdfs xournalpp # for annotating pdfs
pdfpc # presenter console for pdf slides pdfpc # presenter console for pdf slides
niveumPackages.hc # print files as qr codes hc # print files as qr codes
yt-dlp yt-dlp
espeak espeak
rink # unit converter bc # calculator
niveumPackages.auc pari # gp -- better calculator
niveumPackages.cheat-sh scripts.auc
niveumPackages.polyglot scripts.stackoverflow
niveumPackages.qrpaste scripts.infschmv
niveumPackages.ttspaste scripts.qrpaste
niveumPackages.new-mac # get a new mac address scripts.ttspaste
niveumPackages.scanned scripts.new-mac # get a new mac address
niveumPackages.default-gateway scripts.scanned
niveumPackages.kirciuoklis scripts.default-gateway
niveumPackages.image-convert-favicon scripts.showkeys-toggle
niveumPackages.heuretes scripts.kirciuoklis
niveumPackages.ipa # XSAMPA to IPA converter scripts.favicon
niveumPackages.pls scripts.heuretes
niveumPackages.mpv-tv scripts.ipa # XSAMPA to IPA converter
niveumPackages.mpv-iptv scripts.playlist
jellyfin-media-player scripts.mpv-tv
niveumPackages.devanagari scripts.devanagari
niveumPackages.betacode # ancient greek betacode to unicode converter scripts.betacode # ancient greek betacode to unicode converter
niveumPackages.meteo scripts.meteo
niveumPackages.mahlzeit scripts.mahlzeit
niveumPackages.jq-lsp recht
niveumPackages.swallow # window swallowing scripts.vimv
niveumPackages.literature-quote scripts.swallow # window swallowing
niveumPackages.booksplit scripts.literature-quote
niveumPackages.dmenu-randr jless # less(1) for json
niveumPackages.dmenu-bluetooth scripts.notetags
niveumPackages.manual-sort scripts.booksplit
niveumPackages.dns-sledgehammer scripts.dmenurandr
niveumPackages.wttr scripts.interdimensional-cable
niveumPackages.unicodmenu scripts.dmenubluetooth
niveumPackages.emailmenu scripts.manual-sort
niveumPackages.closest scripts.much-scripts
niveumPackages.trans scripts.dns-sledgehammer
(niveumPackages.mpv-radio.override { ts
di-fm-key-file = config.age.secrets.di-fm-key.path; scripts.vg
}) scripts.fkill
(niveumPackages.mpv-tuner.override { scripts.wttr
di-fm-key-file = config.age.secrets.di-fm-key.path; scripts.unicodmenu
}) scripts.closest
scripts.trans
scripts.mpv-radio
# kmein.slide # kmein.slide
termdown scripts.tolino-screensaver
niveumPackages.image-convert-tolino scripts.rfc
niveumPackages.rfc scripts.tag
niveumPackages.tag scripts.timer
niveumPackages.timer python3Packages.eyeD3
niveumPackages.menu-calc scripts.menu-calc
nix-prefetch-git nix-prefetch-git
niveumPackages.nix-git scripts.nix-git
nixfmt nixfmt
par par
qrencode qrencode
# inputs.menstruation-backend.defaultPackage.x86_64-linux menstruation
inputs.agenix.packages.x86_64-linux.default
inputs.recht.defaultPackage.x86_64-linux
(pkgs.writers.writeDashBin "worldradio" '' (pkgs.writers.writeDashBin "worldradio" ''
shuf ${worldradio} | ${pkgs.findutils}/bin/xargs ${pkgs.mpv}/bin/mpv --no-video shuf ${worldradio} | ${pkgs.findutils}/bin/xargs ${pkgs.mpv}/bin/mpv --no-video
@@ -183,27 +204,24 @@ in {
${pkgs.openssh}/bin/ssh makanek "cd /var/lib/weechat/logs && grep --ignore-case --color=always --recursive $@" | ${pkgs.less}/bin/less --raw-control-chars ${pkgs.openssh}/bin/ssh makanek "cd /var/lib/weechat/logs && grep --ignore-case --color=always --recursive $@" | ${pkgs.less}/bin/less --raw-control-chars
'') '')
(pkgs.writers.writeDashBin "ncmpcpp-zaatar" ''MPD_HOST=${(import ../lib/local-network.nix).zaatar} exec ${pkgs.ncmpcpp}/bin/ncmpcpp "$@"'') (pkgs.writers.writeDashBin "ncmpcpp-zaatar" ''MPD_HOST=${(import <niveum/lib/local-network.nix>).zaatar} exec ${pkgs.ncmpcpp}/bin/ncmpcpp "$@"'')
(pkgs.writers.writeDashBin "mpc-zaatar" ''MPD_HOST=${(import ../lib/local-network.nix).zaatar} exec ${pkgs.mpc_cli}/bin/mpc "$@"'') (pkgs.writers.writeDashBin "mpc-zaatar" ''MPD_HOST=${(import <niveum/lib/local-network.nix>).zaatar} exec ${pkgs.mpc_cli}/bin/mpc "$@"'')
inputs.scripts.packages.x86_64-linux.alarm
spotify spotify
ncspot ncspot
playerctl playerctl
nix-index nix-index
niveumPackages.nix-index-update scripts.nix-index-update
#krebs #krebs
niveumPackages.dic dic
config.nur.repos.mic92.ircsink cyberlocker-tools
untilport
(haskellPackages.ghcWithHoogle (hs: [ kpaste
hs.text irc-announce
hs.lens git-preview
hs.bytestring ircaids
]))
(python3.withPackages (py: [ (python3.withPackages (py: [
py.black py.black
@@ -215,47 +233,28 @@ in {
py.pygments py.pygments
py.schema py.schema
])) ]))
# python3Packages.poetry python3Packages.poetry
# language servers
pyright
haskell-language-server
texlab
nil
rust-analyzer
elmPackages.elm-language-server
nodePackages.typescript-language-server
lua-language-server
nodePackages.vscode-langservers-extracted
dhall-lsp-server
dhall-nix
dhall-bash
dhall-json
dhall
html-tidy html-tidy
nodePackages.csslint nodePackages.csslint
nodePackages.jsonlint nodePackages.jsonlint
nodePackages.prettier nodePackages.prettier
nodePackages.typescript nodePackages.typescript
nodePackages.eslint
nodePackages.yarn nodePackages.yarn
deno # better node.js
nodejs nodejs
nodePackages.javascript-typescript-langserver
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
niveumPackages.text2pdf scripts.text2pdf
lowdown lowdown
glow # markdown to term glow # markdown to term
libreoffice libreoffice
# gnumeric # gnumeric
dia dia
pandoc pandoc
# niveumPackages.man-pandoc pandoc-doc
typst
# proselint # proselint
asciidoctor asciidoctor
wordnet wordnet
@@ -266,22 +265,11 @@ in {
shellcheck shellcheck
(pkgs.writers.writeDashBin "hass-cli" '' (pkgs.writers.writeDashBin "hass-cli" ''
HASS_SERVER=http://zaatar.r:8123 HASS_TOKEN="$(cat ${config.age.secrets.home-assistant-token.path})" exec ${pkgs.home-assistant-cli}/bin/hass-cli "$@" HASS_SERVER=http://zaatar.r:8123 HASS_TOKEN=${lib.strings.fileContents <secrets/hass/token>} exec ${pkgs.home-assistant-cli}/bin/hass-cli "$@"
'') '')
scripts.rofi-hass
# xml
saxonb_9_1
libxml2
zotero
]; ];
age.secrets.home-assistant-token = {
file = ../secrets/home-assistant-token.age;
owner = config.users.users.me.name;
group = config.users.users.me.group;
mode = "400";
};
home-manager.users.me.xdg.configFile."pycodestyle".text = '' home-manager.users.me.xdg.configFile."pycodestyle".text = ''
[pycodestyle] [pycodestyle]
max-line-length = 110 max-line-length = 110

View File

@@ -1,25 +0,0 @@
{
services.picom = {
enable = true;
# activeOpacity = 1;
fade = true;
fadeDelta = 1;
# inactiveOpacity = 0.9;
# shadow = true;
# menuOpacity = 0.9;
# shadowOpacity = 0.3;
fadeExclude = [
"class_g = 'slock'" # don't want a transparent lock screen!
"name *?= 'slock'"
"focused = 1"
];
opacityRules = [
# opacity-rule overrides both inactive and active opacity
# video in browser tabs
# substring /regex match of title bar text
"99:name *?= 'Youtube'"
"99:WM_CLASS@:s *= 'mpv$'"
];
};
}

View File

@@ -5,13 +5,15 @@
}: 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 = { imports = [<stockholm/krebs/3modules/power-action.nix>];
krebs.power-action = {
enable = true; enable = true;
plans.suspend = { plans.suspend = {
upperLimit = 7; upperLimit = 7;
lowerLimit = 0; lowerLimit = 0;
charging = false; charging = false;
action = pkgs.writers.writeDash "suspend-wrapper" '' action = pkgs.writeDash "suspend-wrapper" ''
/run/wrappers/bin/sudo ${suspend} /run/wrappers/bin/sudo ${suspend}
''; '';
}; };
@@ -19,6 +21,6 @@ in {
}; };
security.sudo.extraConfig = '' security.sudo.extraConfig = ''
${config.services.power-action.user} ALL= (root) NOPASSWD: ${suspend} ${config.krebs.power-action.user} ALL= (root) NOPASSWD: ${suspend}
''; '';
} }

View File

@@ -1,5 +1,5 @@
{pkgs, ...}: let {pkgs, ...}: let
inherit (import ../lib) localAddresses; inherit (import <niveum/lib>) localAddresses;
hp-driver = pkgs.hplip; hp-driver = pkgs.hplip;
in { in {
services.printing = { services.printing = {

View File

@@ -3,10 +3,9 @@
pkgs, pkgs,
... ...
}: { }: {
networking.hosts = {"42:0:ca48:f98f:63d7:31ce:922b:245d" = ["go"];}; imports = [
<niveum/modules/retiolum.nix>
];
services.tinc.networks.retiolum = { networking.hosts = {"42:0:ca48:f98f:63d7:31ce:922b:245d" = ["go"];};
rsaPrivateKeyFile = config.age.secrets.retiolum-rsa.path;
ed25519PrivateKeyFile = config.age.secrets.retiolum-ed25519.path;
};
} }

View File

@@ -1,18 +1,13 @@
{pkgs, ...}: { {
config,
pkgs,
...
}: let
inherit (import <niveum/lib>) colours;
in {
home-manager.users.me.programs.rofi = { home-manager.users.me.programs.rofi = {
enable = true; enable = true;
pass = { font = "Monospace 10";
enable = true; theme = "${pkgs.rofi}/share/rofi/themes/Arc-Dark.rasi";
extraConfig = ''
_pwgen() {
${pkgs.genpass}/bin/genpass "$@"
}
USERNAME_field='login'
default_user2=kmein
help_color="#FF0000"
''; # help_color set by https://github.com/mrossinek/dotfiles/commit/13fc5f24caa78c8f20547bf473266879507f13bf
};
plugins = [pkgs.rofi-calc];
}; };
} }

View File

@@ -7,10 +7,4 @@
fonts.fontconfig.enable = false; fonts.fontconfig.enable = false;
nix.gc.automatic = true; nix.gc.automatic = true;
nix.optimise.automatic = true; nix.optimise.automatic = true;
services.journald.extraConfig = "SystemMaxUse=500M";
# https://webzine.snowflake.ovh/issue-001.html -- garbage collect when less then 1 GB is available, make 3 GB fee
nix.extraOptions = ''
min-free = 1073741824
max-free = 3221225472
'';
} }

View File

@@ -1,37 +0,0 @@
{pkgs, ...}: {
sound.enable = true;
services.pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
pulse.enable = true;
jack.enable = true;
};
systemd.user.services.pipewire-pulse.path = [pkgs.pulseaudio];
services.avahi = {
enable = true;
publish.enable = true;
publish.userServices = true;
};
environment.etc."pipewire/pipewire-pulse.conf.d/50-network-party.conf".text = ''
context.exec = [
{ path = "pactl" args = "load-module module-native-protocol-tcp" }
{ path = "pactl" args = "load-module module-zeroconf-discover" }
{ path = "pactl" args = "load-module module-zeroconf-publish" }
]
'';
environment.systemPackages = [
pkgs.pavucontrol
pkgs.ncpamixer
pkgs.pamixer
pkgs.pulsemixer
pkgs.pulseaudio # for pactl
];
}

View File

@@ -1,43 +1,26 @@
{pkgs, ...}: let {
inherit (import ../lib) sshPort kieran; pkgs,
externalNetwork = import ../lib/external-network.nix; config,
lib,
...
}: let
inherit (import <niveum/lib>) sshPort kieran;
externalNetwork = import <niveum/lib/external-network.nix>;
sshIdentity = name: "${config.users.users.me.home}/.ssh/${name}";
ssh-passphease = lib.strings.fileContents <system-secrets/ssh/passphrase>;
in { in {
users.users.me.openssh.authorizedKeys.keys = kieran.sshKeys; services.xserver.displayManager.sessionCommands = toString (pkgs.writeScript "ssh-add" ''
#!${pkgs.expect}/bin/expect -f
spawn ${pkgs.openssh}/bin/ssh-add
expect "Enter passphrase for *:"
send "${ssh-passphrase}\n";
expect "Identity added: *"
interact
'');
programs.ssh.startAgent = true; programs.ssh.startAgent = true;
home-manager.users.me = { users.users.me.openssh.authorizedKeys.keys = kieran.sshKeys pkgs;
# https://discourse.nixos.org/t/gnome-keyring-and-ssh-agent-without-gnome/11663
xsession.profileExtra = ''
eval $(${pkgs.gnome3.gnome-keyring}/bin/gnome-keyring-daemon --daemonize --components=ssh,secrets)
export SSH_AUTH_SOCK
'';
# services.gpg-agent = rec {
# enable = false;
# enableSshSupport = true;
# defaultCacheTtlSsh = 2 * 60 * 60;
# maxCacheTtlSsh = 4 * defaultCacheTtlSsh;
# sshKeys = [
# "568047C91DE03A23883E340F15A9C24D313E847C"
# "BB3EE102DB8CD45540A78A6B18B511B67061F6B4" # kfm@manakish ed25519
# "3F8986755818B5762A096BE212777EAAC441DD9D" # fysiweb rsa
# "0E4ABD229432486CC432639BB0986B2CDE365105" # agenix ed25519
# "A1E8D32CBFCDBD2DE798E2298D795CCFD785AE06" # kfm@kabsa ed25519
# ];
# };
};
# environment.extraInit = ''
# if [[ -z "$SSH_AUTH_SOCK" ]]; then
# export SSH_AUTH_SOCK="$(${pkgs.gnupg}/bin/gpgconf --list-dirs agent-ssh-socket)"
# fi
# '';
# environment.interactiveShellInit = ''
# GPG_TTY="$(tty)"
# export GPG_TTY
# ${pkgs.gnupg}/bin/gpg-connect-agent updatestartuptty /bye > /dev/null
# '';
home-manager.users.me.programs.ssh = { home-manager.users.me.programs.ssh = {
enable = true; enable = true;
@@ -66,11 +49,6 @@ in {
user = "root"; user = "root";
port = sshPort; port = sshPort;
}; };
tabula = {
hostname = "tabula.r";
user = "root";
port = sshPort;
};
manakish = { manakish = {
hostname = "manakish.r"; hostname = "manakish.r";
user = "kfm"; user = "kfm";
@@ -81,10 +59,23 @@ in {
user = "kfm"; user = "kfm";
port = sshPort; port = sshPort;
}; };
fatteh = { "nextcloud.fysi.dev" = {
hostname = "fatteh.r"; hostname = "116.203.82.203";
user = "kfm"; user = "root";
port = sshPort; };
"lingua.miaengiadina.ch" = {
hostname = "135.181.85.233";
user = "root";
};
"fysi-dev1" = {
hostname = "94.130.229.139";
user = "root";
identityFile = sshIdentity "fysiweb";
};
"fysi-shared0" = {
hostname = "49.12.205.235";
user = "root";
identityFile = sshIdentity "fysiweb";
}; };
}; };
}; };

View File

@@ -4,18 +4,16 @@
pkgs, pkgs,
... ...
}: let }: let
inherit (import ../lib) sshPort kieran; inherit (import <niveum/lib>) sshPort kieran;
in { in {
users.motd = "Welcome to ${config.networking.hostName}!"; users.motd = "Welcome to ${config.networking.hostName}!";
services.openssh = { services.openssh = {
enable = true; enable = true;
ports = [sshPort]; ports = [sshPort];
settings = { passwordAuthentication = false;
PasswordAuthentication = false; forwardX11 = true;
X11Forwarding = true;
};
}; };
users.users.root.openssh.authorizedKeys.keys = kieran.sshKeys; users.users.root.openssh.authorizedKeys.keys = kieran.sshKeys pkgs;
} }

View File

@@ -1,10 +1,9 @@
{ {
config,
pkgs, pkgs,
lib, lib,
inputs,
... ...
}: let }: let
locker = x: "https://c.krebsco.de/${x}";
dictionaries = { dictionaries = {
lojban = { lojban = {
jbo-deu = pkgs.fetchzip { jbo-deu = pkgs.fetchzip {
@@ -30,7 +29,7 @@
sha256 = "1kmbdjqinrcxkc6jdyyrq5rl2wzhnrychyynnh91yhrjwjxlh44k"; sha256 = "1kmbdjqinrcxkc6jdyyrq5rl2wzhnrychyynnh91yhrjwjxlh44k";
}; };
Woodhouse = pkgs.fetchzip { Woodhouse = pkgs.fetchzip {
url = locker "Woodhouse.zip"; url = "https://c.krebsco.de/Woodhouse.zip";
sha256 = "1dvnc2679yb048q2f3hr2h34acvhan0n3iir6h9ajlrdzz48mlkq"; sha256 = "1dvnc2679yb048q2f3hr2h34acvhan0n3iir6h9ajlrdzz48mlkq";
stripRoot = false; stripRoot = false;
}; };
@@ -69,39 +68,39 @@
sha256 = "1bjja3n3layfd08xa1r0a6375dxh5zi6hlv7chkhgnx800cx7hxn"; sha256 = "1bjja3n3layfd08xa1r0a6375dxh5zi6hlv7chkhgnx800cx7hxn";
}; };
Roget = pkgs.fetchzip { Roget = pkgs.fetchzip {
url = locker "stardict-Roget_s_II_The_New_Thesaurus_3th_Ed-2.4.2.tar.bz2"; url = "http://download.huzheng.org/bigdict/stardict-Roget_s_II_The_New_Thesaurus_3th_Ed-2.4.2.tar.bz2";
hash = "sha256-f2GcNf3+dqZ/sKBpywjdHHC7Rp6FJseY93edRJK3/us="; sha256 = "1szyny9497bpyyccf9l5kr3bnw0wvl4cnsd0n1zscxpyzlsrqqbz";
}; };
JargonFile = pkgs.fetchzip { JargonFile = pkgs.fetchzip {
url = locker "stardict-dictd-jargon-2.4.2.tar.bz2"; url = "http://download.huzheng.org/dict.org/stardict-dictd-jargon-2.4.2.tar.bz2";
hash = "sha256-RFEcz8XzNO+Yk5s8dKSzvF+aOvq2bKysA7VenLKC1yQ="; sha256 = "096phar9qpmm0fnaqv5nz8x9lpxwnfj78g4vjfcfyd7kqp7iqla4";
}; };
Oxford-Collocations = pkgs.fetchzip { Oxford-Collocations = pkgs.fetchzip {
url = locker "stardict-Oxford_Collocations_Dictionary_2nd_Ed-2.4.2.tar.bz2"; url = "http://download.huzheng.org/bigdict/stardict-Oxford_Collocations_Dictionary_2nd_Ed-2.4.2.tar.bz2";
sha256 = "1zkfs0zxkcn21z2lhcabrs77v4ma9hpv7qm119hpyi1d8ajcw07q"; sha256 = "1zkfs0zxkcn21z2lhcabrs77v4ma9hpv7qm119hpyi1d8ajcw07q";
}; };
Langenscheidt-Deu-En = pkgs.fetchzip { Langenscheidt-Deu-En = pkgs.fetchzip {
url = locker "stardict-Handw_rterbuch_Deutsch_Englisc-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Handw_rterbuch_Deutsch_Englisc-2.4.2.tar.bz2";
sha256 = "12q9i5azq7ylyrpb6jqbaf1rxalc3kzcwjvbinvb0yabdxb80y30"; sha256 = "12q9i5azq7ylyrpb6jqbaf1rxalc3kzcwjvbinvb0yabdxb80y30";
}; };
Langenscheidt-En-Deu = pkgs.fetchzip { Langenscheidt-En-Deu = pkgs.fetchzip {
url = locker "stardict-Handw_rterbuch_Englisch_Deutsc-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Handw_rterbuch_Englisch_Deutsc-2.4.2.tar.bz2";
sha256 = "087b05h155j5ldshfgx91pz81h6ijq2zaqjirg7ma8ig3l96zb59"; sha256 = "087b05h155j5ldshfgx91pz81h6ijq2zaqjirg7ma8ig3l96zb59";
}; };
Duden_Das_Fremdworterbuch = pkgs.fetchzip { Duden_Das_Fremdworterbuch = pkgs.fetchzip {
url = locker "stardict-Duden_Das_Fremdworterbuch-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Duden_Das_Fremdworterbuch-2.4.2.tar.bz2";
sha256 = "1zrcay54ccl031s6dvjwsah5slhanmjab87d81rxlcy8fx0xd8wq"; sha256 = "1zrcay54ccl031s6dvjwsah5slhanmjab87d81rxlcy8fx0xd8wq";
}; };
Duden_De_De = pkgs.fetchzip { Duden_De_De = pkgs.fetchzip {
url = locker "stardict-Duden_De_De-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Duden_De_De-2.4.2.tar.bz2";
sha256 = "1fhay04w5aaj83axfmla2ql34nb60gb05dgv0k94ig7p8x4yxxlf"; sha256 = "1fhay04w5aaj83axfmla2ql34nb60gb05dgv0k94ig7p8x4yxxlf";
}; };
ConciseOED = pkgs.fetchzip { ConciseOED = pkgs.fetchzip {
url = locker "stardict-Concise_Oxford_English_Dictionary-2.4.2.tar.bz2"; url = "http://download.huzheng.org/bigdict/stardict-Concise_Oxford_English_Dictionary-2.4.2.tar.bz2";
sha256 = "19kpcxbhqzpmhi94mp48nalgmsh6s7rsx1gb4kwkhirp2pbjcyl7"; sha256 = "19kpcxbhqzpmhi94mp48nalgmsh6s7rsx1gb4kwkhirp2pbjcyl7";
}; };
Duden_Synonym = pkgs.fetchzip { Duden_Synonym = pkgs.fetchzip {
url = locker "stardict-Duden_Synonym-2.4.2.tar.bz2"; url = "http://download.huzheng.org/babylon/german/stardict-Duden_Synonym-2.4.2.tar.bz2";
sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd"; sha256 = "0cx086zvb86bmz7i8vnsch4cj4fb0cp165g4hig4982zakj6f2jd";
}; };
}; };
@@ -141,41 +140,24 @@
}; };
oed = { oed = {
OED1 = pkgs.fetchzip { OED1 = pkgs.fetchzip {
url = locker "stardict-Oxford_English_Dictionary_2nd_Ed._P1-2.4.2.tar.bz2"; url = "http://download.huzheng.org/bigdict/stardict-Oxford_English_Dictionary_2nd_Ed._P1-2.4.2.tar.bz2";
sha256 = "0i5vv1rv44yfwyf9bfbdrb9brzhhpvz2jnh39fv8hh107nkv2vcf"; sha256 = "0i5vv1rv44yfwyf9bfbdrb9brzhhpvz2jnh39fv8hh107nkv2vcf";
}; };
OED2 = pkgs.fetchzip { OED2 = pkgs.fetchzip {
url = locker "stardict-Oxford_English_Dictionary_2nd_Ed._P2-2.4.2.tar.bz2"; url = "http://download.huzheng.org/bigdict/stardict-Oxford_English_Dictionary_2nd_Ed._P2-2.4.2.tar.bz2";
sha256 = "1pk234pbq4pk55d8sjk0pp9j5sajm82f8804kf2xm2x5p387q1rg"; sha256 = "1pk234pbq4pk55d8sjk0pp9j5sajm82f8804kf2xm2x5p387q1rg";
}; };
}; };
coptic = {
dictionary = inputs.coptic-dictionary.packages.x86_64-linux.coptic-stardict;
Crum = pkgs.fetchzip {
url = locker "stardict-Coptic-English_all_dialects-2.4.2.tar.bz2";
sha256 = "1fi281mb9yzv40wjsdapi8fzpa7x2yscz582lv2qnss9g8zzzzr9";
};
};
russian = { russian = {
LingvoGermanRussian = pkgs.fetchzip { LingvoGermanRussian = pkgs.fetchzip {
url = locker "stardict-GR-LingvoUniversal-2.4.2.tar.bz2"; url = "http://download.huzheng.org/lingvo/stardict-GR-LingvoUniversal-2.4.2.tar.bz2";
sha256 = "0p353gs2z4vj70hqsdhffjaaw3a4zlmcs46flipmf35lm5wmaj0g"; sha256 = "0p353gs2z4vj70hqsdhffjaaw3a4zlmcs46flipmf35lm5wmaj0g";
}; };
LingvoRussianGerman = pkgs.fetchzip { LingvoRussianGerman = pkgs.fetchzip {
url = locker "stardict-RG-LingvoUniversal-2.4.2.tar.bz2"; url = "http://download.huzheng.org/lingvo/stardict-RG-LingvoUniversal-2.4.2.tar.bz2";
sha256 = "03f9wdmkgpjifpms7dyh10ma29wf3ka1j3zlp1av0cybhdldk2a8"; sha256 = "03f9wdmkgpjifpms7dyh10ma29wf3ka1j3zlp1av0cybhdldk2a8";
}; };
}; };
turkish = {
BabylonTurkishEnglish = pkgs.fetchzip {
url = locker "stardict-babylon-Babylon_Turkish_English-2.4.2.tar.bz2";
sha256 = "1zpzgk3w0536gww31bj58cmn3imnkndyjwbcr7bay8ibq2kzv44z";
};
BabylonEnglishTurkish = pkgs.fetchzip {
url = locker "stardict-babylon-Babylon_English_Turkish-2.4.2.tar.bz2";
sha256 = "0myx31xzb7nrn5m657h0bwdgm5xp93ccwp6lcpbxgjxdjm3q0hc5";
};
};
}; };
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);
@@ -187,7 +169,7 @@
exec ${pkgs.sdcv}/bin/sdcv --color --only-data-dir --data-dir ${makeStardictDataDir dicts} "$@" exec ${pkgs.sdcv}/bin/sdcv --color --only-data-dir --data-dir ${makeStardictDataDir dicts} "$@"
''; '';
sdcvPager = pkgs.writers.writeDash "sdcvPager" '' sdcvPager = pkgs.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
@@ -292,36 +274,34 @@
" | 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";
# sha256 = "1fi281mb9yzv40wjsdapi8fzpa7x2yscz582lv2qnss9g8zzzzr9"; sha256 = "1fi281mb9yzv40wjsdapi8fzpa7x2yscz582lv2qnss9g8zzzzr9";
# }; };
# SmithBiographyMythology = pkgs.fetchzip { SmithBiographyMythology = pkgs.fetchzip {
# url = "https://github.com/latin-dict/Smith1873/releases/download/v1.0/Smith1873-stardict.zip"; url = "https://github.com/latin-dict/Smith1873/releases/download/v1.0/Smith1873-stardict.zip";
# sha256 = "01h5fxacp2m60xir8kzslkfy772vs3vmz07zhdwfhcwdaxif2af2"; sha256 = "01h5fxacp2m60xir8kzslkfy772vs3vmz07zhdwfhcwdaxif2af2";
# }; };
# SmithAntiquities = pkgs.fetchzip { SmithAntiquities = pkgs.fetchzip {
# url = "https://github.com/latin-dict/Smith1890/releases/download/v1.0/Smith1890-stardict.zip"; url = "https://github.com/latin-dict/Smith1890/releases/download/v1.0/Smith1890-stardict.zip";
# sha256 = "0vpsv62p2lrzmgys4d1swpnc6lqhdi7rxwkj2ngy3lz5dk3fysyb"; sha256 = "0vpsv62p2lrzmgys4d1swpnc6lqhdi7rxwkj2ngy3lz5dk3fysyb";
# }; };
# } }
# // dictionaries.classics // dictionaries.classics
# // dictionaries.sanskrit // dictionaries.sanskrit
# // dictionaries.oed // dictionaries.oed
# // dictionaries.russian // dictionaries.russian
# // dictionaries.englishGerman // dictionaries.englishGerman));
# // dictionaries.turkish));
environment.systemPackages = [ environment.systemPackages = [
pkgs.goldendict
(makeStardict "lsj" dictionaries.classics) (makeStardict "lsj" dictionaries.classics)
(makeStardict "sa" dictionaries.sanskrit) (makeStardict "sa" dictionaries.sanskrit)
(makeStardict "oed" dictionaries.oed) (makeStardict "oed" dictionaries.oed)
(makeStardict "sd-russian" dictionaries.russian) (makeStardict "sd-russian" dictionaries.russian)
(makeStardict "sd" dictionaries.englishGerman) (makeStardict "sd" dictionaries.englishGerman)
(makeStardict "jbo" dictionaries.lojban) (makeStardict "jbo" dictionaries.lojban)
(makeStardict "cop" dictionaries.coptic)
(makeStardict "sd-turkish" dictionaries.turkish)
]; ];
} }
/* /*

View File

@@ -1,52 +0,0 @@
{
pkgs,
config,
...
}: {
age.secrets.stw-berlin-card-code.file = ../secrets/stw-berlin-card-code.age;
systemd.services.stw-berlin = {
enable = true;
wants = ["network-online.target"];
startAt = "weekly";
serviceConfig = {
User = config.users.users.me.name;
Group = config.users.users.me.group;
WorkingDirectory = "/home/kfm/cloud/nextcloud/Uni/Meta/Mensa";
LoadCredential = [
"password:${config.age.secrets.stw-berlin-card-code.path}"
];
};
script = ''
KARTEN_ID=8071859
PASSWORT=$(cat "$CREDENTIALS_DIRECTORY"/password)
endpoint=https://ks.stw.berlin:4433/TL1/TLM/KASVC
authorization_header='Authorization: Basic S0FTVkM6ekt2NXlFMUxaVW12VzI5SQ=='
get_auth_token() {
${pkgs.curl}/bin/curl -sSL "$endpoint/LOGIN?karteNr=$KARTEN_ID&format=JSON&datenformat=JSON" \
-X POST \
-H "$authorization_header" \
--data-raw '{"BenutzerID":"'$KARTEN_ID'","Passwort":"'$PASSWORT'"}' \
| ${pkgs.jq}/bin/jq -r '.[0].authToken|@uri'
}
get_transactions() {
${pkgs.curl}/bin/curl -sSL "$endpoint/TRANS?format=JSON&authToken=$(get_auth_token)&karteNr=$KARTEN_ID&datumVon=12.02.2018&datumBis=$(date -d tomorrow +%d.%m.%Y)" \
-H "$authorization_header" \
| ${pkgs.jq}/bin/jq
}
get_items() {
${pkgs.curl}/bin/curl -sSL "$endpoint/TRANSPOS?format=JSON&authToken=$(get_auth_token)&karteNr=$KARTEN_ID&datumVon=12.02.2018&datumBis=$(date -d tomorrow +%d.%m.%Y)" \
-H "$authorization_header" \
| ${pkgs.jq}/bin/jq
}
get_transactions > transactions-$(date -I).json
get_items > items-$(date -I).json
'';
};
}

View File

@@ -1,69 +0,0 @@
{
pkgs,
config,
lib,
inputs,
...
}: let
generatedWallpaper = pkgs.runCommand "wallpaper.png" {} ''
${inputs.wallpaper-generator.packages.x86_64-linux.wp-gen}/bin/wallpaper-generator lines \
--output $out \
${lib.concatMapStringsSep " "
(n: "--base0${lib.toHexString n}=${config.lib.stylix.colors.withHashtag."base0${lib.toHexString n}"}")
(lib.range 0 15)}
'';
in {
# https://danth.github.io/stylix/tricks.html
# stylix.image = inputs.wallpapers.outPath + "/meteora/rodrigo-soares-250630.jpg";
stylix.image = generatedWallpaper;
# environment.etc."stylix/wallpaper.png".source = generatedWallpaper;
# stylix.polarity = "either";
# stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/${
# onedark
# synth-midnight-dark
# apprentice # https://romainl.github.io/Apprentice/
# one-light
# onedark
# material # https://github.com/ntpeters/base16-materialtheme-scheme
# material-palenight
# material-lighter
# tomorrow # https://github.com/chriskempson/tomorrow-theme
# tomorrow-night
# gruvbox-light-medium # https://github.com/dawikur/base16-gruvbox-scheme
# gruvbox-dark-medium
# selenized-light # https://github.com/jan-warchol/selenized
# selenized-dark
# papercolor-light
# papercolor-dark
# dracula # https://draculatheme.com/
# }.yaml";
stylix.fonts = {
serif = {
package = pkgs.noto-fonts;
name = "Noto Serif";
};
sansSerif = {
package = pkgs.noto-fonts;
name = "Noto Sans";
};
monospace = {
package = pkgs.noto-fonts;
name = "Noto Sans Mono";
};
emoji = {
package = pkgs.noto-fonts-emoji;
name = "Noto Color Emoji";
};
sizes = {
terminal = 6;
applications = 10;
};
};
}

View File

@@ -4,6 +4,8 @@
lib, lib,
... ...
}: let }: let
unstable = import <nixos-unstable> {inherit (config.nixpkgs) config;};
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//;
@@ -42,16 +44,16 @@
''; '';
in { in {
niveum.telegramBots.transits = { niveum.telegramBots.transits = {
enable = true; enable = false;
time = "*:0/1"; time = "*:0/1";
tokenFile = config.age.secrets.telegram-token-kmein.path; token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["-1001796440545"]; chatIds = ["-1001796440545"];
command = toString (pkgs.writers.writeDash "common-transits" '' command = toString (pkgs.writers.writeDash "common-transits" ''
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')
{ {
${pkgs.astrolog}/bin/astrolog -qd $date -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto "North Node" -A 2 ${unstable.astrolog}/bin/astrolog -qd $date -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto "North Node"
${pkgs.astrolog}/bin/astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $date -R Uranus Neptune Pluto "North Node" ${unstable.astrolog}/bin/astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $date -R Uranus Neptune Pluto "North Node"
} | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n | ${pkgs.gnugrep}/bin/grep "^$now" || : } | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n | ${pkgs.gnugrep}/bin/grep "^$now" || :
''); '');
}; };

View File

@@ -1,7 +1,6 @@
{ {
pkgs, pkgs,
lib, lib,
config,
... ...
}: let }: let
autorenkalender-package = pkgs.fetchFromGitHub { autorenkalender-package = pkgs.fetchFromGitHub {
@@ -16,14 +15,12 @@ in {
niveum.telegramBots.autorenkalender = { niveum.telegramBots.autorenkalender = {
enable = true; enable = true;
time = "07:00"; time = "07:00";
tokenFile = config.age.secrets.telegram-token-kmein.path; token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["@autorenkalender"]; chatIds = ["@autorenkalender"];
parseMode = "Markdown"; parseMode = "Markdown";
command = "${autorenkalender}/bin/autorenkalender"; command = "${autorenkalender}/bin/autorenkalender";
}; };
age.secrets.telegram-token-kmein.file = ../../secrets/telegram-token-kmein.age;
niveum.passport.services = [ niveum.passport.services = [
{ {
title = "Autorenkalender"; title = "Autorenkalender";

View File

@@ -1,36 +0,0 @@
{
pkgs,
lib,
config,
...
}: let
celan = pkgs.fetchzip {
url = "http://c.krebsco.de/celan.tar.gz";
sha256 = "sha256-nA+EwAH2vkeolsy9AoPLEMt1uGKDZe/aPrS95CZvuus=";
};
in {
niveum.telegramBots.celan = {
enable = true;
time = "08:00";
tokenFile = config.age.secrets.telegram-token-kmein.path;
chatIds = ["@PaulCelan"];
command = toString (pkgs.writers.writeDash "random-celan" ''
cd ${celan}
poem="$(${pkgs.findutils}/bin/find . -type f | ${pkgs.coreutils}/bin/shuf -n1)"
source="$(${pkgs.coreutils}/bin/dirname "$poem" | ${pkgs.gnused}/bin/sed 's#^\./##;s/[-_]/ /g;s!/! !g;s/0\([0-9]\+\)/\1/g')"
cat "$poem"
echo
printf "Aus: %s\n" "$source"
'');
};
systemd.timers.telegram-bot-celan.timerConfig.RandomizedDelaySec = "10h";
niveum.passport.services = [
{
title = "Paul Celan Bot";
description = "sends a random poem by Paul Celan to Telegram.";
link = "https://t.me/PaulCelan";
}
];
}

View File

@@ -2,13 +2,17 @@
config, config,
pkgs, pkgs,
lib, lib,
inputs,
... ...
}: let }: let
telebots = inputs.telebots.defaultPackage.x86_64-linux; nixpkgs-21-11 = import (builtins.fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-21.11.tar.gz") {
config.permittedInsecurePackages = [
"python3.9-poetry-1.1.12"
];
};
telebots = nixpkgs-21-11.callPackage <telebots> {};
reverseDirectory = "/run/telegram-reverse"; reverseDirectory = "/run/telegram-reverse";
proverbDirectory = "/run/telegram-proverb"; proverbDirectory = "/run/telegram-proverb";
inherit (import ../../lib) tmpfilesConfig; inherit (import <niveum/lib>) tmpfilesConfig;
in { in {
imports = [ imports = [
./literature-quote.nix ./literature-quote.nix
@@ -18,7 +22,7 @@ in {
./smyth.nix ./smyth.nix
./nachtischsatan.nix ./nachtischsatan.nix
./tlg-wotd.nix ./tlg-wotd.nix
./celan.nix <niveum/modules/telegram-bot.nix>
]; ];
systemd.tmpfiles.rules = map (path: systemd.tmpfiles.rules = map (path:
@@ -47,57 +51,33 @@ in {
} }
]; ];
age.secrets = {
telegram-token-reverse.file = ../../secrets/telegram-token-reverse.age;
telegram-token-betacode.file = ../../secrets/telegram-token-betacode.age;
telegram-token-proverb.file = ../../secrets/telegram-token-proverb.age;
telegram-token-streaming-link.file = ../../secrets/telegram-token-streaming-link.age;
};
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];
environment.TELEGRAM_BOT_TOKEN = lib.strings.fileContents <system-secrets/telegram/reverse.token>;
enable = true; enable = true;
script = '' script = "${telebots}/bin/telegram-reverse";
TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-reverse
'';
serviceConfig.Restart = "always"; serviceConfig.Restart = "always";
serviceConfig.WorkingDirectory = reverseDirectory; serviceConfig.WorkingDirectory = reverseDirectory;
serviceConfig.LoadCredential = "token:${config.age.secrets.telegram-token-reverse.path}";
};
systemd.services.telegram-streaming-link = {
wantedBy = ["multi-user.target"];
description = "Telegram bot converting YouTube Music <-> Spotify";
enable = true;
script = ''
TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-streaming-link
'';
serviceConfig.Restart = "always";
serviceConfig.LoadCredential = "token:${config.age.secrets.telegram-token-streaming-link.path}";
}; };
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";
environment.TELEGRAM_BOT_TOKEN = lib.strings.fileContents <system-secrets/telegram/betacode.token>;
enable = true; enable = true;
script = '' script = "${telebots}/bin/telegram-betacode";
TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-betacode
'';
serviceConfig.Restart = "always"; serviceConfig.Restart = "always";
serviceConfig.LoadCredential = "token:${config.age.secrets.telegram-token-betacode.path}";
}; };
systemd.services.telegram-proverb = { systemd.services.telegram-proverb = {
wantedBy = ["multi-user.target"]; wantedBy = ["multi-user.target"];
description = "Telegram proverb bot"; description = "Telegram proverb bot";
environment.TELEGRAM_BOT_TOKEN = lib.strings.fileContents <system-secrets/telegram/proverb.token>;
enable = true; enable = true;
script = '' script = "${telebots}/bin/telegram-proverb";
TELEGRAM_BOT_TOKEN="$(cat "$CREDENTIALS_DIRECTORY/token")" ${telebots}/bin/telegram-proverb
'';
serviceConfig.Restart = "always"; serviceConfig.Restart = "always";
serviceConfig.WorkingDirectory = proverbDirectory; serviceConfig.WorkingDirectory = proverbDirectory;
serviceConfig.LoadCredential = "token:${config.age.secrets.telegram-token-proverb.path}";
}; };
} }

View File

@@ -1,16 +1,14 @@
{ {
pkgs, pkgs,
config,
inputs,
lib, lib,
... ...
}: let }: let
hesychius = inputs.scripts.outPath + "/hesychius/hesychius.txt"; hesychius = <scripts> + "/hesychius/hesychius.txt";
in { in {
niveum.telegramBots.hesychius = { niveum.telegramBots.hesychius = {
enable = true; enable = true;
time = "08:00"; time = "08:00";
tokenFile = config.age.secrets.telegram-token-kmein.path; token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["@HesychiosAlexandreus"]; chatIds = ["@HesychiosAlexandreus"];
command = "${pkgs.coreutils}/bin/shuf -n1 ${hesychius}"; command = "${pkgs.coreutils}/bin/shuf -n1 ${hesychius}";
}; };

View File

@@ -1,16 +1,17 @@
{ {
pkgs, pkgs,
config,
lib, lib,
niveumPackages,
... ...
}: { }: let
scripts = import <niveum/packages/scripts> {inherit pkgs lib;};
inherit (scripts) literature-quote;
in {
niveum.telegramBots.quotebot = { niveum.telegramBots.quotebot = {
enable = true; enable = true;
time = "08/6:00"; time = "08/6:00";
tokenFile = config.age.secrets.telegram-token-kmein.path; token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["-1001760262519"]; chatIds = ["-1001760262519"];
command = "${niveumPackages.literature-quote}/bin/literature-quote"; command = "${literature-quote}/bin/literature-quote";
parseMode = "Markdown"; parseMode = "Markdown";
}; };

View File

@@ -1,29 +1,28 @@
{ {
pkgs, pkgs,
config,
lib, lib,
... ...
}: let }: let
nachtischsatan-bot = {tokenFile}: nachtischsatan-bot = {token}:
pkgs.writers.writePython3 "nachtischsatan-bot" { pkgs.writers.writePython3 "nachtischsatan-bot" {
libraries = [pkgs.python3Packages.python-telegram-bot]; libraries = [pkgs.python3Packages.python-telegram-bot];
} '' } ''
from telegram.ext import Application, ContextTypes, MessageHandler, filters from telegram.ext import Updater, MessageHandler
from telegram import Update from telegram.ext.filters import Filters
import random import random
import time import time
async def flubber(update: Update, context: ContextTypes.DEFAULT_TYPE): def flubber(update, context):
time.sleep(random.randrange(4000) / 1000) time.sleep(random.randrange(4000) / 1000)
await update.message.reply_text("*flubberflubber*") update.message.reply_text("*flubberflubber*")
with open('${tokenFile}', 'r') as tokenFile: updater = Updater('${token}')
token = tokenFile.read().strip()
application = Application.builder().token(token).build() updater.dispatcher.add_handler(MessageHandler(Filters.all, flubber))
application.add_handler(MessageHandler(filters.ALL, flubber)) updater.start_polling()
application.run_polling() updater.idle()
''; '';
in { in {
systemd.services.telegram-nachtischsatan = { systemd.services.telegram-nachtischsatan = {
@@ -31,13 +30,11 @@ in {
description = "*flubberflubber*"; description = "*flubberflubber*";
enable = true; enable = true;
script = toString (nachtischsatan-bot { script = toString (nachtischsatan-bot {
tokenFile = config.age.secrets.telegram-token-nachtischsatan.path; token = lib.strings.fileContents <system-secrets/telegram/nachtischsatan.token>;
}); });
serviceConfig.Restart = "always"; serviceConfig.Restart = "always";
}; };
age.secrets.telegram-token-nachtischsatan.file = ../../secrets/telegram-token-nachtischsatan.age;
niveum.passport.services = [ niveum.passport.services = [
{ {
title = "Nachtischsatan-Bot"; title = "Nachtischsatan-Bot";

View File

@@ -1,13 +1,12 @@
{ {
config,
pkgs, pkgs,
lib, lib,
... ...
}: { }: {
niveum.telegramBots.smyth = { niveum.telegramBots.smyth = {
enable = true; enable = true;
time = "08:00"; time = "06/6:00";
tokenFile = config.age.secrets.telegram-token-kmein.path; token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["@HerbertWeirSmyth"]; chatIds = ["@HerbertWeirSmyth"];
command = toString (pkgs.writers.writeDash "random-smyth" '' command = toString (pkgs.writers.writeDash "random-smyth" ''
set -efu set -efu
@@ -26,7 +25,7 @@
''); '');
}; };
systemd.timers.telegram-bot-smyth.timerConfig.RandomizedDelaySec = "10h"; systemd.timers.telegram-bot-smyth.timerConfig.RandomizedDelaySec = "3h";
niveum.passport.services = [ niveum.passport.services = [
{ {

View File

@@ -1,19 +1,18 @@
{ {
pkgs, pkgs,
lib, lib,
config,
... ...
}: { }: {
niveum.telegramBots.tlg-wotd = { niveum.telegramBots.tlg-wotd = {
enable = true; enable = true;
time = "9:30"; time = "9:30";
token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = ["@tlgwotd"]; chatIds = ["@tlgwotd"];
tokenFile = config.age.secrets.telegram-token-kmein.path;
command = toString (pkgs.writers.writeDash "tlg-wotd" '' command = toString (pkgs.writers.writeDash "tlg-wotd" ''
${pkgs.curl}/bin/curl -sSL http://stephanus.tlg.uci.edu/Iris/Wotd \ ${pkgs.curl}/bin/curl -sSL http://stephanus.tlg.uci.edu/Iris/Wotd \
| ${pkgs.recode}/bin/recode html..utf8 \ | ${pkgs.recode}/bin/recode html..utf8 \
| ${pkgs.jq}/bin/jq -r ' | ${pkgs.jq}/bin/jq -r '
"*\(.word)* '\'''\(.definition | sub("<.*>"; "") | rtrimstr(" "))'\'''\n\nFirst occurrence: \(.firstOccurrence)\nNumber of occurrences: \(.totalOccurrences)" "*\(.word)* '\'''\(.definition | rtrimstr(" "))'\'''\n\nFirst occurrence: \(.firstOccurrence)\nNumber of occurrences: \(.totalOccurrences)"
' '
''); '');
parseMode = "Markdown"; parseMode = "Markdown";

82
configs/themes.nix Normal file
View File

@@ -0,0 +1,82 @@
{
config,
lib,
pkgs,
...
}: let
switch-theme = pkgs.writers.writeDashBin "switch-theme" ''
set -efux
if [ "$1" = toggle ]; then
if [ "$(${pkgs.coreutils}/bin/cat /var/theme/current_theme)" = dark ]; then
${placeholder "out"}/bin/switch-theme light
else
${placeholder "out"}/bin/switch-theme dark
fi
elif test -e "/etc/themes/$1"; then
mkdir -p /var/theme/config
${pkgs.rsync}/bin/rsync --chown=${config.users.users.me.name}:users -a --delete "/etc/themes/$1/" /var/theme/config/
echo "$1" > /var/theme/current_theme
${pkgs.coreutils}/bin/chown ${config.users.users.me.name}:users /var/theme/current_theme
${pkgs.xorg.xrdb}/bin/xrdb -merge /var/theme/config/xresources
${pkgs.procps}/bin/pkill -HUP xsettingsd
else
echo "theme $1 not found"
fi
'';
in {
systemd.services.xsettingsd = {
wantedBy = ["multi-user.target"];
after = ["display-manager.service"];
environment.DISPLAY = ":0";
serviceConfig = {
ExecStart = "${pkgs.xsettingsd}/bin/xsettingsd -c /var/theme/config/xsettings.conf";
User = config.users.users.me.name;
Restart = "always";
RestartSec = "15s";
};
};
systemd.tmpfiles.rules = [
"d /var/theme/ 755 ${config.users.users.me.name} users"
];
environment.systemPackages = [
switch-theme
pkgs.capitaine-cursors
];
home-manager.users.me = {
home.pointerCursor = {
name = "capitaine-cursors-white";
package = pkgs.capitaine-cursors;
size = 16;
};
};
environment.etc = {
"themes/light/xsettings.conf".text = ''
Net/ThemeName "Adwaita"
'';
"themes/light/xresources".text = ''
*background: #ffffff
*foreground: #000000
'';
"themes/dark/xsettings.conf".text = ''
Net/ThemeName "Adwaita-dark"
'';
"themes/dark/xresources".text = ''
*background: #000000
*foreground: #ffffff
'';
};
system.activationScripts.theme.text = ''
export DISPLAY=:0
if test -e /var/theme/current_theme; then
${switch-theme}/bin/switch-theme "$(cat /var/theme/current_theme)" ||
${switch-theme}/bin/switch-theme dark
else
${switch-theme}/bin/switch-theme dark
fi
'';
}

33
configs/theming.nix Normal file
View File

@@ -0,0 +1,33 @@
{
lib,
config,
pkgs,
...
}: let
theme = (import <niveum/lib>).theme pkgs;
in {
environment.systemPackages = [theme.gtk.package theme.icon.package theme.cursor.package];
services.xserver.displayManager.lightdm.greeters.gtk = {
theme = {inherit (theme.gtk) name package;};
iconTheme = {inherit (theme.icon) name package;};
};
home-manager.users.me = {
gtk = {
enable = true;
iconTheme = theme.icon;
theme = theme.gtk;
};
qt = {
enable = true;
platformTheme = "gtk";
};
home.pointerCursor =
theme.cursor
// {
size = 16;
x11.enable = true;
};
};
}

View File

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

37
configs/traadfri.nix Normal file
View File

@@ -0,0 +1,37 @@
{
pkgs,
lib,
...
}: let
inherit (import <niveum/lib>) localAddresses;
living-room-id = 131090;
in {
imports = [<niveum/modules/traadfri.nix>];
environment.systemPackages = [
(pkgs.writers.writeDashBin "traadfri-party" ''
while true; do
for color in $(traadfri colours | shuf); do
echo "$color"
traadfri group "''${2:-${toString living-room-id}}" --on --colour="$color"
sleep "''${1:-2}"
done
done
'')
];
niveum.traadfri = {
enable = true;
user = "kmein";
host = localAddresses.tradfri;
key = lib.strings.fileContents <secrets/traadfri.key>;
rooms = {
corridor = 131080;
kitchen = 131081;
bedroom = 131082;
living-room = living-room-id;
bedside = 131087;
chain = 131089;
};
};
}

View File

@@ -2,28 +2,18 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }: {
# url = "http://wallpaper.r/realwallpaper-krebs-stars-berlin.png"; imports = [<stockholm/krebs/3modules/fetchWallpaper.nix>];
url = "http://wallpaper.r/realwallpaper-krebs.png";
stateDir = "~/.cache/wallpaper";
in {
systemd.user.services.wallpaper = {
wantedBy = ["graphical-session.target"];
after = ["network.target"];
script = ''
set -euf
mkdir -p ${stateDir} krebs.fetchWallpaper = {
chmod o+rx ${stateDir} enable = true;
cd ${stateDir} url = "http://prism.r/realwallpaper-krebs-stars-berlin.png";
(${pkgs.curl}/bin/curl -s -o wallpaper.tmp -z wallpaper.tmp ${lib.escapeShellArg url} && cp wallpaper.tmp wallpaper) || : };
${pkgs.feh}/bin/feh --no-fehbg --bg-scale wallpaper
''; users.users.fetchWallpaper.isSystemUser = true;
startAt = "*:00,10,20,30,40,50";
serviceConfig = { services.xserver = {
Restart = "always"; display = lib.mkForce 0; # needed for fetchWallpaper to find the X display
RestartSec = "15s"; displayManager.sessionCommands = "${pkgs.xorg.xhost}/bin/xhost +LOCAL:";
StartLimitBurst = 0;
};
}; };
} }

View File

@@ -7,15 +7,6 @@
# nothing to see here # nothing to see here
''; '';
environment.systemPackages = [pkgs.atuin];
environment.variables.ATUIN_CONFIG_DIR = toString (pkgs.writeTextDir "/config.toml" ''
auto_sync = true
update_check = false
sync_address = "http://zaatar.r:8888"
sync_frequency = 0
style = "compact"
'');
programs.zsh = let programs.zsh = let
zsh-completions = pkgs.fetchFromGitHub { zsh-completions = pkgs.fetchFromGitHub {
owner = "zsh-users"; owner = "zsh-users";
@@ -23,6 +14,12 @@
rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb"; rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb";
sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l"; sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l";
}; };
zsh-history-substring-search = pkgs.fetchFromGitHub {
owner = "zsh-users";
repo = "zsh-history-substring-search";
rev = "aae3388491c2312c4efb2e86bcb999927bb2900e";
sha256 = "0lgmq1xcccnz5cf7vl0r0qj351hwclx9p80cl0qczxry4r2g5qaz";
};
in { in {
enable = true; enable = true;
enableCompletion = true; enableCompletion = true;
@@ -52,11 +49,17 @@
export KEYTIMEOUT=1 export KEYTIMEOUT=1
hash -d nixos=/etc/nixos niveum=${config.users.users.me.home}/sync/src/niveum hash -d nixos=/etc/nixos niveum=${config.users.users.me.home}/projects/niveum
autoload -U zmv run-help edit-command-line autoload -U zmv run-help
fpath=(${zsh-completions}/src $fpath) fpath=(${zsh-completions}/src $fpath)
source ${zsh-history-substring-search}/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey -M vicmd 'k' history-substring-search-up
bindkey -M vicmd 'j' history-substring-search-down
''; '';
promptInit = with config.niveum; '' promptInit = with config.niveum; ''
autoload -Uz vcs_info autoload -Uz vcs_info
@@ -68,20 +71,9 @@
zstyle ':vcs_info:*' formats "%c%u%F{cyan}%b%f" zstyle ':vcs_info:*' formats "%c%u%F{cyan}%b%f"
zstyle ':vcs_info:*' actionformats "(%a) %c%u%F{cyan}%b%f" zstyle ':vcs_info:*' actionformats "(%a) %c%u%F{cyan}%b%f"
# atuin distributed shell history
export ATUIN_NOBIND="true" # disable all keybdinings of atuin
eval "$(atuin init zsh)"
bindkey '^r' _atuin_search_widget # bind ctrl+r to atuin
# use zsh only session history
fc -p
precmd () { precmd () {
vcs_info vcs_info
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] || [ -n "$SSH_CONNECTION" ]; then RPROMPT="$vcs_info_msg_0_"
RPROMPT="$(hostname)"
else
RPROMPT="$vcs_info_msg_0_"
fi
if [[ -n $IN_NIX_SHELL ]]; then if [[ -n $IN_NIX_SHELL ]]; then
PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})λ%f ' PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})λ%f '
else else
@@ -99,8 +91,6 @@
zle -N zle-line-init zle -N zle-line-init
zle -N zle-keymap-select zle -N zle-keymap-select
zle -N edit-command-line
bindkey -M vicmd v edit-command-line
''; '';
}; };
} }

1612
flake.lock generated

File diff suppressed because it is too large Load Diff

573
flake.nix
View File

@@ -2,410 +2,195 @@
description = "niveum: packages, modules, systems"; description = "niveum: packages, modules, systems";
inputs = { inputs = {
agenix.url = "github:ryantm/agenix"; nixos-stable.url = "github:NixOS/nixpkgs/nixos-22.05";
coptic-dictionary.url = "github:kmein/coptic-dictionary"; nixos-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
home-manager.url = "github:nix-community/home-manager/release-23.11";
menstruation-backend.url = "github:kmein/menstruation.rs";
menstruation-telegram.url = "github:kmein/menstruation-telegram";
nix-on-droid.url = "github:t184256/nix-on-droid/release-23.05";
nixinate.url = "github:matthewcroughan/nixinate";
nixpkgs-old.url = "github:NixOS/nixpkgs/50fc86b75d2744e1ab3837ef74b53f103a9b55a0";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/master";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
nur.url = "github:nix-community/NUR";
recht.url = "github:kmein/recht";
retiolum.url = "git+https://git.thalheim.io/Mic92/retiolum";
rust-overlay.url = "github:oxalica/rust-overlay";
scripts.url = "github:kmein/scripts";
stylix.url = "github:danth/stylix/release-23.05";
telebots.url = "github:kmein/telebots";
tinc-graph.url = "github:kmein/tinc-graph";
voidrice.url = "github:Lukesmithxyz/voidrice";
wallpaper-generator.url = "github:pinpox/wallpaper-generator/v1.1";
wallpapers.url = "github:kmein/wallpapers";
agenix.inputs.home-manager.follows = "home-manager"; flake-utils.url = "github:numtide/flake-utils";
agenix.inputs.nixpkgs.follows = "nixpkgs"; home-manager = {
coptic-dictionary.inputs.nixpkgs.follows = "nixpkgs"; url = "github:nix-community/home-manager/master";
home-manager.inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixos-unstable";
# menstruation-backend.inputs.flake-utils.follows = "flake-utils"; };
# menstruation-backend.inputs.nixpkgs.follows = "nixpkgs"; krops = {
# menstruation-backend.inputs.rust-overlay.follows = "rust-overlay"; url = "github:kmein/krops";
menstruation-telegram.inputs.flake-utils.follows = "flake-utils"; inputs.nixpkgs.follows = "nixos-stable";
menstruation-telegram.inputs.menstruation-backend.follows = "menstruation-backend"; inputs.flake-utils.follows = "flake-utils";
menstruation-telegram.inputs.nixpkgs.follows = "nixpkgs-old"; };
nix-on-droid.inputs.home-manager.follows = "home-manager";
nix-on-droid.inputs.nixpkgs.follows = "nixpkgs"; # legacy
recht.inputs.flake-utils.follows = "flake-utils"; menstruation-backend = {
recht.inputs.nixpkgs.follows = "nixpkgs"; url = "github:kmein/menstruation.rs";
rust-overlay.inputs.flake-utils.follows = "flake-utils"; flake = false;
rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; };
scripts.inputs.flake-utils.follows = "flake-utils"; menstruation-telegram = {
scripts.inputs.nixpkgs.follows = "nixpkgs"; url = "github:kmein/menstruation-telegram";
scripts.inputs.rust-overlay.follows = "rust-overlay"; flake = false;
stylix.inputs.home-manager.follows = "home-manager"; };
stylix.inputs.nixpkgs.follows = "nixpkgs"; nix-writers = {
tinc-graph.inputs.flake-utils.follows = "flake-utils"; url = "git+https://cgit.krebsco.de/nix-writers";
tinc-graph.inputs.nixpkgs.follows = "nixpkgs"; flake = false;
tinc-graph.inputs.rust-overlay.follows = "rust-overlay"; };
voidrice.flake = false; recht = {
wallpaper-generator.inputs.flake-utils.follows = "flake-utils"; url = "github:kmein/recht";
wallpapers.flake = false; flake = false;
};
retiolum = {
url = "github:krebs/retiolum";
flake = false;
};
scripts = {
url = "github:kmein/scripts";
flake = false;
};
stockholm = {
url = "git+https://cgit.lassul.us/stockholm";
flake = false;
};
telebots = {
url = "github:kmein/telebots";
flake = false;
};
tinc-graph = {
url = "github:kmein/tinc-graph";
flake = false;
};
traadfri = {
url = "github:kmein/traadfri";
flake = false;
};
tuna = {
url = "github:kmein/tuna";
flake = false;
};
}; };
outputs = inputs @ { outputs = {
self, self,
nixpkgs,
nixpkgs-unstable,
nur,
home-manager,
agenix,
retiolum,
nixinate,
flake-utils, flake-utils,
nix-on-droid, home-manager,
stylix, krops,
... menstruation-backend,
}: menstruation-telegram,
{ nix-writers,
apps = { nixos-unstable,
x86_64-darwin = let nixos-stable,
pkgs = nixpkgs.legacyPackages.x86_64-darwin; recht,
in { retiolum,
deploy-maakaron = { scripts,
type = "app"; stockholm,
program = toString (pkgs.writers.writeDash "deploy-maakaron" '' telebots,
exec $(nix build .#homeConfigurations.maakaron.activationPackage --no-link --print-out-paths)/activate tinc-graph,
''); traadfri,
}; tuna,
} @ inputs: let
system = "x86_64-linux";
pkgs = nixos-stable.legacyPackages.${system};
home =
if nixos-stable.lib.inPureEvalMode or false
then _: /nonexistent
else import lib/home.nix;
source = {
sources,
unstable,
name,
}:
{
niveum.file = toString ./.;
nixos-config.symlink = "niveum/systems/${name}/configuration.nix";
system-secrets.pass = {
dir = toString (home /.password-store);
name = "systems/${name}";
}; };
x86_64-linux = let secrets.pass = {
pkgs = nixpkgs.legacyPackages.x86_64-linux; dir = toString (home /.password-store);
lib = nixpkgs.lib; name = "shared";
in };
nixinate.nixinate.x86_64-linux self nixpkgs.git = {
// { url = "https://github.com/NixOS/nixpkgs";
mock-secrets = { ref =
type = "app"; (
program = toString (pkgs.writers.writeDash "mock-secrets" '' if unstable
${pkgs.findutils}/bin/find secrets -not -path '*/.*' -type f | ${pkgs.coreutils}/bin/sort > secrets.txt then inputs.nixos-unstable
''); else inputs.nixos-stable
}; )
} .rev;
# the following error prevents remote building of ful: https://github.com/NixOS/nixpkgs/issues/177873 shallow = true;
// builtins.listToAttrs (map (hostname: let };
externalNetwork = import ./lib/external-network.nix; }
targets = { // nixos-stable.lib.mapAttrs' (name: value: {
ful = "root@ful"; inherit name;
zaatar = "root@zaatar"; value.git = {
makanek = "root@makanek"; url = let
manakish = "root@manakish"; github = x: "https://github.com/${x}";
kabsa = "root@kabsa";
fatteh = "root@fatteh";
};
in in
lib.attrsets.nameValuePair "deploy-${hostname}" {
type = "app";
program = toString (pkgs.writers.writeDash "deploy-${hostname}" ''
exec ${pkgs.nixos-rebuild}/bin/nixos-rebuild switch --max-jobs 2 --log-format internal-json --flake .?submodules=1#${hostname} --build-host ${targets.${hostname}} --target-host ${targets.${hostname}} 2>&1 | ${pkgs.nix-output-monitor}/bin/nom --json
'');
}) (builtins.attrNames self.nixosConfigurations))
// {
deploy-ful = {
type = "app";
program = toString (pkgs.writers.writeDash "deploy-ful" ''
exec ${pkgs.nix}/bin/nix run .?submodules=1#nixinate.ful --log-format internal-json 2>&1 | ${pkgs.nix-output-monitor}/bin/nom --json
'');
};
};
};
nixosModules = {
htgen = import modules/htgen.nix;
moodle-dl = import modules/moodle-dl.nix;
networkmanager-declarative = import modules/networkmanager-declarative.nix;
passport = import modules/passport.nix;
panoptikon = import modules/panoptikon.nix;
power-action = import modules/power-action.nix;
system-dependent = import modules/system-dependent.nix;
telegram-bot = import modules/telegram-bot.nix;
};
lib = {
panoptikon = import lib/panoptikon.nix;
};
nixOnDroidConfigurations = {
moto = nix-on-droid.lib.nixOnDroidConfiguration {
modules = [systems/moto/configuration.nix];
pkgs = import nixpkgs {
system = "aarch64-linux";
overlays = [nix-on-droid.overlays.default];
};
extraSpecialArgs = {
niveumPackages = inputs.self.packages.aarch64-linux;
niveumLib = inputs.self.lib;
inherit inputs;
};
home-manager-path = home-manager.outPath;
};
};
homeConfigurations = {
maakaron = let
system = "x86_64-darwin";
pkgs = nixpkgs.legacyPackages.${system};
in
home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [./systems/maakaron/home.nix];
extraSpecialArgs = {
inherit inputs;
niveumPackages = inputs.self.packages.${system};
};
};
};
nixosConfigurations = let
niveumSpecialArgs = system: {
unstablePackages = import nixpkgs-unstable {
inherit system;
config.allowUnfreePredicate = pkg:
builtins.elem (nixpkgs-unstable.lib.getName pkg) [
"obsidian"
];
};
niveumPackages = inputs.self.packages.${system};
niveumLib = inputs.self.lib;
inherit inputs;
};
in {
ful = nixpkgs.lib.nixosSystem rec {
system = "aarch64-linux";
specialArgs = niveumSpecialArgs system;
modules = [
systems/ful/configuration.nix
agenix.nixosModules.default
inputs.self.nixosModules.passport
inputs.self.nixosModules.panoptikon
retiolum.nixosModules.retiolum
nur.nixosModules.nur
{ {
_module.args.nixinate = { home-manager = github "nix-community/home-manager";
host = "ful"; menstruation-backend = github "kmein/menstruation.rs";
sshUser = "root"; menstruation-telegram = github "kmein/menstruation-telegram";
buildOn = "remote"; nixos-unstable = github "NixOS/nixpkgs";
substituteOnTarget = true; nix-writers = "https://cgit.krebsco.de/nix-writers";
hermetic = false; recht = github "kmein/recht";
}; retiolum = github "krebs/retiolum";
stockholm = "https://cgit.lassul.us/stockholm";
scripts = github "kmein/scripts";
telebots = github "kmein/telebots";
tinc-graph = github "kmein/tinc-graph";
traadfri = github "kmein/traadfri";
} }
]; .${name};
ref = value.rev;
shallow = true;
}; };
zaatar = nixpkgs.lib.nixosSystem rec { }) (nixos-stable.lib.filterAttrs (name: _: builtins.elem name sources) inputs);
system = "x86_64-linux"; deployScriptFor = {
specialArgs = niveumSpecialArgs system; name,
modules = [ user ? "root",
systems/zaatar/configuration.nix host,
inputs.self.nixosModules.moodle-dl unstable ? false,
agenix.nixosModules.default sshPort ? (import ./lib/default.nix).sshPort,
retiolum.nixosModules.retiolum sources,
]; }:
toString (krops.packages.${system}.writeDeploy "deploy-${name}" {
source = krops.lib.evalSource [(source {inherit sources unstable name;})];
target = "${user}@${host}:${toString sshPort}";
useNixOutputMonitor = true;
});
in {
apps.${system} = let
forSystems = f: builtins.listToAttrs (map f (builtins.attrNames (builtins.readDir ./systems)));
externalNetwork = import ./lib/external-network.nix;
deployScripts = forSystems (name: {
name = "deploy-${name}";
value = {
type = "app";
program = deployScriptFor {
inherit name;
host =
if externalNetwork ? name
then externalNetwork.${name}
else "${name}.r";
unstable = name == "kabsa" || name == "manakish";
sources =
["nix-writers" "nixpkgs" "retiolum" "stockholm"]
++ {
zaatar = ["traadfri"];
ful = [];
tahina = [];
kabsa = ["traadfri" "nixos-unstable" "home-manager" "menstruation-backend" "recht"];
manakish = ["traadfri" "nixos-unstable" "home-manager" "menstruation-backend" "recht"];
makanek = ["nixos-unstable" "menstruation-telegram" "menstruation-backend" "scripts" "telebots" "tinc-graph"];
}
.${name};
};
}; };
makanek = nixpkgs.lib.nixosSystem rec { });
system = "x86_64-linux"; ciScripts = forSystems (name: {
# for using inputs in other config files name = "build-${name}";
specialArgs = niveumSpecialArgs system; value = {
modules = [ type = "app";
systems/makanek/configuration.nix program = import ./ci.nix {inherit name system inputs;};
inputs.self.nixosModules.telegram-bot
inputs.self.nixosModules.htgen
inputs.self.nixosModules.passport
agenix.nixosModules.default
retiolum.nixosModules.retiolum
nur.nixosModules.nur
];
}; };
tahina = nixpkgs.lib.nixosSystem { });
system = "x86_64-linux"; in
modules = [ deployScripts // ciScripts;
systems/tahina/configuration.nix };
agenix.nixosModules.default
retiolum.nixosModules.retiolum
];
};
tabula = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
systems/tabula/configuration.nix
agenix.nixosModules.default
retiolum.nixosModules.retiolum
];
};
manakish = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = niveumSpecialArgs system;
modules = [
systems/manakish/configuration.nix
agenix.nixosModules.default
retiolum.nixosModules.retiolum
home-manager.nixosModules.home-manager
nur.nixosModules.nur
stylix.nixosModules.stylix
];
};
kabsa = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = niveumSpecialArgs system;
modules = [
systems/kabsa/configuration.nix
agenix.nixosModules.default
retiolum.nixosModules.retiolum
home-manager.nixosModules.home-manager
nur.nixosModules.nur
stylix.nixosModules.stylix
];
};
fatteh = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = niveumSpecialArgs system;
modules = [
systems/fatteh/configuration.nix
agenix.nixosModules.default
retiolum.nixosModules.retiolum
home-manager.nixosModules.home-manager
nur.nixosModules.nur
stylix.nixosModules.stylix
];
};
};
}
// flake-utils.lib.eachSystem [flake-utils.lib.system.x86_64-linux flake-utils.lib.system.x86_64-darwin flake-utils.lib.system.aarch64-linux] (system: let
pkgs = import nixpkgs {
inherit system;
overlays = [
nur.overlay
(self: super: {
mpv = super.mpv.override {scripts = [inputs.self.packages.${system}.mpv-visualizer super.mpvScripts.mpris];};
dmenu = super.writers.writeDashBin "dmenu" ''exec ${pkgs.rofi}/bin/rofi -dmenu "$@"'';
})
];
};
unstablePackages = import nixpkgs-unstable {
inherit system;
};
wrapScript = {
packages ? [],
name,
script,
}:
pkgs.writers.writeDashBin name ''PATH=$PATH:${nixpkgs.lib.makeBinPath (packages ++ [pkgs.findutils pkgs.coreutils pkgs.gnused pkgs.gnugrep])} ${script} "$@"'';
in {
packages = rec {
auc = pkgs.callPackage packages/auc.nix {};
betacode = pkgs.callPackage packages/betacode.nix {};
brassica = pkgs.callPackage packages/brassica.nix {};
cheat-sh = pkgs.callPackage packages/cheat-sh.nix {};
closest = pkgs.callPackage packages/closest {};
cyberlocker-tools = pkgs.callPackage packages/cyberlocker-tools.nix {};
default-gateway = pkgs.callPackage packages/default-gateway.nix {};
depp = pkgs.callPackage packages/depp.nix {};
dashboard = pkgs.callPackage packages/dashboard {};
devanagari = pkgs.callPackage packages/devanagari {};
devour = pkgs.callPackage packages/devour.nix {};
dic = pkgs.callPackage packages/dic.nix {};
dirmir = pkgs.callPackage packages/dirmir.nix {};
dmenu-bluetooth = pkgs.callPackage packages/dmenu-bluetooth.nix {};
dmenu-scrot = pkgs.callPackage packages/dmenu-scrot.nix {};
dns-sledgehammer = pkgs.callPackage packages/dns-sledgehammer.nix {};
fkill = pkgs.callPackage packages/fkill.nix {};
fzfmenu = pkgs.callPackage packages/fzfmenu.nix {};
genius = pkgs.callPackage packages/genius.nix {};
gfs-fonts = pkgs.callPackage packages/gfs-fonts.nix {};
git-preview = pkgs.callPackage packages/git-preview.nix {};
gpt35 = pkgs.callPackage packages/gpt.nix {model = "gpt-3.5-turbo";};
gpt4 = pkgs.callPackage packages/gpt.nix {model = "gpt-4";};
hc = pkgs.callPackage packages/hc.nix {};
jq-lsp = pkgs.callPackage packages/jq-lsp.nix {};
stardict-tools = pkgs.callPackage packages/stardict-tools.nix {};
heuretes = pkgs.callPackage packages/heuretes.nix {};
htgen = pkgs.callPackage packages/htgen.nix {};
image-convert-favicon = pkgs.callPackage packages/image-convert-favicon.nix {};
image-convert-tolino = pkgs.callPackage packages/image-convert-tolino.nix {};
infschmv = pkgs.callPackage packages/infschmv.nix {};
iolanguage = pkgs.callPackage packages/iolanguage.nix {};
ipa = pkgs.writers.writePython3Bin "ipa" {flakeIgnore = ["E501"];} (builtins.readFile packages/ipa.py);
ix = pkgs.callPackage packages/ix.nix {};
jsesh = pkgs.callPackage packages/jsesh.nix {};
k-lock = pkgs.callPackage packages/k-lock.nix {};
kirciuoklis = pkgs.callPackage packages/kirciuoklis.nix {};
klem = pkgs.callPackage packages/klem.nix {};
kpaste = pkgs.callPackage packages/kpaste.nix {};
literature-quote = pkgs.callPackage packages/literature-quote.nix {};
mahlzeit = pkgs.haskellPackages.callPackage packages/mahlzeit.nix {};
man-pandoc = pkgs.callPackage packages/man/pandoc.nix {};
man-pdf = pkgs.callPackage packages/man-pdf.nix {};
mansplain = pkgs.callPackage packages/mansplain.nix {};
manual-sort = pkgs.callPackage packages/manual-sort.nix {};
menu-calc = pkgs.callPackage packages/menu-calc.nix {};
meteo = pkgs.callPackage packages/meteo.nix {};
mpv-radio = pkgs.callPackage packages/mpv-radio.nix {di-fm-key-file = "/dev/null";};
mpv-tuner = pkgs.callPackage packages/mpv-tuner.nix {di-fm-key-file = "/dev/null";};
mpv-tv = pkgs.callPackage packages/mpv-tv.nix {};
mpv-iptv = pkgs.callPackage packages/mpv-iptv.nix {};
mpv-visualizer = unstablePackages.mpvScripts.visualizer;
new-mac = pkgs.callPackage packages/new-mac.nix {};
nix-git = pkgs.callPackage packages/nix-git.nix {};
nix-index-update = pkgs.callPackage packages/nix-index-update.nix {inherit system;};
notemenu = pkgs.callPackage packages/notemenu.nix {niveumPackages = self.packages.${system};};
opustags = pkgs.callPackage packages/opustags.nix {};
pls = pkgs.callPackage packages/pls.nix {};
polyglot = pkgs.callPackage packages/polyglot.nix {};
qrpaste = pkgs.callPackage packages/qrpaste.nix {};
rfc = pkgs.callPackage packages/rfc.nix {};
scanned = pkgs.callPackage packages/scanned.nix {};
swallow = pkgs.callPackage packages/swallow.nix {};
text2pdf = pkgs.callPackage packages/text2pdf.nix {};
timer = pkgs.callPackage packages/timer.nix {};
tocharian-font = pkgs.callPackage packages/tocharian-font.nix {};
trans = pkgs.callPackage packages/trans.nix {};
ttspaste = pkgs.callPackage packages/ttspaste.nix {};
unicodmenu = pkgs.callPackage packages/unicodmenu.nix {};
emailmenu = pkgs.callPackage packages/emailmenu.nix {};
untilport = pkgs.callPackage packages/untilport.nix {};
vg = pkgs.callPackage packages/vg.nix {};
vim = pkgs.callPackage packages/vim.nix {niveumPackages = self.packages.${system};};
obsidian-vim = pkgs.callPackage packages/obsidian-vim.nix {};
vimPlugins-cheat-sh-vim = pkgs.callPackage packages/vimPlugins/cheat-sh.nix {};
vimPlugins-icalendar-vim = pkgs.callPackage packages/vimPlugins/icalendar-vim.nix {};
vimPlugins-jq-vim = pkgs.callPackage packages/vimPlugins/jq-vim.nix {};
vimPlugins-typst-vim = pkgs.callPackage packages/vimPlugins/typst-vim.nix {};
vimPlugins-vim-256noir = pkgs.callPackage packages/vimPlugins/vim-256noir.nix {};
vimPlugins-vim-colors-paramount = pkgs.callPackage packages/vimPlugins/vim-colors-paramount.nix {};
vimPlugins-vim-fetch = pkgs.callPackage packages/vimPlugins/vim-fetch.nix {};
vimPlugins-vim-fsharp = pkgs.callPackage packages/vimPlugins/vim-fsharp.nix {};
vimPlugins-vim-mail = pkgs.callPackage packages/vimPlugins/vim-mail.nix {};
vimPlugins-vim-reason-plus = pkgs.callPackage packages/vimPlugins/vim-reason-plus.nix {};
vimv = pkgs.callPackage packages/vimv.nix {};
weechat-declarative = pkgs.callPackage packages/weechat-declarative.nix {};
weechatScripts-hotlist2extern = pkgs.callPackage packages/weechatScripts/hotlist2extern.nix {};
wttr = pkgs.callPackage packages/wttr.nix {};
itl = pkgs.callPackage packages/itl.nix {};
itools = pkgs.callPackage packages/itools.nix {itl = itl;};
booksplit = wrapScript {
script = inputs.voidrice.outPath + "/.local/bin/booksplit";
name = "booksplit";
packages = [pkgs.ffmpeg pkgs.glibc.bin];
};
dmenu-randr = pkgs.callPackage packages/dmenu-randr.nix {};
tag = wrapScript {
script = inputs.voidrice.outPath + "/.local/bin/tag";
name = "tag";
packages = [pkgs.ffmpeg];
};
};
});
} }

37
lib/colours/antares.nix Normal file
View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#151515";
dark = "#000000";
};
red = {
bright = "#de575c";
dark = "#de575c";
};
yellow = {
bright = "#ebe971";
dark = "#ebe971";
};
green = {
bright = "#00b853";
dark = "#00b853";
};
blue = {
bright = "#90d0f0";
dark = "#7fc6f0";
};
magenta = {
bright = "#cf9ffa";
dark = "#cf9ffa";
};
cyan = {
bright = "#4ae5e8";
dark = "#4ae5e8";
};
white = {
bright = "#ffffff";
dark = "#bbbbbb";
};
background = black.dark;
foreground = white.dark;
cursor = green.bright;
}

View File

@@ -0,0 +1,37 @@
{
black = {
bright = "#444444";
dark = "#1c1c1c";
};
red = {
bright = "#ff8700";
dark = "#af5f5f";
};
green = {
bright = "#87af87";
dark = "#5f875f";
};
yellow = {
bright = "#ffffaf";
dark = "#87875f";
};
blue = {
bright = "#8fafd7";
dark = "#5f87af";
};
magenta = {
bright = "#8787af";
dark = "#5f5f87";
};
cyan = {
bright = "#5fafaf";
dark = "#5f8787";
};
white = {
bright = "#999999";
dark = "#6c6c6c";
};
background = "#262626";
foreground = "#bcbcbc";
cursor = "#bcbcbc";
}

37
lib/colours/ayu-dark.nix Normal file
View File

@@ -0,0 +1,37 @@
{
black = {
dark = "#000000";
bright = "#323232";
};
red = {
dark = "#ff3333";
bright = "#ff6565";
};
green = {
dark = "#b8cc52";
bright = "#e9fe83";
};
yellow = {
dark = "#e6c446";
bright = "#fff778";
};
blue = {
dark = "#36a3d9";
bright = "#68d4ff";
};
magenta = {
dark = "#f07078";
bright = "#ffa3aa";
};
cyan = {
dark = "#95e5cb";
bright = "#c7fffc";
};
white = {
dark = "#ffffff";
bright = "#ffffff";
};
background = "#0e1419";
foreground = "#e5e1cf";
cursor = "#f19618";
}

37
lib/colours/ayu-light.nix Normal file
View File

@@ -0,0 +1,37 @@
{
black = {
dark = "#000000";
bright = "#323232";
};
red = {
dark = "#ff3333";
bright = "#ff6565";
};
green = {
dark = "#86b200";
bright = "#b8e532";
};
yellow = {
dark = "#f19618";
bright = "#ffc849";
};
blue = {
dark = "#41a6d9";
bright = "#73d7ff";
};
magenta = {
dark = "#f07078";
bright = "#ffa3aa";
};
cyan = {
dark = "#4cbe99";
bright = "#7ff0cb";
};
white = {
dark = "#ffffff";
bright = "#ffffff";
};
background = "#fafafa";
foreground = "#5b6673";
cursor = "#ff6900";
}

37
lib/colours/connermcd.nix Normal file
View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#454545";
dark = "#222222";
};
red = {
bright = "#FA8072";
dark = "#B22222";
};
green = {
bright = "#779A3E";
dark = "#556B2F";
};
yellow = {
bright = "#DAA520";
dark = "#B8860B";
};
blue = {
bright = "#6495ED";
dark = "#4682B4";
};
magenta = {
bright = "#DA70D6";
dark = "#9932CC";
};
cyan = {
bright = "#B0E0E6";
dark = "#87CEEB";
};
white = {
bright = "#FFFFFF";
dark = "#C0C0C0";
};
background = "#000000";
foreground = "#AAAAAA";
cursor = green.bright;
}

37
lib/colours/ibm-3270.nix Normal file
View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#888888";
dark = "#222222";
};
red = {
bright = "#ef8383";
dark = "#f01818";
};
yellow = {
bright = "#efe28b";
dark = "#f8d824";
};
green = {
bright = "#23d830";
dark = "#7ed684";
};
blue = {
bright = "#b3bfef";
dark = "#7890f0";
};
magenta = {
bright = "#efb3e3";
dark = "#f078d8";
};
cyan = {
bright = "#9ce2e2";
dark = "#54e4e4";
};
white = {
bright = "#ffffff";
dark = "#a5a5a5";
};
background = "#000000";
foreground = "#bbbbbb";
cursor = green.bright;
}

37
lib/colours/mac-os.nix Normal file
View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#818383";
dark = "#000000";
};
red = {
bright = "#fc391f";
dark = "#c23621";
};
yellow = {
bright = "#eaec23";
dark = "#adad27";
};
green = {
bright = "#31e722";
dark = "#25bc24";
};
blue = {
bright = "#5833ff";
dark = "#492ee1";
};
magenta = {
bright = "#f935f8";
dark = "#d338d3";
};
cyan = {
bright = "#14f0f0";
dark = "#33bbc8";
};
white = {
bright = "#e9ebeb";
dark = "#cbcccd";
};
background = black.dark;
foreground = white.dark;
cursor = green.bright;
}

View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#4b4b4b";
dark = "#242424";
};
red = {
bright = "#fc1c18";
dark = "#d71c15";
};
green = {
bright = "#6bc219";
dark = "#5aa513";
};
yellow = {
bright = "#fec80e";
dark = "#fdb40c";
};
blue = {
bright = "#0955ff";
dark = "#063b8c";
};
magenta = {
bright = "#fb0050";
dark = "#e40038";
};
cyan = {
bright = "#3ea8fc";
dark = "#2595e1";
};
white = {
bright = "#8c00ec";
dark = "#efefef";
};
background = "#181818";
foreground = white.dark;
cursor = "#bbbbbb";
}

View File

@@ -0,0 +1,37 @@
rec {
black = {
bright = "#282c34";
dark = "#282c34";
};
red = {
bright = "#e06c75";
dark = "#e06c75";
};
green = {
bright = "#98c379";
dark = "#98c379";
};
yellow = {
bright = "#e5c07b";
dark = "#e5c07b";
};
blue = {
bright = "#61afef";
dark = "#61afef";
};
magenta = {
bright = "#c678dd";
dark = "#c678dd";
};
cyan = {
bright = "#56b6c2";
dark = "#56b6c2";
};
white = {
bright = "#dcdfe4";
dark = "#dcdfe4";
};
background = black.dark;
foreground = white.bright;
cursor = "#a3b3cc";
}

View File

@@ -0,0 +1,37 @@
rec {
black = {
dark = "#073642";
bright = "#002b36";
};
red = {
dark = "#dc322f";
bright = "#cb4b16";
};
yellow = {
dark = "#b58900";
bright = "#657b83";
};
green = {
dark = "#859900";
bright = "#586e75";
};
blue = {
dark = "#268bd2";
bright = "#839496";
};
magenta = {
dark = "#d33682";
bright = "#6c71c4";
};
cyan = {
dark = "#2aa198";
bright = "#93a1a1";
};
white = {
dark = "#eee8d5";
bright = "#fdf6e3";
};
background = black.bright;
foreground = blue.bright;
cursor = cyan.bright;
}

View File

@@ -0,0 +1,37 @@
rec {
black = {
dark = "#073642";
bright = "#002b36";
};
red = {
dark = "#dc322f";
bright = "#cb4b16";
};
yellow = {
dark = "#b58900";
bright = "#657b83";
};
green = {
dark = "#859900";
bright = "#586e75";
};
blue = {
dark = "#268bd2";
bright = "#839496";
};
magenta = {
dark = "#d33682";
bright = "#6c71c4";
};
cyan = {
dark = "#2aa198";
bright = "#93a1a1";
};
white = {
dark = "#eee8d5";
bright = "#fdf6e3";
};
background = white.bright;
foreground = yellow.bright;
cursor = green.bright;
}

View File

@@ -1,5 +1,5 @@
pkgs: rec { pkgs: rec {
terminal = "alacritty"; terminal = "alacritty";
browser = "${pkgs.firefox}/bin/firefox"; browser = "${pkgs.brave}/bin/brave";
fileManager = "${pkgs.pcmanfm}/bin/pcmanfm"; fileManager = "${terminal} -e ${pkgs.ranger}/bin/ranger";
} }

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