From 15a56cb20a283d6d11c4205f78ce0d6f81846a28 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Sat, 6 May 2017 10:23:11 +0200
Subject: [PATCH 01/12] tv: mv-cd -> mv-ni

---
 krebs/3modules/tv/default.nix  | 4 ++--
 tv/2configs/exim-smarthost.nix | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/krebs/3modules/tv/default.nix b/krebs/3modules/tv/default.nix
index e387fabc5..0db686005 100644
--- a/krebs/3modules/tv/default.nix
+++ b/krebs/3modules/tv/default.nix
@@ -413,8 +413,8 @@ with import <stockholm/lib>;
     dv = {
       mail = "dv@alnus.r";
     };
-    mv-cd = {
-      mail = "mv@cd.r";
+    mv-ni = {
+      mail = "mv@ni.r";
       pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGer9e2+Lew7vnisgBbsFNECEIkpNJgEaqQqgb9inWkQ mv@vod";
     };
     tv = {
diff --git a/tv/2configs/exim-smarthost.nix b/tv/2configs/exim-smarthost.nix
index 816dce78d..079013c79 100644
--- a/tv/2configs/exim-smarthost.nix
+++ b/tv/2configs/exim-smarthost.nix
@@ -21,7 +21,7 @@ with import <stockholm/lib>;
     internet-aliases = with config.krebs.users; [
       { from = "bku-eppler@viljetic.de"; to = tv.mail; }
       { from = "postmaster@viljetic.de"; to = tv.mail; } # RFC 822
-      { from = "mirko@viljetic.de"; to = mv-cd.mail; }
+      { from = "mirko@viljetic.de"; to = mv-ni.mail; }
       { from = "tomislav@viljetic.de"; to = tv.mail; }
       { from = "tv@destroy.dyn.shackspace.de"; to = tv.mail; }
       { from = "tv@viljetic.de"; to = tv.mail; }

From e053edeee21d7ab5656f387863302651cf65d662 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Tue, 9 May 2017 19:17:08 +0200
Subject: [PATCH 02/12] tv git: add hstool

---
 tv/2configs/git.nix | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tv/2configs/git.nix b/tv/2configs/git.nix
index 293a00e78..13b12986c 100644
--- a/tv/2configs/git.nix
+++ b/tv/2configs/git.nix
@@ -33,6 +33,9 @@ let {
       cgit.desc = "dict.leo.org command line interface";
     };
     get = {};
+    hstool = {
+      cgit.desc = "Haskell Development Environment ^_^";
+    };
     htgen = {
       cgit.desc = "toy HTTP server";
     };

From 1b77fcae885722fb5d557e03f5e97d1d64df1d2b Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Tue, 9 May 2017 23:15:32 +0200
Subject: [PATCH 03/12] krebs.dns.providers: drop internet and retiolum

---
 krebs/3modules/default.nix | 2 --
 1 file changed, 2 deletions(-)

diff --git a/krebs/3modules/default.nix b/krebs/3modules/default.nix
index d539d4166..ea2979df4 100644
--- a/krebs/3modules/default.nix
+++ b/krebs/3modules/default.nix
@@ -105,9 +105,7 @@ let
         gg23 = "hosts";
         shack = "hosts";
         i = "hosts";
-        internet = "hosts";
         r = "hosts";
-        retiolum = "hosts";
       };
 
       krebs.users = {

From 66f9170f524a1a59ba7b69b2fc778c99ccbd41ff Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Tue, 9 May 2017 23:42:18 +0200
Subject: [PATCH 04/12] retiolum-hosts: init

---
 krebs/3modules/default.nix | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/krebs/3modules/default.nix b/krebs/3modules/default.nix
index ea2979df4..daa963bc8 100644
--- a/krebs/3modules/default.nix
+++ b/krebs/3modules/default.nix
@@ -139,6 +139,29 @@ let
         ) cfg.hosts
       ));
 
