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

156 Commits

Author SHA1 Message Date
06c1be9e09 wip: flakes 2021-12-29 17:41:53 +01:00
d5087c40b2 feat: use flake nix 2021-12-28 23:24:30 +01:00
23fb65ce1e chore(retiolum): update 2021-12-28 20:49:43 +01:00
c49a5a4187 feat(retiolum): use ed25519 keys 2021-12-28 17:04:54 +01:00
42df2c032e derp 2021-12-28 17:04:54 +01:00
86d6943dd2 feat(kabsa): disable zramfs 2021-12-28 17:04:54 +01:00
6f10cd277d fix(weechat): matrix server 2021-12-28 15:39:56 +01:00
869c6e6a08 fix(vim): make a tiny bit faster 2021-12-28 14:48:29 +01:00
5b131a5a30 feat: flameshot -> flameshot-once 2021-12-28 14:48:09 +01:00
0423429e02 fix: send transits at correct time 2021-12-27 10:40:51 +01:00
f451cc5028 feat(astrolog): configure 2021-12-27 10:29:11 +01:00
8f9e8db71e fix(traadfri): dont timeout 2021-12-25 18:03:57 +01:00
81e6b5c9f6 feat: transits telegram bot 2021-12-25 08:31:11 +01:00
50d8788088 chore: update 2021-12-25 08:31:11 +01:00
805b46ffb1 feat: remove nur-packages 2021-12-25 08:31:10 +01:00
bc9217ba3e feat(weechat): improve zero covid 2021-12-22 23:08:58 +01:00
db2ec25bc1 feat: remove praesenzlehre-berlin.org 2021-12-22 23:06:54 +01:00
33b960143b feat: remove nur-packages 2021-12-22 22:55:43 +01:00
f02225d1e9 feat: use upstream astrolog 2021-12-22 10:19:16 +01:00
9c2e2df05a feat: astrolog 2021-12-21 18:17:37 +01:00
aaeef41f55 feat: anki# 2021-12-21 07:39:23 +01:00
0787da719e fix(retiolum-map): also update index.html 2021-12-20 15:10:19 +01:00
e225a7d451 feat(tinc-graph): update 2021-12-18 10:48:38 +01:00
9d3b29add2 chore: update 2021-12-17 19:02:32 +01:00
5792224240 Revert "feat(shell.nix): colourful parallel"
This reverts commit 5ade0a7011.
2021-12-17 19:02:22 +01:00
ecadc12c9f feat(zaatar): disable tuna 2021-12-16 08:46:02 +01:00
4ecc34b63e feat(tarot): update key file 2021-12-16 00:19:28 +01:00
48e2be7427 feat(tarot): serve files and waites key 2021-12-15 15:01:19 +01:00
296a3a9c9f feat(tarot): occasionally reverse 2021-12-15 15:00:46 +01:00
0136215a4a feat(tarot): run at tarot.kmein.de 2021-12-15 13:54:51 +01:00
dd8a885e81 feat: add transits script 2021-12-15 13:54:51 +01:00
e755ee06e2 feat(makanek): run tarot service on tarot.kmein.r 2021-12-15 12:38:09 +01:00
5ade0a7011 feat(shell.nix): colourful parallel 2021-12-15 12:38:09 +01:00
bed0795a04 fix(monitoring): probe alew.hu-berlin.de every 5 min 2021-12-14 19:20:11 +01:00
31d59aba6a feat(monitoring): probe alew.hu-berlin.de 2021-12-14 19:20:10 +01:00
08c04462a7 feat(monitoring): probe alew.hu-berlin.de 2021-12-13 17:29:09 +01:00
7d00a2e896 fix(pmount): setuid root 2021-12-13 11:58:00 +01:00
1027a850fb feat: add bvg disruptions script 2021-12-13 11:57:42 +01:00
314134d861 feat(hu-berlin): reenable forti vpn 2021-12-13 11:57:27 +01:00
143b2f1a06 Revert "feat(nextcloud): move to cloud.kmein.de"
This reverts commit 8a45abae35.
2021-12-11 09:45:25 +01:00
02cc600c68 feat: install pandoc users guide as man page 2021-12-10 20:25:07 +01:00
25c48354f7 feat: add csv2json and json2csv scripts 2021-12-10 19:43:06 +01:00
5b2c2c7709 feat(scripts): add auc roman calendar 2021-12-10 19:42:52 +01:00
e55cc77825 feat(readme): add attribution 2021-12-09 12:59:19 +01:00
8a45abae35 feat(nextcloud): move to cloud.kmein.de 2021-12-09 07:14:35 +01:00
e046c74539 chore(retiolum): update 2021-12-08 13:11:07 +01:00
9dae3e2d1a feat(weechat): add weechat-matrix 2021-12-08 12:15:14 +01:00
0fea7ba938 feat(moodle-dl): serve via retiolum 2021-12-08 11:39:19 +01:00
edcbe19fb2 feat: add rudimentary readme 2021-12-08 11:03:48 +01:00
ee573e13fc fix(kabsa, manakish): disable illum, hardware does it by itself 2021-12-07 20:09:22 +01:00
83d23f8b55 feat(zaatar): add gaslight 2021-12-07 20:00:10 +01:00
addd7077ed fix(khal): restore cloud address 2021-12-07 20:00:10 +01:00
ec175ef3d7 feat(khal): config format changed with 4.0.0 2021-12-07 20:00:10 +01:00
a7a103c853 feat(urlwatch): add zeno ebooks site 2021-12-04 11:35:36 +01:00
2105a5a0fe feat(weechat): #home-manager 2021-12-04 11:35:36 +01:00
d5a71770a6 feat: kierán.de -> kmein.de 2021-12-03 12:17:36 +01:00
bff6ede4c1 feat(ssh): add alew machine 2021-12-02 14:19:14 +01:00
5a82328b37 feat: make work with 21.11 2021-12-01 17:38:47 +01:00
b3871ba6aa feat(graph.r): use geoip from updater, share with retiolum 2021-12-01 12:04:26 +01:00
9b68ac87d8 chore(nextcloud): create password files 2021-12-01 12:03:55 +01:00
bbc50f3642 feat(radio, urlwatch): create groups 2021-12-01 12:03:33 +01:00
fc067a8493 feat(retiolum-map): use 21.11 geoipupdate 2021-12-01 09:58:46 +01:00
4ac499530d chore(names): update 2021-12-01 09:47:51 +01:00
078b3f6183 chore(tinc-graph): update 2021-12-01 09:47:45 +01:00
ca0267ce22 fix(tuna): new syncthing syntax 2021-12-01 09:47:14 +01:00
10d003371e fix(tuna, moodle-dl): create groups for users 2021-12-01 08:14:18 +01:00
33da8389f5 chore: update to 21.11 2021-12-01 08:14:05 +01:00
707e1f1565 chore(retiolum): update 2021-12-01 07:42:22 +01:00
312dd27f02 feat: add service to supersede graph.r 2021-11-30 22:31:19 +01:00
5a0f6d3035 feat(weechat): new variant 2021-11-30 22:31:19 +01:00
77bd1116ea chore: update 2021-11-30 22:31:19 +01:00
8d4362d903 feat(khal): configure more 2021-11-25 08:25:47 +01:00
bc4e25a42d feat(i3status-rust): increase rate 2021-11-24 18:20:04 +01:00
96627b6f50 feat(weechat): improve zero-covid 2021-11-24 11:12:34 +01:00
6f2a824d8b fix(pls): skip/like before reporting in IRC 2021-11-24 11:11:46 +01:00
a65a4b28da feat: copyq 2021-11-23 21:48:00 +01:00
41f87bdc37 feat(pls): add recent command 2021-11-23 21:47:30 +01:00
85ab948ccd feat(zaatar): install ncmpcpp 2021-11-21 11:55:04 +01:00
9f834e742e chore: update 2021-11-21 11:40:52 +01:00
416d3ab277 feat(i3status-rust): show moon fullness percentage 2021-11-20 09:40:32 +01:00
82b9bb2a4c feat(sa): add possibility of devanagari output 2021-11-20 09:39:57 +01:00
82b650bdbf fix: book reading script cannot be named "read" 2021-11-20 09:39:27 +01:00
06125303b8 feat: add some scripts for reading pdfs 2021-11-19 13:40:32 +01:00
c0efacd6ce chore: update 2021-11-19 13:40:19 +01:00
2aff28c6ed feat: astrological info script 2021-11-19 08:09:08 +01:00
e27db27fd8 chore: update 2021-11-15 18:43:47 +01:00
683bd2f3be feat: closest word script 2021-11-15 18:43:34 +01:00
01e3cef34f feat(i3): add moon phase to status bar 2021-11-13 23:39:01 +01:00
f921d3d3b6 fix(monitoring): grafana link 2021-11-13 19:17:35 +01:00
ffa3f820ce feat(pls): more insults 2021-11-12 20:22:51 +01:00
8738cb4a58 feat: kirčiuoklis script 2021-11-12 20:06:08 +01:00
a2b706e787 feat(direnv): simplify shell.nix template 2021-11-12 20:06:08 +01:00
22247715a3 feat(fonts): alegreya{,-sans} 2021-11-12 20:06:08 +01:00
bdd4bda339 fix(hedgedoc): serve ssl correctly 2021-11-12 20:06:08 +01:00
1002fd8b43 fix(NetworkManager): use constant addresses for home wifi 2021-11-12 20:06:08 +01:00
1f48644558 feat(haskell): install monad-memo, edit-distance 2021-11-12 16:03:43 +01:00
da95622df1 chore: update 2021-11-08 17:55:06 +01:00
e275c81257 fix(monitoring): display host name in reboot message 2021-11-08 10:06:29 +01:00
bf7d0165b1 feat: add more sanskrit dictionaries 2021-11-07 13:12:11 +01:00
cb10b423dc feat(mpv): reenable osc 2021-11-06 08:15:07 +01:00
a93a34e546 feat(mpv): sane screenshot template 2021-11-06 07:45:02 +01:00
c7603af4d0 fix(matterbridge): dont strip markdown 2021-11-06 07:45:02 +01:00
dd685afb7c feat(mpv): dont generate thumbnails, it is eating up my cpu 2021-11-04 07:25:40 +01:00
055b4016e6 feat(moodle-dl): two more 2021-10-28 15:16:16 +02:00
f361d2b877 feat: add russian keyboard 2021-10-28 15:06:33 +02:00
8b00faf762 feat(vdirsyncer): fix birthday calendar issue, add fysi 2021-10-26 20:43:56 +02:00
f7d72e00b6 feat(neomutt): add macros to limit messages 2021-10-24 19:16:37 +02:00
087c138906 fix(beets): remove buggy lyrics plugin 2021-10-24 19:16:37 +02:00
bf8f6d8d52 feat(i3status-rust): rewrite sun timer to work offline 2021-10-24 18:22:55 +02:00
fcf2aa4cca chore: update 2021-10-24 08:38:43 +02:00
48484514bc feat(moodle-dl): add one more course 2021-10-24 08:25:35 +02:00
aa359ad986 fix(menstruation): update to fix timezone 2021-10-21 13:29:17 +02:00
2432b0bbaa feat(moodle-dl): add one more course 2021-10-21 12:18:07 +02:00
2b754d4a5b feat(moodle-dl): add one more course 2021-10-21 12:18:07 +02:00
f38e5c3295 feat(moodle-dl): add one more course 2021-10-20 09:11:56 +02:00
f6b4740b73 chore: update 2021-10-19 22:53:56 +02:00
c06fb3f50c feat(pls): use ircaids 2021-10-19 22:42:29 +02:00
4ae2fa4a6a feat: unify/update stockholm pkgs 2021-10-19 22:42:00 +02:00
6809db5ccc feat(moodle-dl): add one more course 2021-10-19 19:41:04 +02:00
c9fb802c55 feat: install menstruation 2021-10-19 18:59:29 +02:00
2f4505d29b feat(i3status-rust): remove keyboard indicator 2021-10-19 18:55:46 +02:00
b43de46611 feat(i3status-rust): add sun timer 2021-10-19 18:02:42 +02:00
3545c37084 chore(menstruation): update 2021-10-19 17:10:18 +02:00
043fe3b67b feat(moodle-dl): one more course 2021-10-19 14:51:43 +02:00
f0779c45c3 feat(moodle-dl): two more courses 2021-10-19 14:35:12 +02:00
b7a6fda046 chore(menstruation): update 2021-10-19 10:54:30 +02:00
e431e0bf03 fix(urlwatch): make tatort more readable 2021-10-19 09:20:30 +02:00
ac54cd5eaf feat(makanek): run mensa bot 2021-10-18 21:14:52 +02:00
4bd5965915 fix(monitoring): clearly say when stuff is resolved 2021-10-18 20:56:42 +02:00
f21112465b feat(menstruation): add as submodules 2021-10-18 18:19:47 +02:00
b989684f12 feat(vdirsyncer): restart after failure 2021-10-18 07:24:43 +02:00
beef73daab feat(moodle-dl): one more course 2021-10-18 07:24:32 +02:00
de3fbfd356 feat(moodle-dl): add first WS21 courses 2021-10-17 20:18:59 +02:00
a1e88e30a7 feat(makanek): add onomastics service 2021-10-12 23:25:11 +02:00
c50698f275 feat: manage retiolum addresses globally, declaratively share moodle 2021-10-12 11:51:55 +02:00
6119c0dbcc feat: bye bye keybase 2021-10-12 11:51:14 +02:00
7dd5a9e269 feat(neomutt): dont ask about ~/Mail 2021-10-11 20:03:03 +02:00
2384a4eef5 feat: add serveHtml helper 2021-10-11 20:02:41 +02:00
f6ffd477d1 feat(zaatar): run bvg info dashboard 2021-10-11 20:02:41 +02:00
77fc7e4832 feat(i3status-rust): show current keyboard layout 2021-10-11 20:02:41 +02:00
76d75048fa feat(neomutt): add old uni account, add alias 2021-10-11 20:02:41 +02:00
71e65461cf feat: simplify use of krebs pkgs 2021-10-11 20:02:41 +02:00
6545b016c5 feat: remove traces of old mail setup 2021-10-08 22:17:05 +02:00
6eff3d831c feat(nextcloud): update 2021-10-08 20:25:54 +02:00
80abae0daa feat: spotify-tui -> ncspot 2021-10-08 20:04:05 +02:00
bbdef3a8ed feat(neomutt): add mua alias 2021-10-08 20:03:52 +02:00
1f28eb000d feat(monitoring): add uptime alert 2021-10-08 20:03:44 +02:00
fb7a295310 chore: update 2021-10-08 20:03:28 +02:00
ad84e0445d feat(neomutt): style and simplify 2021-10-08 16:00:20 +02:00
faac180148 feat: bye bye notmuch, hello neomutt 2021-10-07 08:59:54 +02:00
2691608f8c feat: LB 2021-10-07 08:59:54 +02:00
9678ba7b28 chore: update 2021-10-03 23:41:55 +02:00
dc90c4c6ab feat: qrpaste 2021-09-23 21:25:50 +02:00
4c2a4df663 feat(networkmanager): declarative 2021-09-22 08:03:47 +02:00
c60e90f001 fix(monitoring): telegram alerts grafana link 2021-09-22 07:56:17 +02:00
d0f1287c68 feat(radio): rip antenne-asb.ga 2021-09-22 07:56:17 +02:00
122 changed files with 2577 additions and 923 deletions

46
.bin/bvg.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/sh
interesting="U6 N6 140 M46 184 N84"
curl -sSL 'https://www.bvg.de/disruption-reports/q' \
--data-raw '{"variables":{},"query":"{
allDisruptions {
disruptions {
meldungsId
linie
verkehrsmittel
__typename
... on Traffic {
datum
gueltigVonDatum
gueltigVonZeit
gueltigBisDatum
gueltigBisZeit
richtungName
richtungHafasId
beginnAbschnittName
beginnAbschnittHafasId
endeAbschnittName
endeAbschnittHafasId
textIntUrsache
sev
textIntAuswirkung
umfahrung
textWAPSMSUrsache
textWAPSMSAuswirkung
prioritaet
__typename
}
}
__typename
}
}"}' \
| jq --arg interesting "$interesting" '
.data.allDisruptions.disruptions
| map(select(
(.linie as $linie
| $interesting
| split(" ")
| index($linie))
and (.["__typename"] == "Traffic")
))
'

14
.bin/csv2json Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python3
import csv
import json
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--delimiter", "-d", default=",", help="CSV field separator")
args = parser.parse_args()
if __name__ == "__main__":
json.dump(list(csv.DictReader(sys.stdin, delimiter=args.delimiter)), sys.stdout)

7
.bin/elm-publish-private Executable file
View File

@@ -0,0 +1,7 @@
#! /usr/bin/env nix-shell
#! nix-shell -p "(import <nixpkgs> { overlays = [ (import ~/work/fysiweb/engiadina-pwa/devops/pkgs) ]; }).elm-publish-private"
#! nix-shell -i bash
set -efux
exec elm-publish-private "$@"

24
.bin/json2csv Executable file
View File

@@ -0,0 +1,24 @@
#!/usr/bin/env python3
import csv
import json
import sys
if __name__ == "__main__":
json_list = json.load(sys.stdin)
if not isinstance(json_list, list):
print("JSON object is not a list.", file=sys.stderr)
sys.exit(1)
if len(json_list) == 0:
print("JSON list is empty.", file=sys.stderr)
sys.exit(1)
keys = set()
for element in json_list:
if isinstance(element, dict):
keys |= element.keys()
else:
print("Non-dict element:", element, file=sys.stderr)
sys.exit(1)
writer = csv.DictWriter(sys.stdout, fieldnames=list(keys))
writer.writeheader()
for element in json_list:
writer.writerow(element)

6
.bin/sample-pdf.sh Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/sh
filepath="$(shuf --head-count=1)"
pages="$(pdfinfo "$filepath" | awk '/^Pages:/{print $2}')"
random_page="$(shuf --input-range="1-$pages" --head-count=1)"
zathura --page="$random_page" "$filepath"

12
.gitmodules vendored
View File

