From 924f48b15ae44441aef413b753dd4742944c95ec Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Fri, 8 Nov 2024 13:48:02 +0100 Subject: [PATCH 1/5] nx2site001 --- home-modules/nx2site.nix | 100 +++++++++ home.nix | 1 + sops-secrets.yaml | 12 +- system-modules/docker.nix | 1 + system-modules/networking.nix | 2 +- system-modules/nx2site.nix | 361 ++++++++++++++++++++++--------- system-modules/nx2site/proxy.nix | 255 +++++++++++++--------- system-modules/users.nix | 2 +- 8 files changed, 525 insertions(+), 209 deletions(-) create mode 100644 home-modules/nx2site.nix diff --git a/home-modules/nx2site.nix b/home-modules/nx2site.nix new file mode 100644 index 0000000..89c0eae --- /dev/null +++ b/home-modules/nx2site.nix @@ -0,0 +1,100 @@ +{ pkgs, lib, host, user, ... }: +lib.mkIf (host == "NxACE" && user != "tv") +{ + home.packages = with pkgs; [ + (writeShellApplication { + name = "nxmd"; + text = let + ascii_size = (pkgs.writers.writePython3Bin "ascii_size" { + # libraries = with pkgs.python311Packages; [ ]; + flakeIgnore = []; + } /* python */ '' + from sys import argv + + with open(argv[1], "r", encoding='utf-8') as f: + raw = f.read() + + sraw = raw.split("\n") + + linestart = 0 + lineend = 0 + started = False + for linenum in range(len(sraw)): + if sraw[linenum].strip() == "```ascii": + linestart = linenum + started = True + + if started and sraw[linenum].strip() == "```": + lineend = linenum + break + + maxwidth = 0 + for linenum in range(linestart, lineend): + linewidth = len(sraw[linenum]) + if linewidth > maxwidth: + maxwidth = linewidth + + print(f"Maximum length of the `ascii` code clock is {maxwidth} characters.") + + px = (1 / maxwidth) * 1500 + vw = (1 / maxwidth) * 150 + + snew = sraw + snew[3] = "aaw: " + str(round(vw, 2)) + snew[4] = "aawm: " + str(round(px, 2)) + + new = "\n".join(snew) + + with open(argv[1], "w", encoding='utf-8') as f: + f.write(new) + print(f"The resulting font sizes are {px}px (aawm) and {vw}vw (aam).") + print(f"You can now use the push operation on {argv[1]}.") + '' + ); + in /* bash */ '' + ord=$(date +"%e" | awk '{printf("%d%s\n", $1, ($1==11||$1==12||$1==13)?"th":((($1%10)==1)?"st":((($1%10)==2)?"nd":((($1%10)==3)?"rd":"th"))))}') + nxdate="$(date +'%A the ')" + nxdate="$nxdate""$ord" + nxdate="$nxdate""$(date +' of %B %Y')" + + if [[ $# -eq 0 ]]; then + echo "Error: No arguments provided." + echo "Usage: $0 push " + exit 1 + fi + + if [[ "$1" == "push" ]]; then + if [[ ! "$2" =~ \.md$ ]]; then + echo "Error: Second argument must be a markdown (.md) file" + echo "Usage: $0 push " + exit 1 + fi + pandoc \ + "$2" \ + --highlight-style=breezeDark \ + --standalone \ + --mathjax \ + --ascii \ + --template /var/nginx/assets/template.html \ + --metadata pdate="$nxdate" \ + --verbose --from markdown-markdown_in_html_blocks+raw_html \ + -o /var/nginx/webroot/"$(basename "$2" .md )".html + + echo pushed "$2" + elif [[ "$1" == "ascii-size" ]]; then + if [[ ! "$2" =~ \.md$ ]]; then + echo "Error: Second argument must be a markdown (.md) file" + echo "Usage: $0 ascii-size " + exit 1 + fi + ${ascii_size}/bin/ascii_size "$2" + + else + echo "Error: First argument must be 'push'" + echo "Usage: $0 push " + exit 1 + fi + ''; + }) + ]; +} diff --git a/home.nix b/home.nix index 1d60de8..3d90feb 100755 --- a/home.nix +++ b/home.nix @@ -26,6 +26,7 @@ # ./home-modules/matrix.nix ./home-modules/nh.nix ./home-modules/nvidia.nix + ./home-modules/nx2site.nix ./home-modules/nx-gcal-event.nix ./home-modules/obs.nix ./home-modules/office.nix diff --git a/sops-secrets.yaml b/sops-secrets.yaml index 24b0b7d..4e95ce6 100644 --- a/sops-secrets.yaml +++ b/sops-secrets.yaml @@ -21,8 +21,12 @@ weechat: passphrase: ENC[AES256_GCM,data:3NVhMouf3wwMJTZCvIjbi5fjHJHxe25Q+wRo,iv:W8cShdM3iUyEiRCPNupMin3gfF+cqGxslD18CAvUW4c=,tag:DXBATGEhHjhXqy+J9BNVwg==,type:str] nx2site: namecheap.pw: ENC[AES256_GCM,data:tN6ArfQu+YfVkPPN00raPZWmghDKVFmmGgwACVQQSHs=,iv:TlUl0L3+Ea9vt43lwDlM0SE1+CLvWJdryt1lFhQ+75I=,tag:pia2ORsm66AQUOE/ZiO8yA==,type:str] - sslCertificate: ENC[AES256_GCM,data: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,iv:CUTe478K3KZWcWzn0E/jMf99RNEiF9prboUycUGdjqE=,tag:W4zt375htT8ujE2B7spI5g==,type:str] - sslCertificateKey: ENC[AES256_GCM,data:wktk9+gWW5zfKqj8pfBLG336svlEa0xuqDAo0KBNZIv58NhQkn61mdqQqLOrJFL0k6ve98exjw+Jf5Z33QjzxlVTvC++hb/9dL9uIBuFECk6AFJrZsbh3b3SA9nFD0E+Bdh3eYcf41O9owRwczglay43iOkgzQKk+iuGW9Gci671Px0krmxps+pLuk54crHVy7+DZBh3kyHV/rGQ/uEw8gUdu2XG4Ohcob5puHwl97EJ8MHmNsUI5+6XfcNMJm0IEu2tO42oVFQSvZbDCaD0dGWk0v2kmgjxV032bN+GMq1WDUzYwWte8GQvbjlS/SlcFw==,iv:di4iMask6hg1WtOuh0cgzOjmQLWp31UElfTsCIGk4tY=,tag:/HLq03JMo7C1OZDWSIfENw==,type:str] + cloudflare: + api-token-dns-edit: ENC[AES256_GCM,data:fR4fH6NqwtHI8aebEwjUn5JMoy3q3GXgu/dREe8JK7yRBIOhJ8BKuw==,iv:fQqLRYCN/7zhpHzYxMcn8q1aA7x4qd3qWGgrFWn2E/U=,tag:GJ1muJG755ch/84Sgcf2Vw==,type:str] + global-api-key: ENC[AES256_GCM,data:7WBmyEYFG0jEkxeiF9H4isfrCrn7Uv21hEJgX5i2/fOu3+evZA==,iv:IicsZo7qMG3xOKVr8lHzsOu2pTaDKUSx+85SyehDe20=,tag:nQ+CWX2kEmk3vIH4pi6Vlw==,type:str] + sslCertificate.pem: ENC[AES256_GCM,data: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,iv:r4vqXNMieiy9+E1ZIknUxQtxgEoZh7zSSrJ0yS5KQUs=,tag:AYX7RayP3dmNgUnkytQg7Q==,type:str] + sslCertificateKey.pem: ENC[AES256_GCM,data:Wzmi17UA4mpCr4VaUolfKwZJEZ5K9Ybp2/K3noC/D/QYlgJfwWnQEoXDfLj3lVVnz0V/m71NAtZ9p3/jhiQCyIwt0cOmsAmd1isHf0KQwGagc8cHttwDeZT7AzLW4axqevpZM8bjVk/TJ/k+uGbArqSwgu2W7C77uCltSS8AydWzD2D7eQciDZzQ4yyHShW9f0SH8Q/wumuY4ksjLs4roYtQgtr1ezUb1U329xA1y81apd47RHviJ/moOBQYY2Y8fbNryUmfqvGYtsfXxmNElJpGAStqjBCo0bncOetP+bfj90CJlbkIn1JzcPOa5ZJjDg==,iv:28PcaWyOsQ8gN6qvZYDS3H4lKKlU7ihxxLUXMYgHPEY=,tag:6t+jvoAZkYlqg/2d8V5Emw==,type:str] + dhparams.pem: ENC[AES256_GCM,data:wGIUlT8QHruxHvrlaUdEDU3aKkB5hvQLZXic1ryKr1hIFw9uOv1hOCOPY+QUDBzfm+DXv62hTFAeq4siAoZ0wWvQ0uBuSZZBGrfuY1ZTsTJmpgTphdHi+S4/kl/Vt7nuBlvdW8VbwU+mzmSK4UuIjuvAl0RI+q9C/BAu0tsXvKfaCkrbYwSi6pdPjToEoATPWfuCdkZUulENBIdBkTLZ6F97fgNgsXub2xOEIRxqFAzg3G2nO3Mn7rSRRJraZNIsHgBTYpSNcijDBwZpgYKjcKsochYUNzVrCuLOu5xJPUU87pmd+Rup2hpMfWyK0xtUjncvHyfctEZANqfo+RdEBg81n1WHkFb1WnWUsRh8RmcVZuA9skI5S7Xhp4L2B5IKn0XGnKLG3og9iYb9tDVQys4o5/68+jjxdm51fmRYo3FvghnyFCYkQ/tm+ClCcRSPocYDrfSf0Rvg2v9nPmMj0IrEHlzVnafiJgp3VjI9cYLNW2wKiwf0Z8dWkrtnS8G7p072+w0fklmvLrdvlLZduAwrY6gS2nMbPUz1AwjAoMmQi7sFmbkP6M/PmkVV+hNP7T9ntmC4BQr2k5/3gKZPOEPO/xeMLlla68QpDVxU06NhC0Z3d5t3YY0wIVISNZXi4fgQO0G5nvFpPyyWCvvg39gulyAwUJfFQ3erNNFTjJe7X9RjqoJvjTgFm4IaYcL64Cr49KDu6Za01g492rBCEL842o3lVmZSqOYCG3UEEsSwOxn2iROZKgorZ5dyd1n1WevM+pKTUAaucy52iLJGLISRAVv82ZkmbS5L4zMHkYxVjUnqrYIZsk6+7sRHIQ31E0YtUFdMjRYUcOwfR1u+Ox+zV1NawpKjsuhKl+DRN+Q1TXUdEumUU1pDHT/RXtNHsyYOgeCBbTs93kdhFcHgO0dh5Ou/2N8EcTzWwAYd/qyE3wMZZTggTb44xwu6h0XhaLtnAk2lZ4vXwSaozf+Vq/uxAvYLxrhx6ujKVyX/O053YsKqOPKerYoN17uO8PrKoA==,iv:e0RPF9ZtzSRBRzMtWTWY3AVGsMXxvldA2HjiW9hf97Q=,tag:eb9ACnuGR+8eqncWoKQ/pw==,type:str] USERTrust: ECC: ENC[AES256_GCM,data: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,iv:GS5GMpbxeweqwjUvOzqg59xBOzNZqrL5t7RjsFjpucM=,tag:j0MaMw71fnRHxeydlqAaww==,type:str] RSA: ENC[AES256_GCM,data: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,iv:NJkjWL5kMHET68oR5Xp22kvkThXIp7WxRVajmTfsB5M=,tag:NSXeRItMKlOQYP4QtzMKIg==,type:str] @@ -73,8 +77,8 @@ sops: SHJLR3lvdlFiRmJuU25RUHFFTmpjamMKbzycdDvQBAuOiRROTZEQSnaXoPapz73L yVS9EUP25FSx/sGqRqaCefbeaybuM1aso6LDnlomv4Bib7zjugWKSw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2024-07-28T15:38:03Z" - mac: ENC[AES256_GCM,data:/ZQ0QX/nqGWHkIOvJxKxl8HHlK1bxEdog0Ee/N5CnU6aw4l8IoX3BwpZBFP78+/EO1flH4S9zyJfRE1U9NoIqXPXs+r0dgGiJm0FHwGiHi1oGRmxfggi0Kes4WQa3rIgxuyeIjwXWc4LNPLkCyNPGNdnE0wZ4ab31O/ZbIME1NY=,iv:r7RZGBdXJnk6261LE7IwmojWYC6JoqVJFwekGbhuFXY=,tag:FWaAoJ8FRZJitAp8F3cK2Q==,type:str] + lastmodified: "2024-10-07T00:12:32Z" + mac: ENC[AES256_GCM,data:zousJNtsrpNUXxdboNDsREOuvTImGn8eUxTJMQok0zR8tvSFX9yQ+mQMg2kgG85HOhOH/fGP8WZDb4iq4kGKR15712mr/oOmoAR7SxtYlO4A0UV6uQDhp+Jx1/QhX0wSt8m6a8/RbQHDttXP219bU6/rGe3YZ2TxIy0wg+LLuS4=,iv:ZnkGt7TwUNLCrQW4gH8R/tM/se5lGi6Exk1FHPRhCxA=,tag:ZWrGua4fe38si90AVnDGQg==,type:str] pgp: - created_at: "2024-06-09T19:44:41Z" enc: |- diff --git a/system-modules/docker.nix b/system-modules/docker.nix index 18c7dd1..26b310e 100755 --- a/system-modules/docker.nix +++ b/system-modules/docker.nix @@ -15,6 +15,7 @@ users.users."${user}".extraGroups = [ "docker" ]; networking.firewall.allowedTCPPorts = [ 80 + 443 8384 ]; } diff --git a/system-modules/networking.nix b/system-modules/networking.nix index bef3ad6..e52d9ef 100755 --- a/system-modules/networking.nix +++ b/system-modules/networking.nix @@ -14,5 +14,5 @@ in enable = true; }; - networking.enableIPv6 = false; + networking.enableIPv6 = true; } diff --git a/system-modules/nx2site.nix b/system-modules/nx2site.nix index a352af4..c314758 100644 --- a/system-modules/nx2site.nix +++ b/system-modules/nx2site.nix @@ -1,121 +1,272 @@ -{ config, pkgs, lib, user, host, ... }: +{ config, pkgs, lib, user, host, secrets, ... }: # lib.mkIf false -lib.mkIf (host == "NxACE") -# ((import ./nx2site/proxy.nix { inherit config pkgs lib user; }) // -( +lib.mkIf (host == "NxACE" && user != "tv") { sops.secrets = { - "nx2site/namecheap.pw" = { }; - }; - - systemd = { - timers."namecheap-dynamic-dns" = { - wantedBy = [ "timers.target" ]; - timerConfig = { - OnBootSec = "2m"; - OnUnitActiveSec = "10m"; - Unit = "namecheap-dynamic-dns.service"; - }; + "nx2site/namecheap.pw" = { }; + # "nx2site/cloudflare/api-token-dns-edit" = { }; + "nx2site/cloudflare/global-api-key" = { }; }; - services."namecheap-dynamic-dns" = let - u = let - domain = "nx2.site"; - passord-file-path = config.sops.secrets."nx2site/namecheap.pw".path; - # passord-file-path = config.sops.secrets."nx2site/namecheap.pw".path; - log-file-path = "/var/log/update_namecheap.log"; - count-file-path = "/var/log/update_namecheap-count.txt"; - in pkgs.writers.writePython3Bin "update_namecheap" { - libraries = with pkgs.python311Packages; [ requests ]; - flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" ]; - } '' - import requests - import argparse - import socket - from datetime import datetime - def get_public_ip(): return requests.get('https://ipinfo.io/ip').text.strip() + systemd = { + timers."dynamic-dns" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "2m"; + OnUnitActiveSec = "10m"; + Unit = "dynamic-dns.service"; + }; + }; + # services."dynamic-dns" = let + # u = let + # domain = "nx2.site"; + # passord-file-path = config.sops.secrets."nx2site/namecheap.pw".path; + # log-file-path = "/var/log/update_namecheap.log"; + # count-file-path = "/var/log/update_namecheap-count.txt"; + # in pkgs.writers.writePython3Bin "update_namecheap" { + # libraries = with pkgs.python311Packages; [ requests ]; + # flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" ]; + # } '' + # import requests + # import argparse + # import socket + # from datetime import datetime - def get_dns_ip(): return socket.gethostbyname_ex('${domain}')[2][0] + # def get_public_ip(): return requests.get('https://ipinfo.io/ip').text.strip() - def main(force_update): - my_ip = get_public_ip() - dns_ip = get_dns_ip() + # def get_dns_ip(): return socket.gethostbyname_ex('${domain}')[2][0] - with open("${count-file-path}", "r") as f: - content = f.read() - if content == "": count = 0 - else: count = int(content) - count += 1 - with open("${count-file-path}", "w") as f: - f.write(str(count)) + # def main(force_update): + # my_ip = get_public_ip() + # dns_ip = get_dns_ip() - if not (force_update or my_ip != dns_ip): - print(f"Host IP and DNS response are both {my_ip} --> No Action") - exit(0) - else: - with open("${passord-file-path}", 'r') as pw_file: pw = pw_file.read().strip() + # with open("${count-file-path}", "r") as f: + # content = f.read() + # if content == "": count = 0 + # else: count = int(content) + # count += 1 + # with open("${count-file-path}", "w") as f: + # f.write(str(count)) - # Perform DNS updates - resp_base = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=@&domain=${domain}&password={pw}&ip={my_ip}") - resp_subd = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=*&domain=${domain}&password={pw}&ip={my_ip}") + # if not (force_update or my_ip != dns_ip): + # print(f"Host IP and DNS response are both {my_ip} --> No Action") + # exit(0) + # else: + # with open("${passord-file-path}", 'r') as pw_file: pw = pw_file.read().strip() + + # # Perform DNS updates + # resp_base = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=@&domain=${domain}&password={pw}&ip={my_ip}") + # resp_subd = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=*&domain=${domain}&password={pw}&ip={my_ip}") - # Reset the count file - with open("${count-file-path}", 'w') as f: f.write('0') + # # Reset the count file + # with open("${count-file-path}", 'w') as f: f.write('0') - now_str = datetime.now().strftime('%Y/%m/%d-%R') - log_entry = f"At {now_str} - from {dns_ip} to {my_ip} - {count} times - Response {resp_base.status_code}{' - (forced)' if force_update else ' '}\n" - print(log_entry, end="") - with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) + # now_str = datetime.now().strftime('%Y/%m/%d-%R') + # log_entry = f"At {now_str} - from {dns_ip} to {my_ip} - {count} times - Response {resp_base.status_code}{' - (forced)' if force_update else ' '}\n" + # print(log_entry, end="") + # with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) - if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument('-f', '--force', action='store_true', help='Force update') - args = parser.parse_args() + # if __name__ == "__main__": + # parser = argparse.ArgumentParser() + # parser.add_argument('-f', '--force', action='store_true', help='Force update') + # args = parser.parse_args() - main(args.force) - ''; - in { - script = '' - set -eu - ${u}/bin/update_namecheap - ''; - serviceConfig = { - Type = "oneshot"; + # main(args.force) + # ''; + # in { + # script = '' + # set -eu + # ${u}/bin/update_namecheap + # ''; + # serviceConfig = { + # Type = "oneshot"; + # }; + services."dynamic-dns" = let + u = let + domain = "nx2.site"; + account_id = secrets.email.gmail-online.mail; + zone_id = "33fecab36e060f49d492127345ea95a0"; + record_id = { + base = "58d3412e8d88889d1a611b3669f0700f"; + sub = "fc861353142bc05d5dbad1799178e6a1"; + base6 = "d1b90e21d2d747dcb30448bd65312927"; + sub6 = "b8082b7afe9e80971fc9f9dda16ec284"; + }; + passord-file-path = config.sops.secrets."nx2site/cloudflare/global-api-key".path; + log-file-path = "/var/log/couldflare.log"; + count-file-path = "/var/log/cloudflare-count.txt"; + in pkgs.writers.writePython3Bin "dyn_dns" { + libraries = with pkgs.python311Packages; [ requests ]; + flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" "E121" "E261" "E303"]; + } '' + import requests + import subprocess + from datetime import datetime + + def get_public_ip(ipv6=False): + return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip() + + def main(): + my_ip = get_public_ip() + my_ip6 = get_public_ip(ipv6=True) + + with open("${count-file-path}", "r") as f: + content = f.read() + if content == "": count = 0 + else: count = int(content) + count += 1 + with open("${count-file-path}", "w") as f: + f.write(str(count)) + + # 4 + with open("${passord-file-path}", 'r') as pw_file: + pw = pw_file.read().strip() + + # Perform DNS updates + # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record + resp_base = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip, + "type": "A" + } + ) + + resp_subd = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip, + "type": "A" + } + ) + + if resp_base.status_code != 200: + print(resp_base.text) + + + now_str = datetime.now().strftime('%Y/%m/%d-%R') + log_entry = f"At {now_str} - to {my_ip} - Response {resp_base.status_code}\n" + print(log_entry, end="") + with open("${log-file-path}", 'a') as log_file: + log_file.write(log_entry) + + # Perform DNS updates + # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record + resp_base = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base6}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip6, + "type": "AAAA" + } + ) + + resp_subd = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub6}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip6, + "type": "AAAA" + } + ) + + if resp_base.status_code != 200: + print(resp_base.text) + + + now_str = datetime.now().strftime('%Y/%m/%d-%R') + log_entry = f"At {now_str} - to {my_ip6} - Response {resp_base.status_code}\n" + print(log_entry, end="") + with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) + + if __name__ == "__main__": + main() + ''; + in { + script = '' + set -eu + ${u}/bin/dyn_dns + ''; + serviceConfig = { + Type = "oneshot"; + User = "root"; + }; }; }; - }; - # I can't use this becasue API Access for Namecheap needs a static whitelisted IP, which I don't have - # security.acme = { - # acceptTerms = true; - # certs."nx2site" = { }; - # }; - environment.systemPackages = with pkgs; [ - certbot - (writeShellApplication { - name = "refresh_ssl_certificate"; - runtimeInputs = [ certbot ]; - # https://forum.endeavouros.com/t/tutorial-add-a-systemd-boot-loader-menu-entry-for-a-windows-installation-using-a-separate-esp-partition/37431 - text = let - webroot = /home/nx2/nx2site/staticweb/content; - in /*bash*/ '' - cartbot - ls ${webroot} - ''; - }) - ]; - networking.hosts = { # docker network inspect nx2site_default | grep -E "Name|IPv4" | tr "\n" " " | sed -r 's- +- -g;s-\n?"Name": -\n-g' | sed -r '1d;2d;s-"(.+?)", "IPv4Address": "(.+)/16",- "\2" = [ "\1.docker" ];-g' - "172.1.2.1" = [ "staticweb.docker" ]; - "172.1.3.1" = [ "matrix.docker" ]; - # "172.1.0.9" = [ "matrixdb.docker" ]; - "172.1.4.1" = [ "matrix-ss.docker" ]; - # "172.1.0.7" = [ "matrix-ssdb.docker" ]; - "172.1.5.1" = [ "pw.docker" ]; - "172.1.6.1" = [ "git.docker" ]; - # "172.1.0.10" = [ "gitdb.docker" ]; - "172.1.7.1" = [ "nn.docker" ]; - "172.1.8.1" = [ "llm.docker" ]; - # "172.1.9.1" = [ "proxy.docker" ]; - "172.1.10.1" = [ "share.docker" ]; - "172.1.11.1" = [ "odq.docker" ]; - }; -}) + # I can't use this becasue API Access for Namecheap needs a static whitelisted IP, which I don't have + # security.acme = { + # acceptTerms = true; + # certs."nx2site" = { }; + # }; + environment.systemPackages = with pkgs; [ + certbot + (writeShellApplication { + name = "refresh_ssl_certificate"; + runtimeInputs = [ certbot ]; + # https://forum.endeavouros.com/t/tutorial-add-a-systemd-boot-loader-menu-entry-for-a-windows-installation-using-a-separate-esp-partition/37431 + text = let + webroot = /home/nx2/nx2site/staticweb/content; + in /*bash*/ '' + cartbot + ls ${webroot} + ''; + }) + ]; + networking.hosts = { # docker network inspect nx2site_default | grep -E "Name|IPv4" | tr "\n" " " | sed -r 's- +- -g;s-\n?"Name": -\n-g' | sed -r '1d;2d;s-"(.+?)", "IPv4Address": "(.+)/16",- "\2" = [ "\1.docker" ];-g' + "172.1.2.1" = [ "staticweb.docker" ]; + "172.1.3.1" = [ "matrix.docker" ]; + # "172.1.0.9" = [ "matrixdb.docker" ]; + "172.1.4.1" = [ "matrix-ss.docker" ]; + # "172.1.0.7" = [ "matrix-ssdb.docker" ]; + "172.1.5.1" = [ "pw.docker" ]; + "172.1.6.1" = [ "git.docker" ]; + # "172.1.0.10" = [ "gitdb.docker" ]; + "172.1.7.1" = [ "nn.docker" ]; + "172.1.8.1" = [ "llm.docker" ]; + # "172.1.9.1" = [ "proxy.docker" ]; + "172.1.10.1" = [ "share.docker" ]; + "172.1.11.1" = [ "odq.docker" ]; + }; + } diff --git a/system-modules/nx2site/proxy.nix b/system-modules/nx2site/proxy.nix index fde9b31..b62493d 100644 --- a/system-modules/nx2site/proxy.nix +++ b/system-modules/nx2site/proxy.nix @@ -1,25 +1,58 @@ -{ config, pkgs, lib, user }: -lib.mkIf false +{ config, pkgs, lib, user, ... }: { sops.secrets = { "nx2site/sslCertificate.pem" = { owner = config.services.nginx.user; }; "nx2site/sslCertificateKey.pem" = { owner = config.services.nginx.user; }; "nx2site/dhparams.pem" = { owner = config.services.nginx.user; }; }; + security.acme = { + acceptTerms = true; + defaults = { + email = "acme@nx2.site"; + webroot = "/var/nginx/webroot"; + group = "nginx"; + }; + certs = { + "nx2.site" = { + extraDomainNames = [ "git.nx2.site" "pw.nx2.site" ]; + }; + }; + }; + users.users."nginx" = { + extraGroups = [ "nginx" "acme" ]; + useDefaultShell = false; + linger = true; + home = "/var/nginx/"; + homeMode = "770"; + createHome = true; + isSystemUser = true; + isNormalUser = false; + }; + systemd.services.nginx.serviceConfig.ProtectHome = "read-only"; services.nginx = { enable = true; + user = "nginx"; + group = "nginx"; additionalModules = []; # appendConfig = ''''; clientMaxBodySize = "20m"; defaultHTTPListenPort = 80; defaultListenAddresses = [ "0.0.0.0" ] ++ lib.optional config.networking.enableIPv6 "[::0]"; - defaultListen = [ { - addr = "0.0.0.0"; - ssl = true; - port = 443; - proxyProtocol = true; - }]; + defaultListen = [ + { + addr = "0.0.0.0"; + ssl = true; + port = 443; + proxyProtocol = true; + } + { + addr = "[::0]"; + ssl = true; + port = 443; + proxyProtocol = true; + } + ]; defaultMimeTypes = "${pkgs.mailcap}/etc/nginx/mime.types"; defaultSSLListenPort = 443; enableQuicBPF = true; @@ -39,7 +72,7 @@ lib.mkIf false recommendedTlsSettings = true; recommendedZstdSettings = true; serverTokens = false; - # sslCiphers = true; + # sslCiphers = # useing default; sslDhparam = config.sops.secrets."nx2site/dhparams.pem".path; sslProtocols = "TLSv1.2 TLSv1.3"; statusPage = false; @@ -50,7 +83,7 @@ lib.mkIf false "matrix".servers = { "matrix.docker:80" = {}; }; "matrix-ss".servers = { "matrix-ss.docker:80" = {}; }; "pw".servers = { "pw.docker:80" = {}; }; - "git".servers = { "git.docker:80" = {}; }; + "git".servers = { "git.docker:3000" = {}; }; "nn".servers = { "nn.docker:80" = {}; }; "llm".servers = { "llm.docker:80" = {}; }; "share".servers = { "share.docker:80" = {}; }; @@ -58,72 +91,99 @@ lib.mkIf false "sync".servers = { "localhost:8384" = {}; }; }; virtualHosts = let - sslCertificate = config.sops.secrets."nx2site/sslCertificate.pem".path; - sslCertificateKey = config.sops.secrets."nx2site/sslCertificateKey.pem".path; - kTLS = true; http2 = true; http3 = true; http3_hq = true; quic = true; - in - { - "nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; + # sslCertificate = config.sops.secrets."nx2site/sslCertificate.pem".path; + # sslCertificateKey = config.sops.secrets."nx2site/sslCertificateKey.pem".path; + vh = { + kTLS = true; + http2 = true; + http3 = true; + http3_hq = true; + quic = true; + addSSL = true; + enableACME = true; + }; + dl = [ + { addr = "0.0.0.0"; port = 443; ssl = true; } + { addr = "0.0.0.0"; port = 80; ssl = false; } + { addr = "[::0]"; port = 443; ssl = true; } + { addr = "[::0]"; port = 80; ssl = false; } + ]; + in { + "nx2.site" = vh // { + root = "/var/nginx/webroot"; + default = true; + listen = dl; locations = { "/" = { - proxyPass = "http://staticweb"; - # extraConfig = [ ''add_header Alt-Svc 'h3=":443"; ma=86400';'' ''add_header Cache-Control "public";'' ] ++ common-location-conf; + # index = "index.html"; + # tryFiles = "$uri/ $uri.html =404"; + extraConfig = '' + index index.html; + if ($request_uri ~ ^/(.*)\.html(\?|$)) { + return 301 /$1; + } + try_files $uri $uri.html $uri/ /404.html =404; + ''; + }; + "~^(/ba)$" = { + return = "301 /BA.pdf"; }; "/.well-known/matrix/client" = { - return = ''200 '{"m.homeserver": {"base_url": "https://matrix.nx2.site"}, "org.matrix.msc3575.proxy": {"url": "https://matrix-ss.nx2.site"}}' ''; - extraConfig = [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; + return = "502"; + # return = ''200 '{"m.homeserver": {"base_url": "https://matrix.nx2.site"}, "org.matrix.msc3575.proxy": {"url": "https://matrix-ss.nx2.site"}}' ''; + # extraConfig = builtins.concatStringsSep "\n" [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; }; "/.well-known/matrix/server" = { - return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; - extraConfig = [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; - }; - "~ ^/(client/|_matrix/client/unstable/org.matrix.msc3575/sync)" = { - proxyPass = "http://matrix-ss"; - # extraConfig = [ ''proxy_set_header X-Forwarded-For $remote_addr;'' ''proxy_set_header X-Forwarded-Proto $scheme;'' ''proxy_set_header Host $host;'' ]; - }; - "~ ^(\/_matrix|\/_synapse\/client)" = { - return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; - # extraConfig = []; + return = "502"; + # return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; + # extraConfig = builtins.concatStringsSep "\n" [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; }; + # "~ ^/(client/|_matrix/client/unstable/org.matrix.msc3575/sync)" = { + # proxyPass = "http://matrix-ss"; + # # extraConfig = [ ''proxy_set_header X-Forwarded-For $remote_addr;'' ''proxy_set_header X-Forwarded-Proto $scheme;'' ''proxy_set_header Host $host;'' ]; + # }; + # "~ ^(\/_matrix|\/_synapse\/client)" = { + # return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; + # # extraConfig = []; + # }; }; - }; + }; "matrix.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - listen = [ - { addr = "0.0.0.0"; port = 443; ssl = true; } - { addr = "0.0.0.0"; port = 8448; ssl = true; } + listen = dl ++ [ + # { addr = "0.0.0.0"; port = 8448; ssl = true; } + # { addr = "0.0.0.0"; port = 8448; ssl = true; } ]; locations = { - "/" = { - proxyPass = "http://matrix"; - # extraConfig = [ ''add_header Alt-Svc 'h3=":443"; ma=86400';'' ''add_header Cache-Control "public";'' ] ++ common-location-conf; - }; + # "/" = { +# proxyPass = "http://matrix"; +# # extraConfig = [ ''add_header Alt-Svc 'h3=":443"; ma=86400';'' ''add_header Cache-Control "public";'' ] ++ common-location-conf; +# }; + "~.*" = { return = "502"; }; }; }; - "matrix-ss.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; - # "resolver 1.1.1.1;" - # "client_max_body_size 500M;" - # ]; - locations = { - "/" = { proxyPass = "http://pw"; }; - }; - }; - # "dev.nx2.site" = { - # inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; - # locations = { - # "/" = { - # proxyPass = "http://dev"; - # }; - # }; - # }; - "pw.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; +# "matrix-ss.nx2.site" = { +# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; +# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; +# # "resolver 1.1.1.1;" +# # "client_max_body_size 500M;" +# # ]; +# locations = { +# "/" = { proxyPass = "http://pw"; }; +# }; +# }; +# # "dev.nx2.site" = { +# # inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; +# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; +# # locations = { +# # "/" = { +# # proxyPass = "http://dev"; +# # }; +# # }; +# # }; + "pw.nx2.site" = vh // { + # inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; + listen = dl; locations = { "/" = { proxyPass = "http://pw"; }; "/admin" = { proxyPass = "http://pw"; }; @@ -131,48 +191,47 @@ lib.mkIf false "/notifications/hub/negotiate" = { proxyPass = "http://pw"; }; }; }; - "share.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; - locations = { - "/" = { proxyPass = "http://share"; # ''proxy_hide_header Content-Disposition;'' - # ''proxy_set_header Content-Disposition $upstream_http_content_disposition;'' - # ''proxy_set_header X-Real-IP $remote_addr;'' - # ''proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'' - # ''proxy_set_header Host $http_host;'' - # ]; - }; - "/socket.io" = { - proxyPass = "http://share/socket.io"; - proxyWebsockets = true; - # extraConfig = [ - # ''proxy_http_version 1.1;'' - # ''proxy_set_header Upgrade $http_upgrade;'' - # ''proxy_set_header Connection "upgrade";'' - # ]; - }; - }; - }; - "sync.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; - locations = { - "/" = { proxyPass = "http://sync"; }; - }; - }; - "git.nx2.site" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; +# "share.nx2.site" = { +# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; +# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; +# locations = { +# "/" = { proxyPass = "http://share"; # ''proxy_hide_header Content-Disposition;'' +# # ''proxy_set_header Content-Disposition $upstream_http_content_disposition;'' +# # ''proxy_set_header X-Real-IP $remote_addr;'' +# # ''proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'' +# # ''proxy_set_header Host $http_host;'' +# # ]; +# }; +# "/socket.io" = { +# proxyPass = "http://share/socket.io"; +# proxyWebsockets = true; +# # extraConfig = [ +# # ''proxy_http_version 1.1;'' +# # ''proxy_set_header Upgrade $http_upgrade;'' +# # ''proxy_set_header Connection "upgrade";'' +# # ]; +# }; +# }; +# }; +# "sync.nx2.site" = { +# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; +# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; +# locations = { +# "/" = { proxyPass = "http://sync"; }; +# }; +# }; + "git.nx2.site" = vh // { # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; + listen = dl; locations = { "/" = { proxyPass = "http://git"; }; }; }; - "~^(.*)\.nx2\.site$" = { - inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; - root = "/home/nx2/nx2site/staticweb/xcontent/"; + "~^(.*).nx2.site$" = { + listen = dl; + root = "/var/nginx/webroot"; locations = { - "~.*" = { return = "502 /502.html"; }; + "~.*" = { return = "301 https://nx2.site/502.html"; }; }; }; }; diff --git a/system-modules/users.nix b/system-modules/users.nix index cec112b..bc092ac 100755 --- a/system-modules/users.nix +++ b/system-modules/users.nix @@ -5,7 +5,7 @@ users.users."${user}" = { isNormalUser = true; - extraGroups = [ "networkmanager" "wheel" "audio" "video" "docker" "libvirtd" "uinput" "input" "ydotool" ]; + extraGroups = [ "networkmanager" "wheel" "audio" "video" "docker" "libvirtd" "uinput" "input" "ydotool" "acme" "nginx" ]; useDefaultShell = true; openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID1RPCcS8DtIf75a2FEW4d8X6WTVeLlmretoLqppvZlJ" # From [A] GPG Sub Key From c5c41087b551ab01a7cc4c391f849ca83a2c4560 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Fri, 8 Nov 2024 13:48:27 +0100 Subject: [PATCH 2/5] dm new style --- system-modules/dm.nix | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/system-modules/dm.nix b/system-modules/dm.nix index 0f4714a..e1102ff 100755 --- a/system-modules/dm.nix +++ b/system-modules/dm.nix @@ -25,11 +25,7 @@ if (host != "NxACE") then } else { - environment.systemPackages = with pkgs; [ - sddm - # where-is-my-sddm-theme - ]; - services.xserver = { + services = { displayManager = { defaultSession = "hyprland"; sddm = { From c19c2707758cd601994e908106c2902e090bf8a4 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Fri, 8 Nov 2024 13:48:37 +0100 Subject: [PATCH 3/5] newer curl --- configuration.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configuration.nix b/configuration.nix index 51b5acd..2820da1 100755 --- a/configuration.nix +++ b/configuration.nix @@ -36,6 +36,7 @@ ./system-modules/users.nix ./system-modules/virtualisation.nix ./system-modules/ydotool.nix + ./system-modules/nx2site/proxy.nix ]; # Set your time zone. @@ -80,7 +81,7 @@ git-crypt lazygit # home-manager module is bugged wget - curl + curlHTTP3 zip unzip p7zip From 104d1334df2833b8ee0b6b67c9523ec677af55c8 Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Sat, 9 Nov 2024 19:48:52 +0100 Subject: [PATCH 4/5] huge cleanup --- configuration.nix | 11 +- flake.nix | 6 +- home-modules/bash.nix | 12 +- home-modules/chatterino.nix | 2055 ++++++----------- home-modules/direnv.nix | 1 - home-modules/fish.nix | 1 - home-modules/foot.nix | 270 --- home-modules/git.nix | 7 +- home-modules/gpg.nix | 5 +- home-modules/gtk.nix | 7 +- home-modules/hyprland-autoname-workspaces.nix | 180 +- home-modules/hyprland.nix | 4 +- home-modules/kitty.nix | 49 +- home-modules/mako.nix | 8 +- home-modules/nx-gcal-event.nix | 11 +- home-modules/nx2site.nix | 3 +- home-modules/office.nix | 1 - home-modules/programming/python.nix | 35 +- home-modules/qt.nix | 1 - home-modules/rofi.nix | 201 +- home-modules/ssh.nix | 58 +- home-modules/starship.nix | 7 +- home-modules/vale.nix | 7 +- home-modules/waybar.nix | 16 +- home-modules/wlogout.nix | 171 +- home-modules/yazi.nix | 3 +- home-modules/zoxide.nix | 3 +- home.nix | 2 +- system-modules/boot.nix | 4 +- system-modules/dm.nix | 26 +- system-modules/gitea.nix | 6 + system-modules/nx2site.nix | 446 ++-- system-modules/nx2site/proxy.nix | 197 +- system-modules/syncthing.nix | 15 +- system-modules/users.nix | 6 - 35 files changed, 1314 insertions(+), 2521 deletions(-) delete mode 100644 home-modules/foot.nix create mode 100644 system-modules/gitea.nix diff --git a/configuration.nix b/configuration.nix index 2820da1..8b02c76 100755 --- a/configuration.nix +++ b/configuration.nix @@ -1,6 +1,6 @@ -{ pkgs, inputs, ... }: +{ pkgs, inputs, lib, host, ... }: { - imports = [ + imports = ([ inputs.sops-nix.nixosModules.sops ./system-modules/auto-mount.nix ./system-modules/hardware-configuration.nix @@ -26,7 +26,6 @@ ./system-modules/kodi.nix ./system-modules/networking.nix ./system-modules/nvidia.nix - ./system-modules/nx2site.nix ./system-modules/ollama.nix ./system-modules/qmk.nix ./system-modules/sops.nix @@ -36,8 +35,12 @@ ./system-modules/users.nix ./system-modules/virtualisation.nix ./system-modules/ydotool.nix + ]) ++ (if (host == "NxACE") then [ + ./system-modules/nx2site.nix ./system-modules/nx2site/proxy.nix - ]; + # ./system-modules/nx2site/gitea.nix + # ./system-modules/nx2site/vaultwarden.nix + ] else []); # Set your time zone. time.timeZone = "Europe/Berlin"; diff --git a/flake.nix b/flake.nix index 3ad5b84..3311f3f 100755 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,7 @@ outputs = { self, nixpkgs, nixpkgs-unstable, nixpkgs-latest, home-manager, ... }@inputs: let system = "x86_64-linux"; user = "nx2"; + domain = "nx2.site"; config = { allowUnfree = true; allowUnfreePredicate = pkg: builtins.elem (pkgs.lib.getName pkg) (import ./flake-modules/allowed.nix).unfree; }; @@ -42,7 +43,7 @@ enable = if (host == "NxXPS" || host == "NxNORTH") then true else false; prime = if (host == "NxXPS") then true else false; }; - in { inherit inputs user host pkgs-unstable pkgs-latest secrets rice nvidia; }; + in { inherit inputs user host domain pkgs-unstable pkgs-latest secrets rice nvidia; }; }; in { NxXPS = make-nixos-system "NxXPS"; @@ -59,13 +60,12 @@ enable = if (host == "NxXPS" || host == "NxNORTH") then true else false; prime = if (host == "NxXPS") then true else false; }; - in { inherit inputs system user host pkgs-unstable pkgs-latest rice secrets nvidia; }; + in { inherit inputs system user host domain pkgs-unstable pkgs-latest rice secrets nvidia; }; }; in { "${user}@NxXPS" = make-home-configuration "NxXPS" user; "${user}@NxNORTH" = make-home-configuration "NxNORTH" user; "${user}@NxACE" = make-home-configuration "NxACE" user; - "tv@NxACE" = make-home-configuration "NxACE" "tv"; }; }; } diff --git a/home-modules/bash.nix b/home-modules/bash.nix index c5d0985..2b1f025 100755 --- a/home-modules/bash.nix +++ b/home-modules/bash.nix @@ -1,9 +1,5 @@ -{ pkgs, lib, user, ... }: -lib.mkIf (user != "tv") +{ ... }: { - home.packages = with pkgs; [ - bash - ]; programs.bash = { enable = true; shellAliases = { @@ -19,11 +15,5 @@ lib.mkIf (user != "tv") "checkjobs" ]; enableCompletion = false; - # initExtra = '' - # if [[ $- == *i* ]] # if interactive - # then - # eval "$(${pkgs.starship}/bin/starship init bash)" - # fi - # ''; }; } diff --git a/home-modules/chatterino.nix b/home-modules/chatterino.nix index 657a49d..5a0970b 100755 --- a/home-modules/chatterino.nix +++ b/home-modules/chatterino.nix @@ -1,11 +1,15 @@ { pkgs, lib, rice, user, secrets, ... }: let channels = [ + "Caedrel" + "NoWay4u_Sir" + "zackrawrr" + "agurin" "asmongold" "Broeki" "Broxah" - "Caedrel" + # "Caedrel" "chrissyofficial" "EintrachtSpandau" "GamesDoneQuick" @@ -28,7 +32,7 @@ let "maxim" "NASA" "NNOPrime" - "NoWay4u_Sir" + # "NoWay4u_Sir" "OfficialMikeShinoda" "ow_esports" "PrimeGaming" @@ -41,7 +45,7 @@ let "Trick2g" "TSM_ImperialHal" "Xisuma" - "zackrawrr" + # "zackrawrr" ]; tabber = channel-name: { highlightsEnabled = true; @@ -57,1362 +61,697 @@ let type = "split"; }; }; -in -lib.mkIf (user != "tv") -{ - home.packages = with pkgs; [ - chatterino2 - ]; - - home.file.".local/share/chatterino/Settings/settings.json".text = with secrets.chatterino; '' - { - "accounts": { - "current": "${username}", - "uid189594946": { - "clientID": "${clientID}", - "oauthToken": "${oauthToken}", - "userID": "${userID}", - "username": "${username}" +in { + home = { + packages = with pkgs; [ chatterino2 ]; + file = { + ".local/share/chatterino/Settings/settings.json".text = with secrets.chatterino; '' + { + "accounts": { + "current": "${username}", + "uid189594946": { + "clientID": "${clientID}", + "oauthToken": "${oauthToken}", + "userID": "${userID}", + "username": "${username}" + } + }, + "appearance": { + "boldScale": 63.0, + "currentFontFamily": "${rice.font.base.name}", + "currentFontSize": 12, + "messages": { + "alternateMessageBackground": true, + "lastMessageColor": "#ff7f0002", + "lastMessagePattern": 10, + "separateMessages": true, + "showTimestamps": false, + "timestampFormat": "h =mm", + "usernameDisplayMode": 1 + }, + "splitheader": { + "showGame": true, + "showTitle": true, + "showUptime": true, + "showViewerCount": true + }, + "tabVisibility": 1, + "theme": { + "name": "Black" + } + }, + "behaviour": { + "pauseOnHoverDuration": 5.0, + "showJoins": false, + "usernameRightClickBehavior": 0, + "usernameRightClickBehaviorWithModifier": 1 + }, + "emotes": { + "removeSpacesBetweenEmotes": false, + "showUnlistedSevenTVEmotes": true + }, + "highlighting": { + "badges": [ + { + "alert": false, + "color": "#7f7f3f49", + "displayName": "Broadcaster", + "name": "broadcaster", + "showInMentions": false, + "sound": false, + "soundUrl": "" + }, + { + "alert": false, + "color": "#7f7f3f49", + "displayName": "Admin", + "name": "admin", + "showInMentions": false, + "sound": false, + "soundUrl": "" + }, + { + "alert": false, + "color": "#7f7f3f49", + "displayName": "Staff", + "name": "staff", + "showInMentions": false, + "sound": false, + "soundUrl": "" + }, + { + "alert": false, + "displayName": "Moderator", + "name": "moderator", + "showInMentions": false, + "sound": false, + "soundUrl": "" + }, + { + "alert": false, + "color": "#7f7f3578", + "displayName": "VIP", + "name": "vip", + "showInMentions": false, + "sound": false, + "soundUrl": "" + } + ], + "selfMessageHighlight": { + "color": "#73008cff", + "enabled": true + } + }, + "hotkeys": { + "addedDefaults": [ + "change channel", + "close popup window", + "create clip", + "delete", + "emote picker", + "focus down", + "focus left", + "focus right", + "focus up", + "go to end of input", + "go to end of input with selection", + "go to start of input", + "go to start of input with selection", + "new popup window", + "new popup window from tab", + "new split", + "new tab", + "next message", + "open debug popup", + "open quick switcher", + "open settings", + "popup accept", + "popup focus search box", + "popup reject", + "popup scroll down", + "popup scroll up", + "popup select last tab", + "popup select next tab", + "popup select previous tab", + "popup select tab #1", + "popup select tab #2", + "popup select tab #3", + "popup select tab #4", + "popup select tab #5", + "popup select tab #6", + "popup select tab #7", + "popup select tab #8", + "previous message", + "reconnect", + "reload emotes", + "remove tab", + "reopen split", + "scroll page down", + "scroll page up", + "scroll to bottom", + "scroll to top", + "select last tab", + "select next tab", + "select previous tab", + "select tab #1", + "select tab #2", + "select tab #3", + "select tab #4", + "select tab #5", + "select tab #6", + "select tab #7", + "select tab #8", + "send message", + "send message and keep text", + "show global search", + "show search", + "toggle live tabs only", + "toggle local r9k", + "toggle tab visibility", + "zoom in", + "zoom out", + "zoom reset" + ], + "change channel": { + "action": "changeChannel", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+R" + }, + "close popup window": { + "action": "delete", + "arguments": [], + "category": "popupWindow", + "keySequence": "Esc" + }, + "create clip": { + "action": "createClip", + "arguments": [], + "category": "split", + "keySequence": "Alt+X" + }, + "delete": { + "action": "delete", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+W" + }, + "emote picker": { + "action": "openEmotesPopup", + "arguments": [], + "category": "splitInput", + "keySequence": "Ctrl+E" + }, + "focus down": { + "action": "focus", + "arguments": [ + "down" + ], + "category": "split", + "keySequence": "Alt+Down" + }, + "focus left": { + "action": "focus", + "arguments": [ + "left" + ], + "category": "split", + "keySequence": "Alt+Left" + }, + "focus right": { + "action": "focus", + "arguments": [ + "right" + ], + "category": "split", + "keySequence": "Alt+Right" + }, + "focus up": { + "action": "focus", + "arguments": [ + "up" + ], + "category": "split", + "keySequence": "Alt+Up" + }, + "go to end of input": { + "action": "cursorToEnd", + "arguments": [ + "withoutSelection" + ], + "category": "splitInput", + "keySequence": "End" + }, + "go to end of input with selection": { + "action": "cursorToEnd", + "arguments": [ + "withSelection" + ], + "category": "splitInput", + "keySequence": "Shift+End" + }, + "go to start of input": { + "action": "cursorToStart", + "arguments": [ + "withoutSelection" + ], + "category": "splitInput", + "keySequence": "Home" + }, + "go to start of input with selection": { + "action": "cursorToStart", + "arguments": [ + "withSelection" + ], + "category": "splitInput", + "keySequence": "Shift+Home" + }, + "new popup window": { + "action": "popup", + "arguments": [ + "split" + ], + "category": "window", + "keySequence": "Ctrl+N" + }, + "new popup window from tab": { + "action": "popup", + "arguments": [ + "window" + ], + "category": "window", + "keySequence": "Ctrl+Shift+N" + }, + "new split": { + "action": "newSplit", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+T" + }, + "new tab": { + "action": "newTab", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+Shift+T" + }, + "next message": { + "action": "nextMessage", + "arguments": [], + "category": "splitInput", + "keySequence": "Down" + }, + "open debug popup": { + "action": "debug", + "arguments": [], + "category": "split", + "keySequence": "F10" + }, + "open quick switcher": { + "action": "openQuickSwitcher", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+K" + }, + "open settings": { + "action": "openSettings", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+P" + }, + "popup accept": { + "action": "accept", + "arguments": [], + "category": "popupWindow", + "keySequence": "Return" + }, + "popup focus search box": { + "action": "search", + "arguments": [], + "category": "popupWindow", + "keySequence": "Ctrl+F" + }, + "popup reject": { + "action": "reject", + "arguments": [], + "category": "popupWindow", + "keySequence": "Esc" + }, + "popup scroll down": { + "action": "scrollPage", + "arguments": [ + "down" + ], + "category": "popupWindow", + "keySequence": "PgDown" + }, + "popup scroll up": { + "action": "scrollPage", + "arguments": [ + "up" + ], + "category": "popupWindow", + "keySequence": "PgUp" + }, + "popup select last tab": { + "action": "openTab", + "arguments": [ + "last" + ], + "category": "popupWindow", + "keySequence": "Ctrl+9" + }, + "popup select next tab": { + "action": "openTab", + "arguments": [ + "next" + ], + "category": "popupWindow", + "keySequence": "Ctrl+Tab" + }, + "popup select previous tab": { + "action": "openTab", + "arguments": [ + "previous" + ], + "category": "popupWindow", + "keySequence": "Ctrl+Shift+Tab" + }, + "popup select tab #1": { + "action": "openTab", + "arguments": [ + "0" + ], + "category": "popupWindow", + "keySequence": "Ctrl+1" + }, + "popup select tab #2": { + "action": "openTab", + "arguments": [ + "1" + ], + "category": "popupWindow", + "keySequence": "Ctrl+2" + }, + "popup select tab #3": { + "action": "openTab", + "arguments": [ + "2" + ], + "category": "popupWindow", + "keySequence": "Ctrl+3" + }, + "popup select tab #4": { + "action": "openTab", + "arguments": [ + "3" + ], + "category": "popupWindow", + "keySequence": "Ctrl+4" + }, + "popup select tab #5": { + "action": "openTab", + "arguments": [ + "4" + ], + "category": "popupWindow", + "keySequence": "Ctrl+5" + }, + "popup select tab #6": { + "action": "openTab", + "arguments": [ + "5" + ], + "category": "popupWindow", + "keySequence": "Ctrl+6" + }, + "popup select tab #7": { + "action": "openTab", + "arguments": [ + "6" + ], + "category": "popupWindow", + "keySequence": "Ctrl+7" + }, + "popup select tab #8": { + "action": "openTab", + "arguments": [ + "7" + ], + "category": "popupWindow", + "keySequence": "Ctrl+8" + }, + "previous message": { + "action": "previousMessage", + "arguments": [], + "category": "splitInput", + "keySequence": "Up" + }, + "reconnect": { + "action": "reconnect", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+F5" + }, + "reload emotes": { + "action": "reloadEmotes", + "arguments": [], + "category": "split", + "keySequence": "F5" + }, + "remove tab": { + "action": "removeTab", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+Shift+W" + }, + "reopen split": { + "action": "reopenSplit", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+G" + }, + "scroll page down": { + "action": "scrollPage", + "arguments": [ + "down" + ], + "category": "split", + "keySequence": "PgDown" + }, + "scroll page up": { + "action": "scrollPage", + "arguments": [ + "up" + ], + "category": "split", + "keySequence": "PgUp" + }, + "scroll to bottom": { + "action": "scrollToBottom", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+End" + }, + "scroll to top": { + "action": "scrollToTop", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+Home" + }, + "select last tab": { + "action": "openTab", + "arguments": [ + "last" + ], + "category": "window", + "keySequence": "Ctrl+9" + }, + "select next tab": { + "action": "openTab", + "arguments": [ + "next" + ], + "category": "window", + "keySequence": "Ctrl+Tab" + }, + "select previous tab": { + "action": "openTab", + "arguments": [ + "previous" + ], + "category": "window", + "keySequence": "Ctrl+Shift+Tab" + }, + "select tab #1": { + "action": "openTab", + "arguments": [ + "0" + ], + "category": "window", + "keySequence": "Ctrl+1" + }, + "select tab #2": { + "action": "openTab", + "arguments": [ + "1" + ], + "category": "window", + "keySequence": "Ctrl+2" + }, + "select tab #3": { + "action": "openTab", + "arguments": [ + "2" + ], + "category": "window", + "keySequence": "Ctrl+3" + }, + "select tab #4": { + "action": "openTab", + "arguments": [ + "3" + ], + "category": "window", + "keySequence": "Ctrl+4" + }, + "select tab #5": { + "action": "openTab", + "arguments": [ + "4" + ], + "category": "window", + "keySequence": "Ctrl+5" + }, + "select tab #6": { + "action": "openTab", + "arguments": [ + "5" + ], + "category": "window", + "keySequence": "Ctrl+6" + }, + "select tab #7": { + "action": "openTab", + "arguments": [ + "6" + ], + "category": "window", + "keySequence": "Ctrl+7" + }, + "select tab #8": { + "action": "openTab", + "arguments": [ + "7" + ], + "category": "window", + "keySequence": "Ctrl+8" + }, + "send message": { + "action": "sendMessage", + "arguments": [], + "category": "splitInput", + "keySequence": "Return" + }, + "send message and keep text": { + "action": "sendMessage", + "arguments": [ + "keepInput" + ], + "category": "splitInput", + "keySequence": "Ctrl+Return" + }, + "show global search": { + "action": "showGlobalSearch", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+Shift+F" + }, + "show search": { + "action": "showSearch", + "arguments": [], + "category": "split", + "keySequence": "Ctrl+F" + }, + "toggle live tabs only": { + "action": "setTabVisibility", + "arguments": [ + "toggleLiveOnly" + ], + "category": "window", + "keySequence": "Ctrl+Shift+L" + }, + "toggle local r9k": { + "action": "toggleLocalR9K", + "arguments": [], + "category": "window", + "keySequence": "Ctrl+H" + }, + "toggle tab visibility": { + "action": "setTabVisibility", + "arguments": [ + "toggle" + ], + "category": "window", + "keySequence": "Ctrl+U" + }, + "zoom in": { + "action": "zoom", + "arguments": [ + "in" + ], + "category": "window", + "keySequence": "Ctrl++" + }, + "zoom out": { + "action": "zoom", + "arguments": [ + "out" + ], + "category": "window", + "keySequence": "Ctrl+-" + }, + "zoom reset": { + "action": "zoom", + "arguments": [ + "reset" + ], + "category": "window", + "keySequence": "Ctrl+0" + } + }, + "misc": { + "currentVersion": "2.5.1", + "lockNotebookLayout": false + }, + "similarity": { + "hideSimilar": false, + "hideSimilarMaxDelay": 30, + "hideSimilarMaxMessagesToCheck": 5, + "similarityEnabled": false + }, + "ui": { + "lastSelectChannelTab": 0, + "lastSelectIrcConn": -1 + } } - }, - "appearance": { - "boldScale": 63.0, - "currentFontFamily": "${rice.font.base.name}", - "currentFontSize": 12, - "messages": { - "alternateMessageBackground": true, - "lastMessageColor": "#ff7f0002", - "lastMessagePattern": 10, - "separateMessages": true, - "showTimestamps": false, - "timestampFormat": "h =mm", - "usernameDisplayMode": 1 - }, - "splitheader": { - "showGame": true, - "showTitle": true, - "showUptime": true, - "showViewerCount": true - }, - "tabVisibility": 1, - "theme": { - "name": "Black" + ''; + ".local/share/chatterino/Settings/window-layout.json".text = builtins.toJSON { + windows = [ + { + emotePopup = { + x = 0; + y = 0; + }; + height = 569; + state = "maximized"; + tabs = map tabber channels; + type = "main"; + width = 943; + x = 0; + y = 0; } - }, - "behaviour": { - "pauseOnHoverDuration": 5.0, - "showJoins": false, - "usernameRightClickBehavior": 0, - "usernameRightClickBehaviorWithModifier": 1 - }, - "emotes": { - "removeSpacesBetweenEmotes": false, - "showUnlistedSevenTVEmotes": true - }, - "highlighting": { - "badges": [ - { - "alert": false, - "color": "#7f7f3f49", - "displayName": "Broadcaster", - "name": "broadcaster", - "showInMentions": false, - "sound": false, - "soundUrl": "" - }, - { - "alert": false, - "color": "#7f7f3f49", - "displayName": "Admin", - "name": "admin", - "showInMentions": false, - "sound": false, - "soundUrl": "" - }, - { - "alert": false, - "color": "#7f7f3f49", - "displayName": "Staff", - "name": "staff", - "showInMentions": false, - "sound": false, - "soundUrl": "" - }, - { - "alert": false, - "displayName": "Moderator", - "name": "moderator", - "showInMentions": false, - "sound": false, - "soundUrl": "" - }, - { - "alert": false, - "color": "#7f7f3578", - "displayName": "VIP", - "name": "vip", - "showInMentions": false, - "sound": false, - "soundUrl": "" - } - ], - "selfMessageHighlight": { - "color": "#73008cff", - "enabled": true - } - }, - "hotkeys": { - "addedDefaults": [ - "change channel", - "close popup window", - "create clip", - "delete", - "emote picker", - "focus down", - "focus left", - "focus right", - "focus up", - "go to end of input", - "go to end of input with selection", - "go to start of input", - "go to start of input with selection", - "new popup window", - "new popup window from tab", - "new split", - "new tab", - "next message", - "open debug popup", - "open quick switcher", - "open settings", - "popup accept", - "popup focus search box", - "popup reject", - "popup scroll down", - "popup scroll up", - "popup select last tab", - "popup select next tab", - "popup select previous tab", - "popup select tab #1", - "popup select tab #2", - "popup select tab #3", - "popup select tab #4", - "popup select tab #5", - "popup select tab #6", - "popup select tab #7", - "popup select tab #8", - "previous message", - "reconnect", - "reload emotes", - "remove tab", - "reopen split", - "scroll page down", - "scroll page up", - "scroll to bottom", - "scroll to top", - "select last tab", - "select next tab", - "select previous tab", - "select tab #1", - "select tab #2", - "select tab #3", - "select tab #4", - "select tab #5", - "select tab #6", - "select tab #7", - "select tab #8", - "send message", - "send message and keep text", - "show global search", - "show search", - "toggle live tabs only", - "toggle local r9k", - "toggle tab visibility", - "zoom in", - "zoom out", - "zoom reset" - ], - "change channel": { - "action": "changeChannel", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+R" - }, - "close popup window": { - "action": "delete", - "arguments": [], - "category": "popupWindow", - "keySequence": "Esc" - }, - "create clip": { - "action": "createClip", - "arguments": [], - "category": "split", - "keySequence": "Alt+X" - }, - "delete": { - "action": "delete", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+W" - }, - "emote picker": { - "action": "openEmotesPopup", - "arguments": [], - "category": "splitInput", - "keySequence": "Ctrl+E" - }, - "focus down": { - "action": "focus", - "arguments": [ - "down" - ], - "category": "split", - "keySequence": "Alt+Down" - }, - "focus left": { - "action": "focus", - "arguments": [ - "left" - ], - "category": "split", - "keySequence": "Alt+Left" - }, - "focus right": { - "action": "focus", - "arguments": [ - "right" - ], - "category": "split", - "keySequence": "Alt+Right" - }, - "focus up": { - "action": "focus", - "arguments": [ - "up" - ], - "category": "split", - "keySequence": "Alt+Up" - }, - "go to end of input": { - "action": "cursorToEnd", - "arguments": [ - "withoutSelection" - ], - "category": "splitInput", - "keySequence": "End" - }, - "go to end of input with selection": { - "action": "cursorToEnd", - "arguments": [ - "withSelection" - ], - "category": "splitInput", - "keySequence": "Shift+End" - }, - "go to start of input": { - "action": "cursorToStart", - "arguments": [ - "withoutSelection" - ], - "category": "splitInput", - "keySequence": "Home" - }, - "go to start of input with selection": { - "action": "cursorToStart", - "arguments": [ - "withSelection" - ], - "category": "splitInput", - "keySequence": "Shift+Home" - }, - "new popup window": { - "action": "popup", - "arguments": [ - "split" - ], - "category": "window", - "keySequence": "Ctrl+N" - }, - "new popup window from tab": { - "action": "popup", - "arguments": [ - "window" - ], - "category": "window", - "keySequence": "Ctrl+Shift+N" - }, - "new split": { - "action": "newSplit", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+T" - }, - "new tab": { - "action": "newTab", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+Shift+T" - }, - "next message": { - "action": "nextMessage", - "arguments": [], - "category": "splitInput", - "keySequence": "Down" - }, - "open debug popup": { - "action": "debug", - "arguments": [], - "category": "split", - "keySequence": "F10" - }, - "open quick switcher": { - "action": "openQuickSwitcher", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+K" - }, - "open settings": { - "action": "openSettings", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+P" - }, - "popup accept": { - "action": "accept", - "arguments": [], - "category": "popupWindow", - "keySequence": "Return" - }, - "popup focus search box": { - "action": "search", - "arguments": [], - "category": "popupWindow", - "keySequence": "Ctrl+F" - }, - "popup reject": { - "action": "reject", - "arguments": [], - "category": "popupWindow", - "keySequence": "Esc" - }, - "popup scroll down": { - "action": "scrollPage", - "arguments": [ - "down" - ], - "category": "popupWindow", - "keySequence": "PgDown" - }, - "popup scroll up": { - "action": "scrollPage", - "arguments": [ - "up" - ], - "category": "popupWindow", - "keySequence": "PgUp" - }, - "popup select last tab": { - "action": "openTab", - "arguments": [ - "last" - ], - "category": "popupWindow", - "keySequence": "Ctrl+9" - }, - "popup select next tab": { - "action": "openTab", - "arguments": [ - "next" - ], - "category": "popupWindow", - "keySequence": "Ctrl+Tab" - }, - "popup select previous tab": { - "action": "openTab", - "arguments": [ - "previous" - ], - "category": "popupWindow", - "keySequence": "Ctrl+Shift+Tab" - }, - "popup select tab #1": { - "action": "openTab", - "arguments": [ - "0" - ], - "category": "popupWindow", - "keySequence": "Ctrl+1" - }, - "popup select tab #2": { - "action": "openTab", - "arguments": [ - "1" - ], - "category": "popupWindow", - "keySequence": "Ctrl+2" - }, - "popup select tab #3": { - "action": "openTab", - "arguments": [ - "2" - ], - "category": "popupWindow", - "keySequence": "Ctrl+3" - }, - "popup select tab #4": { - "action": "openTab", - "arguments": [ - "3" - ], - "category": "popupWindow", - "keySequence": "Ctrl+4" - }, - "popup select tab #5": { - "action": "openTab", - "arguments": [ - "4" - ], - "category": "popupWindow", - "keySequence": "Ctrl+5" - }, - "popup select tab #6": { - "action": "openTab", - "arguments": [ - "5" - ], - "category": "popupWindow", - "keySequence": "Ctrl+6" - }, - "popup select tab #7": { - "action": "openTab", - "arguments": [ - "6" - ], - "category": "popupWindow", - "keySequence": "Ctrl+7" - }, - "popup select tab #8": { - "action": "openTab", - "arguments": [ - "7" - ], - "category": "popupWindow", - "keySequence": "Ctrl+8" - }, - "previous message": { - "action": "previousMessage", - "arguments": [], - "category": "splitInput", - "keySequence": "Up" - }, - "reconnect": { - "action": "reconnect", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+F5" - }, - "reload emotes": { - "action": "reloadEmotes", - "arguments": [], - "category": "split", - "keySequence": "F5" - }, - "remove tab": { - "action": "removeTab", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+Shift+W" - }, - "reopen split": { - "action": "reopenSplit", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+G" - }, - "scroll page down": { - "action": "scrollPage", - "arguments": [ - "down" - ], - "category": "split", - "keySequence": "PgDown" - }, - "scroll page up": { - "action": "scrollPage", - "arguments": [ - "up" - ], - "category": "split", - "keySequence": "PgUp" - }, - "scroll to bottom": { - "action": "scrollToBottom", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+End" - }, - "scroll to top": { - "action": "scrollToTop", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+Home" - }, - "select last tab": { - "action": "openTab", - "arguments": [ - "last" - ], - "category": "window", - "keySequence": "Ctrl+9" - }, - "select next tab": { - "action": "openTab", - "arguments": [ - "next" - ], - "category": "window", - "keySequence": "Ctrl+Tab" - }, - "select previous tab": { - "action": "openTab", - "arguments": [ - "previous" - ], - "category": "window", - "keySequence": "Ctrl+Shift+Tab" - }, - "select tab #1": { - "action": "openTab", - "arguments": [ - "0" - ], - "category": "window", - "keySequence": "Ctrl+1" - }, - "select tab #2": { - "action": "openTab", - "arguments": [ - "1" - ], - "category": "window", - "keySequence": "Ctrl+2" - }, - "select tab #3": { - "action": "openTab", - "arguments": [ - "2" - ], - "category": "window", - "keySequence": "Ctrl+3" - }, - "select tab #4": { - "action": "openTab", - "arguments": [ - "3" - ], - "category": "window", - "keySequence": "Ctrl+4" - }, - "select tab #5": { - "action": "openTab", - "arguments": [ - "4" - ], - "category": "window", - "keySequence": "Ctrl+5" - }, - "select tab #6": { - "action": "openTab", - "arguments": [ - "5" - ], - "category": "window", - "keySequence": "Ctrl+6" - }, - "select tab #7": { - "action": "openTab", - "arguments": [ - "6" - ], - "category": "window", - "keySequence": "Ctrl+7" - }, - "select tab #8": { - "action": "openTab", - "arguments": [ - "7" - ], - "category": "window", - "keySequence": "Ctrl+8" - }, - "send message": { - "action": "sendMessage", - "arguments": [], - "category": "splitInput", - "keySequence": "Return" - }, - "send message and keep text": { - "action": "sendMessage", - "arguments": [ - "keepInput" - ], - "category": "splitInput", - "keySequence": "Ctrl+Return" - }, - "show global search": { - "action": "showGlobalSearch", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+Shift+F" - }, - "show search": { - "action": "showSearch", - "arguments": [], - "category": "split", - "keySequence": "Ctrl+F" - }, - "toggle live tabs only": { - "action": "setTabVisibility", - "arguments": [ - "toggleLiveOnly" - ], - "category": "window", - "keySequence": "Ctrl+Shift+L" - }, - "toggle local r9k": { - "action": "toggleLocalR9K", - "arguments": [], - "category": "window", - "keySequence": "Ctrl+H" - }, - "toggle tab visibility": { - "action": "setTabVisibility", - "arguments": [ - "toggle" - ], - "category": "window", - "keySequence": "Ctrl+U" - }, - "zoom in": { - "action": "zoom", - "arguments": [ - "in" - ], - "category": "window", - "keySequence": "Ctrl++" - }, - "zoom out": { - "action": "zoom", - "arguments": [ - "out" - ], - "category": "window", - "keySequence": "Ctrl+-" - }, - "zoom reset": { - "action": "zoom", - "arguments": [ - "reset" - ], - "category": "window", - "keySequence": "Ctrl+0" - } - }, - "misc": { - "currentVersion": "2.5.1", - "lockNotebookLayout": false - }, - "similarity": { - "hideSimilar": false, - "hideSimilarMaxDelay": 30, - "hideSimilarMaxMessagesToCheck": 5, - "similarityEnabled": false - }, - "ui": { - "lastSelectChannelTab": 0, - "lastSelectIrcConn": -1 - } - } - ''; - # home.file.".local/share/chatterino/Settings/settings.json".text = builtins.toJSON { - # hotkeys = { - # addedDefaults = [ - # "change channel" - # "close popup window" - # "create clip" - # "delete" - # "emote picker" - # "focus down" - # "focus left" - # "focus right" - # "focus up" - # "go to end of input" - # "go to end of input with selection" - # "go to start of input" - # "go to start of input with selection" - # "new popup window" - # "new popup window from tab" - # "new split" - # "new tab" - # "next message" - # "open debug popup" - # "open quick switcher" - # "open settings" - # "popup accept" - # "popup focus search box" - # "popup reject" - # "popup scroll down" - # "popup scroll up" - # "popup select last tab" - # "popup select next tab" - # "popup select previous tab" - # "popup select tab #1" - # "popup select tab #2" - # "popup select tab #3" - # "popup select tab #4" - # "popup select tab #5" - # "popup select tab #6" - # "popup select tab #7" - # "popup select tab #8" - # "previous message" - # "reconnect" - # "reload emotes" - # "remove tab" - # "reopen split" - # "scroll page down" - # "scroll page up" - # "scroll to bottom" - # "scroll to top" - # "select last tab" - # "select next tab" - # "select previous tab" - # "select tab #1" - # "select tab #2" - # "select tab #3" - # "select tab #4" - # "select tab #5" - # "select tab #6" - # "select tab #7" - # "select tab #8" - # "send message" - # "send message and keep text" - # "show global search" - # "show search" - # "toggle live tabs only" - # "toggle local r9k" - # "toggle tab visibility" - # "zoom in" - # "zoom out" - # "zoom reset" - # ]; - # "close popup window" = { - # action = "delete"; - # keySequence = "Esc"; - # category = "popupWindow"; - # arguments = [ ]; - # }; - # "popup accept" = { - # action = "accept"; - # keySequence = "Return"; - # category = "popupWindow"; - # arguments = [ ]; - # }; - # "popup focus search box" = { - # action = "search"; - # keySequence = "Ctrl+F"; - # category = "popupWindow"; - # arguments = [ ]; - # }; - # "popup reject" = { - # action = "reject"; - # keySequence = "Esc"; - # category = "popupWindow"; - # arguments = [ ]; - # }; - # "popup scroll down" = { - # action = "scrollPage"; - # keySequence = "PgDown"; - # category = "popupWindow"; - # arguments = [ - # "down" - # ]; - # }; - # "popup scroll up" = { - # action = "scrollPage"; - # keySequence = "PgUp"; - # category = "popupWindow"; - # arguments = [ - # "up" - # ]; - # }; - # "popup select last tab" = { - # action = "openTab"; - # keySequence = "Ctrl+9"; - # category = "popupWindow"; - # arguments = [ - # "last" - # ]; - # }; - # "popup select next tab" = { - # action = "openTab"; - # keySequence = "Ctrl+Tab"; - # category = "popupWindow"; - # arguments = [ - # "next" - # ]; - # }; - # "popup select previous tab" = { - # action = "openTab"; - # keySequence = "Ctrl+Shift+Tab"; - # category = "popupWindow"; - # arguments = [ - # "previous" - # ]; - # }; - # "popup select tab #1" = { - # action = "openTab"; - # keySequence = "Ctrl+1"; - # category = "popupWindow"; - # arguments = [ - # "0" - # ]; - # }; - # "popup select tab #2" = { - # action = "openTab"; - # keySequence = "Ctrl+2"; - # category = "popupWindow"; - # arguments = [ - # "1" - # ]; - # }; - # "popup select tab #3" = { - # action = "openTab"; - # keySequence = "Ctrl+3"; - # category = "popupWindow"; - # arguments = [ - # "2" - # ]; - # }; - # "popup select tab #4" = { - # action = "openTab"; - # keySequence = "Ctrl+4"; - # category = "popupWindow"; - # arguments = [ - # "3" - # ]; - # }; - # "popup select tab #5" = { - # action = "openTab"; - # keySequence = "Ctrl+5"; - # category = "popupWindow"; - # arguments = [ - # "4" - # ]; - # }; - # "popup select tab #6" = { - # action = "openTab"; - # keySequence = "Ctrl+6"; - # category = "popupWindow"; - # arguments = [ - # "5" - # ]; - # }; - # "popup select tab #7" = { - # action = "openTab"; - # keySequence = "Ctrl+7"; - # category = "popupWindow"; - # arguments = [ - # "6" - # ]; - # }; - # "popup select tab #8" = { - # action = "openTab"; - # keySequence = "Ctrl+8"; - # category = "popupWindow"; - # arguments = [ - # "7" - # ]; - # }; - # "change channel" = { - # action = "changeChannel"; - # keySequence = "Ctrl+R"; - # category = "split"; - # arguments = [ ]; - # }; - # "create clip" = { - # action = "createClip"; - # keySequence = "Alt+X"; - # category = "split"; - # arguments = [ ]; - # }; - # delete = { - # action = "delete"; - # keySequence = "Ctrl+W"; - # category = "split"; - # arguments = [ ]; - # }; - # "focus down" = { - # action = "focus"; - # keySequence = "Alt+Down"; - # category = "split"; - # arguments = [ - # "down" - # ]; - # }; - # "focus left" = { - # action = "focus"; - # keySequence = "Alt+Left"; - # category = "split"; - # arguments = [ - # "left" - # ]; - # }; - # "focus right" = { - # action = "focus"; - # keySequence = "Alt+Right"; - # category = "split"; - # arguments = [ - # "right" - # ]; - # }; - # "focus up" = { - # action = "focus"; - # keySequence = "Alt+Up"; - # category = "split"; - # arguments = [ - # "up" - # ]; - # }; - # "open debug popup" = { - # action = "debug"; - # keySequence = "F10"; - # category = "split"; - # arguments = [ ]; - # }; - # reconnect = { - # action = "reconnect"; - # keySequence = "Ctrl+F5"; - # category = "split"; - # arguments = [ ]; - # }; - # "reload emotes" = { - # action = "reloadEmotes"; - # keySequence = "F5"; - # category = "split"; - # arguments = [ ]; - # }; - # "scroll page down" = { - # action = "scrollPage"; - # keySequence = "PgDown"; - # category = "split"; - # arguments = [ - # "down" - # ]; - # }; - # "scroll page up" = { - # action = "scrollPage"; - # keySequence = "PgUp"; - # category = "split"; - # arguments = [ - # "up" - # ]; - # }; - # "scroll to bottom" = { - # action = "scrollToBottom"; - # keySequence = "Ctrl+End"; - # category = "split"; - # arguments = [ ]; - # }; - # "scroll to top" = { - # action = "scrollToTop"; - # keySequence = "Ctrl+Home"; - # category = "split"; - # arguments = [ ]; - # }; - # "show global search" = { - # action = "showGlobalSearch"; - # keySequence = "Ctrl+Shift+F"; - # category = "split"; - # arguments = [ ]; - # }; - # "show search" = { - # action = "showSearch"; - # keySequence = "Ctrl+F"; - # category = "split"; - # arguments = [ ]; - # }; - # "emote picker" = { - # action = "openEmotesPopup"; - # keySequence = "Ctrl+E"; - # category = "splitInput"; - # arguments = [ ]; - # }; - # "go to end of input" = { - # action = "cursorToEnd"; - # keySequence = "End"; - # category = "splitInput"; - # arguments = [ - # "withoutSelection" - # ]; - # }; - # "go to end of input with selection" = { - # action = "cursorToEnd"; - # keySequence = "Shift+End"; - # category = "splitInput"; - # arguments = [ - # "withSelection" - # ]; - # }; - # "go to start of input" = { - # action = "cursorToStart"; - # keySequence = "Home"; - # category = "splitInput"; - # arguments = [ - # "withoutSelection" - # ]; - # }; - # "go to start of input with selection" = { - # action = "cursorToStart"; - # keySequence = "Shift+Home"; - # category = "splitInput"; - # arguments = [ - # "withSelection" - # ]; - # }; - # "next message" = { - # action = "nextMessage"; - # keySequence = "Down"; - # category = "splitInput"; - # arguments = [ ]; - # }; - # "previous message" = { - # action = "previousMessage"; - # keySequence = "Up"; - # category = "splitInput"; - # arguments = [ ]; - # }; - # "send message" = { - # action = "sendMessage"; - # keySequence = "Return"; - # category = "splitInput"; - # arguments = [ ]; - # }; - # "send message and keep text" = { - # action = "sendMessage"; - # keySequence = "Ctrl+Return"; - # category = "splitInput"; - # arguments = [ - # "keepInput" - # ]; - # }; - # "new popup window" = { - # action = "popup"; - # keySequence = "Ctrl+N"; - # category = "window"; - # arguments = [ - # "split" - # ]; - # }; - # "new popup window from tab" = { - # action = "popup"; - # keySequence = "Ctrl+Shift+N"; - # category = "window"; - # arguments = [ - # "window" - # ]; - # }; - # "new split" = { - # action = "newSplit"; - # keySequence = "Ctrl+T"; - # category = "window"; - # arguments = [ ]; - # }; - # "new tab" = { - # action = "newTab"; - # keySequence = "Ctrl+Shift+T"; - # category = "window"; - # arguments = [ ]; - # }; - # "open quick switcher" = { - # action = "openQuickSwitcher"; - # keySequence = "Ctrl+K"; - # category = "window"; - # arguments = [ ]; - # }; - # "open settings" = { - # action = "openSettings"; - # keySequence = "Ctrl+P"; - # category = "window"; - # arguments = [ ]; - # }; - # "remove tab" = { - # action = "removeTab"; - # keySequence = "Ctrl+Shift+W"; - # category = "window"; - # arguments = [ ]; - # }; - # "reopen split" = { - # action = "reopenSplit"; - # keySequence = "Ctrl+G"; - # category = "window"; - # arguments = [ ]; - # }; - # "select last tab" = { - # action = "openTab"; - # keySequence = "Ctrl+9"; - # category = "window"; - # arguments = [ - # "last" - # ]; - # }; - # "select next tab" = { - # action = "openTab"; - # keySequence = "Ctrl+Tab"; - # category = "window"; - # arguments = [ - # "next" - # ]; - # }; - # "select previous tab" = { - # action = "openTab"; - # keySequence = "Ctrl+Shift+Tab"; - # category = "window"; - # arguments = [ - # "previous" - # ]; - # }; - # "select tab #1" = { - # action = "openTab"; - # keySequence = "Ctrl+1"; - # category = "window"; - # arguments = [ - # "0" - # ]; - # }; - # "select tab #2" = { - # action = "openTab"; - # keySequence = "Ctrl+2"; - # category = "window"; - # arguments = [ - # "1" - # ]; - # }; - # "select tab #3" = { - # action = "openTab"; - # keySequence = "Ctrl+3"; - # category = "window"; - # arguments = [ - # "2" - # ]; - # }; - # "select tab #4" = { - # action = "openTab"; - # keySequence = "Ctrl+4"; - # category = "window"; - # arguments = [ - # "3" - # ]; - # }; - # "select tab #5" = { - # action = "openTab"; - # keySequence = "Ctrl+5"; - # category = "window"; - # arguments = [ - # "4" - # ]; - # }; - # "select tab #6" = { - # action = "openTab"; - # keySequence = "Ctrl+6"; - # category = "window"; - # arguments = [ - # "5" - # ]; - # }; - # "select tab #7" = { - # action = "openTab"; - # keySequence = "Ctrl+7"; - # category = "window"; - # arguments = [ - # "6" - # ]; - # }; - # "select tab #8" = { - # action = "openTab"; - # keySequence = "Ctrl+8"; - # category = "window"; - # arguments = [ - # "7" - # ]; - # }; - # "toggle live tabs only" = { - # action = "setTabVisibility"; - # keySequence = "Ctrl+Shift+L"; - # category = "window"; - # arguments = [ - # "toggleLiveOnly" - # ]; - # }; - # "toggle local r9k" = { - # action = "toggleLocalR9K"; - # keySequence = "Ctrl+H"; - # category = "window"; - # arguments = [ ]; - # }; - # "toggle tab visibility" = { - # action = "setTabVisibility"; - # keySequence = "Ctrl+U"; - # category = "window"; - # arguments = [ - # "toggle" - # ]; - # }; - # "zoom in" = { - # action = "zoom"; - # keySequence = "Ctrl++"; - # category = "window"; - # arguments = [ - # "in" - # ]; - # }; - # "zoom out" = { - # action = "zoom"; - # keySequence = "Ctrl+-"; - # category = "window"; - # arguments = [ - # "out" - # ]; - # }; - # "zoom reset" = { - # action = "zoom"; - # keySequence = "Ctrl+0"; - # category = "window"; - # arguments = [ - # "reset" - # ]; - # }; - # }; - # misc = { - # currentVersion = "2.5.1"; - # lockNotebookLayout = false; - # }; - # ui = { - # lastSelectChannelTab = 0; - # lastSelectIrcConn = -1; - # }; - # appearance = { - # theme = { - # name = "Black"; - # }; - # tabVisibility = 1; - # smoothScrollingNewMessages = true;o - # currentFontFamily = rice.font.base.name; - # messages = { - # alternateMessageBackground = true; - # showTimestamps = false; - # timestampFormat = "h =mm"; - # separateMessages = true; - # lastMessagePattern = 10; - # lastMessageColor = "#ff7f0002"; - # usernameDisplayMode = 1; - # }; - # currentFontSize = 12; - # splitheader = { - # showUptime = true; - # showViewerCount = true; - # showGame = true; - # showTitle = true; - # }; - # boldScale = 63.0; - # }; - # accounts = secrets.chatterino.accounts; - # behaviour = { - # pauseOnHoverDuration = 5.0; - # usernameRightClickBehavior = 0; - # usernameRightClickBehaviorWithModifier = 1; - # showJoins = false; - # }; - # highlighting = { - # selfMessageHighlight = { - # enabled = true; - # color = "#73008cff"; - # }; - # badges = [ - # { - # name = "broadcaster"; - # displayName = "Broadcaster"; - # showInMentions = false; - # alert = false; - # sound = false; - # soundUrl = ""; - # color = "#7f7f3f49"; - # } - # { - # name = "admin"; - # displayName = "Admin"; - # showInMentions = false; - # alert = false; - # sound = false; - # soundUrl = ""; - # color = "#7f7f3f49"; - # } - # { - # name = "staff"; - # displayName = "Staff"; - # showInMentions = false; - # alert = false; - # sound = false; - # soundUrl = ""; - # color = "#7f7f3f49"; - # } - # { - # name = "moderator"; - # displayName = "Moderator"; - # showInMentions = false; - # alert = false; - # sound = false; - # soundUrl = ""; - # } - # { - # name = "vip"; - # displayName = "VIP"; - # showInMentions = false; - # alert = false; - # sound = false; - # soundUrl = ""; - # color = "#7f7f3578"; - # } - # ]; - # }; - # emotes = { - # removeSpacesBetweenEmotes = false; - # showUnlistedSevenTVEmotes = true; - # }; - # similarity = { - # similarityEnabled = false; - # hideSimilar = false; - # hideSimilarMaxDelay = 30; - # hideSimilarMaxMessagesToCheck = 5; - # }; - # }; - - - - home.file.".local/share/chatterino/Settings/window-layout.json".text = builtins.toJSON { - windows = [ - { - emotePopup = { - x = 0; - y = 0; - }; - height = 569; - state = "maximized"; - tabs = map tabber channels; - type = "main"; - width = 943; - x = 0; - y = 0; - } - ]; + ]; + }; + }; }; } diff --git a/home-modules/direnv.nix b/home-modules/direnv.nix index d6eff69..3cd677c 100755 --- a/home-modules/direnv.nix +++ b/home-modules/direnv.nix @@ -1,5 +1,4 @@ { lib, user, ... }: -lib.mkIf (user != "tv") { programs = { direnv = { diff --git a/home-modules/fish.nix b/home-modules/fish.nix index 1bc84a6..3f576e3 100755 --- a/home-modules/fish.nix +++ b/home-modules/fish.nix @@ -1,5 +1,4 @@ { pkgs, lib, rice, user, ... }: -lib.mkIf (user != "tv") { home.packages = with pkgs; [ fish diff --git a/home-modules/foot.nix b/home-modules/foot.nix deleted file mode 100644 index 7857be2..0000000 --- a/home-modules/foot.nix +++ /dev/null @@ -1,270 +0,0 @@ -{ config, pkgs, rice, lib, user, ... }: -lib.mkIf (user != "tv") -{ - home.packages = with pkgs; [ - foot - ]; - - programs.foot = { - enable = true; - # background = rice.color.background; - # foreground = rice.color.foreground; - # cursor = rice.color.foreground; - # color0 = rice.color.black.base; - # color8 = rice.color.black.bright; - # color1 = rice.color.red.base; - # color9 = rice.color.red.bright; - # color2 = rice.color.green.base; - # color10 = rice.color.green.bright; - # color3 = rice.color.yellow.base; - # color11 = rice.color.yellow.bright; - # color4 = rice.color.blue.base; - # color12 = rice.color.blue.bright; - # color5 = rice.color.magenta.base; - # color13 = rice.color.magenta.bright; - # color6 = rice.color.cyan.base; - # color14 = rice.color.cyan.bright; - # color7 = rice.color.white.base; - # color15 = rice.color.white.bright; - # background_opacity = builtins.toString rice.transparency; - # window_padding_width = 5; - # remember_window_size = false; - - # settings = { - # main = { - # shell = ''$SHELL (if set, otherwise user's default shell from /etc/passwd)''; - # term = ''foot (or xterm-256color if built with -Dterminfo=disabled)''; - # login-shell = ''no''; - - # # app-id = ''foot''; - # title = ''foot''; - # locked-title = ''no''; - - # font = ''${rice.font.code.name}:size=8''; - # font-size-adjustment = ''0.5''; - # line-height = ""; - # letter-spacing = ''0''; - # horizontal-letter-offset = ''0''; - # vertical-letter-offset = ''0''; - # underline-offset = ""; - # underline-thickness = ""; - # # box-drawings-uses-font-glyphs = "no"; - # # dpi-aware = ''no''; - - # # initial-window-size-pixels = ''700x500''; - # # initial-window-size-chars = ""; - # # initial-window-mode = ''windowed''; - # pad = ''5x5''; - # resize-by-cells = ''yes''; - # resize-keep-grid = ''yes''; - # resize-delay-ms = ''100''; - - # # bold-text-in-bright = false; - # word-delimiters = '',│`|:"'()[]{}<>''; - # selection-target = ''primary''; - # workers = ""; - # utmp-helper = ''/usr/lib/utempter/utempter''; - # # environment = { - # # name = ''value''; - # # }; - - # }; - # bell = { - # urgent = ''no''; - # notify = ''no''; - # visual = ''no''; - # command = ''''; - # command-focused = ''no''; - # }; - # desktop-notifications = { - # command = ''notify-send --wait --app-name ''${app-id} --icon ''${app-id} --category ''${category} --urgency ''${urgency} --expire-time ''${expire-time} --hint STRING:image-path:''${icon} --hint BOOLEAN:suppress-sound:''${muted} --hint STRING:sound-name:''${sound-name} --replace-id ''${replace-id} ''${action-argument} --print-id -- ''${title} ''${body}''; - # command-action-argument = ''--action ''${action-name}=''${action-label}''; - # close = ''""''; - # inhibit-when-focused = ''yes''; - - # }; - # scrollback = { - # lines = ''1000''; - # multiplier = ''3.0''; - # indicator-position = ''relative''; - # indicator-format = ''""''; - # }; - # url = { - # launch = ''xdg-open ''${url}''; - # label-letters = ''sadfjklewcmpgh''; - # osc8-underline = ''url-mode''; - # protocols = ''http, https, ftp, ftps, file, gemini, gopher''; - # uri-characters = ''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]''; - # }; - # cursor = { - # style = ''block''; - # color = ""; - # blink = ''no''; - # blink-rate = ''500''; - # beam-thickness = ''1.5''; - # underline-thickness = ""; - # }; - # mouse = { - # hide-when-typing = ''no''; - # alternate-scroll-mode = ''yes''; - # }; - # touch = { - # long-press-delay = ''400''; - # }; - # colors = { - # alpha = ''1.0''; - # background = ''242424''; - # foreground = ''ffffff''; - # flash = ''7f7f00''; - # flash-alpha = ''0.5''; - - # # Normal/regular colors (color palette 0-7) - # regular0 = ''242424''; - # regular1 = ''f62b5a''; - # regular2 = ''47b413''; - # regular3 = ''e3c401''; - # regular4 = ''24acd4''; - # regular5 = ''f2affd''; - # regular6 = ''13c299''; - # regular7 = ''e6e6e6''; - - # # Bright colors (color palette 8-15) - # bright0 = ''616161''; - # bright1 = ''ff4d51''; - # bright2 = ''35d450''; - # bright3 = ''e9e836''; - # bright4 = ''5dc5f8''; - # bright5 = ''feabf2''; - # bright6 = ''24dfc4''; - # bright7 = ''ffffff''; - - # # dimmed colors (see foot.ini(5) man page) - # # dim0 = ""; - # # ... - # # dim7 = ""; - - # # The remaining 256-color palette - # # 16 = <256-color palette #16> - # # ... - # # 255 = <256-color palette #255> - - # # Misc colors - # selection-foreground = ""; - # selection-background = ""; - # jump-labels = " "; - # scrollback-indicator = " "; - # search-box-no-match = " "; - # search-box-match = " "; - # urls = ""; - # }; - # csd = { - # preferred = ''server''; - # size = ''26''; - # font = ""; - # color = ""; - # hide-when-maximized = ''no''; - # double-click-to-maximize = ''yes''; - # border-width = ''0''; - # border-color = ""; - # button-width = ''26''; - # button-color = ""; - # button-minimize-color = ""; - # button-maximize-color = ""; - # button-close-color = ""; - # }; - # key-bindings = { - # scrollback-up-page = ''Shift+Page_Up''; - # scrollback-up-half-page = ''none''; - # scrollback-up-line = ''none''; - # scrollback-down-page = ''Shift+Page_Down''; - # scrollback-down-half-page = ''none''; - # scrollback-down-line = ''none''; - # scrollback-home = ''none''; - # scrollback-end = ''none''; - # clipboard-copy = ''Control+Shift+c XF86Copy''; - # clipboard-paste = ''Control+Shift+v XF86Paste''; - # primary-paste = ''Shift+Insert''; - # search-start = ''Control+Shift+r''; - # font-increase = ''Control+plus Control+equal Control+KP_Add''; - # font-decrease = ''Control+minus Control+KP_Subtract''; - # font-reset = ''Control+0 Control+KP_0''; - # spawn-terminal = ''Control+Shift+n''; - # minimize = ''none''; - # maximize = ''none''; - # fullscreen = ''none''; - # pipe-visible = ''[sh -c "xurls | fuzzel | xargs -r firefox"] none''; - # pipe-scrollback = ''[sh -c "xurls | fuzzel | xargs -r firefox"] none''; - # pipe-selected = ''[xargs -r firefox] none''; - # pipe-command-output = ''[wl-copy] none''; - # show-urls-launch = ''Control+Shift+o''; - # show-urls-copy = ''none''; - # show-urls-persistent = ''none''; - # prompt-prev = ''Control+Shift+z''; - # prompt-next = ''Control+Shift+x''; - # unicode-input = ''Control+Shift+u''; - # noop = ''none''; - # }; - # search-bindings = { - # cancel = ''Control+g Control+c Escape''; - # commit = ''Return''; - # find-prev = ''Control+r''; - # find-next = ''Control+s''; - # cursor-left = ''Left Control+b''; - # cursor-left-word = ''Control+Left Mod1+b''; - # cursor-right = ''Right Control+f''; - # cursor-right-word = ''Control+Right Mod1+f''; - # cursor-home = ''Home Control+a''; - # cursor-end = ''End Control+e''; - # delete-prev = ''BackSpace''; - # delete-prev-word = ''Mod1+BackSpace Control+BackSpace''; - # delete-next = ''Delete''; - # delete-next-word = ''Mod1+d Control+Delete''; - # extend-char = ''Shift+Right''; - # extend-to-word-boundary = ''Control+w Control+Shift+Right''; - # extend-to-next-whitespace = ''Control+Shift+w''; - # extend-line-down = ''Shift+Down''; - # extend-backward-char = ''Shift+Left''; - # extend-backward-to-word-boundary = ''Control+Shift+Left''; - # extend-backward-to-next-whitespace = ''none''; - # extend-line-up = ''Shift+Up''; - # clipboard-paste = ''Control+v Control+Shift+v Control+y XF86Paste''; - # primary-paste = ''Shift+Insert''; - # unicode-input = ''none''; - # quit = ''none''; - # scrollback-up-page = ''Shift+Page_Up''; - # scrollback-up-half-page = ''none''; - # scrollback-up-line = ''none''; - # scrollback-down-page = ''Shift+Page_Down''; - # scrollback-down-half-page = ''none''; - # scrollback-down-line = ''none''; - # scrollback-home = ''none''; - # scrollback-end = ''none''; - # }; - # url-bindings = { - # cancel = ''Control+g Control+c Control+d Escape''; - # toggle-url-visible = ''t''; - # }; - # text-bindings = { - # "\x03" = ''Mod4+c''; - # }; - # mouse-bindings = { - # scrollback-up-mouse = ''BTN_WHEEL_BACK''; - # scrollback-down-mouse = ''BTN_WHEEL_FORWARD''; - # font-increase = ''Control+BTN_WHEEL_BACK''; - # font-decrease = ''Control+BTN_WHEEL_FORWARD''; - # selection-override-modifiers = ''Shift''; - # primary-paste = ''BTN_MIDDLE''; - # select-begin = ''BTN_LEFT''; - # select-begin-block = ''Control+BTN_LEFT''; - # select-extend = ''BTN_RIGHT''; - # select-extend-character-wise = ''Control+BTN_RIGHT''; - # select-word = ''BTN_LEFT-2''; - # select-word-whitespace = ''Control+BTN_LEFT-2''; - # select-quote = ''BTN_LEFT-3''; - # select-row = ''BTN_LEFT-4''; - - # # vim: ft = ''dosini''; - # }; - # }; - }; -} diff --git a/home-modules/git.nix b/home-modules/git.nix index 2622e48..48f5287 100755 --- a/home-modules/git.nix +++ b/home-modules/git.nix @@ -1,5 +1,4 @@ -{ pkgs, lib, user, rice, ... }: -lib.mkIf (user != "tv") +{ pkgs, rice, ... }: { home.packages = with pkgs; [ git @@ -11,9 +10,7 @@ lib.mkIf (user != "tv") # List of directories to check directories=( "$HOME/nix-dots" - "$HOME/shared/nx-obsidian-vault" - "$HOME/shared/HSMW/Praxis/BCAM/bolt-llmserver" - "$HOME/shared/HSMW/Praxis/BCAM/bcam-tools" + "$HOME/obsidian-vault" "$HOME/Pictures/wallpapers" ) echo "" diff --git a/home-modules/gpg.nix b/home-modules/gpg.nix index 48dc298..8f1931e 100644 --- a/home-modules/gpg.nix +++ b/home-modules/gpg.nix @@ -9,8 +9,7 @@ ]); # services.pcscd.enable = true; - services.gpg-agent = - let + services.gpg-agent = let min2sec = min: (min * 60); in { enable = true; @@ -22,7 +21,7 @@ enableFishIntegration = true; defaultCacheTtlSsh = min2sec 60; defaultCacheTtl = min2sec 30; - # pinentryPackage = pkgs.pinentry-gtk2; + # pinentryPackage = pkgs.pinentry-curses; }; home.file.".gnupg/gpg.conf".text = '' diff --git a/home-modules/gtk.nix b/home-modules/gtk.nix index d581fcb..ef8a728 100755 --- a/home-modules/gtk.nix +++ b/home-modules/gtk.nix @@ -1,5 +1,4 @@ -{ config, pkgs, lib, rice, user, ... }: -let +{ config, pkgs, lib, rice, user, ... }: let # theme-name = "Colloid-Pink-Dark-Compact"; # theme-package = pkgs.colloid-gtk-theme.override { # themeVariants = [ "pink" ]; @@ -14,9 +13,7 @@ let tweaks = [ "rimless" "black" ]; variant = "macchiato"; }; -in -lib.mkIf (user != "tv") -{ +in { home.packages = with pkgs; [ # gnome.gnome-themes-extra # gnome.adwaita-icon-theme diff --git a/home-modules/hyprland-autoname-workspaces.nix b/home-modules/hyprland-autoname-workspaces.nix index e9aa91a..4f33622 100755 --- a/home-modules/hyprland-autoname-workspaces.nix +++ b/home-modules/hyprland-autoname-workspaces.nix @@ -1,109 +1,107 @@ -{ pkgs, lib, user, ... }: -lib.mkIf (user != "tv") +{ pkgs, ... }: { - home.packages = [ - pkgs.hyprland-autoname-workspaces - ]; - - home.file.".config/hyprland-autoname-workspaces/config.toml".text = '' - version = "1.1.14" + home = { + packages = with pkgs; [ hyprland-autoname-workspaces ]; + file.".config/hyprland-autoname-workspaces/config.toml".text = '' + version = "1.1.14" - [class] - VirtualBox = "" - steam = "󰓓" - "VirtualBox Manager" = "" - "com.obsproject.Studio" = "" - "[Ff]irefox" = "󰈹" - "[Tt]hunderbird" = "" - pcbnew = "" - ".*.exe" = "" - Element = "󰘨" - Signal = "󱅵" - Gimp = "" - VSCodium = "󰨞" - "[sS]potify" = "" - virt-manager = "" - lutris = "󰊗" - DEFAULT = "{class}" - "epicgameslauncher.exe" = "󰯷" - "[Cc]ode" = "󰨞" - "galaxyclient.exe" = "󰮡" - pavucontrol = "󰕾" - "Tor Browser" = "󰾔" - mpv = "" - chatterino = "" - libreoffice-writer = "" - kitty = "" - "cyberpunk2077.exe" = "󰾲" - KiCad = "" - "[tT]hunar" = "" - "riotclientux.exe" = "󰰌" - libreoffice-calc = "" - "org.remmina.Remmina" = "󰢹" - "org.inkscape.Inkscape" = "󰕙" - "VirtualBox Machine" = "" - Bitwarden = "" - "[gG]imp-.*" = "" - Chromium = "" - obsidian = "󰠮" - "leagueclientux.exe" = "󰰌" - zathura = "󰈦" - code-oss = "󰨞" - codium-url-handler = "󰨞" - discord = "󰙯" - vesktop = "󰙯" - blueman-manager = "󰂯" - Alacritty = "" - zoom = "󰬡" - spotify = "" + [class] + VirtualBox = "" + steam = "󰓓" + "VirtualBox Manager" = "" + "com.obsproject.Studio" = "" + "[Ff]irefox" = "󰈹" + "[Tt]hunderbird" = "" + pcbnew = "" + ".*.exe" = "" + Element = "󰘨" + Signal = "󱅵" + Gimp = "" + VSCodium = "󰨞" + "[sS]potify" = "" + virt-manager = "" + lutris = "󰊗" + DEFAULT = "{class}" + "epicgameslauncher.exe" = "󰯷" + "[Cc]ode" = "󰨞" + "galaxyclient.exe" = "󰮡" + pavucontrol = "󰕾" + "Tor Browser" = "󰾔" + mpv = "" + chatterino = "" + libreoffice-writer = "" + kitty = "" + "cyberpunk2077.exe" = "󰾲" + KiCad = "" + "[tT]hunar" = "" + "riotclientux.exe" = "󰰌" + libreoffice-calc = "" + "org.remmina.Remmina" = "󰢹" + "org.inkscape.Inkscape" = "󰕙" + "VirtualBox Machine" = "" + Bitwarden = "" + "[gG]imp-.*" = "" + Chromium = "" + obsidian = "󰠮" + "leagueclientux.exe" = "󰰌" + zathura = "󰈦" + code-oss = "󰨞" + codium-url-handler = "󰨞" + discord = "󰙯" + vesktop = "󰙯" + blueman-manager = "󰂯" + Alacritty = "" + zoom = "󰬡" + spotify = "" - [class_active] - "(?i)ExampleOneTerm" = "icon" + [class_active] + "(?i)ExampleOneTerm" = "icon" - [initial_class] + [initial_class] - [initial_class_active] + [initial_class_active] - [workspaces_name] + [workspaces_name] - [title_in_class] + [title_in_class] - [title_in_class_active] + [title_in_class_active] - [title_in_initial_class] + [title_in_initial_class] - [title_in_initial_class_active] + [title_in_initial_class_active] - [initial_title_in_class] + [initial_title_in_class] - [initial_title] - "Spotify Premium" = "" + [initial_title] + "Spotify Premium" = "" - [initial_title_in_class_active] + [initial_title_in_class_active] - [initial_title_in_initial_class] + [initial_title_in_initial_class] - [initial_title_in_initial_class_active] + [initial_title_in_initial_class_active] - [exclude] - aProgram = "^$" - "" = "^$" - "(?i)fcitx" = ".*" - "[Ss]team" = "^(Friends List.*)?$" - "explorer.exe" = ".*" - "(?i)TestApp" = "" + [exclude] + aProgram = "^$" + "" = "^$" + "(?i)fcitx" = ".*" + "[Ss]team" = "^(Friends List.*)?$" + "explorer.exe" = ".*" + "(?i)TestApp" = "" - [format] - dedup = false - dedup_inactive_fullscreen = false - delim = " " - workspace = "{id}:{clients}" - workspace_empty = "{id}" - client = "{icon}" - client_fullscreen = "{icon}" - client_active = "{icon}" - client_dup = "{icon}{counter_sup}" - client_dup_active = "*{icon}*{delim}{icon}{counter_unfocused_sup}" - client_dup_fullscreen = "[{icon}]{delim}{icon}{counter_unfocused_sup}" - ''; + [format] + dedup = false + dedup_inactive_fullscreen = false + delim = " " + workspace = "{id}:{clients}" + workspace_empty = "{id}" + client = "{icon}" + client_fullscreen = "{icon}" + client_active = "{icon}" + client_dup = "{icon}{counter_sup}" + client_dup_active = "*{icon}*{delim}{icon}{counter_unfocused_sup}" + client_dup_fullscreen = "[{icon}]{delim}{icon}{counter_unfocused_sup}" + ''; + }; } diff --git a/home-modules/hyprland.nix b/home-modules/hyprland.nix index 5e9661f..356886a 100755 --- a/home-modules/hyprland.nix +++ b/home-modules/hyprland.nix @@ -46,9 +46,7 @@ let }; }; }; -in -lib.mkIf (user != "tv") -{ +in { home.packages = (with pkgs; [ # hyprland itself is a system package hyprland-protocols diff --git a/home-modules/kitty.nix b/home-modules/kitty.nix index 8def95c..8a99779 100755 --- a/home-modules/kitty.nix +++ b/home-modules/kitty.nix @@ -1,37 +1,32 @@ -{ config, pkgs, rice, lib, user, ... }: -lib.mkIf (user != "tv") +{ rice, ... }: { - home.packages = with pkgs; [ - kitty - ]; - programs.kitty = { enable = true; font = { name = rice.font.code.name2; package = rice.font.code.package; }; - settings = { - background = rice.color.background; - foreground = rice.color.foreground; - cursor = rice.color.foreground; - color0 = rice.color.black.base; - color8 = rice.color.black.bright; - color1 = rice.color.red.base; - color9 = rice.color.red.bright; - color2 = rice.color.green.base; - color10 = rice.color.green.bright; - color3 = rice.color.yellow.base; - color11 = rice.color.yellow.bright; - color4 = rice.color.blue.base; - color12 = rice.color.blue.bright; - color5 = rice.color.magenta.base; - color13 = rice.color.magenta.bright; - color6 = rice.color.cyan.base; - color14 = rice.color.cyan.bright; - color7 = rice.color.white.base; - color15 = rice.color.white.bright; - background_opacity = builtins.toString rice.transparency; + settings = with rice.color; { + background = background; + foreground = foreground; + cursor = foreground; + color0 = black.base; + color8 = black.bright; + color1 = red.base; + color9 = red.bright; + color2 = green.base; + color10 = green.bright; + color3 = yellow.base; + color11 = yellow.bright; + color4 = blue.base; + color12 = blue.bright; + color5 = magenta.base; + color13 = magenta.bright; + color6 = cyan.base; + color14 = cyan.bright; + color7 = white.base; + color15 = white.bright; + background_opacity = builtins.toString rice.transparency; window_padding_width = 5; remember_window_size = false; }; diff --git a/home-modules/mako.nix b/home-modules/mako.nix index 25431be..0d9e4c2 100755 --- a/home-modules/mako.nix +++ b/home-modules/mako.nix @@ -1,10 +1,6 @@ -{ pkgs, rice, lib, user, ... }: -lib.mkIf (user != "tv") +{ pkgs, rice, ... }: { - home.packages = [ - pkgs.mako - pkgs.libnotify - ]; + home.packages = with pkgs; [ libnotify ]; services.mako = with rice; { enable = true; defaultTimeout = 5000; # in ms diff --git a/home-modules/nx-gcal-event.nix b/home-modules/nx-gcal-event.nix index bc8f583..ac84f96 100755 --- a/home-modules/nx-gcal-event.nix +++ b/home-modules/nx-gcal-event.nix @@ -1,9 +1,6 @@ -{ config, pkgs, secrets, lib, user, ... }: -let - sep = " "; -in -lib.mkIf (user != "tv") -{ +{ config, pkgs, secrets, ... }: let + sep = " "; +in { home = { file."${config.xdg.dataHome}/nx-gcal-event-credentials.json".text = '' { @@ -26,7 +23,7 @@ lib.mkIf (user != "tv") # (pkgs.python311.withPackages (python-pkgs: [ # python-pkgs.google # ])) - (writeScriptBin "nx_gcal_event" '' + (writeScriptBin "nx_gcal_event" /* python */ '' #!${pkgs.python3}/bin/python3 import datetime import os diff --git a/home-modules/nx2site.nix b/home-modules/nx2site.nix index 89c0eae..821d1a0 100644 --- a/home-modules/nx2site.nix +++ b/home-modules/nx2site.nix @@ -1,5 +1,4 @@ -{ pkgs, lib, host, user, ... }: -lib.mkIf (host == "NxACE" && user != "tv") +{ pkgs, ... }: { home.packages = with pkgs; [ (writeShellApplication { diff --git a/home-modules/office.nix b/home-modules/office.nix index 91d866c..830f7c2 100755 --- a/home-modules/office.nix +++ b/home-modules/office.nix @@ -1,5 +1,4 @@ { config, pkgs, lib, user, ... }: -lib.mkIf (user != "tv") { home.packages = with pkgs; [ libreoffice diff --git a/home-modules/programming/python.nix b/home-modules/programming/python.nix index 871e903..da29ebd 100755 --- a/home-modules/programming/python.nix +++ b/home-modules/programming/python.nix @@ -1,21 +1,20 @@ -{ config, pkgs, lib, user, ... }: -let - python-with-packages = pkgs.python3.withPackages (pp: with pp; [ - ipython - pipdeptree - requests - google google-api-python-client google-auth-httplib2 google-auth-oauthlib - debugpy - black - ]); -in -lib.mkIf (user != "tv") +{ pkgs, ... }: { - home.packages = [ - python-with-packages - ]; - - home.sessionVariables = { - PYTHONPATH = "${python-with-packages}/${python-with-packages.sitePackages}"; + home = let + python-with-packages = pkgs.python3.withPackages (pp: with pp; [ + ipython + pipdeptree + requests + google google-api-python-client google-auth-httplib2 google-auth-oauthlib + debugpy + black + ]); + in { + packages = [ + python-with-packages + ]; + sessionVariables = { + PYTHONPATH = "${python-with-packages}/${python-with-packages.sitePackages}"; + }; }; } diff --git a/home-modules/qt.nix b/home-modules/qt.nix index b78e18d..130d3fa 100755 --- a/home-modules/qt.nix +++ b/home-modules/qt.nix @@ -1,5 +1,4 @@ { pkgs, lib, user, ... }: -lib.mkIf (user != "tv") { qt = { platformTheme = "gtk"; diff --git a/home-modules/rofi.nix b/home-modules/rofi.nix index 6b02510..b342b50 100755 --- a/home-modules/rofi.nix +++ b/home-modules/rofi.nix @@ -1,114 +1,113 @@ -{ pkgs, rice, lib, user, ... }: -let - trdr = "${rice.lib.float-to-drune rice.transparency}"; -in -lib.mkIf (user != "tv") -{ +{ pkgs, rice, ... }: { home.packages = with pkgs; [ rofi-wayland ]; - home.file.".config/rofi/config.rasi".text = '' - configuration { - show-icons: false; - display-drun: ""; - disable-history: false; - drun-display-format: "{name} [({generic})] [({exec})]"; - } + home.file = let + trdr = "${rice.lib.float-to-drune rice.transparency}"; + in with rice.color; { + ".config/rofi/config.rasi".text = '' + configuration { + show-icons: false; + display-drun: ""; + disable-history: false; + drun-display-format: "{name} [({generic})] [({exec})]"; + } - * { - font: "${rice.font.code.name2} 12"; - foreground: ${rice.color.foreground}; - background-color: ${rice.color.background}${trdr}; - padding: 0px; - margin: 0px; - spacing: 0px; - border-width: 0px; - } + * { + font: "${rice.font.code.name2} 12"; + foreground: ${foreground}; + background-color: ${background}${trdr}; + padding: 0px; + margin: 0px; + spacing: 0px; + border-width: 0px; + } - #window { - background-color: ${rice.color.background}${trdr}; - border: ${builtins.toString rice.border-width}px; - border-radius: ${builtins.toString rice.rounding}; - border-color: ${rice.color.border}; - } - #mainbox { - border: 0; - padding: 0; - } - #message { - border: 0px; - } - #textbox { - text-color: ${rice.color.foreground}; - } - #listview { - fixed-height: 0; - border: 0px; - spacing: 0px ; - scrollbar: false; - padding: 0px; - } + #window { + background-color: ${background}${trdr}; + border: ${builtins.toString rice.border-width}px; + border-radius: ${builtins.toString rice.rounding}; + border-color: ${border}; + } + #mainbox { + border: 0; + padding: 0; + } + #message { + border: 0px; + } + #textbox { + text-color: ${foreground}; + } + #listview { + fixed-height: 0; + border: 0px; + spacing: 0px ; + scrollbar: false; + padding: 0px; + } - #element { - border: 0; - padding: 0px; - border-radius: ${if rice.rounding > 0 then "2" else "0"}px; - } + #element { + border: 0; + padding: 0px; + border-radius: ${if rice.rounding > 0 then "2" else "0"}px; + } - #element.normal.normal { background-color: ${rice.color.background}${trdr}; text-color: ${rice.color.accent.base}; } - #element.selected.normal { background-color: ${rice.color.tertiary.base}${trdr}; text-color: ${rice.color.background}; } - #element.alternate.normal { background-color: ${rice.color.background}${trdr}; text-color: ${rice.color.secondary.base}; } + #element.normal.normal { background-color: ${background}${trdr}; text-color: ${accent.base}; } + #element.selected.normal { background-color: ${tertiary.base}${trdr}; text-color: ${background}; } + #element.alternate.normal { background-color: ${background}${trdr}; text-color: ${secondary.base}; } - #scrollbar { - width: ${builtins.toString rice.border-width}px ; - border: 0; - handle-width: 8px ; - padding: 0; - } - #sidebar { - border: ${builtins.toString rice.border-width}px dash; - } - #button.selected { - text-color: ${rice.color.foreground}; - } - #inputbar { - spacing: 0; - text-color: ${rice.color.background}; - background-color: ${rice.color.accent.base}${trdr}; - padding: 0; - margine-bottom: 2px; - children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; - } - #prompt { - spacing: 0; - background-color: transparent; - text-color: ${rice.color.foreground}; - } - #textbox-prompt-colon { - expand: false; - str: ">"; - margin: 0px 0.3em 0em 0em ; - text-color: ${rice.color.background}; - background-color: transparent; - } - #case-indicator { - spacing: 0; - text-color: ${rice.color.foreground}; - background-color: transparent; - } - #entry { - spacing: 0; - text-color: ${rice.color.background}; - background-color: transparent; - placeholder: ""; - } + #scrollbar { + width: ${builtins.toString rice.border-width}px ; + border: 0; + handle-width: 8px ; + padding: 0; + } + #sidebar { + border: ${builtins.toString rice.border-width}px dash; + } + #button.selected { + text-color: ${foreground}; + } + #inputbar { + spacing: 0; + text-color: ${background}; + background-color: ${accent.base}${trdr}; + padding: 0; + margine-bottom: 2px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; + } + #prompt { + spacing: 0; + background-color: transparent; + text-color: ${foreground}; + } + #textbox-prompt-colon { + expand: false; + str: ">"; + margin: 0px 0.3em 0em 0em ; + text-color: ${background}; + background-color: transparent; + } + #case-indicator { + spacing: 0; + text-color: ${foreground}; + background-color: transparent; + } + #entry { + spacing: 0; + text-color: ${background}; + background-color: transparent; + placeholder: ""; + } - element-text, element-icon { - background-color: inherit; - text-color: inherit; - } - ''; + element-text, element-icon { + background-color: inherit; + text-color: inherit; + } + ''; + }; } diff --git a/home-modules/ssh.nix b/home-modules/ssh.nix index 5ad6d55..8420801 100755 --- a/home-modules/ssh.nix +++ b/home-modules/ssh.nix @@ -1,36 +1,32 @@ -{ config, pkgs, lib, system, user, allowed, secrets, ... }: -lib.mkIf (user != "tv") +{ pkgs, domain, ... }: { + home = { + packages = with pkgs; [ sshfs ]; + file.".ssh/config".text = '' + HOST nxace + HostName ${domain} + User nx2 + Port 50022 - home.packages = with pkgs; [ - sshfs - ]; + HOST nxacel + HostName 192.168.178.32 + User nx2 + Port 50022 + HOST nxrpi + HostName ${domain} + User pi + Port 50023 - home.file.".ssh/config".text = '' - HOST nxace - HostName nx2.site - User nx2 - Port 50022 - - HOST nxacel - HostName 192.168.178.32 - User nx2 - Port 50022 - - HOST nxrpi - HostName nx2.site - User pi - Port 50023 - - HOST nxrpil - HostName 192.168.178.31 - User pi - Port 50023 - - HOST nxgit - HostName git.nx2.site - User git - Port 20022 - ''; + HOST nxrpil + HostName 192.168.178.31 + User pi + Port 50023 + + HOST nxgit + HostName git.${domain} + User git + Port 20022 + ''; + }; } diff --git a/home-modules/starship.nix b/home-modules/starship.nix index e74fd6c..d48815a 100755 --- a/home-modules/starship.nix +++ b/home-modules/starship.nix @@ -1,10 +1,5 @@ -{ pkgs, lib, user, rice, ... }: -lib.mkIf (user != "tv") +{ lib, rice, ... }: { - home.packages = [ - pkgs.starship - ]; - programs.starship = { enable = true; # enableBashIntegration = true; diff --git a/home-modules/vale.nix b/home-modules/vale.nix index 2ba3557..6ec16f7 100644 --- a/home-modules/vale.nix +++ b/home-modules/vale.nix @@ -1,9 +1,6 @@ -{ pkgs, lib, user, ... }: -let +{ pkgs, ... }: let vws = pkgs.vale.withStyles (s: [ s.alex s.google ]); -in -lib.mkIf (user != "tv") -{ +in { home = { packages = [ vws diff --git a/home-modules/waybar.nix b/home-modules/waybar.nix index 289909f..b42b637 100755 --- a/home-modules/waybar.nix +++ b/home-modules/waybar.nix @@ -1,9 +1,6 @@ -{ lib, pkgs, user, rice, ... }: -let +{ lib, pkgs, user, rice, ... }: let sep = " "; -in -lib.mkIf (user != "tv") -{ +in { home.packages = let waybar_mode_script = /*bash*/ '' @@ -100,10 +97,10 @@ lib.mkIf (user != "tv") exec = "cclock"; restart-interval = 60; }; - "custom/ctimeremaining" = { - exec = "nx_gcal_event lookup"; - restart-interval = 60; - }; + # "custom/ctimeremaining" = { + # exec = "nx_gcal_event lookup"; + # restart-interval = 60; + # }; "custom/mode" = { exec = "cat /tmp/waybar-mode"; interval = "once"; @@ -184,7 +181,6 @@ lib.mkIf (user != "tv") #clock, #custom-cclock, - #custom-ctimeremaining, #custom-mode, #battery, #cpu, diff --git a/home-modules/wlogout.nix b/home-modules/wlogout.nix index 21c0f61..c005efe 100755 --- a/home-modules/wlogout.nix +++ b/home-modules/wlogout.nix @@ -1,98 +1,85 @@ -{ config, pkgs, lib, user, rice,... }: -lib.mkIf (user != "tv") +{ pkgs, rice,... }: { - home.packages = with pkgs; [ - wlogout - ]; + home = { + packages = with pkgs; [ wlogout ]; + file = { + ".config/wlogout/style.css".text = /* css */ '' + * { all: unset; } - home.file.".config/wlogout/style.css".text = '' - * { all: unset; } + window { + font-family: ${rice.font.code.name}, monospace; + font-size: 12pt; + color: ${rice.color.foreground}; + background-color: rgba(0, 0, 0, ${builtins.toString rice.transparency}); + } - window { - font-family: ${rice.font.code.name}, monospace; - font-size: 12pt; - color: ${rice.color.foreground}; - background-color: rgba(0, 0, 0, ${builtins.toString rice.transparency}); - } + button { + transition: box-shadow 0.2s ease-in-out, background-color 0.2s ease-in-out; + text-shadow: none; + border: none; + color: ${rice.color.foreground}; + background-color: ${rice.color.background}; + margin: 5px; + } - button { - transition: box-shadow 0.2s ease-in-out, background-color 0.2s ease-in-out; - text-shadow: none; - border: none; - color: ${rice.color.foreground}; - background-color: ${rice.color.background}; - margin: 5px; - } + button:hover { + color: ${rice.color.blue.base}; + } - button:hover { - color: ${rice.color.blue.base} ; - } - - button:focus { - color: ${rice.color.blue.base} ; - } - ''; - - home.file.".config/wlogout/layout".text = '' - { - "label": "lock", - "action": "hyprlock", - "text": "[L]ock", - "height": 0, - "width": 0, - "keybind": "l" - } - { - "label": "reboot", - "action": "systemctl reboot", - "text": "[R]eboot", - "height": 0, - "width": 0, - "keybind": "r" - } - { - "label": "shutdown", - "action": "systemctl poweroff", - "text": "[S]hutdown", - "height": 0, - "width": 0, - "keybind": "s" - } - { - "label": "logout", - "action": "hyprctl dispatch exit 0", - "text": "Lo[g]out", - "height": 0, - "width": 0, - "keybind": "g" - } - { - "label": "suspend", - "action": "systemctl suspend", - "text": "S[u]spend", - "height": 0, - "width": 0, - "keybind": "u" - } - { - "label": "hibernate", - "action": "systemctl hibernate", - "text": "[H]ibernate", - "height": 0, - "width": 0, - "keybind": "h" - } - ''; - # lock { background-image: image(url("./lock.png")); } - # lock:focus { background-image: image(url("./lock-hover.png")); } - # logout { background-image: image(url("./logout.png")); } - # logout:focus { background-image: image(url("./logout-hover.png")); } - # suspend { background-image: image(url("./suspend.png")); } - # suspend:focus { background-image: image(url("./suspend-hover.png")); } - # shutdown { background-image: image(url("./power.png")); } - # shutdown:focus { background-image: image(url("./power-hover.png")); } - # reboot { background-image: image(url("./restart.png")); } - # reboot:focus { background-image: image(url("./restart-hover.png")); } - # hibernate { background-image: image(url("./hibernate.png")); } - # hibernate:hover { background-image: image(url("./hibernate-hover.png"));} + button:focus { + color: ${rice.color.blue.base}; + } + ''; + ".config/wlogout/layout".text = /* json */ '' + { + "label": "lock", + "action": "hyprlock", + "text": "[L]ock", + "height": 0, + "width": 0, + "keybind": "l" + } + { + "label": "reboot", + "action": "systemctl reboot", + "text": "[R]eboot", + "height": 0, + "width": 0, + "keybind": "r" + } + { + "label": "shutdown", + "action": "systemctl poweroff", + "text": "[S]hutdown", + "height": 0, + "width": 0, + "keybind": "s" + } + { + "label": "logout", + "action": "hyprctl dispatch exit 0", + "text": "Lo[g]out", + "height": 0, + "width": 0, + "keybind": "g" + } + { + "label": "suspend", + "action": "systemctl suspend", + "text": "S[u]spend", + "height": 0, + "width": 0, + "keybind": "u" + } + { + "label": "hibernate", + "action": "systemctl hibernate", + "text": "[H]ibernate", + "height": 0, + "width": 0, + "keybind": "h" + } + ''; + }; + }; } diff --git a/home-modules/yazi.nix b/home-modules/yazi.nix index b7a9709..3909965 100755 --- a/home-modules/yazi.nix +++ b/home-modules/yazi.nix @@ -1,6 +1,5 @@ -{ pkgs, lib, system, user, rice, inputs, ... }: -lib.mkIf (user != "tv") +{ pkgs, system, rice, inputs, ... }: { home.packages = with pkgs; [ # yazi diff --git a/home-modules/zoxide.nix b/home-modules/zoxide.nix index 29c3490..330d31b 100755 --- a/home-modules/zoxide.nix +++ b/home-modules/zoxide.nix @@ -1,5 +1,4 @@ -{ config, pkgs, lib, user, ... }: -lib.mkIf (user != "tv") +{ pkgs, ... }: { home.packages = [ pkgs.zoxide diff --git a/home.nix b/home.nix index 3d90feb..c2b0231 100755 --- a/home.nix +++ b/home.nix @@ -27,7 +27,7 @@ ./home-modules/nh.nix ./home-modules/nvidia.nix ./home-modules/nx2site.nix - ./home-modules/nx-gcal-event.nix + # ./home-modules/nx-gcal-event.nix ./home-modules/obs.nix ./home-modules/office.nix ./home-modules/ollama.nix diff --git a/system-modules/boot.nix b/system-modules/boot.nix index 7757332..3b4fa99 100755 --- a/system-modules/boot.nix +++ b/system-modules/boot.nix @@ -1,7 +1,7 @@ -{ config, pkgs, pkgs-unstable, lib, host, inputs, ... }: +{ config, pkgs, pkgs-unstable, lib, host, domain, inputs, ... }: let grub-theme-ascii-diana = (pkgs.fetchFromGitea { - domain = "git.nx2.site"; + domain = "git.${domain}"; owner = "nx2"; repo = "grub-theme-ascii-diana"; rev = "0.5.0"; diff --git a/system-modules/dm.nix b/system-modules/dm.nix index e1102ff..3cf01d5 100755 --- a/system-modules/dm.nix +++ b/system-modules/dm.nix @@ -1,5 +1,4 @@ -{ pkgs, user, host, lib, ... }: -if (host != "NxACE") then +{ pkgs, user, ... }: { services.greetd = { enable = true; @@ -22,27 +21,4 @@ if (host != "NxACE") then TTYVHangup = true; TTYVTDisallocate = true; }; -} -else -{ - services = { - displayManager = { - defaultSession = "hyprland"; - sddm = { - enable = true; - # theme = "where_is_my_sddm_theme"; - settings = { - theme = { - # background = /home/nx2/Pictures/ - passwordFontSize = 12; - passwordInputCursorVisible = true; - }; - }; - }; - autoLogin = lib.mkIf (host == "NxACE") { - enable = true; - user = "tv"; - }; - }; - }; } diff --git a/system-modules/gitea.nix b/system-modules/gitea.nix new file mode 100644 index 0000000..bc24df1 --- /dev/null +++ b/system-modules/gitea.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + services.gitea = { + enable = true; + }; +} diff --git a/system-modules/nx2site.nix b/system-modules/nx2site.nix index c314758..65b188d 100644 --- a/system-modules/nx2site.nix +++ b/system-modules/nx2site.nix @@ -1,272 +1,186 @@ -{ config, pkgs, lib, user, host, secrets, ... }: -# lib.mkIf false -lib.mkIf (host == "NxACE" && user != "tv") +{ config, pkgs, domain, secrets, ... }: { sops.secrets = { - "nx2site/namecheap.pw" = { }; - # "nx2site/cloudflare/api-token-dns-edit" = { }; - "nx2site/cloudflare/global-api-key" = { }; - }; + "nx2site/namecheap.pw" = { }; + # "nx2site/cloudflare/api-token-dns-edit" = { }; + "nx2site/cloudflare/global-api-key" = { }; + }; - systemd = { - timers."dynamic-dns" = { - wantedBy = [ "timers.target" ]; - timerConfig = { - OnBootSec = "2m"; - OnUnitActiveSec = "10m"; - Unit = "dynamic-dns.service"; - }; - }; - # services."dynamic-dns" = let - # u = let - # domain = "nx2.site"; - # passord-file-path = config.sops.secrets."nx2site/namecheap.pw".path; - # log-file-path = "/var/log/update_namecheap.log"; - # count-file-path = "/var/log/update_namecheap-count.txt"; - # in pkgs.writers.writePython3Bin "update_namecheap" { - # libraries = with pkgs.python311Packages; [ requests ]; - # flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" ]; - # } '' - # import requests - # import argparse - # import socket - # from datetime import datetime - - # def get_public_ip(): return requests.get('https://ipinfo.io/ip').text.strip() - - # def get_dns_ip(): return socket.gethostbyname_ex('${domain}')[2][0] - - # def main(force_update): - # my_ip = get_public_ip() - # dns_ip = get_dns_ip() - - # with open("${count-file-path}", "r") as f: - # content = f.read() - # if content == "": count = 0 - # else: count = int(content) - # count += 1 - # with open("${count-file-path}", "w") as f: - # f.write(str(count)) - - # if not (force_update or my_ip != dns_ip): - # print(f"Host IP and DNS response are both {my_ip} --> No Action") - # exit(0) - # else: - # with open("${passord-file-path}", 'r') as pw_file: pw = pw_file.read().strip() - - # # Perform DNS updates - # resp_base = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=@&domain=${domain}&password={pw}&ip={my_ip}") - # resp_subd = requests.get(f"https://dynamicdns.park-your-domain.com/update?host=*&domain=${domain}&password={pw}&ip={my_ip}") - - # # Reset the count file - # with open("${count-file-path}", 'w') as f: f.write('0') - - # now_str = datetime.now().strftime('%Y/%m/%d-%R') - # log_entry = f"At {now_str} - from {dns_ip} to {my_ip} - {count} times - Response {resp_base.status_code}{' - (forced)' if force_update else ' '}\n" - # print(log_entry, end="") - # with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) - - # if __name__ == "__main__": - # parser = argparse.ArgumentParser() - # parser.add_argument('-f', '--force', action='store_true', help='Force update') - # args = parser.parse_args() - - # main(args.force) - # ''; - # in { - # script = '' - # set -eu - # ${u}/bin/update_namecheap - # ''; - # serviceConfig = { - # Type = "oneshot"; - # }; - services."dynamic-dns" = let - u = let - domain = "nx2.site"; - account_id = secrets.email.gmail-online.mail; - zone_id = "33fecab36e060f49d492127345ea95a0"; - record_id = { - base = "58d3412e8d88889d1a611b3669f0700f"; - sub = "fc861353142bc05d5dbad1799178e6a1"; - base6 = "d1b90e21d2d747dcb30448bd65312927"; - sub6 = "b8082b7afe9e80971fc9f9dda16ec284"; - }; - passord-file-path = config.sops.secrets."nx2site/cloudflare/global-api-key".path; - log-file-path = "/var/log/couldflare.log"; - count-file-path = "/var/log/cloudflare-count.txt"; - in pkgs.writers.writePython3Bin "dyn_dns" { - libraries = with pkgs.python311Packages; [ requests ]; - flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" "E121" "E261" "E303"]; - } '' - import requests - import subprocess - from datetime import datetime - - def get_public_ip(ipv6=False): - return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip() - - def main(): - my_ip = get_public_ip() - my_ip6 = get_public_ip(ipv6=True) - - with open("${count-file-path}", "r") as f: - content = f.read() - if content == "": count = 0 - else: count = int(content) - count += 1 - with open("${count-file-path}", "w") as f: - f.write(str(count)) - - # 4 - with open("${passord-file-path}", 'r') as pw_file: - pw = pw_file.read().strip() - - # Perform DNS updates - # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record - resp_base = requests.patch( - 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base}', - headers={ - 'Content-Type': 'application/json', - 'X-Auth-Email': '${account_id}', - 'X-Auth-Key': pw - }, - json={ - "comment": "Domain verification record", - "name": "${domain}", - "proxied": True, - "settings": {}, - "tags": [], - "ttl": 1, # automatic - "content": my_ip, - "type": "A" - } - ) - - resp_subd = requests.patch( - 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub}', - headers={ - 'Content-Type': 'application/json', - 'X-Auth-Email': '${account_id}', - 'X-Auth-Key': pw - }, - json={ - "comment": "Domain verification record", - "name": "${domain}", - "proxied": True, - "settings": {}, - "tags": [], - "ttl": 1, # automatic - "content": my_ip, - "type": "A" - } - ) - - if resp_base.status_code != 200: - print(resp_base.text) - - - now_str = datetime.now().strftime('%Y/%m/%d-%R') - log_entry = f"At {now_str} - to {my_ip} - Response {resp_base.status_code}\n" - print(log_entry, end="") - with open("${log-file-path}", 'a') as log_file: - log_file.write(log_entry) - - # Perform DNS updates - # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record - resp_base = requests.patch( - 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base6}', - headers={ - 'Content-Type': 'application/json', - 'X-Auth-Email': '${account_id}', - 'X-Auth-Key': pw - }, - json={ - "comment": "Domain verification record", - "name": "${domain}", - "proxied": True, - "settings": {}, - "tags": [], - "ttl": 1, # automatic - "content": my_ip6, - "type": "AAAA" - } - ) - - resp_subd = requests.patch( - 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub6}', - headers={ - 'Content-Type': 'application/json', - 'X-Auth-Email': '${account_id}', - 'X-Auth-Key': pw - }, - json={ - "comment": "Domain verification record", - "name": "${domain}", - "proxied": True, - "settings": {}, - "tags": [], - "ttl": 1, # automatic - "content": my_ip6, - "type": "AAAA" - } - ) - - if resp_base.status_code != 200: - print(resp_base.text) - - - now_str = datetime.now().strftime('%Y/%m/%d-%R') - log_entry = f"At {now_str} - to {my_ip6} - Response {resp_base.status_code}\n" - print(log_entry, end="") - with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) - - if __name__ == "__main__": - main() - ''; - in { - script = '' - set -eu - ${u}/bin/dyn_dns - ''; - serviceConfig = { - Type = "oneshot"; - User = "root"; - }; + systemd = { + timers."dynamic-dns" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "2m"; + OnUnitActiveSec = "10m"; + Unit = "dynamic-dns.service"; }; }; - # I can't use this becasue API Access for Namecheap needs a static whitelisted IP, which I don't have - # security.acme = { - # acceptTerms = true; - # certs."nx2site" = { }; - # }; - environment.systemPackages = with pkgs; [ - certbot - (writeShellApplication { - name = "refresh_ssl_certificate"; - runtimeInputs = [ certbot ]; - # https://forum.endeavouros.com/t/tutorial-add-a-systemd-boot-loader-menu-entry-for-a-windows-installation-using-a-separate-esp-partition/37431 - text = let - webroot = /home/nx2/nx2site/staticweb/content; - in /*bash*/ '' - cartbot - ls ${webroot} - ''; - }) - ]; - networking.hosts = { # docker network inspect nx2site_default | grep -E "Name|IPv4" | tr "\n" " " | sed -r 's- +- -g;s-\n?"Name": -\n-g' | sed -r '1d;2d;s-"(.+?)", "IPv4Address": "(.+)/16",- "\2" = [ "\1.docker" ];-g' - "172.1.2.1" = [ "staticweb.docker" ]; - "172.1.3.1" = [ "matrix.docker" ]; - # "172.1.0.9" = [ "matrixdb.docker" ]; - "172.1.4.1" = [ "matrix-ss.docker" ]; - # "172.1.0.7" = [ "matrix-ssdb.docker" ]; - "172.1.5.1" = [ "pw.docker" ]; - "172.1.6.1" = [ "git.docker" ]; - # "172.1.0.10" = [ "gitdb.docker" ]; - "172.1.7.1" = [ "nn.docker" ]; - "172.1.8.1" = [ "llm.docker" ]; - # "172.1.9.1" = [ "proxy.docker" ]; - "172.1.10.1" = [ "share.docker" ]; - "172.1.11.1" = [ "odq.docker" ]; + services."dynamic-dns" = let + u = let + account_id = secrets.email.gmail-online.mail; + zone_id = "33fecab36e060f49d492127345ea95a0"; + record_id = { + base = "58d3412e8d88889d1a611b3669f0700f"; + sub = "fc861353142bc05d5dbad1799178e6a1"; + base6 = "d1b90e21d2d747dcb30448bd65312927"; + sub6 = "b8082b7afe9e80971fc9f9dda16ec284"; + }; + passord-file-path = config.sops.secrets."nx2site/cloudflare/global-api-key".path; + log-file-path = "/var/log/couldflare.log"; + count-file-path = "/var/log/cloudflare-count.txt"; + in pkgs.writers.writePython3Bin "dyn_dns" { + libraries = with pkgs.python311Packages; [ requests ]; + flakeIgnore = [ "E501" "E305" "E701" "E704" "E302" "E114" "F841" "E121" "E261" "E303"]; + } /* python */ '' + import requests + import subprocess + from datetime import datetime + + def get_public_ip(ipv6=False): + return subprocess.run(['${pkgs.curl}/bin/curl', '-s', '-6' if ipv6 else '-4', 'https://ifconfig.me'], capture_output=True, text=True).stdout.strip() + + def main(): + my_ip = get_public_ip() + my_ip6 = get_public_ip(ipv6=True) + + with open("${count-file-path}", "r") as f: + content = f.read() + if content == "": count = 0 + else: count = int(content) + count += 1 + with open("${count-file-path}", "w") as f: + f.write(str(count)) + + # 4 + with open("${passord-file-path}", 'r') as pw_file: + pw = pw_file.read().strip() + + # Perform DNS updates + # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record + resp_base = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip, + "type": "A" + } + ) + + resp_subd = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip, + "type": "A" + } + ) + + if resp_base.status_code != 200: + print(resp_base.text) + + + now_str = datetime.now().strftime('%Y/%m/%d-%R') + log_entry = f"At {now_str} - to {my_ip} - Response {resp_base.status_code}\n" + print(log_entry, end="") + with open("${log-file-path}", 'a') as log_file: + log_file.write(log_entry) + + # Perform DNS updates + # https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record + resp_base = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.base6}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip6, + "type": "AAAA" + } + ) + + resp_subd = requests.patch( + 'https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${record_id.sub6}', + headers={ + 'Content-Type': 'application/json', + 'X-Auth-Email': '${account_id}', + 'X-Auth-Key': pw + }, + json={ + "comment": "Domain verification record", + "name": "${domain}", + "proxied": True, + "settings": {}, + "tags": [], + "ttl": 1, # automatic + "content": my_ip6, + "type": "AAAA" + } + ) + + if resp_base.status_code != 200: + print(resp_base.text) + + + now_str = datetime.now().strftime('%Y/%m/%d-%R') + log_entry = f"At {now_str} - to {my_ip6} - Response {resp_base.status_code}\n" + print(log_entry, end="") + with open("${log-file-path}", 'a') as log_file: log_file.write(log_entry) + + if __name__ == "__main__": + main() + ''; + in { + script = '' + set -eu + ${u}/bin/dyn_dns + ''; + serviceConfig = { + Type = "oneshot"; + User = "root"; + }; }; - } + }; + networking.hosts = { # docker network inspect nx2site_default | grep -E "Name|IPv4" | tr "\n" " " | sed -r 's- +- -g;s-\n?"Name": -\n-g' | sed -r '1d;2d;s-"(.+?)", "IPv4Address": "(.+)/16",- "\2" = [ "\1.docker" ];-g' + # "172.1.2.1" = [ "staticweb.docker" ]; + # "172.1.3.1" = [ "matrix.docker" ]; + # "172.1.0.9" = [ "matrixdb.docker" ]; + # "172.1.4.1" = [ "matrix-ss.docker" ]; + # "172.1.0.7" = [ "matrix-ssdb.docker" ]; + "172.1.5.1" = [ "pw.docker" ]; + "172.1.6.1" = [ "git.docker" ]; + # "172.1.0.10" = [ "gitdb.docker" ]; + # "172.1.7.1" = [ "nn.docker" ]; + # "172.1.8.1" = [ "llm.docker" ]; + # "172.1.9.1" = [ "proxy.docker" ]; + # "172.1.10.1" = [ "share.docker" ]; + # "172.1.11.1" = [ "odq.docker" ]; + }; +} diff --git a/system-modules/nx2site/proxy.nix b/system-modules/nx2site/proxy.nix index b62493d..c2a4a77 100644 --- a/system-modules/nx2site/proxy.nix +++ b/system-modules/nx2site/proxy.nix @@ -1,4 +1,4 @@ -{ config, pkgs, lib, user, ... }: +{ config, pkgs, lib, domain, ... }: { sops.secrets = { "nx2site/sslCertificate.pem" = { owner = config.services.nginx.user; }; @@ -8,13 +8,13 @@ security.acme = { acceptTerms = true; defaults = { - email = "acme@nx2.site"; + email = "acme@${domain}"; webroot = "/var/nginx/webroot"; group = "nginx"; }; certs = { - "nx2.site" = { - extraDomainNames = [ "git.nx2.site" "pw.nx2.site" ]; + "${domain}" = { + extraDomainNames = builtins.map (subd: "${subd}.${domain}") [ "git" "git2" "pw" "pw2" "sync" ]; }; }; }; @@ -29,40 +29,28 @@ isNormalUser = false; }; systemd.services.nginx.serviceConfig.ProtectHome = "read-only"; - services.nginx = { + services.nginx = let + dl = [ + { addr = "0.0.0.0"; port = 443; ssl = true; } + { addr = "0.0.0.0"; port = 80; ssl = false; } + { addr = "[::0]"; port = 443; ssl = true; } + { addr = "[::0]"; port = 80; ssl = false; } + ]; + in { enable = true; user = "nginx"; group = "nginx"; additionalModules = []; # appendConfig = ''''; clientMaxBodySize = "20m"; - defaultHTTPListenPort = 80; defaultListenAddresses = [ "0.0.0.0" ] ++ lib.optional config.networking.enableIPv6 "[::0]"; - defaultListen = [ - { - addr = "0.0.0.0"; - ssl = true; - port = 443; - proxyProtocol = true; - } - { - addr = "[::0]"; - ssl = true; - port = 443; - proxyProtocol = true; - } - ]; + defaultListen = dl; defaultMimeTypes = "${pkgs.mailcap}/etc/nginx/mime.types"; defaultSSLListenPort = 443; enableQuicBPF = true; enableReload = true; - # eventsConfig = ''''; - # logError = ; - # mapHashBucketSize = ; - # mapHashMaxSize = ; package = pkgs.nginxQuic; - # preStart = true; proxyResolveWhileRunning = false; proxyTimeout = "20s"; recommendedBrotliSettings = true; @@ -72,27 +60,12 @@ recommendedTlsSettings = true; recommendedZstdSettings = true; serverTokens = false; - # sslCiphers = # useing default; sslDhparam = config.sops.secrets."nx2site/dhparams.pem".path; sslProtocols = "TLSv1.2 TLSv1.3"; statusPage = false; streamConfig = ""; # udp config validateConfigFile = true; - upstreams = { - "staticweb".servers = { "staticweb.docker:80" = {}; }; - "matrix".servers = { "matrix.docker:80" = {}; }; - "matrix-ss".servers = { "matrix-ss.docker:80" = {}; }; - "pw".servers = { "pw.docker:80" = {}; }; - "git".servers = { "git.docker:3000" = {}; }; - "nn".servers = { "nn.docker:80" = {}; }; - "llm".servers = { "llm.docker:80" = {}; }; - "share".servers = { "share.docker:80" = {}; }; - - "sync".servers = { "localhost:8384" = {}; }; - }; virtualHosts = let - # sslCertificate = config.sops.secrets."nx2site/sslCertificate.pem".path; - # sslCertificateKey = config.sops.secrets."nx2site/sslCertificateKey.pem".path; vh = { kTLS = true; http2 = true; @@ -102,21 +75,13 @@ addSSL = true; enableACME = true; }; - dl = [ - { addr = "0.0.0.0"; port = 443; ssl = true; } - { addr = "0.0.0.0"; port = 80; ssl = false; } - { addr = "[::0]"; port = 443; ssl = true; } - { addr = "[::0]"; port = 80; ssl = false; } - ]; in { - "nx2.site" = vh // { + "${domain}" = vh // { root = "/var/nginx/webroot"; default = true; listen = dl; locations = { "/" = { - # index = "index.html"; - # tryFiles = "$uri/ $uri.html =404"; extraConfig = '' index index.html; if ($request_uri ~ ^/(.*)\.html(\?|$)) { @@ -125,115 +90,51 @@ try_files $uri $uri.html $uri/ /404.html =404; ''; }; - "~^(/ba)$" = { - return = "301 /BA.pdf"; - }; - "/.well-known/matrix/client" = { - return = "502"; - # return = ''200 '{"m.homeserver": {"base_url": "https://matrix.nx2.site"}, "org.matrix.msc3575.proxy": {"url": "https://matrix-ss.nx2.site"}}' ''; - # extraConfig = builtins.concatStringsSep "\n" [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; - }; - "/.well-known/matrix/server" = { - return = "502"; - # return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; - # extraConfig = builtins.concatStringsSep "\n" [ "default_type application/json;" "add_header Access-Control-Allow-Origin *;" ]; - }; - # "~ ^/(client/|_matrix/client/unstable/org.matrix.msc3575/sync)" = { - # proxyPass = "http://matrix-ss"; - # # extraConfig = [ ''proxy_set_header X-Forwarded-For $remote_addr;'' ''proxy_set_header X-Forwarded-Proto $scheme;'' ''proxy_set_header Host $host;'' ]; - # }; - # "~ ^(\/_matrix|\/_synapse\/client)" = { - # return = ''200 '{"m.server":"matrix.nx2.site:443"}' ''; - # # extraConfig = []; - # }; + "~^(/ba)$" = { return = "301 /BA.pdf"; }; + "/.well-known/matrix/client" = { return = "502"; }; + "/.well-known/matrix/server" = { return = "502"; }; }; }; - "matrix.nx2.site" = { - listen = dl ++ [ - # { addr = "0.0.0.0"; port = 8448; ssl = true; } - # { addr = "0.0.0.0"; port = 8448; ssl = true; } - ]; - locations = { - # "/" = { -# proxyPass = "http://matrix"; -# # extraConfig = [ ''add_header Alt-Svc 'h3=":443"; ma=86400';'' ''add_header Cache-Control "public";'' ] ++ common-location-conf; -# }; - "~.*" = { return = "502"; }; - }; - }; -# "matrix-ss.nx2.site" = { -# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; -# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; -# # "resolver 1.1.1.1;" -# # "client_max_body_size 500M;" -# # ]; -# locations = { -# "/" = { proxyPass = "http://pw"; }; -# }; -# }; -# # "dev.nx2.site" = { -# # inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; -# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; -# # locations = { -# # "/" = { -# # proxyPass = "http://dev"; -# # }; -# # }; -# # }; - "pw.nx2.site" = vh // { - # inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; + "matrix.${domain}" = { listen = dl; - locations = { - "/" = { proxyPass = "http://pw"; }; - "/admin" = { proxyPass = "http://pw"; }; - "/notifications/hub" = { proxyPass = "http://pw"; }; - "/notifications/hub/negotiate" = { proxyPass = "http://pw"; }; - }; + locations = { "~.*" = { return = "502"; }; }; }; -# "share.nx2.site" = { -# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; -# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; -# locations = { -# "/" = { proxyPass = "http://share"; # ''proxy_hide_header Content-Disposition;'' -# # ''proxy_set_header Content-Disposition $upstream_http_content_disposition;'' -# # ''proxy_set_header X-Real-IP $remote_addr;'' -# # ''proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'' -# # ''proxy_set_header Host $http_host;'' -# # ]; -# }; -# "/socket.io" = { -# proxyPass = "http://share/socket.io"; -# proxyWebsockets = true; -# # extraConfig = [ -# # ''proxy_http_version 1.1;'' -# # ''proxy_set_header Upgrade $http_upgrade;'' -# # ''proxy_set_header Connection "upgrade";'' -# # ]; -# }; -# }; -# }; -# "sync.nx2.site" = { -# inherit sslCertificate sslCertificateKey kTLS http2 http3 http3_hq quic addSSL enableACME; -# # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; -# locations = { -# "/" = { proxyPass = "http://sync"; }; -# }; -# }; - "git.nx2.site" = vh // { - # listen = [ { addr = "0.0.0.0"; port = 443; ssl = true; } ]; + "pw.${domain}" = vh // { listen = dl; - locations = { - "/" = { proxyPass = "http://git"; }; + locations = let d = "pw.docker:80"; in { + "/" = { proxyPass = "http://${d}"; }; + "/admin" = { proxyPass = "http://${d}"; }; + "/notifications/hub" = { proxyPass = "http://${d}"; }; + "/notifications/hub/negotiate" = { proxyPass = "http://${d}"; }; }; }; - "~^(.*).nx2.site$" = { + "pw2.${domain}" = vh // { + listen = dl; + locations = let d = "127.0.0.1:8222"; in { + "/" = { proxyPass = "http://${d}"; }; + "/admin" = { proxyPass = "http://${d}"; }; + "/notifications/hub" = { proxyPass = "http://${d}"; }; + "/notifications/hub/negotiate" = { proxyPass = "http://${d}"; }; + }; + }; + "sync.${domain}" = vh // { + listen = dl; + locations = { "/" = { proxyPass = "http://127.0.0.1:11434"; }; }; + }; + "git.${domain}" = vh // { + listen = dl; + locations = { "/" = { proxyPass = "http://git.docker:3000"; }; }; + }; + "git2.${domain}" = vh // { + listen = dl; + locations = { "/" = { proxyPass = "http://127.0.0.1:8222"; }; }; + }; + "~^(.*).${domain}$" = { listen = dl; root = "/var/nginx/webroot"; - locations = { - "~.*" = { return = "301 https://nx2.site/502.html"; }; - }; + locations = { "~.*" = { return = "301 https://${domain}/502.html"; }; }; }; }; }; } + diff --git a/system-modules/syncthing.nix b/system-modules/syncthing.nix index 2122857..9c316c9 100644 --- a/system-modules/syncthing.nix +++ b/system-modules/syncthing.nix @@ -1,5 +1,10 @@ -{ config, lib, user, host, secrets, ...}: -let +{ + config, + lib, + user, + host, + secrets, +... }: let # helper funcitons conv = _: device: with device; { "${name}" = {id = id;};}; justname = devices: (builtins.map (device: device.name)) devices; @@ -24,15 +29,11 @@ let daniel-dcim = { name = "daniel-dcim"; path = "/vault/Pictures/Daniel"; }; tessa-dcim = { name = "tessa-dcim"; path = "/vault/Pictures/Tessa"; }; }; -in -lib.mkIf (user != "tv") -{ - +in { sops.secrets = { "syncthing/${host}/cert.pem" = { owner = user; }; "syncthing/${host}/key.pem" = { owner = user; }; }; - services.syncthing = with (builtins.mapAttrs conv devices); { enable = true; user = "${user}"; diff --git a/system-modules/users.nix b/system-modules/users.nix index bc092ac..a065b4f 100755 --- a/system-modules/users.nix +++ b/system-modules/users.nix @@ -11,12 +11,6 @@ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID1RPCcS8DtIf75a2FEW4d8X6WTVeLlmretoLqppvZlJ" # From [A] GPG Sub Key ]; }; - users.users.tv = lib.mkIf (host == "NxACE") { - isNormalUser = true; - extraGroups = [ "networkmanager" "audio" "video" "uinput" ]; - useDefaultShell = true; - }; - programs = { bash = { From 91a5a6def85dad0752b8a9f5df93d323cae1848a Mon Sep 17 00:00:00 2001 From: "Lennart J. Kurzweg (Nx2)" Date: Sat, 9 Nov 2024 20:06:45 +0100 Subject: [PATCH 5/5] manual sops merge before merge --- sops-secrets.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sops-secrets.yaml b/sops-secrets.yaml index 4e95ce6..5a07b2e 100644 --- a/sops-secrets.yaml +++ b/sops-secrets.yaml @@ -34,6 +34,8 @@ eduroam: client-cert: ENC[AES256_GCM,data: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,iv:OzC+2Ghg3tso297TLDLKGaUf/KzXQ/ks/qkD114WhUU=,tag:uGYDmPG/z8dkpKKAmr+f6g==,type:str] client-key: ENC[AES256_GCM,data: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,iv:elOnzTpyIwv49ErwOZRINMSXryBwiwP8Kus83+tAzks=,tag:QN3WdC+TUB01X2p76+ng3w==,type:str] root-ca: ENC[AES256_GCM,data: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,iv:8UyU8fVq8YaSsurOOgsKGIAelaxWR7+AITwwf7ts4qk=,tag:K/zGiCthB6Vyh0ijRDxM6w==,type:str] + nxxpspw: ENC[AES256_GCM,data:IpzL3rsB9BN5fhUBMtAo3DPhk6LEDuizHUj+mPPtQA==,iv:zjH5Bcw0q57oyA/ce0scSIeDvmt51vQzttHq6hwDkwk=,tag:Gf0NUQ3O3fol0M0+2HpGEA==,type:str] + tuda_nmconnection: ENC[AES256_GCM,data:LHy4lYZ6hf0Xfz25KSIY47TwrjNoEvqPi21mXKsfOq9/8Hmveca7UD9jfSbL2fyQ7dEBB2yoW01l6L63GilmSRUqd7eU2dhUCOdZ6L0j7IiFg51oT0FtJSKnQIf9BHslRWP3gQifOxKCIMGwhVEw6xMRINwRizjq073oCCDvgKtbW0cxLy8s4VOsBgAjCWiRDWaItYW83lLL6y49SYw8JJljZXGwrSxmE/wN2STJ05Wzc3cuah63b+lKnGAApkfCALGYGjdktJ/87wT0RveTyV7DzmKOd9Oo0N2cPB91vsnYOKlUBEsNo45x52tvlAx4qJ7358SjNTV0i4HD+k5/byKe8IvSnEsRjvnOLG9OXdCkdf17NcI7VvWPF6u3kAWp81Wc+6lFo9LXB5AE8dRpf5naC1wseLl2pU/8cdgj2EgVl89mo8QaaQfAPxEbaFDnQcNCEYXcRcwjVfBV5cQVqYIrcmmb/c1IVGOOSBijM8u19zq5DfUP1uc835RE9D6NL7NV69VvgoYjb/8/GGf11hDcDESaOEK3zULeyKU0K0hM7AluI8rnZsOZJK70OMLJsUPvVfI0GS9NGZXjYfCoALE0DAt2Qi4cKMNLQzQvHkvXGbdMpzI=,iv:SZmGSEOEPdzWvYvAe4/Iv8qNZjaAfSY+uVfpt3BBN9Q=,tag:NprSgZJwjBHCEKNNypESxg==,type:str] hsmw-vpn-secret: ENC[AES256_GCM,data:3bKxRGTQcbhRjzARSpYBW5ekQW/U/ixzNiFmO36gw0NKyDMLlbVbJBqXvi71M0GXgmo/FA==,iv:7bVDA8u9apDNXFY/vEMbz/0HywG5Pyrl5JfZrcNCr8w=,tag:xz4j7cEc5hvLwrItWjkx0Q==,type:str] sops: kms: [] @@ -77,8 +79,8 @@ sops: SHJLR3lvdlFiRmJuU25RUHFFTmpjamMKbzycdDvQBAuOiRROTZEQSnaXoPapz73L yVS9EUP25FSx/sGqRqaCefbeaybuM1aso6LDnlomv4Bib7zjugWKSw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2024-10-07T00:12:32Z" - mac: ENC[AES256_GCM,data:zousJNtsrpNUXxdboNDsREOuvTImGn8eUxTJMQok0zR8tvSFX9yQ+mQMg2kgG85HOhOH/fGP8WZDb4iq4kGKR15712mr/oOmoAR7SxtYlO4A0UV6uQDhp+Jx1/QhX0wSt8m6a8/RbQHDttXP219bU6/rGe3YZ2TxIy0wg+LLuS4=,iv:ZnkGt7TwUNLCrQW4gH8R/tM/se5lGi6Exk1FHPRhCxA=,tag:ZWrGua4fe38si90AVnDGQg==,type:str] + lastmodified: "2024-11-09T19:04:21Z" + mac: ENC[AES256_GCM,data:S2Y8EeIAh85xU30gR6HIUMGzO11/TP3g6S9UL+6QlHYY9lJKAcvdatWfD2DXJPdN7/dryYNZ1V1rYSIqEMi2QgBoiDN/fA9DF0/YPqfT2oLFBk5VASovRVqWb+x9kXDAnyev/RSX3i0wpJwsr9c1cGxv0ZYG8m+yyWkLJkcmRUo=,iv:MBP4jaUWnpOkUtR6BVTMDhDDP3oWspvBH2syPqL7uuw=,tag:8mySVfdq3D/xDZ3I272D3Q==,type:str] pgp: - created_at: "2024-06-09T19:44:41Z" enc: |-