+      # TODO dedup with networking.extraHosts
+      nixpkgs.config.packageOverrides = oldpkgs:
+        let
+          domains = attrNames (filterAttrs (_: eq "hosts") cfg.dns.providers);
+          check = hostname: any (domain: hasSuffix ".${domain}" hostname) domains;
+        in
+          {
+            retiolum-hosts = oldpkgs.writeText "retiolum-hosts" ''
+              ${concatStringsSep "\n" (flatten (
+                map (host:
+                    let
+                      net = host.nets.retiolum;
+                      aliases = longs;
+                      longs = filter check net.aliases;
+                    in
+                      optionals
+                        (aliases != [])
+                        (map (addr: "${addr} ${toString aliases}") net.addrs)
+                ) (filter (host: hasAttr "retiolum" host.nets)
+                          (attrValues cfg.hosts))))}
+            '';
+          };
+
       # Implements environment.etc."zones/<zone-name>"
       environment.etc = let
         stripEmptyLines = s: (concatStringsSep "\n"

From d95ff6942d2244a7f019032787073e5f087755c2 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Thu, 11 May 2017 16:16:13 +0200
Subject: [PATCH 05/12] l 3 l: .internet -> .i

---
 krebs/3modules/lass/default.nix | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/krebs/3modules/lass/default.nix b/krebs/3modules/lass/default.nix
index cd8238dc1..b86e05319 100644
--- a/krebs/3modules/lass/default.nix
+++ b/krebs/3modules/lass/default.nix
@@ -10,7 +10,7 @@ with import <stockholm/lib>;
         internet = {
           ip4.addr = "144.76.172.188";
           aliases = [
-            "dishfire.internet"
+            "dishfire.i"
           ];
           ssh.port = 45621;
         };
@@ -42,7 +42,7 @@ with import <stockholm/lib>;
         internet = {
           ip4.addr = "104.233.79.118";
           aliases = [
-            "echelon.internet"
+            "echelon.i"
           ];
           ssh.port = 45621;
         };
@@ -82,9 +82,8 @@ with import <stockholm/lib>;
         internet = {
           ip4.addr = "213.239.205.240";
           aliases = [
-            "prism.internet"
+            "prism.i"
             "paste.i"
-            "paste.internet"
           ];
           ssh.port = 45621;
         };
@@ -132,7 +131,7 @@ with import <stockholm/lib>;
         internet = {
           ip4.addr = "104.167.113.104";
           aliases = [
-            "cloudkrebs.internet"
+            "cloudkrebs.i"
           ];
           ssh.port = 45621;
         };

From a6abeed21da488e8997c4ee8bdc0344119317bac Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Thu, 11 May 2017 18:02:24 +0200
Subject: [PATCH 06/12] l 2 w lass: /etc/hosts -> pkgs.retiolum-hosts

---
 lass/2configs/websites/lassulus.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lass/2configs/websites/lassulus.nix b/lass/2configs/websites/lassulus.nix
index 9d5f2645d..0771570ca 100644
--- a/lass/2configs/websites/lassulus.nix
+++ b/lass/2configs/websites/lassulus.nix
@@ -81,7 +81,7 @@ in {
       alias ${config.krebs.tinc.retiolum.hostsArchive};
     '';
     locations."= /retiolum.hosts".extraConfig = ''
-      alias /etc/hosts;
+      alias ${pkgs.retiolum-hosts};
     '';
     locations."/tinc".extraConfig = ''
       alias ${config.krebs.tinc_graphs.workingDir}/external;

From b51c69dbde19a6b7a5f04b790e038208cbc4a6b6 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Thu, 11 May 2017 18:03:51 +0200
Subject: [PATCH 07/12] l 2 mpv: install mpv for all users

---
 lass/2configs/mpv.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lass/2configs/mpv.nix b/lass/2configs/mpv.nix
index d9c6274db..bb068e7a1 100644
--- a/lass/2configs/mpv.nix
+++ b/lass/2configs/mpv.nix
@@ -34,7 +34,7 @@ let
   down = moveToDir "Y" "./down";
 
 in {
-  krebs.per-user.lass.packages = [
+  environment.systemPackages = [
     mpv
   ];
 }

From ddc78797c290044ebbe593eca66e731d15b3b288 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Fri, 12 May 2017 19:24:41 +0200
Subject: [PATCH 08/12] k 5 R sed: make pep80 happy

---
 krebs/5pkgs/Reaktor/scripts/sed-plugin.py | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
index 22b48e59d..f96b849e2 100644
--- a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
+++ b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
@@ -3,15 +3,17 @@
 # Usage:
 # _from=krebs state_dir=. python sed-plugin.py 'dick butt'
 # _from=krebs state_dir=. python sed-plugin.py 's/t/l/g'
-## dick bull
+# > dick bull
 import shelve
 from os import environ
 from os.path import join
 from sys import argv
-d = shelve.open(join(environ['state_dir'],'sed-plugin.shelve'),writeback=True)
-usr = environ['_from']
 import re
 
+d = shelve.open(join(environ['state_dir'], 'sed-plugin.shelve'), writeback=True)
+usr = environ['_from']
+
+
 def is_regex(line):
     myre = re.compile(r'^s/(?:\\/|[^/])+/(?:\\/|[^/])*/[ig]?$')
     return myre.match(line)
@@ -19,11 +21,11 @@ def is_regex(line):
 line = argv[1]
 
 if is_regex(line):
-    last = d.get(usr,None)
+    last = d.get(usr, None)
     if last:
-        from subprocess import Popen,PIPE
-        p = Popen(['sed',line],stdin=PIPE,stdout=PIPE)
-        so,se = p.communicate(bytes("{}\n".format(last),"UTF-8"))
+        from subprocess import Popen, PIPE
+        p = Popen(['sed', line], stdin=PIPE, stdout=PIPE)
+        so, se = p.communicate(bytes("{}\n".format(last), "UTF-8"))
         if p.returncode:
             print("something went wrong when trying to process your regex: {}".format(se.decode()))
         ret = so.decode()

From d04f5af71e0861210a6a307aa8d3289abed2ada8 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Fri, 12 May 2017 19:25:39 +0200
Subject: [PATCH 09/12] k 5 R sed: write english

---
 krebs/5pkgs/Reaktor/scripts/sed-plugin.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
index f96b849e2..da8e2f726 100644
--- a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
+++ b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py
@@ -29,7 +29,7 @@ if is_regex(line):
         if p.returncode:
             print("something went wrong when trying to process your regex: {}".format(se.decode()))
         ret = so.decode()
-        print("\x1b[1m{}\x1b[0m meinte: {}".format(usr,ret.strip()))
+        print("\x1b[1m{}\x1b[0m meant: {}".format(usr, ret.strip()))
         if ret:
             d[usr] = ret
 

From e4ddb51e2fbd561ffc436f871eecff5636c7edd6 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Fri, 12 May 2017 19:34:19 +0200
Subject: [PATCH 10/12] l 3 news: init

---
 lass/3modules/default.nix |  1 +
 lass/3modules/news.nix    | 76 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)
 create mode 100644 lass/3modules/news.nix

diff --git a/lass/3modules/default.nix b/lass/3modules/default.nix
index 959c9d1b4..73692446a 100644
--- a/lass/3modules/default.nix
+++ b/lass/3modules/default.nix
@@ -5,6 +5,7 @@ _:
     ./folderPerms.nix
     ./hosts.nix
     ./mysql-backup.nix
+    ./news.nix
     ./umts.nix
     ./usershadow.nix
     ./xresources.nix
diff --git a/lass/3modules/news.nix b/lass/3modules/news.nix
new file mode 100644
index 000000000..ecf43ab0a
--- /dev/null
+++ b/lass/3modules/news.nix
@@ -0,0 +1,76 @@
+{ config, lib, pkgs, ... }:
+
+with import <stockholm/lib>;
+
+let
+  cfg = config.lass.news;
+
+  out = {
+    options.lass.news = api;
+    config = lib.mkIf cfg.enable imp;
+  };
+
+  api = {
+    enable = mkEnableOption "umts";
+    feeds = mkOption {
+      type = types.listOf (types.submodule { options = {
+        nick = mkOption {
+          type = types.str;
+        };
+        feedurl = mkOption {
+          type = types.str;
+        };
+        interval = mkOption {
+          type = types.int;
+          default = 1000;
+        };
+        channels = mkOption {
+          type = types.listOf types.str;
+        };
+      };});
+    };
+    user = mkOption {
+      type = types.user;
+      default = {
+        name = "news";
+        home = "/var/lib/news";
+      };
+    };
+    ircServer = mkOption {
+      type = types.str;
+      default = "echelon.r";
+      description = "to which server the bot should connect";
+    };
+  };
+
+  imp = {
+
+    users.users.${cfg.user.name} = {
+      inherit (cfg.user) home name uid;
+      createHome = true;
+    };
+
+    systemd.services = listToAttrs (map (feed:
+      nameValuePair "news-${feed.nick}" {
+        wantedBy = [ "multi-user.target" ];
+        after = [ "network.target" ];
+        serviceConfig = {
+          SyslogIdentifier = "news-${feed.nick}";
+          User = cfg.user.name;
+          PrivateTmp = true;
+          Restart = "always";
+          ExecStart = pkgs.writeDash "news-${feed.nick}" ''
+            ${pkgs.haskellPackages.news}/bin/news '${feed.feedurl}' '${toString feed.interval}' \
+              | ${pkgs.goify}/bin/goify \
+              | while :; do
+                ${pkgs.haskellPackages.kirk}/bin/ircout --nick '${feed.nick}' --host '${cfg.ircServer}' \
+                  \${concatStringsSep " \\" feed.channels}
+                done
+          '';
+        };
+      }
+    ) cfg.feeds);
+
+  };
+
+in out

From 402473e25b5e5b6a88f1501cea5a7bd4ae00ce0d Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Mon, 15 May 2017 15:19:41 +0200
Subject: [PATCH 11/12] l 5 xml2json: init

---
 lass/5pkgs/default.nix          |  1 +
 lass/5pkgs/xml2json/default.nix | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)
 create mode 100644 lass/5pkgs/xml2json/default.nix

diff --git a/lass/5pkgs/default.nix b/lass/5pkgs/default.nix
index fd52325ae..6e6ba56fa 100644
--- a/lass/5pkgs/default.nix
+++ b/lass/5pkgs/default.nix
@@ -19,6 +19,7 @@
     q = pkgs.callPackage ./q {};
     rs = pkgs.callPackage ./rs/default.nix {};
     urban = pkgs.callPackage ./urban/default.nix {};
+    xml2json = pkgs.callPackage ./xml2json/default.nix {};
     xmonad-lass = import ./xmonad-lass.nix { inherit pkgs; };
     yt-next = pkgs.callPackage ./yt-next/default.nix {};
   };