@@ -1,3 +1,9 @@
[submodule "submodules/much"] [submodule "submodules/menstruation-telegram"]
path = submodules/much path = submodules/menstruation-telegram
url = git@github.com:kmein/much url = https://github.com/kmein/menstruation-telegram
[submodule "submodules/menstruation-backend"]
path = submodules/menstruation-backend
url = https://github.com/kmein/menstruation.rs
[submodule "submodules/nur-packages"]
path = submodules/nur-packages
url = git@github.com:kmein/nur-packages.git

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://github.com/nix-community/home-manager.git", "url": "https://github.com/nix-community/home-manager.git",
"rev": "7d9ba15214004c979d2c8733f8be12ce6502cf8a", "rev": "697cc8c68ed6a606296efbbe9614c32537078756",
"date": "2021-09-14T00:53:31+02:00", "date": "2021-12-19T00:59:29+01:00",
"path": "/nix/store/83xlchpzj511c0db0whl99x1ww1apnb5-home-manager", "path": "/nix/store/fb46bv10azrag2jjlzhil6j11f4x8glw-home-manager",
"sha256": "18kmvzinsi9xgm81dk5kyd03m3y5nn125kmbkxf66xasrg13yqdv", "sha256": "1c8gxm86zshr2zj9dvr02qs7y3m46gqavr6wyv01r09jfd99dxz9",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -4,6 +4,7 @@
"date": "2021-03-23T22:47:37+01:00", "date": "2021-03-23T22:47:37+01:00",
"path": "/nix/store/mz13xxnil35lwsf90hwnrm2agir7hb51-krops", "path": "/nix/store/mz13xxnil35lwsf90hwnrm2agir7hb51-krops",
"sha256": "07mg3iaqjf1w49vmwfchi7b1w55bh7rvsbgicp2m47gnj9alwdb6", "sha256": "07mg3iaqjf1w49vmwfchi7b1w55bh7rvsbgicp2m47gnj9alwdb6",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -0,0 +1,11 @@
{
"url": "https://cgit.krebsco.de/nix-writers",
"rev": "c528cf970e292790b414b4c1c8c8e9d7e73b2a71",
"date": "2019-04-02T20:05:33+02:00",
"path": "/nix/store/wm5zhsha1a2iy0d582nlfi7604ayd1vz-nix-writers",
"sha256": "0xdivaca1hgbxs79jw9sv4gk4f81vy8kcyaff56hh2dgq2awyvw4",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://github.com/mozilla/nixpkgs-mozilla", "url": "https://github.com/mozilla/nixpkgs-mozilla",
"rev": "0510159186dd2ef46e5464484fbdf119393afa58", "rev": "7c1e8b1dd6ed0043fb4ee0b12b815256b0b9de6f",
"date": "2021-08-17T20:37:26+02:00", "date": "2021-12-07T09:28:33-05:00",
"path": "/nix/store/w877m55xnigwaqrnadmnh2fkvfdxlan5-nixpkgs-mozilla", "path": "/nix/store/pqwcw589i2y2w2116wn3ifl834adjsa0-nixpkgs-mozilla",
"sha256": "1c6r5ldkh71v6acsfhni7f9sxvi7xrqzshcwd8w0hl2rrqyzi58w", "sha256": "1a71nfw7d36vplf89fp65vgj3s66np1dc0hqnqgj5gbdnpm1bihl",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://github.com/NixOS/nixpkgs.git", "url": "https://github.com/NixOS/nixpkgs.git",
"rev": "aee6aefa230479a9c35f5d9031786c83c2db19a2", "rev": "f01adc7b35a8f80e82f3466e6d873b8b9c8f1b28",
"date": "2021-09-14T21:10:26+08:00", "date": "2021-12-22T23:05:28+01:00",
"path": "/nix/store/jmxwzpfb24z159rnpa29drgb8z2znjl9-nixpkgs", "path": "/nix/store/zhfrvg77dzpc3hq02v9zv20dfgqwpzk6-nixpkgs",
"sha256": "0vy89mw8nd4jrv3byisynl7a3gsx0fsfpgqpaqz2z7vy60l1mkiq", "sha256": "17iyf2iiizi7c1wr71day3wvgalbkkm2zgc9lpy7y42rl4frq9sf",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://github.com/NixOS/nixpkgs.git", "url": "https://github.com/NixOS/nixpkgs.git",
"rev": "b3083bc6933eb7fa4ee7bd4802e9f72b56f3e654", "rev": "9ab7d12287ced0e1b4c03b61c781901f178d9d77",
"date": "2021-09-13T17:06:43+02:00", "date": "2021-12-21T10:09:48+01:00",
"path": "/nix/store/18nwp35nj16hr2li3xbs6vczvw32rp5p-nixpkgs", "path": "/nix/store/minmlh0avkwvvc3p7flhpbglp13kr585-nixpkgs",
"sha256": "1cj8jmzgf2rpf8n8yjsh6qsh66rqpyxh8jhn65ll15578fh98gb9", "sha256": "0bbd2pgcyavqn5wgq0xp8p67lha0kv9iqnh49i9w5fb5g29q7i30",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -1,10 +0,0 @@
{
"url": "https://github.com/nix-community/NUR",
"rev": "967dc2db6c7666d5d99113c10b3ff288bf515560",
"date": "2021-09-14T12:44:44+00:00",
"path": "/nix/store/pyxjrg05v2z9zfsqmhg1im7z1sxcya22-NUR",
"sha256": "1lqfny81k2kmsamrf745dm4iw1zk0kdr33hcyf37kvcn99vm870z",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://github.com/krebs/retiolum", "url": "https://github.com/krebs/retiolum",
"rev": "5384cff550036aa3581f8c6f851392329f28ffe8", "rev": "b72b0a987767b587c79cba8499b5114d69fceeef",
"date": "2021-09-19T09:32:14+02:00", "date": "2021-12-28T19:46:45+00:00",
"path": "/nix/store/izzhb6p76h96zmlz5xdxa1xrpixhbk4s-retiolum", "path": "/nix/store/kyaqwf89v6id9mda92x4b0hf778j987x-retiolum",
"sha256": "07318jnkb8zycyi43fydrmrsrbq9ajhb2nnaahj1bxg77pb4wj7a", "sha256": "19hjzzlfk1m9ign33w4ppqgmg23v7c6k8l0fm7f33spq8982w7rb",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

View File

@@ -1,9 +1,10 @@
{ {
"url": "https://cgit.krebsco.de/stockholm", "url": "https://cgit.lassul.us/stockholm",
"rev": "20e358043546482acfa8c6134f095c1a64ef144d", "rev": "576c05cf3a0ceddefa29c2d0073108177c3cfa52",
"date": "2021-08-31T20:06:03+02:00", "date": "2021-12-22T13:59:46+01:00",
"path": "/nix/store/a03pd46kdsfy9d2q9xlzapnzkj4vf20r-stockholm", "path": "/nix/store/yx1j5pardgd9114f0cf3c4xjfq6r4yfv-stockholm",
"sha256": "0cwl36zc68qjwcahjgc3vn9qpnyi351m6ngnq21wlncn0k2gqw4a", "sha256": "18napi4k8i2iizrismlp9ha3ga6c3n2dvrhijy59kl1jxqrsaq9l",
"fetchLFS": false,
"fetchSubmodules": false, "fetchSubmodules": false,
"deepClone": false, "deepClone": false,
"leaveDotGit": false "leaveDotGit": false

10
README.md Normal file
View File

@@ -0,0 +1,10 @@
# niveum
> [nĭvĕus](https://logeion.uchicago.edu/niveus), a, um, adj. [nix], _of_ or _from snow, snowy, snow-_ (poet.)
>
> 1. Lit.: aggeribus niveis informis, Verg. G. 3, 354: aqua, _cooled with snow_, Mart. 12, 17, 6; cf. id. 14, 104 and 117: mons, _covered with snow_, Cat. 64, 240.—
>
> 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
> das ist ja pure poesie —[xkey](https://github.com/riotbib)

View File

@@ -5,7 +5,7 @@
"beets/config.yaml".source = (pkgs.formats.yaml {}).generate "config.yaml" { "beets/config.yaml".source = (pkgs.formats.yaml {}).generate "config.yaml" {
directory = "~/cloud/syncthing/music"; directory = "~/cloud/syncthing/music";
library = "~/cloud/syncthing/common/music.db"; library = "~/cloud/syncthing/common/music.db";
plugins = lib.concatStringsSep " " [ "fetchart" "lastgenre" "lyrics" ]; plugins = toString [ "fetchart" "lastgenre" ];
}; };
}; };
} }

57
configs/bvg.nix Normal file
View File

@@ -0,0 +1,57 @@
{ pkgs, lib, ... }:
let
inherit (import <niveum/lib>) serveHtml;
stations = [
900068204 # A/M
900068302 # KAS
900068203 # B-P
];
fahrplan = pkgs.writeText "fahrplan.html" ''
<!DOCTYPE html>
<title>Fahrplan</title>
<link
rel="icon"
type="image/x-icon"
href="https://mobil.bvg.de/Fahrinfo/img/ua_xhtml/logo.gif"
/>
<style>
body {
margin: 0;
--bvg-yellow: #f0d722;
}
#fahrplan {
display: flex;
height: 100vh;
width: 100%;
flex-direction: row;
}
#fahrplan iframe {
flex-grow: 1;
border: none;
}
#fahrplan iframe + iframe {
border-left: 2px solid var(--bvg-yellow);
}
</style>
<body>
<div id="fahrplan">
${lib.concatMapStrings (station: ''
<iframe scrolling="no" src="https://mobil.bvg.de/Fahrinfo/bin/stboard.bin/dox?ld=0.1&input=${toString station}&boardType=depRT&start=yes"></iframe>
'') stations}
</div>
</body>
'';
in
{
services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
};
services.nginx.virtualHosts."bvg.kmein.r" = {
locations."/".extraConfig = serveHtml fahrplan pkgs;
};
}

View File

@@ -1,12 +1,4 @@
{ config, lib, pkgs, ... }: { { config, lib, pkgs, ... }: {
imports = [
<niveum/modules/dropbox.nix>
];
niveum = {
dropbox.enable = false;
};
system.activationScripts.home-symlinks = '' system.activationScripts.home-symlinks = ''
ln -sfn ${config.users.users.me.home}/cloud/syncthing/common/mahlzeit ${config.users.users.me.home}/mahlzeit ln -sfn ${config.users.users.me.home}/cloud/syncthing/common/mahlzeit ${config.users.users.me.home}/mahlzeit
ln -sfn ${config.users.users.me.home}/cloud/Seafile/Wiki ${config.users.users.me.home}/notes ln -sfn ${config.users.users.me.home}/cloud/Seafile/Wiki ${config.users.users.me.home}/notes
@@ -17,6 +9,17 @@
services.nextcloud-client.enable = true; services.nextcloud-client.enable = true;
}; };
environment.systemPackages = [
(pkgs.writers.writeDashBin "book" ''
set -efu
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/Seafile/Books -type f
} | ${pkgs.fzf}/bin/fzf)"
${pkgs.zathura}/bin/zathura "$book"
'')
];
fileSystems."/media/moodle" = { fileSystems."/media/moodle" = {
device = "zaatar.r:/moodle"; device = "zaatar.r:/moodle";
fsType = "nfs"; fsType = "nfs";
@@ -33,21 +36,19 @@
openDefaultPorts = true; openDefaultPorts = true;
configDir = "/home/kfm/.config/syncthing"; configDir = "/home/kfm/.config/syncthing";
dataDir = "/home/kfm/.config/syncthing"; dataDir = "/home/kfm/.config/syncthing";
declarative = rec { cert = toString <system-secrets/syncthing/cert.pem>;
cert = toString <system-secrets/syncthing/cert.pem>; key = toString <system-secrets/syncthing/key.pem>;
key = toString <system-secrets/syncthing/key.pem>; inherit ((import <niveum/lib>).syncthing) devices;
inherit ((import <niveum/lib>).syncthing) devices; folders =
folders = let cloud-dir = "${config.users.users.me.home}/cloud";
let cloud-dir = "${config.users.users.me.home}/cloud"; in {
in { "${cloud-dir}/syncthing/common".devices = [ "kabsa" "manakish" ];
"${cloud-dir}/syncthing/common".devices = [ "kabsa" "manakish" ]; "${cloud-dir}/syncthing/library".devices = [ "kabsa" "manakish" "heym" ];
"${cloud-dir}/syncthing/library".devices = [ "kabsa" "manakish" "heym" ]; "${cloud-dir}/syncthing/mundoiu".devices = [ "kabsa" "manakish" "heym" ];
"${cloud-dir}/syncthing/mundoiu".devices = [ "kabsa" "manakish" "heym" ]; "${cloud-dir}/syncthing/music" = {
"${cloud-dir}/syncthing/music" = { devices = [ "kabsa" "manakish" "heym" "zaatar" ];
devices = [ "kabsa" "manakish" "heym" "zaatar" ]; id = "music";
id = "music";
};
}; };
}; };
}; };
} }

37
configs/copyq.nix Normal file
View File

@@ -0,0 +1,37 @@
{ 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

@@ -1,29 +1,23 @@
{ pkgs, lib, config, options, ... }: { inputs, pkgs, lib, config, options, ... }:
let let
inherit (lib.strings) makeBinPath; inherit (lib.strings) makeBinPath;
inherit (import <niveum/lib>) localAddresses kieran; inherit (import <niveum/lib>) localAddresses kieran;
in { in {
imports = [ imports = [
<home-manager/nixos> ../modules/system-dependent.nix
<niveum/modules/system-dependent.nix>
{ {
boot.supportedFilesystems = [ "ntfs" ]; boot.supportedFilesystems = [ "ntfs" ];
} }
{ {
nix.nixPath = [ nix.nixPath = [
"/var/src" "/var/src"
"nixpkgs-overlays=${toString ../overlays}"
]; ];
} }
{ services.dbus.packages = [ pkgs.gnome3.dconf ]; }
{ {
nixpkgs = { nixpkgs = {
config = { config = {
allowUnfree = true; allowUnfree = true;
packageOverrides = pkgs: { packageOverrides = pkgs: {
nur = import <nur> { inherit pkgs; };
writeDashBin = pkgs.writers.writeDashBin;
writeDash = pkgs.writers.writeDash;
gfs-fonts = pkgs.callPackage <niveum/packages/gfs-fonts.nix> {}; gfs-fonts = pkgs.callPackage <niveum/packages/gfs-fonts.nix> {};
iolanguage = pkgs.callPackage <niveum/packages/iolanguage.nix> { }; iolanguage = pkgs.callPackage <niveum/packages/iolanguage.nix> { };
ix = pkgs.callPackage <niveum/packages/ix.nix> { }; ix = pkgs.callPackage <niveum/packages/ix.nix> { };
@@ -31,11 +25,8 @@ in {
}; };
overlays = [ overlays = [
(self: super: { (self: super: {
scripts = import <niveum/packages/scripts> { pkgs = super; lib = super.lib; }; scripts = import <niveum/packages/scripts> { pkgs = super; inherit lib; };
}) })
(import <stockholm/krebs/5pkgs/haskell>)
(import <stockholm/submodules/nix-writers/pkgs>)
(import <stockholm/krebs/5pkgs/override>)
]; ];
}; };
} }
@@ -69,6 +60,7 @@ in {
}; };
home-manager.users.me.xdg.enable = true; home-manager.users.me.xdg.enable = true;
home-manager.users.me.dconf.enable = false;
} }
{ {
sound.enable = true; sound.enable = true;
@@ -142,7 +134,6 @@ in {
}; };
} }
{ i18n.defaultLocale = "en_GB.UTF-8"; } { i18n.defaultLocale = "en_GB.UTF-8"; }
{ services.illum.enable = true; }
{ {
services.xserver = { services.xserver = {
enable = true; enable = true;
@@ -163,8 +154,16 @@ in {
} }
{ {
security.wrappers = { security.wrappers = {
pmount.source = "${pkgs.pmount}/bin/pmount"; pmount = {
pumount.source = "${pkgs.pmount}/bin/pumount"; owner = "root";
group = "users";
source = "${pkgs.pmount}/bin/pmount";
};
pumount = {
owner = "root";
group = "users";
source = "${pkgs.pmount}/bin/pumount";
};
}; };
} }
{ programs.command-not-found.enable = true; } { programs.command-not-found.enable = true; }
@@ -198,12 +197,11 @@ in {
./ccc.nix ./ccc.nix
# ./kleiter.nix # ./kleiter.nix
./khal.nix ./khal.nix
./engiadina.nix
./chromium.nix ./chromium.nix
./cloud.nix ./cloud.nix
./copyq.nix
./compton.nix ./compton.nix
./direnv.nix ./direnv.nix
./distrobump.nix
./docker.nix ./docker.nix
./dunst.nix ./dunst.nix
./flix.nix ./flix.nix
@@ -215,13 +213,13 @@ in {
./htop.nix ./htop.nix
./hu-berlin.nix ./hu-berlin.nix
./i3.nix ./i3.nix
./keybase.nix
./keyboard.nix ./keyboard.nix
./mail/client.nix ./lb.nix
./mpv.nix ./mpv.nix
./mime.nix ./mime.nix
./nano.nix ./nano.nix
./neovim.nix ./neovim.nix
./neomutt.nix
./nix.nix ./nix.nix
./newsboat.nix ./newsboat.nix
./flameshot-once.nix ./flameshot-once.nix

View File

@@ -11,8 +11,7 @@ let
cat > shell.nix <<'EOF' cat > shell.nix <<'EOF'
{ pkgs ? import <nixpkgs> {} }: { pkgs ? import <nixpkgs> {} }:
pkgs.mkShell { pkgs.mkShell {
buildInputs = with pkgs; []; buildInputs = [];
shellHook = "export HISTFILE=''${toString ./.history}";
} }
EOF EOF
''${EDITOR:-vim} shell.nix ''${EDITOR:-vim} shell.nix

View File

@@ -1,10 +0,0 @@
{ lib, config, pkgs, ... }: {
imports = [
(import <stockholm/makefu/3modules/bump-distrowatch.nix> {
inherit lib config;
pkgs = pkgs // { writeDash = pkgs.writers.writeDash; };
})
];
makefu.distrobump.enable = false;
}

View File

@@ -1,30 +0,0 @@
{ config, pkgs, ... }:
let
inherit (import <niveum/lib>) tmpfilesConfig;
cdnRoot = "/var/lib/engiadina";
in
{
imports = [ <stockholm/krebs/3modules/permown.nix> ];
krebs.permown.${cdnRoot} = {
owner = config.users.users.me.name;
group = "users";
umask = "0002";
};
services.nginx = {
enable = true;
virtualHosts.default = {
root = cdnRoot;
listen = [{
addr = "0.0.0.0";
port = 3333;
}];
};
};
environment.shellAliases = {
engiadina-watch = "${pkgs.findutils}/bin/find extra-src src | ${pkgs.entr}/bin/entr -s 'build-component && ${pkgs.rsync}/bin/rsync -avu dist/*.js ${cdnRoot}/'";
engiadina-edit = "$EDITOR ${cdnRoot}/index.html";
};
}

View File

@@ -1,26 +1,24 @@
{ config, lib, pkgs, ... }: { lib, pkgs, ... }:
{ let
home-manager.users.me = { inherit (import <niveum/lib>) defaultApplications;
services.flameshot.enable = true; flameshot-once = pkgs.callPackage <stockholm/krebs/5pkgs/simple/flameshot-once> {};
in {
nixpkgs.overlays = [
(self: super: {
write =
super.callPackage <stockholm/krebs/5pkgs/simple/xwaitforwindow.nix> { };
})
];
xdg.configFile."flameshot/flameshot.ini".source = (pkgs.formats.ini {}).generate "flameshot.ini" { environment.systemPackages = [
General = { (flameshot-once.override {
disabledTrayIcon = true; config.imgur = {
checkForUpdates = false; enable = true;
contrastOpacity = 188; createUrl = "http://p.r/image";
savePath = "/tmp"; deleteUrl = "http://p.r/image/delete/%1";
savePathFixed = true; xdg-open.browser = (defaultApplications pkgs).browser;
drawThickness = 0;
showStartupLaunchMessage = false;
filenamePattern = "shot_%F_%T";
}; };
}; config.timeout = 1000;
})
systemd.user.services.flameshot.Unit.Requires = lib.mkForce []; ];
systemd.user.services.flameshot.Environment = {
# IMGUR_CREATE_URL = "https://p.krebsco.de/image";
# IMGUR_DELETE_URL = "https://p.krebsco.de/image/delete/%1";
PATH = "${config.home-manager.users.me.home.profileDirectory}/bin";
};
};
} }

View File

@@ -51,11 +51,11 @@ in {
isSystemUser = true; isSystemUser = true;
createHome = true; createHome = true;
home = cacheLocation; home = cacheLocation;
extraGroups = [ flixGroup ]; group = flixGroup;
}; };
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writeDashBin "mpv-simpsons" '' (pkgs.writers.writeDashBin "mpv-simpsons" ''
set -efu set -efu
cd "${flixLocation}/download" cd "${flixLocation}/download"
[ -f "${cacheLocation}/${indexFilename}" ] || exit 1 [ -f "${cacheLocation}/${indexFilename}" ] || exit 1
@@ -65,7 +65,7 @@ in {
| shuf \ | shuf \
| ${pkgs.findutils}/bin/xargs -d '\n' ${pkgs.mpv}/bin/mpv | ${pkgs.findutils}/bin/xargs -d '\n' ${pkgs.mpv}/bin/mpv
'') '')
(pkgs.writeDashBin "flixmenu" '' (pkgs.writers.writeDashBin "flixmenu" ''
set -efu set -efu
cd "${flixLocation}/download" cd "${flixLocation}/download"

View File

@@ -5,6 +5,8 @@
enableDefaultFonts = true; enableDefaultFonts = true;
fontDir.enable = true; fontDir.enable = true;
fonts = with pkgs; [ fonts = with pkgs; [
alegreya
alegreya-sans
corefonts corefonts
eb-garamond eb-garamond
fira fira

View File

@@ -2,10 +2,10 @@
services.gitea = { services.gitea = {
enable = true; enable = true;
disableRegistration = true; disableRegistration = true;
rootUrl = "https://code.xn--kiern-0qa.de"; rootUrl = "https://code.kmein.de";
appName = "code.kierán.de"; appName = "code.kmein.de";
}; };
services.nginx.virtualHosts."code.xn--kiern-0qa.de" = { services.nginx.virtualHosts."code.kmein.de" = {
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;
locations."/".extraConfig = "proxy_pass http://localhost:3000;"; locations."/".extraConfig = "proxy_pass http://localhost:3000;";

View File

@@ -1,25 +1,34 @@
{ pkgs, ... }: { config, pkgs, ... }:
let let
backupLocation = "/var/lib/codimd-backup"; backupLocation = "/var/lib/codimd-backup";
stateLocation = "/var/lib/codimd/state.sqlite"; stateLocation = "/var/lib/codimd/state.sqlite";
nixpkgs-unstable = import <nixpkgs-unstable> {}; nixpkgs-unstable = import <nixpkgs-unstable> {};
domain = "pad.kmein.de";
in in
{ {
imports = [ <stockholm/krebs/3modules/permown.nix> ]; imports = [ <stockholm/krebs/3modules/permown.nix> ];
services.nginx.virtualHosts."pad.xn--kiern-0qa.de" = { services.nginx.virtualHosts.${domain} = {
enableACME = true; enableACME = true;
addSSL = true; forceSSL = true;
locations."/".extraConfig = '' locations."/" = {
client_max_body_size 4G; proxyPass = "https://localhost:3091";
proxy_set_header Host $host; proxyWebsockets = true;
proxy_pass http://localhost:3091; };
''; };
security.acme.certs.${domain}.group = "hedgecert";
users.groups.hedgecert.members = [ "codimd" "nginx" ];
security.dhparams = {
enable = true;
params.hedgedoc = {};
}; };
services.hedgedoc = { services.hedgedoc = {
enable = true; enable = true;
configuration = { configuration = {
allowOrigin = [ domain ];
allowAnonymous = true; allowAnonymous = true;
allowGravatar = false; allowGravatar = false;
allowFreeURL = true; allowFreeURL = true;
@@ -28,6 +37,13 @@ in
storage = stateLocation; storage = stateLocation;
}; };
port = 3091; port = 3091;
domain = domain;
useSSL = true;
protocolUseSSL = true;
sslCAPath = [ "/etc/ssl/certs/ca-certificates.crt" ];
sslCertPath = "/var/lib/acme/${domain}/cert.pem";
sslKeyPath = "/var/lib/acme/${domain}/key.pem";
dhParamPath = config.security.dhparams.params.hedgedoc.path;
}; };
}; };

View File

@@ -1,5 +1,5 @@
{ config, pkgs, ... }: { { config, pkgs, ... }: {
imports = [ <niveum/modules/hledger.nix> ]; imports = [ ../modules/hledger.nix ];
niveum.hledger = { niveum.hledger = {
enable = true; enable = true;

View File

@@ -32,6 +32,16 @@ in {
options = hu-berlin-cifs-options; options = hu-berlin-cifs-options;
}; };
home-manager.users.me.programs.ssh = {
matchBlocks = {
"alew.hu-berlin.de" = {
user = "centos";
hostname = "141.20.187.219";
};
};
};
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "hu-ip" '' (pkgs.writers.writeDashBin "hu-ip" ''
${pkgs.w3m}/bin/w3m -dump meineip.hu-berlin.de | head --lines=-4 | tail --lines=+3 ${pkgs.w3m}/bin/w3m -dump meineip.hu-berlin.de | head --lines=-4 | tail --lines=+3
@@ -49,7 +59,7 @@ in {
]; ];
systemd.services.hu-vpn = { systemd.services.hu-vpn = {
enable = false; enable = true;
wants = [ "network-online.target" ]; wants = [ "network-online.target" ];
conflicts = [ "openvpn-hu-berlin.service" ]; conflicts = [ "openvpn-hu-berlin.service" ];
script = '' script = ''

View File

@@ -213,7 +213,11 @@ in {
} }
cd ~/notes cd ~/notes
note_file=$(find . -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2 | dmenu -i) note_file=$({
echo diary/$(date -I).md
echo diary/$(date -I -d yesterday).md
find . -type f -printf "%T@ %p\n" | sort --reverse --numeric-sort | cut --delimiter=" " --fields=2
} | dmenu -i)
if test "$note_file" if test "$note_file"
then then
i3-sensible-terminal -e "$EDITOR" "$note_file" i3-sensible-terminal -e "$EDITOR" "$note_file"
@@ -229,8 +233,7 @@ in {
"${modifier}+F10" = "exec ${pkgs.redshift}/bin/redshift -x"; "${modifier}+F10" = "exec ${pkgs.redshift}/bin/redshift -x";
"${modifier}+F11" = "exec ${pkgs.xcalib}/bin/xcalib -invert -alter"; "${modifier}+F11" = "exec ${pkgs.xcalib}/bin/xcalib -invert -alter";
"${modifier}+F12" = "exec ${klem}/bin/klem"; "${modifier}+F12" = "exec ${klem}/bin/klem";
"Print" = "exec flameshot-once";
"Print" = "exec flameshot gui -p /tmp";
"XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5"; "XF86AudioLowerVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -d 5";
"XF86AudioMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t"; "XF86AudioMute" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -t";
"XF86AudioRaiseVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -i 5"; "XF86AudioRaiseVolume" = "exec --no-startup-id ${pkgs.pamixer}/bin/pamixer -i 5";

View File

@@ -1,8 +0,0 @@
{ config, ... }: {
services.keybase.enable = true;
services.kbfs = {
enable = true;
mountPoint = "%h/cloud/keybase";
};
}

View File

@@ -2,8 +2,8 @@
let commaSep = builtins.concatStringsSep ","; let commaSep = builtins.concatStringsSep ",";
in { in {
services.xserver = { services.xserver = {
layout = commaSep [ "de" "gr" ]; layout = commaSep [ "de" "gr" "ru" ];
xkbVariant = commaSep [ "T3" "polytonic" ]; xkbVariant = commaSep [ "T3" "polytonic" "phonetic" ];
xkbOptions = xkbOptions =
commaSep [ "compose:caps" "terminate:ctrl_alt_bksp" "grp:ctrls_toggle" ]; commaSep [ "compose:caps" "terminate:ctrl_alt_bksp" "grp:ctrls_toggle" ];
libinput.enable = true; libinput.enable = true;

View File

@@ -1,9 +1,16 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
davHome = "~/.local/share/dav"; davHome = "~/.local/share/dav";
davEndpoint = "https://cloud.xn--kiern-0qa.de/remote.php/dav"; kmeinCloud = {
username = "kieran"; davEndpoint = "https://cloud.xn--kiern-0qa.de/remote.php/dav";
password = lib.fileContents <secrets/nextcloud/password>; username = "kieran";
password = lib.fileContents <secrets/nextcloud/password>;
};
fysiCloud = {
davEndpoint = "https://nextcloud.fysi.dev/remote.php/dav";
username = "kmein";
password = lib.fileContents <secrets/nextcloud-fysi/password>;
};
in in
{ {
environment.systemPackages = [ pkgs.khal pkgs.vdirsyncer pkgs.khard pkgs.todoman ]; environment.systemPackages = [ pkgs.khal pkgs.vdirsyncer pkgs.khard pkgs.todoman ];
@@ -17,6 +24,10 @@ in
${pkgs.vdirsyncer}/bin/vdirsyncer sync ${pkgs.vdirsyncer}/bin/vdirsyncer sync
${pkgs.khal}/bin/khal printcalendars # https://lostpackets.de/khal/configure.html#syncing ${pkgs.khal}/bin/khal printcalendars # https://lostpackets.de/khal/configure.html#syncing
''; '';
serviceConfig = {
Type = "oneshot";
Restart = "on-failure";
};
}; };
home-manager.users.me = { home-manager.users.me = {
@@ -48,26 +59,48 @@ in
skip_unparsable = no skip_unparsable = no
''; '';
"todoman/todoman.conf".text = '' "todoman/config.py".text = ''
[main] path = "${davHome}/calendar/*"
path = ${davHome}/calendar/* date_format = "%Y-%m-%d"
date_format = %Y-%m-%d time_format = "%H:%M"
time_format = %H:%M
default_due = 0 default_due = 0
default_list = Personal default_list = "Personal"
startable = True startable = True
''; '';
"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
timedelta = 5d timedelta = 5d
print_new = path
default_calendar = personal
[locale] [locale]
timeformat = %H:%M timeformat = %H:%M
@@ -93,7 +126,13 @@ in
[pair kalender] [pair kalender]
a = "kalender_local" a = "kalender_local"
b = "kalender_cloud" b = "kalender_cloud"
collections = ["from a", "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]
@@ -108,15 +147,21 @@ in
[storage kontakte_cloud] [storage kontakte_cloud]
type = "carddav" type = "carddav"
url = "${davEndpoint}/addressbooks/users/${username}/" url = "${kmeinCloud.davEndpoint}/addressbooks/users/${kmeinCloud.username}/"
username = "${username}" username = "${kmeinCloud.username}"
password = "${password}" password = "${kmeinCloud.password}"
[storage kalender_cloud] [storage kalender_cloud]
type = "caldav" type = "caldav"
url = "${davEndpoint}/calendars/${username}/" url = "${kmeinCloud.davEndpoint}/calendars/${kmeinCloud.username}/"
username = "${username}" username = "${kmeinCloud.username}"
password = "${password}" password = "${kmeinCloud.password}"
[storage fysi_cloud]
type = "caldav"
url = "${fysiCloud.davEndpoint}/calendars/${fysiCloud.username}/"
username = "${fysiCloud.username}"
password = "${fysiCloud.password}"
''; '';
}; };
}; };

27
configs/lb.nix Normal file
View File

@@ -0,0 +1,27 @@
{ lib, pkgs, ... }:
let
nixpkgs-unstable = import <nixpkgs-unstable> {};
in
{
systemd.services.lb-subscription = {
enable = true;
wants = [ "network-online.target" ];
startAt = "weekly";
serviceConfig = {
user = "kfm";
WorkingDirectory = "/home/kfm/cloud/Seafile/Books/Germanistik/LB";
};
script = ''
first_year=2019
for year in $(${pkgs.coreutils}/bin/seq "$first_year" "$(date +%Y)"); do
${pkgs.curl}/bin/curl -sSL "https://www.literarische-blaetter.de/jahrgang-$year/" \
| ${nixpkgs-unstable.htmlq}/bin/htmlq --attribute href 'ul.slides a' \
| while read -r month; do
${pkgs.curl}/bin/curl -sSL "$month" \
| ${nixpkgs-unstable.htmlq}/bin/htmlq --attribute src iframe \
| ${pkgs.gnused}/bin/sed 's/.*?pdf=//;s/?wp-hosted.*//'
done
done | ${pkgs.findutils}/bin/xargs ${pkgs.wget}/bin/wget --no-clobber
'';
};
}

View File

@@ -1,145 +0,0 @@
{ lib, ... }:
let
inherit (import <niveum/lib>) kieran;
enableDefaults = lib.recursiveUpdate {
mbsync = {
enable = true;
create = "both";
expunge = "both";
};
msmtp.enable = true;
notmuch.enable = true;
};
settings = {
fastmail = {
smtp = {
host = "smtp.fastmail.com";
port = 465;
tls.enable = true;
};
imap = {
host = "imap.fastmail.com";
port = 993;
tls.enable = true;
};
};
cock = {
smtp = {
host = "mail.cock.li";
port = 587;
tls = {
enable = true;
useStartTls = true;
};
};
imap = {
host = "mail.cock.li";
port = 993;
tls.enable = true;
};
};
posteo = {
smtp = {
host = "posteo.de";
port = 587;
tls = {
enable = true;
useStartTls = true;
};
};
imap = {
host = "posteo.de";
port = 993;
tls.enable = true;
};
};
hu-berlin = {
smtp = {
host = "mailhost.cms.hu-berlin.de";
port = 25;
tls = {
enable = true;
useStartTls = true;
};
};
imap = {
host = "mailbox.cms.hu-berlin.de";
port = 993;
tls.enable = true;
};
};
};
# turns out we have to escape $ because, if the password contains a $, it will get interpolated as a variable by the msmtp `passwordeval` which does: `bash -c "COMMAND; echo"`
pass_ = file: "echo ${lib.escape ["$"] (lib.escapeShellArg (lib.strings.fileContents file))}";
in
{
fysi = enableDefaults {
primary = false;
userName = "kieran@fysi.tech";
address = "kieran@fysi.tech";
realName = kieran.name;
passwordCommand = pass_ <secrets/mail/fastmail>;
inherit (settings.fastmail) imap smtp;
};
cock = enableDefaults {
primary = false;
userName = "2210@cock.li";
address = "2210@cock.li";
realName = "2210";
passwordCommand = pass_ <secrets/mail/cock>;
inherit (settings.cock) imap smtp;
};
kieran-gmail = enableDefaults {
primary = false;
flavor = "gmail.com";
address = "kieran.meinhardt@gmail.com";
realName = kieran.name;
userName = "kieran.meinhardt";
passwordCommand = pass_ <secrets/mail/gmail/kieran.meinhardt>;
folders = {
drafts = "[Gmail]/Entw&APw-rfe";
sent = "[Gmail]/Gesendet";
trash = "[Gmail]/Papierkorb";
};
};
amroplay = enableDefaults {
primary = false;
flavor = "gmail.com";
address = "amroplay@gmail.com";
realName = kieran.name;
userName = "amroplay";
passwordCommand = pass_ <secrets/mail/gmail/amroplay>;
folders = {
drafts = "[Gmail]/Drafts";
sent = "[Gmail]/Sent Mail";
trash = "[Gmail]/Bin";
};
};
posteo = enableDefaults {
primary = true;
address = "kieran.meinhardt@posteo.net";
realName = kieran.name;
userName = "kieran.meinhardt@posteo.net";
passwordCommand = pass_ <secrets/mail/posteo>;
inherit (settings.posteo) imap smtp;
};
hu-berlin = enableDefaults {
primary = false;
address = "meinhark@hu-berlin.de";
realName = kieran.name;
userName = "meinhark";
passwordCommand = pass_ <secrets/eduroam/password>;
inherit (settings.hu-berlin) imap smtp;
};
hu-berlin-work = enableDefaults {
primary = false;
address = "meinhaki@hu-berlin.de";
realName = kieran.name;
userName = "meinhaki";
passwordCommand = pass_ <secrets/mail/meinhaki>;
inherit (settings.hu-berlin) imap smtp;
};
}

View File

@@ -1,52 +0,0 @@
{ config, pkgs, lib, ... }:
let
inherit (import <niveum/lib>) email-sshKey;
much =
let
nixpkgs-much = import (pkgs.fetchFromGitHub {
owner = "NixOS";
repo = "nixpkgs";
rev = "7c2a362b58a1c2ba72d24aa3869da3b1a91d39e1";
sha256 = "0gl4xndyahasa9dv5mi3x9w8s457wl2xh9lcldizcn1irjvkrzs4";
}) {
overlays = [
(import <stockholm/krebs/5pkgs/haskell>)
];
};
much-pkg = pkgs.haskellPackages.callCabal2nix "much" <niveum/submodules/much> {};
in nixpkgs-much.haskell.lib.dontHaddock much-pkg;
in {
environment.variables.NOTMUCH_CONFIG = config.home-manager.users.me.home.sessionVariables.NOTMUCH_CONFIG;
users.users.me.openssh.authorizedKeys.keys = [ email-sshKey ];
environment.systemPackages = [
pkgs.notmuch-addrlookup
pkgs.muchsync
(pkgs.writers.writeDashBin "mua" ''
if [ $# -eq 0 ]; then
${much}/bin/much-kmein
else
${much}/bin/much-kmein -q "$*"
fi
'')
(pkgs.writers.writeDashBin "mail-clean" ''
${pkgs.notmuch}/bin/notmuch search --output files --format=text0 tag:deleted | ${pkgs.findutils}/bin/xargs -r0 rm
${pkgs.notmuch}/bin/notmuch new
'')
];
home-manager.users.me = {
programs.notmuch = {
enable = true;
search.excludeTags = [ "deleted" "spam" ];
};
programs.msmtp.enable = true;
accounts.email.accounts = import ./accounts.nix { inherit lib; };
};
}

View File

@@ -1,80 +0,0 @@
{ config, pkgs, lib, ... }:
let
inherit (import <niveum/lib>) kieran sshPort;
tagRules = [
{
query = "to:miaengiadina-pwa@noreply.github.com AND subject:\"PR run failed\"";
tags = [ "-new" "+deleted" ];
}
{
query = lib.concatStringsSep " OR " [
"from:noreply-local-guides@google.com"
"from:google-maps-noreply@google.com"
"subject:fd-noti"
"from:nebenan.de"
"to:miaengiadina-pwa@noreply.github.com"
];
tags = [ "-new" ];
}
{
query = "tag:new";
tags = [ "-new" "+inbox" ];
}
];
generateTaggingScript = filters:
let
template = { tags, query, message ? "tagging ${query} -> ${lib.concatStringsSep " " tags}", ... }: ''
echo '${message}'
${pkgs.notmuch}/bin/notmuch tag ${lib.concatStringsSep " " tags} -- "${query}"
'';
in lib.concatStringsSep "\n" (map template filters);
in
{
imports = [ <stockholm/krebs/3modules/secret.nix> ];
krebs.secret.files.email-ssh = {
path = "${config.users.users.email.home}/.ssh/id_ed25519";
owner.name = config.users.users.email.name;
source-path = toString <system-secrets> + "/email/ssh.key";
};
users.users.email = {
isNormalUser = true;
description = "fetching mails since 2021";
};
systemd.services.mail-sync =
let
hosts = [ "manakish.r" "kabsa.r" ];
in {
enable = true;
wants = [ "network-online.target" config.krebs.secret.files.email-ssh.service ];
startAt = "*:0/3";
serviceConfig.User = config.users.users.email.name;
serviceConfig.Type = "oneshot";
environment.NOTMUCH_CONFIG = config.home-manager.users.email.home.sessionVariables.NOTMUCH_CONFIG;
path = [ pkgs.notmuch pkgs.openssh ];
script = ''
${pkgs.isync}/bin/mbsync --all || true
${lib.concatMapStringsSep "\n" (host: ''
echo === syncing ${host}
${pkgs.muchsync}/bin/muchsync -s 'ssh -CTaxq -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=4 -p ${toString sshPort}' kfm@${host} || :
'') hosts}
'';
};
home-manager.users.email = {
programs.mbsync.enable = true;
accounts.email.accounts = import ./accounts.nix { inherit lib; };
programs.notmuch = {
enable = true;
new.tags = [ "new" ];
hooks.postNew = generateTaggingScript tagRules;
};
};
}

View File

@@ -22,9 +22,9 @@
}; };
telegram.kmein.Token = bridgeBotToken; telegram.kmein.Token = bridgeBotToken;
irc = irc =
let Nick = "ponte"; StripMarkdown = true; let Nick = "ponte";
in { in {
hackint = { Server = "irc.hackint.org:6697"; UseTLS = true; inherit Nick StripMarkdown; }; hackint = { Server = "irc.hackint.org:6697"; UseTLS = true; inherit Nick; };
}; };
mumble.lassulus = { mumble.lassulus = {
Server = "lassul.us:64738"; Server = "lassul.us:64738";

41
configs/menstruation.nix Normal file
View File

@@ -0,0 +1,41 @@
{ pkgs, lib, ... }:
let
backend = pkgs.callPackage <niveum/submodules/menstruation-backend> {};
telegram = pkgs.callPackage <niveum/submodules/menstruation-telegram> {};
backendPort = 8000;
in
{
containers.menstruation.autoStart = true;
containers.menstruation.config = { config, pkgs, ... }: {
services.redis.enable = true;
systemd.services.menstruation-telegram = {
wants = [
"network-online.target"
"menstruation-backend.service"
"redis.service"
];
wantedBy = [ "multi-user.target" ];
environment = {
MENSTRUATION_TOKEN = lib.strings.fileContents <system-secrets/telegram/menstruation.token>;
MENSTRUATION_ENDPOINT = "http://localhost:${toString backendPort}";
MENSTRUATION_MODERATORS = "18980945";
};
serviceConfig = {
Restart = "always";
DynamicUser = true;
ExecStart = "${telegram}/bin/menstruation-telegram";
};
};
systemd.services.menstruation-backend = {
wants = [ "network-online.target" ];
environment.ROCKET_PORT = toString backendPort;
serviceConfig = {
Restart = "always";
DynamicUser = true;
ExecStart = "${backend}/bin/menstruation_server";
};
};
};
}

View File

@@ -0,0 +1,17 @@
# https://github.com/Fluepke/nix-files/blob/2be70b76a198afaa7763132fed645a3c19d5af6e/configuration/common/blackbox-exporter.yml
# https://github.com/xHain-hackspace/xhain-nixfiles/blob/0d6e3b87a07317c2d54cccabf4f90da589319e2c/common/prometheus/blackbox-exporter.yml
{
modules.http_2xx = {
http = {
fail_if_not_ssl = true;
ip_protocol_fallback = false;
method = "GET";
no_follow_redirects = false;
preferred_ip_protocol = "ip4";
valid_http_versions = [ "HTTP/1.1" "HTTP/2.0" ];
tls_config.insecure_skip_verify = true;
};
prober = "http";
timeout = "15s";
};
}

View File

@@ -1,6 +1,7 @@
{ lib, config, pkgs, ... }: { lib, config, pkgs, ... }:
let let
lokiConfig = import ./loki.nix; lokiConfig = import ./loki.nix;
blackboxConfig = import ./blackbox.nix;
in in
{ {
services.grafana = { services.grafana = {
@@ -60,6 +61,11 @@ in
for = "1h"; for = "1h";
annotations.summary = "{{$labels.job}}: Using lots of RAM."; annotations.summary = "{{$labels.job}}: Using lots of RAM.";
} }
{
alert = "UptimeMonster";
expr = "time() - node_boot_time_seconds > 2592000";
annotations.summary = "{{$labels.job}}: up for more than 30 days.";
}
{ {
alert = "HostDown"; alert = "HostDown";
expr = ''up == 0''; expr = ''up == 0'';
@@ -71,7 +77,37 @@ in
{ {
alert = "Reboot"; alert = "Reboot";
expr = "time() - node_boot_time_seconds < 300"; expr = "time() - node_boot_time_seconds < 300";
annotations.summary = "{{$labels.alias}}: Reboot"; annotations.summary = "{{$labels.job}}: Reboot";
}
{
alert = "ProbeFailed";
expr = "probe_success == 0";
for = "5m";
annotations.summary = "{{$labels.instance}}: probe failed";
}
{
alert = "SlowProbe";
expr = "avg_over_time(probe_http_duration_seconds[1m]) > 1";
for = "5m";
annotations.summary = "{{$labels.instance}}: HTTP probe slow";
}
{
alert = "HttpStatusCode";
expr = "probe_http_status_code != 0 AND (probe_http_status_code <= 199 OR probe_http_status_code >= 400)";
for = "5m";
annotations.summary = "{{$labels.instance}}: status code {{$value}}";
}
{
alert = "SslExpirySoon";
expr = "probe_ssl_earliest_cert_expiry - time() < 86400 * 30";
for = "5m";
annotations.summary = "{{$labels.instance}}: SSL certificate expires in 30 days";
}
{
alert = "SslExpiry";
expr = "probe_ssl_earliest_cert_expiry - time() <= 0";
for = "5m";
annotations.summary = "{{$labels.instance}}: SSL certificate has expired";
} }
]; ];
}]; }];
@@ -109,12 +145,12 @@ in
{{ define "telegram.default" }} {{ define "telegram.default" }}
{{range .Alerts -}} {{range .Alerts -}}
{{ if eq .Status "firing" }} {{ if eq .Status "firing" }}
<b>{{ index .Annotations "summary"}}</b> <b>{{ index .Annotations "summary"}}</b>
{{ index .Annotations "description" }} {{ index .Annotations "description" }}
See on <a href="${config.services.grafana.domain}/d/alpUteInz/niveum">Grafana</a>. See on Grafana: http://${config.services.grafana.domain}/d/alpUteInz/niveum
{{ else -}} {{ else -}}
😌 <del>{{ index .Annotations "summary"}}</del> RESOLVED 😌 <del>{{ index .Annotations "summary"}}</del>
{{- end }} {{- end }}
{{end -}} {{end -}}
{{end}} {{end}}
@@ -152,15 +188,36 @@ in
job_name = "makanek"; job_name = "makanek";
static_configs = [ { targets = [ static_configs = [ { targets = [
"127.0.0.1:${toString config.services.prometheus.exporters.node.port}" "127.0.0.1:${toString config.services.prometheus.exporters.node.port}"
# "127.0.0.1:${toString config.services.prometheus.exporters.nginx.port}"
]; } ]; ]; } ];
} }
{
scrape_interval = "5m";
job_name = "blackbox";
metrics_path = "/probe";
params.module = [ "http_2xx" ];
relabel_configs = [
{ source_labels = ["__address__"]; target_label = "__param_target"; }
{ source_labels = ["__param_target"]; target_label = "instance"; }
{ replacement = "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}"; target_label = "__address__"; }
];
static_configs = [{
targets = [
"alew.hu-berlin.de"
];
}];
}
{ {
job_name = "zaatar"; job_name = "zaatar";
static_configs = [ { targets = [ "zaatar.r:${toString config.services.prometheus.exporters.node.port}" ]; } ]; static_configs = [ { targets = [ "zaatar.r:${toString config.services.prometheus.exporters.node.port}" ]; } ];
} }
]; ];
services.prometheus.exporters.blackbox = {
enable = true;
configFile = (pkgs.formats.yaml {}).generate "blackbox.yaml" blackboxConfig;
};
networking.firewall.allowedTCPPorts = [ networking.firewall.allowedTCPPorts = [
lokiConfig.server.http_listen_port lokiConfig.server.http_listen_port
]; ];

View File

@@ -45,6 +45,25 @@ in
103685 # Griechische Sprache und Übersetzung I 103685 # Griechische Sprache und Übersetzung I
105455 # Elegia greca 105455 # Elegia greca
105335 # Homerische Epen 105335 # Homerische Epen
# WS 2021
108122 # Griechisch
107986 # Altostslavisch
107792 # Elegie in Rom
107369 # Tusculanae Disputationes
108586 # Griechische Religion
107988 # Balkanindogermanisch
108312 # Altnordisch
107281 # NLP
108736 # Grammatiktheorie
109438 # Warum klingt Orkisch böse
108025 # Poetik der Nordgermanen
107280 # Statistik
108350 # Attische Redner
107461 # Argonautika
108283 # Digital Classicist
109211 # Altlitauisch
109185 # Etymologie
]; ];
download_submissions = true; download_submissions = true;
download_descriptions = true; download_descriptions = true;
@@ -63,11 +82,26 @@ in
networking.firewall.allowedTCPPorts = [ 2049 ]; networking.firewall.allowedTCPPorts = [ 2049 ];
services.nginx.virtualHosts."moodle.kmein.r" =
let
identity = lib.strings.fileContents <secrets/eduroam/identity>;
password = lib.strings.fileContents <secrets/eduroam/password>;
in {
basicAuth."${identity}" = password;
locations."/" = {
root = config.services.moodle-dl.directory;
extraConfig = ''
autoindex on;
charset UTF-8;
'';
};
};
services.nfs.server = { services.nfs.server = {
enable = true; enable = true;
exports = '' exports = let machines = with (import <niveum/lib>).retiolumAddresses; [kabsa manakish]; in ''
/export 10.243.2.4(fsid=0) 10.243.2.85(fsid=0) /export ${lib.concatMapStringsSep " " (machine: "${machine.ipv4}(fsid=0)") machines}
/export/moodle 10.243.2.4(insecure,rw) 10.243.2.85(insecure,rw) /export/moodle ${lib.concatMapStringsSep " " (machine: "${machine.ipv4}(insecure,rw)") machines}
''; '';
}; };
} }

View File

@@ -8,8 +8,8 @@ in {
programs.mpv = { programs.mpv = {
enable = true; enable = true;
config = { config = {
osc = "no";
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";
}; };
bindings = { bindings = {
"Alt+RIGHT" = "add video-rotate 90"; "Alt+RIGHT" = "add video-rotate 90";
@@ -22,7 +22,6 @@ in {
"Alt+j" = "add video-pan-y -0.05"; "Alt+j" = "add video-pan-y -0.05";
}; };
scripts = [ scripts = [
pkgs.mpvScripts.thumbnail
nixpkgs-unstable.mpvScripts.youtube-quality nixpkgs-unstable.mpvScripts.youtube-quality
]; ];
}; };

38
configs/names.nix Normal file
View File

@@ -0,0 +1,38 @@
{ pkgs, lib, ... }:
let
port = 5703;
geogen = (pkgs.fetchFromGitHub {
owner = "kmein";
repo = "scripts";
rev = "8945430f27a8c6fd632dd35382cb094abe3543ff";
sha256 = "1djyxkynypxsrmdf6idgjszqpcgqyq607rrsvl58p2bpymmwibzb";
}) + "/onomastics";
inherit (pkgs.callPackage geogen {}) dependencyEnv;
in
{
systemd.services.names = {
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
description = "Better clone of geogen.stoepel.net";
serviceConfig = {
DynamicUser = true;
};
script = ''
cd $(mktemp -d)
ln -s "${geogen}/wsgi.py" wsgi.py
${dependencyEnv}/bin/gunicorn wsgi:app -b :${toString port}
'';
};
services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
};
services.nginx.virtualHosts."names.kmein.r" = {
locations."/".proxyPass = "http://127.0.0.1:${toString port}";
};
}

248
configs/neomutt.nix Normal file
View File

@@ -0,0 +1,248 @@
{ pkgs, lib, ... }:
let
mainMailbox = "posteo";
accounts.uni = {
user = "meinhark";
password = lib.strings.fileContents <secrets/eduroam/password>;
address = "kieran.felix.meinhardt@hu-berlin.de";
imap = "mailbox.cms.hu-berlin.de";
smtp = "mailhost.cms.hu-berlin.de";
smtpSettings = smtp: "smtp://${smtp}";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts.uni-old = {
user = "meinhark";
password = lib.strings.fileContents <secrets/eduroam/password>;
address = "meinhark@informatik.hu-berlin.de";
imap = "mailbox.informatik.hu-berlin.de";
smtp = "mailhost.informatik.hu-berlin.de";
smtpSettings = smtp: "smtp://${smtp}";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts.work-uni = {
user = "meinhaki";
password = lib.strings.fileContents <secrets/mail/meinhaki>;
address = "kieran.meinhardt@hu-berlin.de";
imap = "mailbox.cms.hu-berlin.de";
smtp = "mailhost.cms.hu-berlin.de";
smtpSettings = smtp: "smtp://${smtp}";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts.work-fysi = rec {
user = "kieran@fysi.tech";
address = user;
password = lib.strings.fileContents <secrets/mail/fastmail>;
imap = "imap.fastmail.com";
smtp = "smtp.fastmail.com";
smtpSettings = smtp: "smtps://${smtp}:465";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts.cock = rec {
user = "2210@cock.li";
address = user;
password = lib.strings.fileContents <secrets/mail/cock>;
imap = "mail.cock.li";
smtp = imap;
smtpSettings = smtp: "smtp://${smtp}:587";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts."${mainMailbox}" = rec {
user = "kieran.meinhardt@posteo.net";
address = user;
password = lib.strings.fileContents <secrets/mail/posteo>;
imap = "posteo.de";
smtp = imap;
smtpSettings = smtp: "smtp://${smtp}";
folders = {
drafts = "Drafts";
sent = "Sent";
trash = "Trash";
};
};
accounts.google-amro = rec {
user = "amroplay@gmail.com";
address = user;
password = lib.strings.fileContents <secrets/mail/gmail/amroplay>;
imap = "imap.gmail.com";
smtp = "smtp.gmail.com";
smtpSettings = smtp: "smtps://${smtp}:465";
folders = {
drafts = "[Gmail]/Drafts";
sent = "[Gmail]/Sent Mail";
trash = "[Gmail]/Bin";
};
};
accounts.google-kieran = rec {
user = "kieran.meinhardt@gmail.com";
address = user;
password = lib.strings.fileContents <secrets/mail/gmail/kieran.meinhardt>;
imap = "imap.gmail.com";
smtp = "smtp.gmail.com";
smtpSettings = smtp: "smtps://${smtp}:465";
folders = {
drafts = "[Gmail]/Entwürfe";
sent = "[Gmail]/Gesendet";
trash = "[Gmail]/Papierkorb";
};
};
in
{
environment.systemPackages = [ pkgs.neomutt ];
environment.shellAliases.mua = "${pkgs.neomutt}/bin/neomutt -f ${mainMailbox}";
home-manager.users.me.xdg.configFile."neomutt/neomuttrc".text = ''
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.sxiv}/bin/sxiv %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;
''}:$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 lightblack default '.*'
# New mail is boldened:
color index_author lightyellow black "~N"
color index_subject lightwhite black "~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

@@ -25,18 +25,13 @@
customRC = builtins.readFile <niveum/lib/vim/init.vim>; customRC = builtins.readFile <niveum/lib/vim/init.vim>;
packages.nvim = with pkgs.vimPlugins; { packages.nvim = with pkgs.vimPlugins; {
start = [ start = [
# cheat-sh-vim
# deoplete-nvim
# vim-abolish
ale ale
fzf-vim fzf-vim
fzfWrapper fzfWrapper
goyo
supertab supertab
undotree undotree
tabular tabular
vimwiki vimwiki
vim-256noir
vim-colors-paramount vim-colors-paramount
vim-commentary vim-commentary
vim-css-color vim-css-color
@@ -44,13 +39,9 @@
vim-fetch vim-fetch
vim-fugitive vim-fugitive
vim-gitgutter vim-gitgutter
vim-pandoc
vim-pandoc-syntax # vim-pandoc-after
vim-repeat vim-repeat
vim-sensible vim-sensible
# vim-startify
vim-surround vim-surround
vim-mail
]; ];
opt = [ opt = [
csv csv
@@ -72,6 +63,9 @@
vim-reason-plus vim-reason-plus
vim-toml vim-toml
vimtex vimtex
vim-pandoc
vim-pandoc-syntax # vim-pandoc-after
vim-256noir
]; ];
}; };
}; };

View File

@@ -1,13 +1,84 @@
{ pkgs, ... }: { lib, pkgs, ... }:
let let
autowifi = pkgs.writers.writePython3Bin "autowifi" { flakeIgnore = [ "E501" ]; } <stockholm/lass/5pkgs/autowifi/autowifi.py>; autowifi = pkgs.writers.writePython3Bin "autowifi" { flakeIgnore = [ "E501" ]; } <stockholm/lass/5pkgs/autowifi/autowifi.py>;
profile = name: custom: lib.recursiveUpdate {
connection.id = name;
connection.type = "wifi";
connection.interface-name = "wlp3s0";
connection.permissions = "";
wifi.mac-address-blacklist = "";
wifi.ssid = name;
wifi.mode = "infrastructure";
ipv4.dns-search = "";
ipv4.method = "auto";
ipv6.addr-gen-mode = "stable-privacy";
ipv6.dns-search = "";
ipv6.method = "auto";
proxy = {};
} custom;
eduroamProfile = {
connection.uuid = "eae9fee6-a7d2-4120-a609-440b457d6fcf";
wifi-security = {
group = "ccmp;tkip;";
key-mgmt = "wpa-eap";
pairwise = "ccmp;";
proto = "rsn;";
};
"802-1x" = {
altsubject-matches = "DNS:srv1-radius.cms.hu-berlin.de;DNS:srv2-radius.cms.hu-berlin.de;";
anonymous-identity = "anonymous@wlan.hu-berlin.de";
ca-cert = pkgs.fetchurl {
url = "https://www.cms.hu-berlin.de/de/dl/netze/wlan/config/eduroam/t-telesec_globalroot_class_2.pem";
sha256 = "0if8aqd06sid7a0vw009zpa087wxcgdd2x6z2zs4pis5kvyqj2dk";
};
eap = "ttls;";
identity = lib.strings.fileContents <secrets/eduroam/identity>;
password = lib.strings.fileContents <secrets/eduroam/password>;
phase2-auth = "pap";
};
};
in in
{ {
imports = [ ../modules/networkmanager-declarative.nix ];
networking.networkmanager = { networking.networkmanager = {
enable = true; enable = true;
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" ];
@@ -25,9 +96,5 @@ in
}; };
}; };
networking.networkmanager.dispatcherScripts = [
{ source = "${pkgs.nur.repos.makefu.prison-break}/bin/prison-break"; }
];
environment.systemPackages = [ pkgs.speedtest-cli ]; environment.systemPackages = [ pkgs.speedtest-cli ];
} }

View File

@@ -1,11 +1,12 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
passwordFile = path: toString (pkgs.writeText "password" (lib.strings.fileContents path));
inherit (import <niveum/lib>) localAddresses; inherit (import <niveum/lib>) localAddresses;
in in
{ {
services.nextcloud = { services.nextcloud = {
enable = true; enable = true;
package = pkgs.nextcloud21; package = pkgs.nextcloud22;
https = true; https = true;
@@ -23,8 +24,8 @@ in
dbuser = "nextcloud"; dbuser = "nextcloud";
dbhost = "/run/postgresql"; # nextcloud will add /.s.PGSQL.5432 by itself dbhost = "/run/postgresql"; # nextcloud will add /.s.PGSQL.5432 by itself
dbname = "nextcloud"; dbname = "nextcloud";
dbpass = lib.strings.fileContents <system-secrets/nextcloud/database>; dbpassFile = passwordFile <system-secrets/nextcloud/database>;
adminpass = lib.strings.fileContents <system-secrets/nextcloud/admin>; adminpassFile = passwordFile <system-secrets/nextcloud/admin>;
adminuser = "admin"; adminuser = "admin";
# extraTrustedDomains = [ "toum.r" ]; # extraTrustedDomains = [ "toum.r" ];
}; };

View File

@@ -2,9 +2,7 @@
{ {
# enable `nix flake` # enable `nix flake`
nix = { nix = {
package = pkgs.nix; package = pkgs.nixFlakes;
# extraOptions = '' extraOptions = "experimental-features = nix-command flakes";
# experimental-features = nix-command
# '';
}; };
} }

View File

@@ -2,8 +2,29 @@
let let
hc = pkgs.callPackage <stockholm/tv/5pkgs/simple/hc.nix> {}; hc = pkgs.callPackage <stockholm/tv/5pkgs/simple/hc.nix> {};
worldradio = pkgs.callPackage <niveum/packages/worldradio.nix> {}; worldradio = pkgs.callPackage <niveum/packages/worldradio.nix> {};
menstruation = pkgs.callPackage <niveum/submodules/menstruation-backend> {};
nixpkgs-unstable = import <nixpkgs-unstable> { config.allowUnfree = true; }; nixpkgs-unstable = import <nixpkgs-unstable> { config.allowUnfree = true; };
astrolog = nixpkgs-unstable.astrolog.overrideAttrs (old: old // {
installPhase = ''
${old.installPhase}
# set sensible defaults
sed -i '
/^-z /s/8:00W/1:00E/ # timezone
/^-zl /s/122W19:59 47N36:35/13E22:42 52N27:42/ # default location
/^-zj /s/"Current moment now"/Now/ # default name
/^-zj /s/"Seattle, WA, USA"/Berlin/ # default location
/^_k/s/_k/=k/ # use color
/^_Yd/s/_Yd/=Yd/ # sensible date format
/^_Yt/s/_Yt/=Yt/ # sensible time format
/^_Yv/s/_Yv/=Yv/ # sensible length format
/^:Xbw/s/:Xbw/:Xbn/ # set X11 bitmap format
/^:I /s/80/120/ # wider text output
' $out/astrolog/astrolog.as
'';
});
recht = pkgs.callPackage (pkgs.fetchFromGitHub { recht = pkgs.callPackage (pkgs.fetchFromGitHub {
owner = "kmein"; owner = "kmein";
repo = "recht"; repo = "recht";
@@ -13,7 +34,6 @@ let
in { in {
imports = [ imports = [
./krebs.nix
./writing.nix ./writing.nix
./python.nix ./python.nix
./haskell ./haskell
@@ -51,7 +71,6 @@ in {
wget wget
whois whois
ix ix
nur.repos.kmein.python3Packages.instaloader
dnsutils dnsutils
# mtr # my traceroute # mtr # my traceroute
# FILE MANAGERS # FILE MANAGERS
@@ -107,6 +126,8 @@ in {
audacity audacity
calibre calibre
inkscape inkscape
astrolog # astrolog
anki # flashcards
nixpkgs-unstable.zoom-us # video conferencing nixpkgs-unstable.zoom-us # video conferencing
pdfgrep # search in pdf pdfgrep # search in pdf
pdftk # pdf toolkit pdftk # pdf toolkit
@@ -118,11 +139,14 @@ in {
youtubeDL youtubeDL
bc # calculator bc # calculator
pari # gp -- better calculator pari # gp -- better calculator
scripts.auc
scripts.infschmv scripts.infschmv
scripts.qrpaste
scripts.new-mac # get a new mac address scripts.new-mac # get a new mac address
scripts.scanned scripts.scanned
scripts.default-gateway scripts.default-gateway
scripts.showkeys-toggle scripts.showkeys-toggle
scripts.kirciuoklis
scripts.favicon scripts.favicon
scripts.ipa # XSAMPA to IPA converter scripts.ipa # XSAMPA to IPA converter
scripts.playlist scripts.playlist
@@ -130,10 +154,9 @@ in {
scripts.devanagari scripts.devanagari
scripts.betacode # ancient greek betacode to unicode converter scripts.betacode # ancient greek betacode to unicode converter
scripts.meteo scripts.meteo
nur.repos.kmein.mahlzeit scripts.mahlzeit
recht recht
# nur.repos.kmein.slide scripts.vimv
nur.repos.kmein.vimv
scripts.swallow # window swallowing scripts.swallow # window swallowing
scripts.genius scripts.genius
scripts.instaget scripts.instaget
@@ -152,8 +175,10 @@ in {
scripts.vg scripts.vg
scripts.fkill scripts.fkill
scripts.wttr scripts.wttr
scripts.boetlingk scripts.sanskrit-dictionary
scripts.unicodmenu scripts.unicodmenu
scripts.horoscope
scripts.closest
scripts.trans scripts.trans
scripts.liddel-scott-jones scripts.liddel-scott-jones
scripts.mpv-radio scripts.mpv-radio
@@ -169,6 +194,8 @@ in {
qrencode qrencode
wtf wtf
menstruation
(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
'') '')
@@ -181,11 +208,20 @@ in {
(pkgs.writers.writeDashBin "mpc-zaatar" ''MPD_HOST=${(import <niveum/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 "$@"'')
nixpkgs-unstable.spotify nixpkgs-unstable.spotify
nixpkgs-unstable.spotify-tui ncspot
playerctl playerctl
nix-index nix-index
scripts.nix-index-update scripts.nix-index-update
#krebs
dic
cyberlocker-tools
untilport
kpaste
irc-announce
git-preview
ircaids
]; ];
} }

View File

@@ -36,6 +36,7 @@ with haskellPackages; [
directory directory
dlist dlist
either either
edit-distance
exceptions exceptions
extra extra
filepath filepath
@@ -54,6 +55,7 @@ with haskellPackages; [
megaparsec megaparsec
microlens microlens
monad-logger monad-logger
monad-memo
mono-traversable mono-traversable
mtl mtl
network network

View File

@@ -1,22 +0,0 @@
{ lib, pkgs, ... }:
let
krebs-packages = pkgs: {
dic = pkgs.callPackage <stockholm/krebs/5pkgs/simple/dic> { };
yt-next = pkgs.callPackage <stockholm/lass/5pkgs/yt-next> { };
acronym = pkgs.callPackage <stockholm/lass/5pkgs/acronym> { };
urban = pkgs.callPackage <stockholm/lass/5pkgs/urban> { };
mpv-poll = pkgs.callPackage <stockholm/lass/5pkgs/mpv-poll> { };
cyberlocker-tools = pkgs.callPackage <stockholm/krebs/5pkgs/simple/cyberlocker-tools> { };
untilport = pkgs.callPackage <stockholm/krebs/5pkgs/simple/untilport> { };
kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> { };
irc-announce =
pkgs.callPackage <stockholm/krebs/5pkgs/simple/irc-announce> { };
git-preview =
pkgs.callPackage <stockholm/krebs/5pkgs/simple/git-preview> { };
};
in {
nixpkgs.config.packageOverrides = krebs-packages;
environment.systemPackages =
map (name: pkgs.${name}) (lib.attrNames (krebs-packages pkgs));
}

View File

@@ -2,10 +2,10 @@
environment.systemPackages = [ environment.systemPackages = [
(pkgs.python3.withPackages (py: [ (pkgs.python3.withPackages (py: [
py.black py.black
py.python-language-server # py.python-language-server
py.pyls-mypy # py.pyls-mypy
py.pyls-black # py.pyls-black
py.pyls-isort # py.pyls-isort
py.flake8 py.flake8
py.pygments py.pygments
py.schema py.schema

View File

@@ -1,5 +1,7 @@
{ pkgs, lib, config, ... }: { pkgs, lib, config, ... }:
let let
pandoc-doc = pkgs.callPackage <niveum/packages/man/pandoc.nix> {};
zoteroStyle = { name, sha256 }: { zoteroStyle = { name, sha256 }: {
name = "${name}.csl"; name = "${name}.csl";
path = pkgs.fetchurl { path = pkgs.fetchurl {
@@ -63,13 +65,14 @@ in {
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
nur.repos.kmein.text2pdf scripts.text2pdf
lowdown lowdown
glow # markdown to term glow # markdown to term
libreoffice libreoffice
# gnumeric # gnumeric
dia dia
pandoc pandoc
pandoc-doc
# proselint # proselint
asciidoctor asciidoctor
wordnet wordnet

View File

@@ -3,8 +3,6 @@ let
suspend = pkgs.writers.writeDash "suspend" "${pkgs.systemd}/bin/systemctl suspend"; suspend = pkgs.writers.writeDash "suspend" "${pkgs.systemd}/bin/systemctl suspend";
in in
{ {
imports = [ <stockholm/krebs/3modules/power-action.nix> ];
krebs.power-action = { krebs.power-action = {
enable = true; enable = true;
plans.suspend = { plans.suspend = {

View File

@@ -1,19 +1,10 @@
{ lib, pkgs, config, ... }: { lib, pkgs, config, ... }:
let let
inherit (import <niveum/lib>) tmpfilesConfig; inherit (import <niveum/lib>) tmpfilesConfig serveHtml;
radioStore = "/var/lib/radio"; radioStore = "/var/lib/radio";
htgenPort = 8080; htgenPort = 8080;
stations = { stations = {
meddl = {
streamPort = 8000;
mpdPort = 6600;
description = ''
Drachenlord-Radio. Kopie von <a href="https://antenne-asb.ga/">Hit Radio Antenne ASB</a>, dem Anti-Mobbing-Sender.
<em>Hier wird nicht nur, aber auch Meddl gespielt.
Für dich On Air einer unserer Top Moderatoren Rainer Winkler. Als einer der größten Meddler aller Zeiten, hat er sich schon in seiner Kinheit einen Namen gemacht. Auch wenn er dem Meddl zugeneigt ist und HipHop-Kaschber eigentlich hasst, spielt er mittlerweile gelegentlich auch Techno oder HipHop.</em>
'';
};
lyrikline = { lyrikline = {
streamPort = 8001; streamPort = 8001;
mpdPort = 6601; mpdPort = 6601;
@@ -72,7 +63,11 @@ in
}) })
]; ];
users.extraUsers.radio.isSystemUser = true; users.extraUsers.radio = {
isSystemUser = true;
group = "radio";
};
users.groups.radio = {};
krebs.htgen.radio = { krebs.htgen.radio = {
port = htgenPort; port = htgenPort;
@@ -113,25 +108,6 @@ in
)" )"
url="$(cat ${radioStore}/$hash)" url="$(cat ${radioStore}/$hash)"
echo "<html><body style='margin:0'><iframe style='width:100%;height:100%;border:0' src="$url"></iframe></body></html>"
exit
;;
"POST /meddl/skip")
send200
${mpcs.meddl}/bin/mpc-meddl next
exit
;;
"GET /meddl/status")
send200
hash="$(
${mpcs.meddl}/bin/mpc-meddl status -f '%file%' \
| head -n 1 \
| md5sum \
| cut -d' ' -f 1
)"
url="$(cat ${radioStore}/$hash)"
echo "<html><body style='margin:0'><iframe style='width:100%;height:100%;border:0' src="$url"></iframe></body></html>" echo "<html><body style='margin:0'><iframe style='width:100%;height:100%;border:0' src="$url"></iframe></body></html>"
exit exit
;; ;;
@@ -220,57 +196,12 @@ in
}; };
systemd.services.meddl = { services.nginx.virtualHosts."radio.kmein.de" = {
after = [ "container@meddl.service" ];
wantedBy = [ "container@meddl.service" ];
startAt = "*:00/10";
serviceConfig.User = config.users.extraUsers.radio.name;
preStart = "${mpcs.meddl}/bin/mpc-meddl crop || :";
script = ''
set -efu
host=http://antenne-asb.ga
prepend_host() {
sed "s#^#$host/#"
}
${pkgs.curl}/bin/curl -sSL "$host" \
| ${pkgs.pup}/bin/pup 'li a attr{href}' \
| prepend_host \
| while read -r song; do
song_url="$(${pkgs.curl}/bin/curl -sSL "$song" \
| ${pkgs.pup}/bin/pup 'audio source attr{src}' \
| prepend_host
)"
hash="$(echo "$song_url" | md5sum | cut -d' ' -f 1)"
echo "$song_url ($hash) -> $song"
echo "$song" > "${radioStore}/$hash"
${mpcs.meddl}/bin/mpc-meddl add "$song_url"
done
${mpcs.meddl}/bin/mpc-meddl play
'';
};
services.nginx.virtualHosts."radio.xn--kiern-0qa.de" = {
enableACME = true; enableACME = true;
forceSSL = true; forceSSL = true;
locations = lib.mkMerge ( locations = lib.mkMerge (
[ [
{ { "/".extraConfig = serveHtml (import ./station-list.nix { inherit pkgs lib stations; }) pkgs; }
"/".extraConfig = ''
default_type "text/html";
root ${pkgs.linkFarm "station-list" [{
name = "index.html";
path = import ./station-list.nix { inherit pkgs lib stations; };
}]};
index index.html;
'';
# skip
"= /meddl/skip".proxyPass = "http://127.0.0.1:${toString htgenPort}";
}
] ++ (lib.mapAttrsToList (name: station: { ] ++ (lib.mapAttrsToList (name: station: {
"= /${name}/status".proxyPass = "http://127.0.0.1:${toString htgenPort}"; "= /${name}/status".proxyPass = "http://127.0.0.1:${toString htgenPort}";
"= /${name}/listen.ogg".proxyPass = "http://127.0.0.1:${toString station.streamPort}"; "= /${name}/listen.ogg".proxyPass = "http://127.0.0.1:${toString station.streamPort}";

69
configs/retiolum-map.nix Normal file
View File

@@ -0,0 +1,69 @@
{ config, pkgs, lib, ... }:
let
network = "retiolum";
stateDirectory = "retiolum-map";
geo-ip-database = "${lib.head config.services.geoipupdate.settings.EditionIDs}.mmdb";
geo-ip-database-path = "${config.services.geoipupdate.settings.DatabaseDirectory}/${geo-ip-database}";
tinc-graph-source = pkgs.fetchFromGitHub {
owner = "kmein";
repo = "tinc-graph";
rev = "1b9c69ffdbdab82d30a23e44f739feea63d94163";
sha256 = "0bk4x9l399f80lmz4asx7s5fcsgrfdb6xyymbq884621x4z3d2vp";
};
tinc-graph = pkgs.callPackage tinc-graph-source {};
in
{
systemd.services.retiolum-index = {
description = "Retiolum indexing service";
wants = [ "tinc.${network}.service" ];
script = ''
${tinc-graph}/bin/tinc-graph --geoip-file ${geo-ip-database-path} --network ${network} \
| ${pkgs.coreutils}/bin/tee network.json \
| ${tinc-graph}/bin/tinc-statistics > statistics.json
cp ${tinc-graph}/static/map.html map.html
cp ${tinc-graph}/static/map.html index.html
cp ${tinc-graph}/static/graph.html graph.html
'';
startAt = "hourly";
path = [ pkgs.coreutils pkgs.jq pkgs.tinc_pre ];
serviceConfig = {
Type = "oneshot";
User = "root";
StateDirectory = stateDirectory;
WorkingDirectory = "/var/lib/${stateDirectory}";
};
};
services.geoipupdate = {
enable = true;
settings = {
AccountID = 608777;
LicenseKey = toString <system-secrets/maxmind/license.key>;
EditionIDs = [ "GeoLite2-City" ];
};
};
services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts."graph.r".locations."/".root = "/var/lib/${stateDirectory}";
};
systemd.services.geoip-share = {
after = [ "geoipupdate.service" ];
script = let
cyberlocker-tools = pkgs.callPackage <stockholm/krebs/5pkgs/simple/cyberlocker-tools> {};
in "${cyberlocker-tools}/bin/cput ${geo-ip-database} < ${geo-ip-database-path}";
serviceConfig = {
Type = "oneshot";
DynamicUser = true;
};
};
}

View File

@@ -1,6 +1,6 @@
{ config, pkgs, ... }: { { config, pkgs, ... }: {
imports = [ imports = [
<niveum/modules/retiolum.nix> ../modules/retiolum.nix
]; ];
networking.hosts = { "42:0:ca48:f98f:63d7:31ce:922b:245d" = [ "go" ]; }; networking.hosts = { "42:0:ca48:f98f:63d7:31ce:922b:245d" = [ "go" ]; };

View File

@@ -4,46 +4,6 @@ let
in{ in{
home-manager.users.me.programs.rofi = { home-manager.users.me.programs.rofi = {
enable = true; enable = true;
separator = "solid";
scrollbar = false;
borderWidth = 0;
lines = 5;
font = "Monospace 10"; font = "Monospace 10";
colors = rec {
window = rec {
background = colours.foreground;
border = background;
separator = colours.black.bright;
};
rows = {
normal = {
background = window.background;
backgroundAlt = window.background;
foreground = colours.background;
highlight = {
foreground = colours.cyan.dark;
inherit (window) background;
};
};
active = {
background = window.background;
backgroundAlt = window.background;
foreground = colours.yellow.dark;
highlight = {
foreground = colours.green.dark;
inherit (window) background;
};
};
urgent = {
background = window.background;
backgroundAlt = window.background;
foreground = colours.red.dark;
highlight = {
foreground = colours.magenta.dark;
inherit (window) background;
};
};
};
};
}; };
} }

61
configs/tarot.nix Normal file
View File

@@ -0,0 +1,61 @@
{ config, pkgs, lib, ... }:
let
tarotPort = 7407;
tarotFiles = pkgs.fetchzip {
url = "https://c.krebsco.de/tarot.zip";
sha256 = "0jl5vdwlj17pqp94yj02xgsb1gyvs9i08m83kac0jdnhfjl2f75a";
stripRoot = false;
};
tarotKey = builtins.fetchurl {
url = "http://c.krebsco.de/tarot.pdf";
sha256 = "1n2m53kjg2vj9dbr70b9jrsbqwdfrcb48l4wswn21549fi24g6dx";
};
in
{
krebs.htgen.tarot = {
port = tarotPort;
user.name = "radio";
script = ''. ${pkgs.writers.writeDash "tarot" ''
case "$Method $Request_URI" in
"GET /")
if item=$(${pkgs.findutils}/bin/find ${toString tarotFiles} -type f | ${pkgs.coreutils}/bin/shuf -n1); then
card=$(mktemp --tmpdir tarot.XXX)
trap 'rm $card' EXIT
reverse=$(${pkgs.coreutils}/bin/shuf -i0-1 -n1)
if [ "$reverse" -eq 1 ]; then
${pkgs.imagemagick}/bin/convert -rotate 180 "$item" "$card"
else
${pkgs.coreutils}/bin/cp "$item" "$card"
fi
printf 'HTTP/1.1 200 OK\r\n'
printf 'Content-Type: %s\r\n' "$(${pkgs.file}/bin/file -ib "$card")"
printf 'Server: %s\r\n' "$Server"
printf 'Connection: close\r\n'
printf 'Content-Length: %d\r\n' $(${pkgs.coreutils}/bin/wc -c < "$card")
printf '\r\n'
cat "$card"
exit
fi
;;
esac
''}'';
};
services.nginx.virtualHosts."tarot.kmein.de" = {
enableACME = true;
forceSSL = true;
locations = {
"/".proxyPass = "http://127.0.0.1:${toString tarotPort}";
"/files/" = {
root = pkgs.linkFarm "tarot" [
{ name = "files/key.pdf"; path = tarotKey; }
{ name = "files/cards"; path = tarotFiles; }
];
extraConfig = ''
autoindex on;
charset UTF-8;
'';
};
};
};
}

View File

@@ -0,0 +1,53 @@
{ pkgs, lib, ... }:
let
nixpkgs-unstable = import <nixpkgs-unstable> {};
toSymbols = pkgs.writers.writeDash "to-symbols" ''
${pkgs.gnused}/bin/sed '
s/\bTri\b//;
s/\bOpp\b//;
s/\bSqu\b//;
s/\bSex\b//;
s/\bCon\b//;
s/Sun//g;
s/Moon//g;
s/Mercury//g;
s/Venus//g;
s/Mars//g;
s/Jupiter//g;
s/Saturn//g;
s/Uranus//g;
s/Neptune//g;
s/Pluto//g;
s/North Node//g;
s/\bLeo\b//g;
s/\bCan\(cer\)\?\b//g;
s/\bGem\(ini\)\?\b//g;
s/\bVir\(go\)\?\b//g;
s/\bLib\(ra\)\?\b//g;
s/\bTau\(rus\)\?\b//g;
s/\bAri\(es\)\?\b//g;
s/\bSco\(rpio\)\?\b//g;
s/\bPis\(ces\)\?\b//g;
s/\bSag\(ittarius\)\?\b//g;
s/\bAqu\(arius\)\?\b//g;
s/\bCap\(ricorn\)\?\b//g;
s/-->//g;
s/\s\+/ /g; # replace multiple spaces by one
s/^.*\([ 0-9]\{2\}:[0-9]\{2\}\) /\1 /; # remove date at beginning of line (but not everything up to v/c X:XX)
s/^\s*//
'
'';
in {
niveum.telegramBots.transits = {
enable = true;
time = "4:00";
token = lib.strings.fileContents <system-secrets/telegram/kmein.token>;
chatIds = [ "18980945" ];
command = toString (pkgs.writers.writeDash "common-transits" ''
{
${nixpkgs-unstable.astrolog}/bin/astrolog -n -zN Berlin -Yt -Yd -d -R Uranus Neptune Pluto
${nixpkgs-unstable.astrolog}/bin/astrolog -Yt -Yd -q 10 22 1999 6:32 -zN Kassel -td $(${pkgs.coreutils}/bin/date +'%m %d %Y') -R Uranus Neptune Pluto
} | ${toSymbols} | ${pkgs.coreutils}/bin/sort -n
'');
};
}

View File

@@ -14,6 +14,7 @@ let
in { in {
imports = [ imports = [
./literature-quote.nix ./literature-quote.nix
./astrology.nix
./autorenkalender.nix ./autorenkalender.nix
./nachtischsatan.nix ./nachtischsatan.nix
./tlg-wotd.nix ./tlg-wotd.nix

View File

@@ -4,7 +4,7 @@ let
living-room-id = 131090; living-room-id = 131090;
in in
{ {
imports = [ <niveum/modules/traadfri.nix> ]; imports = [ ../modules/traadfri.nix ];
environment.systemPackages = [ environment.systemPackages = [
(pkgs.writers.writeDashBin "traadfri-party" '' (pkgs.writers.writeDashBin "traadfri-party" ''

View File

@@ -19,17 +19,15 @@ in
openDefaultPorts = true; openDefaultPorts = true;
configDir = "${mpd-directory}/.config/syncthing"; configDir = "${mpd-directory}/.config/syncthing";
dataDir = "${mpd-directory}/.config/syncthing"; dataDir = "${mpd-directory}/.config/syncthing";
declarative = rec { cert = toString <system-secrets/syncthing/cert.pem>;
cert = toString <system-secrets/syncthing/cert.pem>; key = toString <system-secrets/syncthing/key.pem>;
key = toString <system-secrets/syncthing/key.pem>; devices = {
devices = { inherit ((import <niveum/lib>).syncthing.devices) kabsa manakish heym;
inherit ((import <niveum/lib>).syncthing.devices) kabsa manakish heym; };
}; folders.${config.services.mpd.musicDirectory} = {
folders.${config.services.mpd.musicDirectory} = { devices = [ "heym" "kabsa" "manakish" ];
devices = [ "heym" "kabsa" "manakish" ]; id = "music";
id = "music"; type = "receiveonly";
type = "receiveonly";
};
}; };
}; };
@@ -97,6 +95,7 @@ in
}; };
/*
services.nginx = { services.nginx = {
enable = true; enable = true;
recommendedGzipSettings = true; recommendedGzipSettings = true;
@@ -111,4 +110,5 @@ in
}; };
}; };
}; };
*/
} }

View File

@@ -25,13 +25,26 @@ let
{ {
name = "Tatort"; name = "Tatort";
url = "https://www.daserste.de/unterhaltung/krimi/tatort/vorschau/index.html"; url = "https://www.daserste.de/unterhaltung/krimi/tatort/vorschau/index.html";
filter = [ "html2text" "strip" ]; filter = [
"html2text"
"strip"
{
shellpipe = ''
${pkgs.gnused}/bin/sed 's/&#32;/ /g;s/))/&\n/g;s/ \+/ /g'
'';
}
];
} }
{ {
name = "Kratylos"; name = "Kratylos";
url = "https://kratylos.reichert-online.org/current_issue/KRATYLOS"; url = "https://kratylos.reichert-online.org/current_issue/KRATYLOS";
filter = [ { element-by-id = "content"; } "html2text" "strip" ]; filter = [ { element-by-id = "content"; } "html2text" "strip" ];
} }
{
name = "Zeno Free E-Books";
url = "http://www.zeno.org/Lesesaal/M/E-Books";
filter = [ { element-by-class = "zenoCOMain"; } "html2text" "strip" ];
}
{ {
name = "Indogermanische Forschungen"; name = "Indogermanische Forschungen";
url = "https://www.degruyter.com/journal/key/INDO/html"; url = "https://www.degruyter.com/journal/key/INDO/html";
@@ -120,8 +133,11 @@ in
home = urlwatchDir; home = urlwatchDir;
createHome = true; createHome = true;
isSystemUser = true; isSystemUser = true;
group = "urlwatch";
}; };
users.groups.urlwatch = {};
systemd.services.urlwatch = { systemd.services.urlwatch = {
enable = true; enable = true;
startAt = "*-*-* 05:00:00"; startAt = "*-*-* 05:00:00";
@@ -132,6 +148,7 @@ in
''; '';
serviceConfig = { serviceConfig = {
User = config.users.extraUsers.urlwatch.name; User = config.users.extraUsers.urlwatch.name;
Group = config.users.groups.urlwatch.name;
WorkingDirectory = config.users.extraUsers.urlwatch.home; WorkingDirectory = config.users.extraUsers.urlwatch.home;
PermissionsStartOnly = "true"; PermissionsStartOnly = "true";
PrivateTmp = "true"; PrivateTmp = "true";

View File

@@ -1,7 +1,5 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
{ {
imports = [ <stockholm/krebs/3modules/fetchWallpaper.nix> ];
krebs.fetchWallpaper = { krebs.fetchWallpaper = {
enable = true; enable = true;
url = "http://prism.r/realwallpaper-krebs-stars-berlin.png"; url = "http://prism.r/realwallpaper-krebs-stars-berlin.png";

View File

@@ -23,7 +23,7 @@ in {
''; '';
weechat = pkgs.weechat.override { weechat = pkgs.weechat.override {
configure = { ... }: { configure = { ... }: {
scripts = [ pkgs.weechatScripts.weechat-autosort pkgs.weechatScripts.colorize_nicks ]; scripts = [ pkgs.weechatScripts.weechat-autosort pkgs.weechatScripts.colorize_nicks pkgs.weechatScripts.weechat-matrix ];
init = let init = let
coolColors = lib.lists.subtractLists (lib.range 52 69 ++ lib.range 231 248) (lib.range 31 254); coolColors = lib.lists.subtractLists (lib.range 52 69 ++ lib.range 231 248) (lib.range 31 254);
nick = "kmein"; nick = "kmein";
@@ -43,14 +43,18 @@ in {
/server add oftc irc.oftc.net/6697 -ssl -ipv6 /server add oftc irc.oftc.net/6697 -ssl -ipv6
/server add retiolum irc.r /server add retiolum irc.r
/server add news news.r /server add news news.r
/matrix server add nibbana nibbana.jp
/alias add mod /quote omode $channel +o $nick /alias add mod /quote omode $channel +o $nick
/relay add weechat 9000 /relay add weechat 9000
/set relay.network.password ${relayPassword} /set relay.network.password ${relayPassword}
/set matrix.server.nibbana.username ${nick}
/set matrix.server.nibbana.password "${lib.strings.fileContents <system-secrets/matrix/nibbana>}"
/set irc.server.oftc.command /msg nickserv IDENTIFY ${lib.strings.fileContents <system-secrets/irc/oftc>};/msg nickserv SET CLOAK ON /set irc.server.oftc.command /msg nickserv IDENTIFY ${lib.strings.fileContents <system-secrets/irc/oftc>};/msg nickserv SET CLOAK ON
/set irc.server.oftc.autojoin "#osm,#osm-de" /set irc.server.oftc.autojoin "#osm,#osm-de,#home-manager"
/set irc.server.hackint.autojoin "#krebs,#nixos,#the_playlist" /set irc.server.hackint.autojoin "#krebs,#nixos,#the_playlist"
/set irc.server.hackint.sasl_mechanism plain /set irc.server.hackint.sasl_mechanism plain
@@ -68,7 +72,7 @@ in {
/set irc.server.news.command "/oper aids balls" /set irc.server.news.command "/oper aids balls"
/set logger.level.irc.news 0 /set logger.level.irc.news 0
/filter addreplace zerocovid * * [kc]orona|[kc]ovid|virus|lockdown|va[kc][sc]in|mutante|mutation|impf|pandemi|κορ[ωο]ν[αο]ϊό|корона|expert|infe[ck]t|infizi|in[cz]iden[cz]|sars-cov|drosten|virolog|lauterbach|delta /filter addreplace zerocovid * * [kc]orona|💉|🤒|😷|[kc]ovid|virus|lockdown|va[kc][sc]in|mutante|mutation|impf|pandemi|κορ[ωο]ν[αο]ϊό|корона|expert|infe[ck]t|infizi|in[cz]iden[cz]|sars-cov|drosten|virolog|lauterbach|delta|omi[ck]ron|epidemi|booster|r-wert
/filter addreplace joinquit * irc_join,irc_part,irc_quit,irc_nick * /filter addreplace joinquit * irc_join,irc_part,irc_quit,irc_nick *
/filter addreplace playlist_topic irc.*.#the_playlist irc_topic * /filter addreplace playlist_topic irc.*.#the_playlist irc_topic *
/filter addreplace brockman_notice irc.news.* irc_notice * /filter addreplace brockman_notice irc.news.* irc_notice *
@@ -80,6 +84,7 @@ in {
/connect hackint /connect hackint
/connect retiolum /connect retiolum
/connect news /connect news
/matrix connect nibbana
''; '';
}; };
}; };

View File

@@ -1,68 +1,38 @@
let let
inherit (import ./lib/default.nix) sshPort; inherit (import ./lib/default.nix) sshPort;
gitFromJson = path: krops = builtins.fetchGit { url = "https://cgit.krebsco.de/krops/"; };
let object = importJson path;
in {
inherit (object) url;
ref = object.rev;
};
krops = builtins.fetchGit (gitFromJson .versions/krops.json);
lib = import "${krops}/lib"; lib = import "${krops}/lib";
pkgs = import "${krops}/pkgs" { }; pkgs = import "${krops}/pkgs" { };
importJson = (import <nixpkgs> { }).lib.importJSON;
regularSystem = { path, name, address }: { source = name: lib.evalSource [{
source = lib.evalSource [{ niveum.file = toString ./.;
niveum.file = toString ./.; system-secrets.pass = {
system.file = toString path; dir = toString ~/.password-store;
nixos-config.symlink = "system/configuration.nix"; name = "systems/${name}";
};
secrets.pass = {
dir = toString ~/.password-store;
name = "shared";
};
}];
nixpkgs.git = gitFromJson .versions/nixpkgs.json // { shallow = true; }; command = targetPath: ''
nixpkgs-unstable.git = gitFromJson .versions/nixpkgs-unstable.json // { shallow = true; }; nix-shell -p git --run '
home-manager.git = gitFromJson .versions/home-manager.json; nixos-rebuild switch -v --show-trace --flake ${targetPath}/niveum || \
stockholm.git = gitFromJson .versions/stockholm.json; nixos-rebuild switch -v --flake ${targetPath}/niveum
retiolum.git = gitFromJson .versions/retiolum.json; '
nur.git = gitFromJson .versions/nur.json; '';
nixpkgs-mozilla.git = gitFromJson .versions/nixpkgs-mozilla.json;
system-secrets.pass = { createHost = name: target: pkgs.krops.writeCommand "deploy-${name}" {
dir = toString ~/.password-store; source = source name;
name = "systems/${name}"; inherit command target;
};
secrets.pass = {
dir = toString ~/.password-store;
name = "shared";
};
}];
target = "root@${address}:${toString sshPort}";
}; };
inherit (pkgs.krops) writeDeploy; in rec {
in { zaatar = createHost "zaatar" "root@zaatar.r:${toString sshPort}";
zaatar = writeDeploy "deploy-zaatar" (regularSystem { kabsa = createHost "kabsa" "root@kabsa.r:${toString sshPort}";
path = systems/zaatar; makanek = createHost "kabsa" "root@makanek.r:${toString sshPort}";
name = "zaatar"; manakish = createHost "kabsa" "root@manakish.r:${toString sshPort}";
address = "zaatar.r"; all = pkgs.writeScript "deploy-all"
}); (lib.concatStringsSep "\n" [ zaatar kabsa makanek manakish ]);
kabsa = writeDeploy "deploy-kabsa" (regularSystem {
path = systems/kabsa;
name = "kabsa";
address = "kabsa.r";
});
toum = writeDeploy "deploy-toum" (regularSystem {
path = systems/toum;
name = "toum";
address = "toum.r";
}) // {
buildTarget = "${builtins.getEnv "USER"}@localhost/${builtins.getEnv "HOME"}/.cache/krops";
};
makanek = writeDeploy "deploy-makanek" (regularSystem {
path = systems/makanek;
name = "makanek";
address = "makanek.r";
});
manakish = writeDeploy "deploy-manakish" (regularSystem {
path = systems/manakish;
name = "manakish";
address = "manakish.r";
});
} }

150
flake.lock generated Normal file
View File

@@ -0,0 +1,150 @@
{
"nodes": {
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1639871969,
"narHash": "sha256-6feWUnMygRzA9tzkrfAzpA5/NBYg75bkFxnqb1DtD7E=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "697cc8c68ed6a606296efbbe9614c32537078756",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-21.11",
"repo": "home-manager",
"type": "github"
}
},
"krops": {
"flake": false,
"locked": {
"lastModified": 1637419569,
"narHash": "sha256-0hxKZQIoByRDoPsfQq5qzFJioyWRX/fbpvMO2EYQ9lc=",
"ref": "master",
"rev": "13ae434b140035e7e2664bd5a8ef4c475413b2e0",
"revCount": 115,
"type": "git",
"url": "https://cgit.krebsco.de/krops"
},
"original": {
"type": "git",
"url": "https://cgit.krebsco.de/krops"
}
},
"nix-writers": {
"flake": false,
"locked": {
"lastModified": 1554228333,
"narHash": "sha256-hG/PlcCvCQhNcU55NpHfATkyH9k6cZmO7uvBoJjasXU=",
"ref": "master",
"rev": "c528cf970e292790b414b4c1c8c8e9d7e73b2a71",
"revCount": 32,
"type": "git",
"url": "https://cgit.krebsco.de/nix-writers"
},
"original": {
"type": "git",
"url": "https://cgit.krebsco.de/nix-writers"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1640759603,
"narHash": "sha256-k4d7oC6GvDV1OKxG325JUDpKtZcDUPEiddnJMOQQ/x8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e101dc111ac1e5a21efca7822417acc1cb92013a",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "release-21.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-mozilla": {
"flake": false,
"locked": {
"lastModified": 1638887313,
"narHash": "sha256-FMYV6rVtvSIfthgC1sK1xugh3y7muoQcvduMdriz4ag=",
"owner": "mozilla",
"repo": "nixpkgs-mozilla",
"rev": "7c1e8b1dd6ed0043fb4ee0b12b815256b0b9de6f",
"type": "github"
},
"original": {
"owner": "mozilla",
"repo": "nixpkgs-mozilla",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1640725200,
"narHash": "sha256-yR8clhRTt1OBFojyBaNnNgD+om51nhuJ1OLqWqdY2Ow=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "eaeea6e9337b93d2acb7c2aa27e3f4617408375a",
"type": "github"
},
"original": {
"owner": "nixos",
"repo": "nixpkgs",
"type": "github"
}
},
"retiolum": {
"flake": false,
"locked": {
"lastModified": 1640724425,
"narHash": "sha256-eGzvF96ZnrKqvQ7wnpa9OYsfBxUMV0Jdh3QGdZhbSek=",
"owner": "krebs",
"repo": "retiolum",
"rev": "5a32ea07d6ca5668ea06f14dffe94fb46d42c674",
"type": "github"
},
"original": {
"owner": "krebs",
"repo": "retiolum",
"type": "github"
}
},
"root": {
"inputs": {
"home-manager": "home-manager",
"krops": "krops",
"nix-writers": "nix-writers",
"nixpkgs": "nixpkgs",
"nixpkgs-mozilla": "nixpkgs-mozilla",
"nixpkgs-unstable": "nixpkgs-unstable",
"retiolum": "retiolum",
"stockholm": "stockholm"
}
},
"stockholm": {
"flake": false,
"locked": {
"lastModified": 1640726454,
"narHash": "sha256-twePnoB0NRhSM4zJOrUI/Zxzwx/u52ey6zA4YYGEvOc=",
"ref": "master",
"rev": "2a47990f16935d909930c9dd1ed6f8f2982df638",
"revCount": 10218,
"type": "git",
"url": "https://cgit.lassul.us/stockholm"
},
"original": {
"type": "git",
"url": "https://cgit.lassul.us/stockholm"
}
}
},
"root": "root",
"version": 7
}

79
flake.nix Normal file
View File

@@ -0,0 +1,79 @@
# imported from https://github.com/pinpox/nixos/blob/bdc0d47111d57cd19512c83538a01f9f9a3fc847/flake.nix
# ref https://www.youtube.com/watch?v=mJbQ--iBc1U
{
description = "niveum systems";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/release-21.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs";
home-manager = {
url = "github:nix-community/home-manager/release-21.11";
inputs.nixpkgs.follows = "nixpkgs";
};
# flake-utils.url = "github:numtide/flake-utils";
# flake-compat = {
# url = "github:edolstra/flake-compat";
# flake = false;
# };
stockholm = {
url = "git+https://cgit.lassul.us/stockholm";
flake = false;
};
nix-writers = {
url = "git+https://cgit.krebsco.de/nix-writers";
flake = false;
};
krops = {
url = "git+https://cgit.krebsco.de/krops";
flake = false;
};
retiolum = {
url = "github:krebs/retiolum";
flake = false;
};
nixpkgs-mozilla = {
url = "github:mozilla/nixpkgs-mozilla";
flake = false;
};
};
outputs = { self, nixpkgs, nix-writers, home-manager, stockholm, ... }@inputs:
let
nixosSystem = nixpkgs.lib.makeOverridable nixpkgs.lib.nixosSystem;
defaultModules = [
{ _module.args.inputs = inputs; }
{
imports = [
home-manager.nixosModules.home-manager
"${stockholm}/krebs/3modules/power-action.nix"
"${stockholm}/krebs/3modules/fetchWallpaper.nix"
({ pkgs, ... }: {
nix.nixPath = [ "nixpkgs=${pkgs.path}" ];
nixpkgs.overlays = [
(import "${nix-writers}/pkgs")
(import "${stockholm}/krebs/5pkgs")
];
})
({ pkgs, ... }: { # https://github.com/Mic92/dotfiles/blob/50826e8f247909557975f4f193ecbb4162b07310/nixos/modules/upgrade-diff.nix
system.activationScripts.diff = ''
${pkgs.nix}/bin/nix store diff-closures /run/current-system "$systemConfig"
'';
})
];
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
}
];
in {
nixosConfigurations = {
kabsa = nixosSystem {
system = "x86_64-linux";
modules = defaultModules ++ [
systems/kabsa/configuration.nix
];
};
};
};
}

View File

@@ -7,6 +7,12 @@ rec {
removeRules = lib.concatMapStringsSep "\n" (rule: "iptables -D ${rule} || true"); removeRules = lib.concatMapStringsSep "\n" (rule: "iptables -D ${rule} || true");
}; };
serveHtml = file: pkgs: ''
default_type "text/html";
root ${pkgs.linkFarm "fahrplan" [{ name = "index.html"; path = file; }]};
index index.html;
'';
sshPort = 22022; sshPort = 22022;
colours = import ./colours/mac-os.nix; colours = import ./colours/mac-os.nix;
@@ -28,6 +34,8 @@ rec {
defaultApplications = import ./default-applications.nix; defaultApplications = import ./default-applications.nix;
retiolumAddresses = import ./retiolum-network.nix;
localAddresses = import ./local-network.nix; localAddresses = import ./local-network.nix;
email-sshKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINKz33wHtPuIfgXEb0+hybxFGV9ZuPsDTLUZo/+hlcdA"; email-sshKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINKz33wHtPuIfgXEb0+hybxFGV9ZuPsDTLUZo/+hlcdA";

View File

@@ -92,6 +92,43 @@ in {
units = "metric"; units = "metric";
}; };
} }
{
block = "custom";
interval = 60 * 5;
command = let inherit (import <niveum/configs/spacetime.nix>) location; in "${pkgs.scripts.horoscope}/bin/horoscope --latitude=${toString location.latitude} --longitude=${toString location.longitude}";
}
{
block = "custom";
interval = 60 * 5;
command = let spacetime = import <niveum/configs/spacetime.nix>; in pkgs.writers.writePython3 "sun.py" { libraries = [ pkgs.python3Packages.astral ]; flakeIgnore = [ "E121" "E501" ]; }
''
import astral
import astral.moon
import astral.sun
import math
moon_phases = {
0: "🌑",
3.5: "🌒",
7: "🌓",
10.5: "🌔",
14: "🌕",
17.5: "🌖",
21: "🌗",
24.5: "🌘",
28: "🌑",
}
current_phase = astral.moon.phase()
closest_phase = min(moon_phases.keys(), key=lambda x: abs(current_phase - x))
moon_percentage = round(100 * math.sin(current_phase / 28 * math.pi), 1)
city = astral.LocationInfo("Berlin", "Germany", "${spacetime.time.timeZone}", ${toString spacetime.location.latitude}, ${toString spacetime.location.longitude})
sun = astral.sun.sun(city.observer, date=astral.today(), tzinfo=city.timezone)
print("🌅 {} 🌇 {} {} {}%".format(sun["sunrise"].strftime("%R"), sun["sunset"].strftime("%R"), moon_phases[closest_phase], moon_percentage))
'';
}
{ {
block = "custom"; block = "custom";
interval = 60 * 60; interval = 60 * 60;
@@ -100,17 +137,6 @@ in {
| ${pkgs.jq}/bin/jq -r '"💉 \(.data.quote * 1000 | floor | . / 10)% \(.data.secondVaccination.quote * 1000 | floor | . / 10)%"' | ${pkgs.jq}/bin/jq -r '"💉 \(.data.quote * 1000 | floor | . / 10)% \(.data.secondVaccination.quote * 1000 | floor | . / 10)%"'
''; '';
} }
{
block = "custom";
interval = 30;
command =
let query = "tag:unread AND tag:inbox";
in pkgs.writers.writeDash "count-new-mail" ''
mail_count="$(${pkgs.notmuch}/bin/notmuch search ${lib.escapeShellArg query} | wc -l)"
[ "$mail_count" = 0 ] && printf "📭" || printf "📬"
echo "$mail_count"
'';
}
(let service = "openvpn-hu-berlin"; in { (let service = "openvpn-hu-berlin"; in {
block = "custom"; block = "custom";
interval = 5; interval = 5;

21
lib/retiolum-network.nix Normal file
View File

@@ -0,0 +1,21 @@
{
kabsa = {
ipv4 = "10.243.2.4";
ipv6 = "42:0:3c46:861f:a118:8e9a:82c9:3d";
};
zaatar = {
ipv4 = "10.243.2.34";
ipv6 = "42:0:3c46:156e:10b6:3bd6:6e82:b2cd";
};
makanek = {
ipv4 = "10.243.2.84";
ipv6 = "42:0:3c46:f7a9:1f0a:1b2b:822a:6050";
};
manakish = {
ipv4 = "10.243.2.85";
ipv6 = "42:0:3c46:ac99:ae36:cb8:c551:ba27";
};
}

View File

@@ -50,18 +50,12 @@ in [
desc = "Diminutive from lassus (weary, faint, tired). A programming human. Doing superior professional art."; desc = "Diminutive from lassus (weary, faint, tired). A programming human. Doing superior professional art.";
} }
{ {
stream = "https://radio.xn--kiern-0qa.de/meddl/listen.ogg"; stream = "https://radio.kmein.de/lyrik/listen.ogg";
station = "Meddl";
logo = "https://antenne-asb.ga/logo.png";
desc = "Forked from antenne-asb.ga: Radiosender zum Youtuber Drachenlord. Hier läuft den ganzen Tag Drachenlord Musik von Haidern oder Podcasts zum Lord.";
}
{
stream = "https://radio.xn--kiern-0qa.de/lyrik/listen.ogg";
station = "Lyrik"; station = "Lyrik";
desc = "Lyrik-Lesung rund um die Uhr."; desc = "Lyrik-Lesung rund um die Uhr.";
} }
{ {
stream = "https://radio.xn--kiern-0qa.de/lyrikline/listen.ogg"; stream = "https://radio.kmein.de/lyrikline/listen.ogg";
station = "Lyrikline"; station = "Lyrikline";
logo = "https://www.lyrikline.org/themes/lyrik/svg/Logo_lyrikline_pure.svg"; logo = "https://www.lyrikline.org/themes/lyrik/svg/Logo_lyrikline_pure.svg";
desc = "24/7 zufällige Wiedergaben von lyrikline.org."; desc = "24/7 zufällige Wiedergaben von lyrikline.org.";

View File

@@ -132,6 +132,7 @@ if has("autocmd")
autocmd bufnewfile,bufread *.jq packadd jq.vim autocmd bufnewfile,bufread *.jq packadd jq.vim
autocmd bufnewfile,bufread *.re packadd vim-reason-plus | set filetype=reason autocmd bufnewfile,bufread *.re packadd vim-reason-plus | set filetype=reason
autocmd bufnewfile,bufread *.journal packadd vim-ledger | set filetype=ledger shiftwidth=4 autocmd bufnewfile,bufread *.journal packadd vim-ledger | set filetype=ledger shiftwidth=4
autocmd bufnewfile,bufread *.md packadd vim-pandoc | packadd vim-pandoc-syntax
autocmd bufnewfile,bufread urls,config set filetype=conf autocmd bufnewfile,bufread urls,config set filetype=conf
autocmd bufnewfile,bufread *.elm packadd elm-vim | set filetype=elm shiftwidth=4 autocmd bufnewfile,bufread *.elm packadd elm-vim | set filetype=elm shiftwidth=4
autocmd bufnewfile,bufread *.dhall packadd dhall-vim | set filetype=dhall autocmd bufnewfile,bufread *.dhall packadd dhall-vim | set filetype=dhall

View File

@@ -1,29 +0,0 @@
{ pkgs, lib, config, ... }:
with lib;
let cfg = config.niveum.dropbox;
in {
options.niveum.dropbox = { enable = mkEnableOption "Dropbox"; };
config = mkIf cfg.enable {
environment.systemPackages = [ pkgs.dropbox-cli ];
networking.firewall = {
allowedTCPPorts = [ 17500 ];
allowedUDPPorts = [ 17500 ];
};
systemd.user.services.dropbox = {
description = "Dropbox synchronisation service";
wantedBy = [ "graphical-session.target" ];
serviceConfig = {
ExecStart = "${pkgs.dropbox.out}/bin/dropbox";
ExecReload = "${pkgs.coreutils.out}/bin/kill -HUP $MAINPID";
KillMode = "control-group"; # upstream recommends process
Restart = "on-failure";
PrivateTmp = true;
ProtectSystem = "full";
Nice = 10;
};
};
};
}

View File

@@ -56,6 +56,7 @@ in {
users.users.moodle-dl = { users.users.moodle-dl = {
isSystemUser = true; isSystemUser = true;
home = cfg.directory; home = cfg.directory;
group = "moodle-dl";
}; };
users.groups.moodle-dl = {}; users.groups.moodle-dl = {};

View File

@@ -0,0 +1,50 @@
# https://github.com/jmackie/nixos-networkmanager-profiles/
{ lib, config, ... }:
with lib;
let
nm = config.networking.networkmanager;
mkProfile = profileAttrs:
if !(isAttrs profileAttrs) then
throw "error 1"
else {
enable = true;
mode = "0400"; # readonly (user)
text = (foldlAttrs (accum:
{ name, value }: ''
${accum}
[${name}] ${mkProfileEntry value}'')
"# Generated by nixos-networkmanager-profiles" profileAttrs) + "\n";
};
mkProfileEntry = entryAttrs:
if !(isAttrs entryAttrs) then
throw "error 2"
else
foldlAttrs (accum:
{ name, value }: ''
${accum}
${name}=${toString value}'') "" entryAttrs;
foldlAttrs = op: nul: attrs:
foldl (accum: { fst, snd }: op accum (nameValuePair fst snd)) nul
(lists.zipLists (attrNames attrs) (attrValues attrs));
attrLength = attrs: length (attrValues attrs);
in {
options.networking.networkmanager.profiles = mkOption {
type = types.attrs;
default = { };
};
config = mkIf (attrLength nm.profiles > 0) {
environment.etc = (foldlAttrs (accum:
{ name, value }:
accum // {
"NetworkManager/system-connections/${name}.nmconnection" =
mkProfile value;
}) { } nm.profiles);
};
}

View File

@@ -34,6 +34,7 @@ in {
(name: _: builtins.readFile "${<retiolum/hosts>}/${name}") (name: _: builtins.readFile "${<retiolum/hosts>}/${name}")
(builtins.readDir <retiolum/hosts>); (builtins.readDir <retiolum/hosts>);
rsaPrivateKeyFile = toString <system-secrets/retiolum.key>; rsaPrivateKeyFile = toString <system-secrets/retiolum.key>;
ed25519PrivateKeyFile = toString <system-secrets/retiolum.ed25519>;
extraConfig = '' extraConfig = ''
LocalDiscovery = yes LocalDiscovery = yes
AutoConnect = yes AutoConnect = yes

View File

@@ -6,8 +6,8 @@ let
traadfri-package = pkgs.fetchFromGitHub { traadfri-package = pkgs.fetchFromGitHub {
owner = "kmein"; owner = "kmein";
repo = "traadfri"; repo = "traadfri";
rev = "a55b778cf4c7f124e75070b056c90f5a8043bc45"; rev = "cf46bd09cd3263b90a09b0ca979aa705a4c3671c";
sha256 = "10ggqksdbgmcwc2f3xs6abjf9zpvv554xfl3b3bblmfijgr6srv9"; sha256 = "0az9q38pl8fqk00488blhn6rhvwsw2wky3dbdlyz7945ggvxnbyd";
}; };
in pkgs.callPackage traadfri-package { in pkgs.callPackage traadfri-package {
libcoap = pkgs.callPackage <niveum/packages/libcoap.nix> { tls = true; }; libcoap = pkgs.callPackage <niveum/packages/libcoap.nix> { tls = true; };

View File

@@ -76,7 +76,11 @@ in {
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
users.extraUsers.tuna.isSystemUser = true; users.users.tuna = {
isSystemUser = true;
group = "tuna";
};
users.groups.tuna = {};
# ref https://github.com/florianheinemann/MPD.FM/blob/9d037cf87597b26ae2f10ba9feea48946ad6cc68/service/MPD.FM.service # ref https://github.com/florianheinemann/MPD.FM/blob/9d037cf87597b26ae2f10ba9feea48946ad6cc68/service/MPD.FM.service
systemd.services.tuna = { systemd.services.tuna = {
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];

View File

@@ -1,6 +0,0 @@
self: super:
with super.lib;
let
eval = import <nixpkgs/nixos/lib/eval-config.nix>;
paths = (eval {modules = [(import <nixos-config>)];}).config.nixpkgs.overlays;
in foldl' (flip extends) (_: super) paths self

27
packages/daybook.nix Normal file
View File

@@ -0,0 +1,27 @@
{ lib, stdenv, makeWrapper, pandoc, fetchFromGitHub }:
stdenv.mkDerivation {
name = "daybook";
src = fetchFromGitHub {
owner = "kmein";
repo = "daybook";
rev = "db2c34830e09183c80f3381bf5e4c44d52f05d53";
sha256 = "0nbsv8f12qh5spq7zhimhdf3p7msk33xrb0ilqvlc6jmlkpislmv";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ pandoc ];
buildPhase = ''
mkdir -p $out/man/man1
pandoc --standalone --to man daybook.1.md -o $out/man/man1/daybook.1
'';
installPhase = ''
mkdir -p $out/bin
install daybook $out/bin
wrapProgram $out/bin/daybook --prefix PATH ":" ${pandoc}/bin ;
'';
meta = with lib; {
homepage = https://github.com/kmein/daybook;
description = "A diary writing utility in sh";
license = licenses.mit;
platforms = platforms.linux;
};
}

29
packages/depp.nix Normal file
View File

@@ -0,0 +1,29 @@
{ lib, writeShellScriptBin }:
let
aliasFlag = name: value: "-c alias.${name}=${lib.escapeShellArg value}";
aliases = {
eroeffne = "init";
machnach = "clone";
zieh = "pull";
fueghinzu = "add";
drueck = "push";
pfusch = "push --force";
zweig = "branch";
verzweige = "branch";
uebergib = "commit";
erde = "rebase";
unterscheide = "diff";
vereinige = "merge";
bunkere = "stash";
markiere = "tag";
nimm = "checkout";
tagebuch = "log";
zustand = "status";
};
in writeShellScriptBin "depp" ''
if [ $# -gt 0 ]; then
git ${lib.concatStringsSep " " (lib.attrsets.mapAttrsToList aliasFlag aliases)} "$@"
else
printf "${lib.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: n + " " + v) aliases)}\n"
fi
''

28
packages/devour.nix Normal file
View File

@@ -0,0 +1,28 @@
{ lib, stdenv, xdo, makeWrapper, fetchFromGitHub }:
stdenv.mkDerivation {
name = "devour";
version = "master";
src = fetchFromGitHub {
owner = "salman-abedin";
repo = "devour";
rev = "ceb871c3046ce290c27e2887365b9a19ca38113c";
sha256 = "0f2jb8knx7lqy6wmf3rchgq2n2dj496lm8vgcs58rppzrmsk59d5";
};
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ xdo ];
DESTDIR="$(out)";
fixupPhase = ''
wrapProgram $out/bin/devour --prefix PATH ":" ${xdo}/bin ;
'';
meta = with lib; {
homepage = "https://github.com/salman-abedin/devour";
description = "Window Manager agnostic swallowing feature for terminal emulators";
license = licenses.gpl3;
platforms = platforms.all;
};
}

30
packages/mahlzeit.nix Normal file
View File

@@ -0,0 +1,30 @@
{ lib, fetchFromGitHub, mkDerivation, ansi-terminal, base, directory, doctest, filepath
, megaparsec, optparse-applicative, prettyprinter, process
, raw-strings-qq, stdenv, tasty, tasty-hunit, text, yaml
}:
mkDerivation {
pname = "mahlzeit";
version = "0.1.0";
src = fetchFromGitHub {
owner = "kmein";
repo = "mahlzeit";
rev = "954c0fb3f45815999bc65d003794af6a850b069c";
sha256 = "046yrr40hjmxkjmwzcvmwb39fxx2v2i6hgdxrjfiwilzvhikarrg";
};
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
ansi-terminal base directory filepath megaparsec prettyprinter text
yaml
];
executableHaskellDepends = [
ansi-terminal base directory filepath optparse-applicative process
text yaml
];
testHaskellDepends = [
base doctest megaparsec raw-strings-qq tasty tasty-hunit
];
homepage = "https://github.com/kmein/mahlzeit";
description = "Recipe toolkit";
license = lib.licenses.mit;
}

14
packages/man/pandoc.nix Normal file
View File

@@ -0,0 +1,14 @@
{ stdenv, pandoc, lib, fetchgit }:
stdenv.mkDerivation {
name = "pandoc-doc";
version = pandoc.version;
src = fetchgit {
url = "https://github.com/jgm/pandoc";
rev = pandoc.version;
sha256 = "0s4mczbql35wh6bhyi542yln24f530rlsw6akcv7lmp083rrlpy4";
};
buildPhase = ''
mkdir -p $out/man/man1
${pandoc}/bin/pandoc -V section=1 --standalone --write=man $src/MANUAL.txt -o $out/man/man1/pandoc.1
'';
}

26
packages/opustags.nix Normal file
View File

@@ -0,0 +1,26 @@
{ lib, stdenv, cmake, pkgconfig, libogg, fetchFromGitHub }:
stdenv.mkDerivation rec {
name = "opustags";
version = "1.3.0";
src = fetchFromGitHub {
owner = "fmang";
repo = "opustags";
rev = version;
sha256 = "09z0cdg20algaj2yyhfz3hxh1biwjjvzx1pc2vdc64n8lkswqsc1";
};
cmakeFlags = [
"-DCMAKE_INSTALL_PREFIX=$out"
];
buildInputs = [ libogg ];
nativeBuildInputs = [ cmake pkgconfig ];
meta = with lib; {
homepage = "https://github.com/fmang/opustags";
description = "Ogg Opus tags editor";
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,12 @@
{ fetchPypi, buildPythonPackage, pygtrie, ... }:
buildPythonPackage rec {
pname = "betacode";
version = "0.2";
src = fetchPypi {
inherit pname version;
sha256 = "08fnjzjvnm9m6p4ddyr8qgfb9bs2nipv4ls50784v0xazgxx7siv";
};
preBuild = ''echo > README.rst'';
propagatedBuildInputs = [ pygtrie ];
doCheck = false;
}

View File

@@ -0,0 +1,14 @@
{ fetchFromGitHub, buildPythonPackage, backports_functools_lru_cache, selenium, regex, ... }:
buildPythonPackage rec {
pname = "indic_transliteration";
version = "unstable-2020-12-15";
src = fetchFromGitHub {
repo = pname;
owner = "sanskrit-coders";
rev = "2ea25a03af15937916b6768835e056166986c567";
sha256 = "1pcf800hl0zkcffc47mkjq9mizsxdi0hwxlnij5bvbqdshd3w9ll";
};
patches = [ ./regex-version.patch ];
propagatedBuildInputs = [ backports_functools_lru_cache selenium regex ];
doCheck = false;
}

View File

@@ -0,0 +1,9 @@
diff --git a/requirements.txt b/requirements.txt
index 76b12d7..27fdc79 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,3 @@
backports.functools_lru_cache==1.6.1
selenium==3.141.0
-regex==2020.10.11
+regex>=2020.7.14

View File

@@ -0,0 +1,12 @@
{ buildPythonApplication, fetchPypi, requests }:
let
in buildPythonApplication rec {
pname = "instaloader";
version = "4.2.4";
src = fetchPypi {
inherit pname version;
sha256 = "02zqb02idk2pzks7dv42vigcmmpjpfhfdyjp911yr0ix7dy3q0b9";
};
propagatedBuildInputs = [ requests ];
doCheck = false;
}

View File

@@ -0,0 +1,10 @@
{ fetchPypi, buildPythonPackage, ... }:
buildPythonPackage rec {
pname = "pygtrie";
version = "2.3";
src = fetchPypi {
inherit pname version;
sha256 = "00x7q4p9r75zdnw3a8vd0d0w0i5l28w408g5bsfl787yv6b1h9i8";
};
doCheck = false;
}

View File

@@ -0,0 +1,23 @@
{ buildPythonPackage, buildPythonApplication, fetchPypi, pytestrunner, six, beautifulsoup4, requests, dbus-python }:
let
lyricwikia = buildPythonPackage rec {
pname = "lyricwikia";
version = "0.1.9";
src = fetchPypi {
inherit pname version;
sha256 = "0sa5wkbgp5bpgkl8hgn7byyz9zj0786647ikf2l0k8m4fimq623y";
};
buildInputs = [ pytestrunner ];
propagatedBuildInputs = [ six beautifulsoup4 requests ];
doCheck = false;
};
in buildPythonApplication rec {
pname = "spotify-cli-linux";
version = "1.4.2";
src = fetchPypi {
inherit pname version;
sha256 = "1gxich3v2i4lmh60abbw3mw15399afvvqflv8g6plvvbmvxmbgp0";
};
propagatedBuildInputs = [ lyricwikia dbus-python ];
doCheck = false;
}

31
packages/scripts/auc.nix Normal file
View File

@@ -0,0 +1,31 @@
{ stdenv, fetchFromGitHub, lib, pandoc }:
let
owner = "kamalist";
in
stdenv.mkDerivation rec {
pname = "auc";
version = "2019-04-02";
src = fetchFromGitHub {
inherit owner;
repo = "AUC";
rev = "66d1cd57472442b4bf3c1ed12ca5cadd57d076b3";
sha256 = "0gb4asmlfr19h42f3c5wg9c9i3014if3ymrqan6w9klgzgfyh2la";
};
installPhase = ''
mkdir -p $out/{bin,man/man1}
install auc $out/bin
${pandoc}/bin/pandoc -V title=${lib.escapeShellArg pname} -V section=1 $src/README.md -s -t man -o $out/man/man1/auc.1
'';
meta = with lib; {
description = "Command-line Roman calendar";
longDescription = ''
AUC (Ab Urbe condita) is a command-line Roman calendar tool. Currently it shows the specified date in the format of the Ancient Romans.
'';
license = licenses.mit;
maintainers = [ maintainers.kmein ];
platforms = platforms.all;
};
}

View File

@@ -1,9 +0,0 @@
#!/bin/sh
set -efu
input="$*"
curl -sSL "https://www.sanskrit-lexicon.uni-koeln.de/scans/PWScan/2020/web/webtc/getword.php?key=$input&filter=roman&accent=yes&transLit=hk" \
| pandoc --standalone --variable=title:"$input" --from=html --to=man \
| sed 's/\s\+\([:.,;]\)/\1/g;s/\s\+/ /g' \
| man --local-file --pager="bat -p" -

View File

@@ -1,6 +1,8 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> { }; kpaste = pkgs.callPackage <stockholm/krebs/5pkgs/simple/kpaste> { };
opustags = pkgs.callPackage <niveum/packages/opustags.nix> { };
betacode = pkgs.callPackage <niveum/packages/python3Packages/betacode.nix> { };
wrapScript = { packages ? [ ], name, script }: wrapScript = { packages ? [ ], name, script }:
pkgs.writers.writeDashBin name '' pkgs.writers.writeDashBin name ''
PATH=$PATH:${ PATH=$PATH:${
@@ -15,6 +17,8 @@ let
sha256 = "0c4hkny4zkknlimc9yi9ljss2cws4zn8lzd8ip9b8mfsm094dlfl"; sha256 = "0c4hkny4zkknlimc9yi9ljss2cws4zn8lzd8ip9b8mfsm094dlfl";
}; };
in rec { in rec {
auc = pkgs.callPackage ./auc.nix {};
instaget = wrapScript { instaget = wrapScript {
packages = [ pkgs.jq pkgs.curl pkgs.gnugrep ]; packages = [ pkgs.jq pkgs.curl pkgs.gnugrep ];
script = ./instaget.sh; script = ./instaget.sh;
@@ -76,6 +80,12 @@ in rec {
fi fi
''; '';
qrpaste = pkgs.writers.writeDashBin "qrpaste" ''
file="$(${pkgs.mktemp}/bin/mktemp qrpasteXXX.png --tmpdir)"
${pkgs.qrencode}/bin/qrencode "$(${pkgs.xclip}/bin/xclip -selection clipboard -out)" -o "$file"
${pkgs.sxiv}/bin/sxiv "$file" ; rm "$file"
'';
interdimensional-cable = interdimensional-cable =
let nimaid-github-io = pkgs.fetchFromGitHub { let nimaid-github-io = pkgs.fetchFromGitHub {
owner = "nimaid"; owner = "nimaid";
@@ -89,7 +99,7 @@ in rec {
''; '';
tag = wrapScript { tag = wrapScript {
packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 pkgs.nur.repos.kmein.opustags ]; packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 opustags ];
script = "${voidrice}/.local/bin/tag"; script = "${voidrice}/.local/bin/tag";
name = "tag"; name = "tag";
}; };
@@ -100,6 +110,12 @@ in rec {
name = "meteo"; name = "meteo";
}; };
kirciuoklis = wrapScript {
packages = [ pkgs.curl pkgs.jq ];
script = ./kirciuoklis.sh;
name = "kirciuoklis";
};
booksplit = wrapScript { booksplit = wrapScript {
packages = [ pkgs.ffmpeg tag pkgs.glibc.bin ]; packages = [ pkgs.ffmpeg tag pkgs.glibc.bin ];
script = "${voidrice}/.local/bin/booksplit"; script = "${voidrice}/.local/bin/booksplit";
@@ -122,13 +138,37 @@ in rec {
packages = [ pkgs.curl pkgs.pup betacode pkgs.gnused pkgs.pandoc pkgs.man ]; packages = [ pkgs.curl pkgs.pup betacode pkgs.gnused pkgs.pandoc pkgs.man ];
}; };
boetlingk = wrapScript { sanskrit-dictionary = pkgs.writers.writeDashBin "sa" ''
name = "boet"; set -efu
script = ./boetlingk.sh;
packages = [ pkgs.curl pkgs.gnused pkgs.pandoc pkgs.man ];
};
playlist = import ./pls.nix { inherit pkgs; }; usage() {
echo "usage: [OUTPUT=deva|roman] $0 mw|mwe|boet|bopp|apte|boro TERM"
exit 1
}
[ $# -eq 2 ] || usage
case $1 in
mw) id=MWScan;;
mwe) id=MWEScan;;
bopp) id=BOPScan;;
boet) id=PWGScan;;
apte) id=AEScan;;
boro) id=BORScan;;
*) usage;;
esac
shift
input="$*"
${pkgs.curl}/bin/curl -sSL "https://www.sanskrit-lexicon.uni-koeln.de/scans/$id/2020/web/webtc/getword.php?key=$input&filter=''${OUTPUT-roman}&accent=yes&transLit=hk" \
| ${pkgs.pandoc}/bin/pandoc --standalone --variable=title:"$input" --from=html --to=man \
| ${pkgs.gnused}/bin/sed 's/\s\+\([:.,;]\)/\1/g;s/\s\+/ /g' \
| ${pkgs.man}/bin/man --local-file --pager="${pkgs.bat}/bin/bat -p" -
'';
playlist = import ./pls.nix { inherit pkgs lib; };
mpv-tv = import ./mpv-tv.nix { inherit pkgs lib; }; mpv-tv = import ./mpv-tv.nix { inherit pkgs lib; };
@@ -138,6 +178,18 @@ in rec {
script = ./favicon.sh; script = ./favicon.sh;
}; };
closest = pkgs.writers.writeDashBin "closest" ''
${pkgs.writers.writeHaskellBin "closest" {
libraries = with pkgs.haskellPackages; [ parallel optparse-applicative edit-distance ];
ghcArgs = ["-O3" "-threaded" ];
} (builtins.readFile ./distance.hs)}/bin/closest +RTS -N4 -RTS --dictionary ${pkgs.fetchurl {
url = "https://gist.github.com/MarvinJWendt/2f4f4154b8ae218600eb091a5706b5f4/raw/36b70dd6be330aa61cd4d4cdfda6234dcb0b8784/wordlist-german.txt";
sha256 = "0vr4lmlckgvj4s8sk502sknq9pf3297rvasj5sqqm05zzbdgpppj";
}} "$@"
'';
horoscope = pkgs.callPackage ./horoscope {};
genius = wrapScript { genius = wrapScript {
packages = [ pkgs.curl pkgs.gnused pkgs.pandoc ]; packages = [ pkgs.curl pkgs.gnused pkgs.pandoc ];
name = "genius"; name = "genius";
@@ -245,7 +297,7 @@ in rec {
''; '';
betacode = pkgs.writers.writePython3Bin "betacode" { betacode = pkgs.writers.writePython3Bin "betacode" {
libraries = [ pkgs.nur.repos.kmein.python3Packages.betacode ]; libraries = [ betacode ];
} '' } ''
import betacode.conv import betacode.conv
import sys import sys
@@ -354,4 +406,12 @@ in rec {
curl -L "https://github.com/Mic92/nix-index-database/releases/download/$tag/files" -o $XDG_RUNTIME_DIR/files-$tag curl -L "https://github.com/Mic92/nix-index-database/releases/download/$tag/files" -o $XDG_RUNTIME_DIR/files-$tag
mv $XDG_RUNTIME_DIR/files-$tag $HOME/.cache/nix-index/files mv $XDG_RUNTIME_DIR/files-$tag $HOME/.cache/nix-index/files
''; '';
} // {
devour = pkgs.callPackage <niveum/packages/devour.nix> { };
depp = pkgs.callPackage <niveum/packages/depp.nix> { };
text2pdf = pkgs.callPackage <niveum/packages/text2pdf.nix> { };
vimv = pkgs.callPackage <niveum/packages/vimv.nix> { };
when = pkgs.callPackage <niveum/packages/when.nix> { };
mahlzeit = pkgs.haskellPackages.callPackage <niveum/packages/mahlzeit.nix> { };
inherit opustags;
} }

View File

@@ -0,0 +1,36 @@
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE RecordWildCards #-}
import Control.Arrow ((&&&))
import Control.Monad (forM_)
import Control.Parallel.Strategies (using, parList, rdeepseq)
import Data.Char (toLower)
import Data.List (sortOn)
import Options.Applicative
import Text.EditDistance (levenshteinDistance, defaultEditCosts)
data Options = Options
{ limit :: Int
, word :: String
, dictionary :: FilePath
}
optionsParser :: Parser Options
optionsParser = do
limit <- option auto (long "limit" <> short 'l' <> help "maximum edit distance to list" <> value 3 <> metavar "N")
word <- strArgument (help "the word to match" <> metavar "WORD")
dictionary <- strOption (long "dictionary" <> short 'd' <> help "the dictionary to search")
pure Options {..}
readDictionary :: FilePath -> IO [String]
readDictionary path = lines . map toLower <$> readFile path
main :: IO ()
main = do
let options = info (optionsParser <**> helper) (fullDesc <> progDesc "Find close words")
Options {..} <- execParser options
let word' = map toLower word
allWords <- readDictionary dictionary
let distances = map (levenshteinDistance defaultEditCosts word' &&& id) allWords
distances' = distances `using` parList rdeepseq
ranking = takeWhile ((<= limit) . fst) $ sortOn fst distances'
forM_ ranking $ \(theDistance, theWord) -> putStrLn (show theDistance ++ " " ++ theWord)

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