diff --git a/lass/5pkgs/xml2json/default.nix b/lass/5pkgs/xml2json/default.nix
new file mode 100644
index 000000000..78690d4b7
--- /dev/null
+++ b/lass/5pkgs/xml2json/default.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+let
+  pp = pkgs.python35Packages;
+in pp.buildPythonPackage rec {
+  name = "xml2json-${version}";
+  version = "22ffcd";
+  propagatedBuildInputs = [
+    pp.simplejson
+  ];
+  src = pkgs.fetchFromGitHub {
+    owner = "hay";
+    repo = "xml2json";
+    rev = "${version}";
+    sha256 = "1snjd6q6bk517350gdrl8kkphkra0iaz56i583h2q57ab09r29vc";
+  };
+  doCheck = false;
+}

From a5b18f7d696a1ec628dc2a59cc2c6fe6b685c2f9 Mon Sep 17 00:00:00 2001
From: lassulus <lass@lassul.us>
Date: Mon, 15 May 2017 18:02:04 +0200
Subject: [PATCH 12/12] l 2 nixpkgs: 11b82a9 -> 2bb9c1c

---
 lass/2configs/nixpkgs.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lass/2configs/nixpkgs.nix b/lass/2configs/nixpkgs.nix
index 86b7d6d2a..49c44aa88 100644
--- a/lass/2configs/nixpkgs.nix
+++ b/lass/2configs/nixpkgs.nix
@@ -3,6 +3,6 @@
 {
   krebs.build.source.nixpkgs.git = {
     url = https://cgit.lassul.us/nixpkgs;
-    ref = "11b82a9";
+    ref = "2bb9c1c";
   };
 }