Merge branch 'master' of https://cgit.lassul.us/stockholm
This commit is contained in:
commit
3c0496ec1a
25
krebs/3modules/external/default.nix
vendored
25
krebs/3modules/external/default.nix
vendored
@ -373,6 +373,30 @@ in {
|
|||||||
syncthing.id = "22NLFY5-QMRM3BH-76QIBYI-OPMKVGM-DU4FNZI-3KN2POF-V4WIC6M-2SFFUAC";
|
syncthing.id = "22NLFY5-QMRM3BH-76QIBYI-OPMKVGM-DU4FNZI-3KN2POF-V4WIC6M-2SFFUAC";
|
||||||
nets = {};
|
nets = {};
|
||||||
};
|
};
|
||||||
|
catalonia = {
|
||||||
|
owner = config.krebs.users.xkey;
|
||||||
|
nets = {
|
||||||
|
retiolum = {
|
||||||
|
ip4.addr = "10.243.13.12";
|
||||||
|
aliases = [ "catalonia.r" ];
|
||||||
|
tinc.pubkey = ''
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIICCgKCAgEAug+nej8/spuRHdzcfBYAuzUVoiq4YufmJqXSshvgf4aqjeVEt91Y
|
||||||
|
gT6iBN8IKnMjYk3bAS7MxmgiyVE17MQlaQi0RSYY47M8I9TvCYtWX/FcXuP9e6CA
|
||||||
|
VcalDUNpy2qNB+yEE8gMa8vDA3smKk/iK47jTtpWoPtvejLK/SCi8RdlYjKlOErE
|
||||||
|
Yl9mCniGD1WEYgdrjf6Nl7av6uuGYNibivIMkB2JyGwGGmzvP+oBFi2Cwarw8K2e
|
||||||
|
FK2VGrAfkgiP5rTPACHseoeCsJtRLozgzYzmS5M9XhP5ZoPkbtR/pL5btCwoCTlZ
|
||||||
|
HotmLVg4DezbPjNOBB9gtJF4UuzQjSPNY6K1VvvLOhDwXdyln82LuNcm9l+cy9y3
|
||||||
|
mGeSvqOouBugDqie6OpkF0KrRwlGQVwzwtnDohGd/5f7TbiPf1QjC+JP/m4mxZl3
|
||||||
|
zE0BCOct9b4hUc/CFto71CPlytSbTsMhfJAn8JxttGvsWIAj+dQ0iuLXfLDflWt6
|
||||||
|
sImmnOo28YInvFx6pKoxTwcV1AVrPWn5TSePhZM50dmzs0exltOISFECDhpPabU3
|
||||||
|
ZymRCze8fH9Z3SHxfxTlTZV7IaW2kpyyBe1KsWpM46gLPk5icX+Xc6mdGwbdGBpf
|
||||||
|
vDZ+BoHCjq9FfQrAu1+E83yCYyu+3fWrLSgYyrqjg0gPcCcnb1g6hqECAwEAAQ==
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
users = {
|
users = {
|
||||||
ciko = {
|
ciko = {
|
||||||
@ -421,6 +445,7 @@ in {
|
|||||||
mail = "xq@shackspace.de";
|
mail = "xq@shackspace.de";
|
||||||
pubkey = ssh-for "xq";
|
pubkey = ssh-for "xq";
|
||||||
};
|
};
|
||||||
|
xkey = {};
|
||||||
miaoski = {
|
miaoski = {
|
||||||
};
|
};
|
||||||
filly = {
|
filly = {
|
||||||
|
@ -45,6 +45,10 @@ with import <stockholm/lib>;
|
|||||||
default = self.config.port == "6697";
|
default = self.config.port == "6697";
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
};
|
};
|
||||||
|
API.listen = mkOption {
|
||||||
|
default = null;
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
@ -65,9 +69,11 @@ with import <stockholm/lib>;
|
|||||||
ExecStart = let
|
ExecStart = let
|
||||||
configFile = pkgs.writeJSON configFileName configValue;
|
configFile = pkgs.writeJSON configFileName configValue;
|
||||||
configFileName = "${cfg.systemd-service-name}.config.json";
|
configFileName = "${cfg.systemd-service-name}.config.json";
|
||||||
configValue = recursiveUpdate {
|
configValue = stripAttr (
|
||||||
|
recursiveUpdate {
|
||||||
logTime = false;
|
logTime = false;
|
||||||
} (removeAttrs cfg ["_module"]);
|
} (removeAttrs cfg ["_module"])
|
||||||
|
);
|
||||||
in "${pkgs.reaktor2}/bin/reaktor ${configFile}";
|
in "${pkgs.reaktor2}/bin/reaktor ${configFile}";
|
||||||
Restart = "always";
|
Restart = "always";
|
||||||
RestartSec = "30";
|
RestartSec = "30";
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
{ mkDerivation, aeson, async, attoparsec, base, blessings
|
{ mkDerivation, aeson, async, attoparsec, base, blessings
|
||||||
, bytestring, containers, data-default, fetchgit, filepath
|
, bytestring, containers, data-default, fetchgit, filepath
|
||||||
, hashable, lens, lens-aeson, network, network-simple
|
, hashable, lens, lens-aeson, network, network-simple
|
||||||
, network-simple-tls, pcre-light, process, random, stdenv
|
, network-simple-tls, network-uri, pcre-light, process, random
|
||||||
, string-conversions, stringsearch, text, time, transformers
|
, servant-server, stdenv, string-conversions, stringsearch, text
|
||||||
, unagi-chan, unix, unordered-containers, vector
|
, time, transformers, unagi-chan, unix, unordered-containers
|
||||||
|
, vector, wai, warp
|
||||||
}:
|
}:
|
||||||
mkDerivation {
|
mkDerivation {
|
||||||
pname = "reaktor2";
|
pname = "reaktor2";
|
||||||
version = "0.2.2";
|
version = "0.3.0";
|
||||||
src = fetchgit {
|
src = fetchgit {
|
||||||
url = "https://cgit.krebsco.de/reaktor2";
|
url = "https://cgit.krebsco.de/reaktor2";
|
||||||
sha256 = "1kyr5i5zdzvc7fcyac1i1yvi88kcxafrgp8p79c1b9l4g9sjnv78";
|
sha256 = "02hqpq8wcfd6rvi8qk10zy3f3lrzzqnjwqal4cbvksjn3vahz36h";
|
||||||
rev = "9f4e2644188f985d7cd806c13e2c0dee1688b9f0";
|
rev = "a6893c00f78a8acd0a4bfe7da87ab6889eabcf21";
|
||||||
fetchSubmodules = true;
|
fetchSubmodules = true;
|
||||||
};
|
};
|
||||||
isLibrary = false;
|
isLibrary = false;
|
||||||
@ -19,9 +20,9 @@ mkDerivation {
|
|||||||
executableHaskellDepends = [
|
executableHaskellDepends = [
|
||||||
aeson async attoparsec base blessings bytestring containers
|
aeson async attoparsec base blessings bytestring containers
|
||||||
data-default filepath hashable lens lens-aeson network
|
data-default filepath hashable lens lens-aeson network
|
||||||
network-simple network-simple-tls pcre-light process random
|
network-simple network-simple-tls network-uri pcre-light process
|
||||||
string-conversions stringsearch text time transformers unagi-chan
|
random servant-server string-conversions stringsearch text time
|
||||||
unix unordered-containers vector
|
transformers unagi-chan unix unordered-containers vector wai warp
|
||||||
];
|
];
|
||||||
license = stdenv.lib.licenses.mit;
|
license = stdenv.lib.licenses.mit;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@ pkgs.writers.writeDashBin "generate-wallpaper" ''
|
|||||||
|
|
||||||
# remove snow from ice map
|
# remove snow from ice map
|
||||||
if needs_rebuild ice.png ice-raw.jpg; then
|
if needs_rebuild ice.png ice-raw.jpg; then
|
||||||
convert ice-raw.jpg -fuzz 20% -fill black -opaque white -scale "$in_size" ice.png
|
convert ice-raw.jpg -fuzz 20% -fill black -opaque white -colorspace gray -blur 0x6 -scale "$in_size" ice.png
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if needs_rebuild snow.png snow-raw.jpg; then
|
if needs_rebuild snow.png snow-raw.jpg; then
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"url": "https://github.com/NixOS/nixpkgs-channels",
|
"url": "https://github.com/NixOS/nixpkgs-channels",
|
||||||
"rev": "d96bd3394b734487d1c3bfbac0e8f17465e03afe",
|
"rev": "b61999e4ad60c351b4da63ae3ff43aae3c0bbdfb",
|
||||||
"date": "2020-03-19T15:32:34+01:00",
|
"date": "2020-04-16T08:43:36-04:00",
|
||||||
"sha256": "05n27wz5ln9ni5cy5rhjcy612i44gmblkq5m0g827v8pd0nk00da",
|
"sha256": "0cggpdks4qscyirqwfprgdl91mlhjlw24wkg0riapk5f2g2llbpq",
|
||||||
"fetchSubmodules": false
|
"fetchSubmodules": false
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"url": "https://github.com/NixOS/nixpkgs-channels",
|
"url": "https://github.com/NixOS/nixpkgs-channels",
|
||||||
"rev": "598a9cbed6348ebda43c6b1a9a3061e0206297e7",
|
"rev": "b67bc34d4e3de1e89b8bb7cd6e375ba44f1ae8ca",
|
||||||
"date": "2020-03-28T03:06:32+01:00",
|
"date": "2020-04-15T22:11:06+01:00",
|
||||||
"sha256": "12m910j2sfhm3a6skw4janxy010gzdxp15bn8v9w7w9hhjzvdw8c",
|
"sha256": "1q9a64bl5afflgpa2iaw1q7z7s08c8xq9w6lndlnc5c3siajrp8v",
|
||||||
"fetchSubmodules": false
|
"fetchSubmodules": false
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,15 @@
|
|||||||
'';
|
'';
|
||||||
|
|
||||||
services.thinkfan.enable = true;
|
services.thinkfan.enable = true;
|
||||||
|
services.thinkfan.levels = ''
|
||||||
|
(0, 0, 55)
|
||||||
|
(1, 48, 60)
|
||||||
|
(2, 50, 61)
|
||||||
|
(3, 52, 63)
|
||||||
|
(6, 60, 65)
|
||||||
|
(7, 80, 85)
|
||||||
|
(127, 90, 32767)
|
||||||
|
'';
|
||||||
|
|
||||||
services.logind.lidSwitch = "ignore";
|
services.logind.lidSwitch = "ignore";
|
||||||
services.logind.lidSwitchDocked = "ignore";
|
services.logind.lidSwitchDocked = "ignore";
|
||||||
|
@ -263,8 +263,6 @@ with import <stockholm/lib>;
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
users.users.download.openssh.authorizedKeys.keys = [
|
users.users.download.openssh.authorizedKeys.keys = [
|
||||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDB0d0JA20Vqn7I4lCte6Ne2EOmLZyMJyS9yIKJYXNLjbLwkQ4AYoQKantPBkTxR75M09E7d3j5heuWnCjWH45TrfQfe1EOSSC3ppCI6C6aIVlaNs+KhAYZS0m2Y8WkKn+TT5JLEa8yybYVN/RlZPOilpj/1QgjU6CQK+eJ1k/kK+QFXcwN82GDVh5kbTVcKUNp2tiyxFA+z9LY0xFDg/JHif2ROpjJVLQBJ+YPuOXZN5LDnVcuyLWKThjxy5srQ8iDjoxBg7dwLHjby5Mv41K4W61Gq6xM53gDEgfXk4cQhJnmx7jA/pUnsn2ZQDeww3hcc7vRf8soogXXz2KC9maiq0M/svaATsa9Ul4hrKnqPZP9Q8ScSEAUX+VI+x54iWrnW0p/yqBiRAzwsczdPzaQroUFTBxrq8R/n5TFdSHRMX7fYNOeVMjhfNca/gtfw9dYBVquCvuqUuFiRc0I7yK44rrMjjVQRcAbw6F8O7+04qWCmaJ8MPlmApwu2c05VMv9hiJo5p6PnzterRSLCqF6rIdhSnuOwrUIt1s/V+EEZXHCwSaNLaQJnYL0H9YjaIuGz4c8kVzxw4c0B6nl+hqW5y5/B2cuHiumnlRIDKOIzlv8ufhh21iN7QpIsPizahPezGoT1XqvzeXfH4qryo8O4yTN/PWoA+f7o9POU7L6hQ== lhebendanz@nixos"
|
|
||||||
config.krebs.users.palo.pubkey
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -382,6 +380,9 @@ with import <stockholm/lib>;
|
|||||||
lass.pubkey
|
lass.pubkey
|
||||||
lass-android.pubkey
|
lass-android.pubkey
|
||||||
makefu.pubkey
|
makefu.pubkey
|
||||||
|
palo.pubkey
|
||||||
|
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDB0d0JA20Vqn7I4lCte6Ne2EOmLZyMJyS9yIKJYXNLjbLwkQ4AYoQKantPBkTxR75M09E7d3j5heuWnCjWH45TrfQfe1EOSSC3ppCI6C6aIVlaNs+KhAYZS0m2Y8WkKn+TT5JLEa8yybYVN/RlZPOilpj/1QgjU6CQK+eJ1k/kK+QFXcwN82GDVh5kbTVcKUNp2tiyxFA+z9LY0xFDg/JHif2ROpjJVLQBJ+YPuOXZN5LDnVcuyLWKThjxy5srQ8iDjoxBg7dwLHjby5Mv41K4W61Gq6xM53gDEgfXk4cQhJnmx7jA/pUnsn2ZQDeww3hcc7vRf8soogXXz2KC9maiq0M/svaATsa9Ul4hrKnqPZP9Q8ScSEAUX+VI+x54iWrnW0p/yqBiRAzwsczdPzaQroUFTBxrq8R/n5TFdSHRMX7fYNOeVMjhfNca/gtfw9dYBVquCvuqUuFiRc0I7yK44rrMjjVQRcAbw6F8O7+04qWCmaJ8MPlmApwu2c05VMv9hiJo5p6PnzterRSLCqF6rIdhSnuOwrUIt1s/V+EEZXHCwSaNLaQJnYL0H9YjaIuGz4c8kVzxw4c0B6nl+hqW5y5/B2cuHiumnlRIDKOIzlv8ufhh21iN7QpIsPizahPezGoT1XqvzeXfH4qryo8O4yTN/PWoA+f7o9POU7L6hQ== lhebendanz@nixos"
|
||||||
|
"AAAAB3NzaC1yc2EAAAADAQABAAABgQC4ECL9NSCWqs4KVe+FF+2BPtl5Bv5aQPHqnXllCyiESZykwRKLx6/AbF5SbUAUMVZtp9oDSdp28m3BvVeWJ/q7hAbIxUtfd/jp+JBRZ8Kj6K5GzUO7Bhgl/o0A7xEjAeOKHiYuLjdPMcFUyl6Ah4ey/mcQYf6AdU0+hYUDeUlKe/YxxYD6202W0GJq2xGdIqs/TbopT9iaX+sv0wdXDVfFY72nFqOUwJW3u6O2viKKRugrz/eo50Eo3ts7pYz/FpDXExrUvV9Vu/bQ34pa8nKgF3/AKQHgmzljNQSVZKyAV8OY0UFonjBMXCBg2tXtwfnlzdx2SyuQVv55x+0AuRKsi85G2xLpXu1A3921pseBTW6Q6kbYK9eqxAay2c/kNbwNqFnO+nCvQ6Ier/hvGddOtItMu96IuU2E7mPN6WgvM8/3fjJRFWnZxFxqu/k7iH+yYT8qwRgdiSqZc76qvkYEuabdk2itstTRY0A3SpI3hFMZDw/7bxgMZtqpfyoRk5s= philip@shiki11:15 <Profpatsch> AAAAB3NzaC1yc2EAAAADAQABAAABgQC4ECL9NSCWqs4KVe+FF+2BPtl5Bv5aQPHqnXllCyiESZykwRKLx6/AbF5SbUAUMVZtp9oDSdp28m3BvVeWJ/q7hAbIxUtfd/jp+JBRZ8Kj6K5GzUO7Bhgl/o0A7xEjAeOKHiYuLjdPMcFUyl6Ah4ey/mcQYf6AdU0+hYUDeUlKe/YxxYD6202W0GJq2xGdIqs/TbopT9iaX+sv0wdXDVfFY72nFqOUwJW3u6O2viKKRugrz/eo50Eo3ts7pYz/FpDXExrUvV9Vu/bQ34pa8nKgF3/AKQHgmzljNQSVZKyAV8OY0UFonjBMXCBg2tXtwfnlzdx2SyuQVv55x+0AuRKsi85G2xLpXu1A3921pseBTW6Q6kbYK9eqxAay2c/kNbwNqFnO+nCvQ6Ier/hvGddOtItMu96IuU2E7mPN6WgvM8/3fjJRFWnZxFxqu/k7iH+yYT8qwRgdiSqZc76qvkYEuabdk2itstTRY0A3SpI3hFMZDw/7bxgMZtqpfyoRk5s= philip@shiki"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -19,7 +19,9 @@ with import <stockholm/lib>;
|
|||||||
<stockholm/lass/2configs/ssh-cryptsetup.nix>
|
<stockholm/lass/2configs/ssh-cryptsetup.nix>
|
||||||
<stockholm/lass/2configs/nfs-dl.nix>
|
<stockholm/lass/2configs/nfs-dl.nix>
|
||||||
<stockholm/lass/2configs/gg23.nix>
|
<stockholm/lass/2configs/gg23.nix>
|
||||||
|
<stockholm/lass/2configs/hass>
|
||||||
<stockholm/lass/2configs/br.nix>
|
<stockholm/lass/2configs/br.nix>
|
||||||
|
<stockholm/lass/2configs/fetchWallpaper.nix>
|
||||||
];
|
];
|
||||||
|
|
||||||
krebs.build.host = config.krebs.hosts.shodan;
|
krebs.build.host = config.krebs.hosts.shodan;
|
||||||
|
@ -71,12 +71,14 @@ in {
|
|||||||
gitAndTools.qgit
|
gitAndTools.qgit
|
||||||
git-preview
|
git-preview
|
||||||
gnome3.dconf
|
gnome3.dconf
|
||||||
|
iodine
|
||||||
lm_sensors
|
lm_sensors
|
||||||
ncdu
|
ncdu
|
||||||
nix-index
|
nix-index
|
||||||
nix-review
|
nix-review
|
||||||
nmap
|
nmap
|
||||||
pavucontrol
|
pavucontrol
|
||||||
|
ponymix
|
||||||
powertop
|
powertop
|
||||||
rxvt_unicode-with-plugins
|
rxvt_unicode-with-plugins
|
||||||
sxiv
|
sxiv
|
||||||
|
@ -19,6 +19,7 @@ with (import <stockholm/lib>);
|
|||||||
];
|
];
|
||||||
|
|
||||||
services.tor.enable = true;
|
services.tor.enable = true;
|
||||||
|
services.tor.client.enable = true;
|
||||||
|
|
||||||
krebs.iptables.tables.filter.INPUT.rules = [
|
krebs.iptables.tables.filter.INPUT.rules = [
|
||||||
{ predicate = "-i retiolum -p udp --dport 60000:61000"; target = "ACCEPT";}
|
{ predicate = "-i retiolum -p udp --dport 60000:61000"; target = "ACCEPT";}
|
||||||
|
@ -113,6 +113,8 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
in {
|
in {
|
||||||
|
environment.systemPackages = [ pkgs.review-mail-queue ];
|
||||||
|
|
||||||
krebs.exim-smarthost = {
|
krebs.exim-smarthost = {
|
||||||
enable = true;
|
enable = true;
|
||||||
dkim = [
|
dkim = [
|
||||||
|
@ -20,12 +20,13 @@ with import <stockholm/lib>;
|
|||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
machines = [
|
machines = [
|
||||||
{ ethernetAddress = "c8:3d:d4:2c:40:ae"; hostName = "tv"; ipAddress = "10.42.0.3"; }
|
{ ethernetAddress = "a8:a6:48:65:ce:4c"; hostName = "tv"; ipAddress = "10.42.0.3"; }
|
||||||
{ ethernetAddress = "3c:2a:f4:22:28:37"; hostName = "drucker"; ipAddress = "10.42.0.4"; }
|
{ ethernetAddress = "3c:2a:f4:22:28:37"; hostName = "drucker"; ipAddress = "10.42.0.4"; }
|
||||||
{ ethernetAddress = "80:7d:3a:67:b7:01"; hostName = "s20-bett"; ipAddress = "10.42.0.10"; }
|
{ ethernetAddress = "80:7d:3a:67:b7:01"; hostName = "s20-tv"; ipAddress = "10.42.0.10"; }
|
||||||
{ ethernetAddress = "80:7d:3a:68:04:f0"; hostName = "s20-drucker"; ipAddress = "10.42.0.11"; }
|
{ ethernetAddress = "80:7d:3a:68:04:f0"; hostName = "s20-drucker"; ipAddress = "10.42.0.11"; }
|
||||||
{ ethernetAddress = "80:7d:3a:68:11:a5"; hostName = "s20-kueche"; ipAddress = "10.42.0.12"; }
|
{ ethernetAddress = "80:7d:3a:68:11:a5"; hostName = "s20-wasch"; ipAddress = "10.42.0.12"; }
|
||||||
{ ethernetAddress = "80:7d:3a:67:bb:69"; hostName = "s20-stereo"; ipAddress = "10.42.0.13"; }
|
{ ethernetAddress = "80:7d:3a:67:bb:69"; hostName = "s20-stereo"; ipAddress = "10.42.0.13"; }
|
||||||
|
{ ethernetAddress = "ec:b5:fa:07:78:16"; hostName = "hue-bridge"; ipAddress = "10.42.0.21"; }
|
||||||
{ ethernetAddress = "80:8d:b7:c5:80:dc"; hostName = "arubaAP"; ipAddress = "10.42.0.99"; }
|
{ ethernetAddress = "80:8d:b7:c5:80:dc"; hostName = "arubaAP"; ipAddress = "10.42.0.99"; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
@ -45,9 +46,6 @@ with import <stockholm/lib>;
|
|||||||
|
|
||||||
boot.kernel.sysctl."net.ipv4.ip_forward" = 1;
|
boot.kernel.sysctl."net.ipv4.ip_forward" = 1;
|
||||||
krebs.iptables.tables.filter.INPUT.rules = [
|
krebs.iptables.tables.filter.INPUT.rules = [
|
||||||
{ predicate = "-i int0 -p tcp --dport 8123"; target = "ACCEPT"; } # hass
|
|
||||||
{ predicate = "-i retiolum -p tcp --dport 8123"; target = "ACCEPT"; } # hass
|
|
||||||
{ predicate = "-i int0 -p tcp --dport 1883"; target = "ACCEPT"; } # mosquitto
|
|
||||||
{ predicate = "-i int0 -p udp --dport 53"; target = "ACCEPT"; } # dns
|
{ predicate = "-i int0 -p udp --dport 53"; target = "ACCEPT"; } # dns
|
||||||
];
|
];
|
||||||
krebs.iptables.tables.filter.FORWARD.rules = [
|
krebs.iptables.tables.filter.FORWARD.rules = [
|
||||||
@ -62,72 +60,5 @@ with import <stockholm/lib>;
|
|||||||
krebs.iptables.tables.nat.POSTROUTING.rules = [
|
krebs.iptables.tables.nat.POSTROUTING.rules = [
|
||||||
{ v6 = false; predicate = "-s 10.42.0.0/24 ! -d 10.42.0.0/24"; target = "MASQUERADE"; }
|
{ v6 = false; predicate = "-s 10.42.0.0/24 ! -d 10.42.0.0/24"; target = "MASQUERADE"; }
|
||||||
];
|
];
|
||||||
|
|
||||||
services.home-assistant = let
|
|
||||||
tasmota_s20 = name: topic: {
|
|
||||||
platform = "mqtt";
|
|
||||||
inherit name;
|
|
||||||
state_topic = "stat/${topic}/POWER";
|
|
||||||
command_topic = "cmnd/${topic}/POWER";
|
|
||||||
payload_on = "ON";
|
|
||||||
payload_off = "OFF";
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.home-assistant.override {
|
|
||||||
#extraComponents = [
|
|
||||||
# (pkgs.fetchgit {
|
|
||||||
# url = "https://github.com/marcschumacher/dwd_pollen";
|
|
||||||
# rev = "0.1";
|
|
||||||
# sha256 = "12vldwsds27c9l15ffc6svk9mj17jhypcz736pvpmpqbsymllz2p";
|
|
||||||
# })
|
|
||||||
#];
|
|
||||||
};
|
|
||||||
config = {
|
|
||||||
homeassistant = {
|
|
||||||
name = "Home"; time_zone = "Europe/Berlin";
|
|
||||||
latitude = "48.7687";
|
|
||||||
longitude = "9.2478";
|
|
||||||
elevation = 247;
|
|
||||||
};
|
|
||||||
sun.elevation = 66;
|
|
||||||
discovery = {};
|
|
||||||
frontend = { };
|
|
||||||
mqtt = {
|
|
||||||
broker = "localhost";
|
|
||||||
port = 1883;
|
|
||||||
client_id = "home-assistant";
|
|
||||||
username = "gg23";
|
|
||||||
password = "gg23-mqtt";
|
|
||||||
keepalive = 60;
|
|
||||||
protocol = 3.1;
|
|
||||||
};
|
|
||||||
sensor = [
|
|
||||||
];
|
|
||||||
switch = [
|
|
||||||
(tasmota_s20 "Drucker Strom" "drucker")
|
|
||||||
(tasmota_s20 "Bett Licht" "bett")
|
|
||||||
(tasmota_s20 "Kueche Licht" "kueche")
|
|
||||||
];
|
|
||||||
device_tracker = [
|
|
||||||
{
|
|
||||||
platform = "luci";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.mosquitto = {
|
|
||||||
enable = true;
|
|
||||||
host = "0.0.0.0";
|
|
||||||
allowAnonymous = false;
|
|
||||||
checkPasswords = true;
|
|
||||||
users.gg23 = {
|
|
||||||
password = "gg23-mqtt";
|
|
||||||
acl = [ "topic readwrite #" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
environment.systemPackages = [ pkgs.mosquitto ];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
86
lass/2configs/hass/default.nix
Normal file
86
lass/2configs/hass/default.nix
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./zigbee.nix
|
||||||
|
./rooms/bett.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
krebs.iptables.tables.filter.INPUT.rules = [
|
||||||
|
{ predicate = "-i int0 -p tcp --dport 1883"; target = "ACCEPT"; } # mosquitto
|
||||||
|
{ predicate = "-i docker0 -p tcp --dport 1883"; target = "ACCEPT"; } # mosquitto
|
||||||
|
{ predicate = "-i int0 -p tcp --dport 8123"; target = "ACCEPT"; } # hass
|
||||||
|
{ predicate = "-i retiolum -p tcp --dport 8123"; target = "ACCEPT"; } # hass
|
||||||
|
];
|
||||||
|
|
||||||
|
services.home-assistant = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.home-assistant.override {
|
||||||
|
# extraComponents = [ "hue" ];
|
||||||
|
};
|
||||||
|
configWritable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
lass.hass.config = let
|
||||||
|
tasmota_s20 = name: topic: {
|
||||||
|
platform = "mqtt";
|
||||||
|
inherit name;
|
||||||
|
state_topic = "stat/${topic}/POWER";
|
||||||
|
command_topic = "cmnd/${topic}/POWER";
|
||||||
|
payload_on = "ON";
|
||||||
|
payload_off = "OFF";
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
homeassistant = {
|
||||||
|
name = "Home";
|
||||||
|
time_zone = "Europe/Berlin";
|
||||||
|
latitude = "48.7687";
|
||||||
|
longitude = "9.2478";
|
||||||
|
elevation = 247;
|
||||||
|
};
|
||||||
|
config = {};
|
||||||
|
sun.elevation = 66;
|
||||||
|
discovery = {};
|
||||||
|
frontend = {};
|
||||||
|
mqtt = {
|
||||||
|
broker = "localhost";
|
||||||
|
port = 1883;
|
||||||
|
client_id = "home-assistant";
|
||||||
|
username = "gg23";
|
||||||
|
password = "gg23-mqtt";
|
||||||
|
keepalive = 60;
|
||||||
|
protocol = 3.1;
|
||||||
|
|
||||||
|
discovery = true;
|
||||||
|
birth_message = {
|
||||||
|
topic = "/hass/status";
|
||||||
|
payload = "online";
|
||||||
|
};
|
||||||
|
will_message = {
|
||||||
|
topic = "/hass/status";
|
||||||
|
payload = "offline";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sensor = [
|
||||||
|
];
|
||||||
|
switch = [
|
||||||
|
(tasmota_s20 "TV" "tv")
|
||||||
|
(tasmota_s20 "Drucker Strom" "drucker")
|
||||||
|
(tasmota_s20 "Waschmaschine" "wasch")
|
||||||
|
(tasmota_s20 "Stereo Anlage" "stereo")
|
||||||
|
];
|
||||||
|
mobile_app = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mosquitto = {
|
||||||
|
enable = true;
|
||||||
|
host = "0.0.0.0";
|
||||||
|
allowAnonymous = false;
|
||||||
|
checkPasswords = true;
|
||||||
|
users.gg23 = {
|
||||||
|
password = "gg23-mqtt";
|
||||||
|
acl = [ "topic readwrite #" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.mosquitto ];
|
||||||
|
}
|
83
lass/2configs/hass/lib.nix
Normal file
83
lass/2configs/hass/lib.nix
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
lights = {
|
||||||
|
bett = "light.0x0017880106ed3bd8_light";
|
||||||
|
essen = "light.0x0017880108327622_light";
|
||||||
|
arbeit = "light.0x0017880106ee2865_light";
|
||||||
|
nass = "light.0x00178801082e9f2f_light";
|
||||||
|
};
|
||||||
|
|
||||||
|
sensors = {
|
||||||
|
bett = "0x00178801086ac38c";
|
||||||
|
};
|
||||||
|
|
||||||
|
lightswitch = switch: light: {
|
||||||
|
automation = [
|
||||||
|
{
|
||||||
|
trigger = {
|
||||||
|
platform = "mqtt";
|
||||||
|
topic = "zigbee/${switch}";
|
||||||
|
};
|
||||||
|
condition = {
|
||||||
|
condition = "or";
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.action == 'on-press' }}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.action == 'up-press' }}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
condition = "and";
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.action == 'down-press' }}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.brightness > 30 }}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
action = [
|
||||||
|
{
|
||||||
|
service = "light.turn_on";
|
||||||
|
data_template = {
|
||||||
|
entity_id = light;
|
||||||
|
brightness = "{{ trigger.payload_json.brightness }}";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
trigger = {
|
||||||
|
platform = "mqtt";
|
||||||
|
topic = "zigbee/${switch}";
|
||||||
|
};
|
||||||
|
condition = {
|
||||||
|
condition = "or";
|
||||||
|
conditions = [
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.action == 'off-press' }}";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
condition = "template";
|
||||||
|
value_template = "{{ trigger.payload_json.brightness < 30 }}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
action = {
|
||||||
|
service = "light.turn_off";
|
||||||
|
data_template = {
|
||||||
|
entity_id = light;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
27
lass/2configs/hass/rooms/bett.nix
Normal file
27
lass/2configs/hass/rooms/bett.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
with import ../lib.nix;
|
||||||
|
|
||||||
|
{
|
||||||
|
lass.hass.config = lib.lists.fold lib.recursiveUpdate {} [
|
||||||
|
{
|
||||||
|
#automation = [{
|
||||||
|
# trigger = {
|
||||||
|
# platform = "mqtt";
|
||||||
|
# topic = "zigbee/0x00178801086ac38c/action";
|
||||||
|
# payload = "on-press";
|
||||||
|
# };
|
||||||
|
# action = {
|
||||||
|
# service = "light.turn_on";
|
||||||
|
# data = {
|
||||||
|
# brightness = 150;
|
||||||
|
# rgb_color = [ 255 0 0 ];
|
||||||
|
# entity_id = [
|
||||||
|
# "light.0x0017880108327622_light"
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
#}];
|
||||||
|
}
|
||||||
|
(lightswitch sensors.bett lights.bett)
|
||||||
|
];
|
||||||
|
}
|
152
lass/2configs/hass/zigbee.nix
Normal file
152
lass/2configs/hass/zigbee.nix
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
{config, pkgs, lib, ...}: let
|
||||||
|
|
||||||
|
zigbee2mqtt_cfg = pkgs.writeText "zigbee2mqtt.json" (builtins.toJSON {
|
||||||
|
homeassistant = true;
|
||||||
|
permit_join = true;
|
||||||
|
mqtt = {
|
||||||
|
discovery = true;
|
||||||
|
base_topic = "zigbee";
|
||||||
|
server = "mqtt://10.42.0.1";
|
||||||
|
user = "gg23";
|
||||||
|
password = "gg23-mqtt";
|
||||||
|
};
|
||||||
|
serial.port = "/dev/cc2531";
|
||||||
|
});
|
||||||
|
|
||||||
|
in {
|
||||||
|
# symlink the zigbee controller
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dailout"
|
||||||
|
'';
|
||||||
|
|
||||||
|
system.activationScripts.installZigbee = ''
|
||||||
|
install -d /var/lib/zigbee2mqtt
|
||||||
|
install ${zigbee2mqtt_cfg} /var/lib/zigbee2mqtt/configuration.yaml
|
||||||
|
'';
|
||||||
|
|
||||||
|
# hack to restart docker container on config change
|
||||||
|
systemd.services.docker-zigbee2mqtt.environment.cfg = zigbee2mqtt_cfg;
|
||||||
|
|
||||||
|
docker-containers.zigbee2mqtt = {
|
||||||
|
image = "koenkk/zigbee2mqtt";
|
||||||
|
extraDockerOptions = [
|
||||||
|
"--device=/dev/cc2531:/dev/cc2531"
|
||||||
|
];
|
||||||
|
volumes = ["/var/lib/zigbee2mqtt:/app/data"];
|
||||||
|
};
|
||||||
|
|
||||||
|
lass.hass.config = {
|
||||||
|
sensor = [
|
||||||
|
# Sensor for monitoring the bridge state
|
||||||
|
{
|
||||||
|
platform = "mqtt";
|
||||||
|
name = "Zigbee2mqtt Bridge state";
|
||||||
|
state_topic = "/zigbee/bridge/state";
|
||||||
|
icon = "mdi:router-wireless";
|
||||||
|
}
|
||||||
|
# Sensor for Showing the Zigbee2mqtt Version
|
||||||
|
{
|
||||||
|
platform = "mqtt";
|
||||||
|
name = "Zigbee2mqtt Version";
|
||||||
|
state_topic = "/zigbee/bridge/config";
|
||||||
|
value_template = "{{ value_json.version }}";
|
||||||
|
icon = "mdi:zigbee";
|
||||||
|
}
|
||||||
|
# Sensor for Showing the Coordinator Version
|
||||||
|
{
|
||||||
|
platform = "mqtt";
|
||||||
|
name = "Coordinator Version";
|
||||||
|
state_topic = "/zigbee/bridge/config";
|
||||||
|
value_template = "{{ value_json.coordinator }}";
|
||||||
|
icon = "mdi:chip";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
switch = [
|
||||||
|
{
|
||||||
|
platform = "mqtt";
|
||||||
|
name = "Zigbee2mqtt Main join";
|
||||||
|
state_topic = "/zigbee/bridge/config/permit_join";
|
||||||
|
command_topic = "/zigbee/bridge/config/permit_join";
|
||||||
|
payload_on = "true";
|
||||||
|
payload_off = "false";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
automation = [
|
||||||
|
{
|
||||||
|
alias = "Zigbee2mqtt Log Level";
|
||||||
|
initial_state = "on";
|
||||||
|
trigger = {
|
||||||
|
platform = "state";
|
||||||
|
entity_id = "input_select.zigbee2mqtt_log_level";
|
||||||
|
};
|
||||||
|
action = [
|
||||||
|
{
|
||||||
|
service = "mqtt.publish";
|
||||||
|
data = {
|
||||||
|
payload_template = "{{ states('input_select.zigbee2mqtt_log_level') }}";
|
||||||
|
topic = "/zigbee/bridge/config/log_level";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
# Automation to start timer when enable join is turned on
|
||||||
|
{
|
||||||
|
id = "zigbee_join_enabled";
|
||||||
|
alias = "Zigbee Join Enabled";
|
||||||
|
hide_entity = "true";
|
||||||
|
trigger = {
|
||||||
|
platform = "state";
|
||||||
|
entity_id = "switch.zigbee2mqtt_main_join";
|
||||||
|
to = "on";
|
||||||
|
};
|
||||||
|
action = {
|
||||||
|
service = "timer.start";
|
||||||
|
entity_id = "timer.zigbee_permit_join";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
# Automation to stop timer when switch turned off and turn off switch when timer finished
|
||||||
|
{
|
||||||
|
id = "zigbee_join_disabled";
|
||||||
|
alias = "Zigbee Join Disabled";
|
||||||
|
hide_entity = "true";
|
||||||
|
trigger = [
|
||||||
|
{
|
||||||
|
platform = "event";
|
||||||
|
event_type = "timer.finished";
|
||||||
|
event_data.entity_id = "timer.zigbee_permit_join";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
platform = "state";
|
||||||
|
entity_id = "switch.zigbee2mqtt_main_join";
|
||||||
|
to = "off";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
action = [
|
||||||
|
{ service = "timer.cancel";
|
||||||
|
data.entity_id = "timer.zigbee_permit_join";
|
||||||
|
}
|
||||||
|
{ service = "switch.turn_off";
|
||||||
|
entity_id = "switch.zigbee2mqtt_main_join";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
input_select.zigbee2mqtt_log_level = {
|
||||||
|
name = "Zigbee2mqtt Log Level";
|
||||||
|
options = [
|
||||||
|
"debug"
|
||||||
|
"info"
|
||||||
|
"warn"
|
||||||
|
"error"
|
||||||
|
];
|
||||||
|
initial = "info";
|
||||||
|
icon = "mdi:format-list-bulleted";
|
||||||
|
};
|
||||||
|
|
||||||
|
timer.zigbee_permit_join = {
|
||||||
|
name = "Zigbee Time remaining";
|
||||||
|
duration = 120;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -26,7 +26,11 @@
|
|||||||
users.users.mainUser = {
|
users.users.mainUser = {
|
||||||
extraGroups = [ "networkmanager" ];
|
extraGroups = [ "networkmanager" ];
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
gnome3.gnome_keyring gnome3.dconf
|
gnome3.gnome_keyring
|
||||||
|
gnome3.dconf
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
environment.systemPackages = [
|
||||||
|
pkgs.nm-dmenu
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,10 @@ let
|
|||||||
music_dir = "/home/radio/music";
|
music_dir = "/home/radio/music";
|
||||||
|
|
||||||
add_random = pkgs.writeDashBin "add_random" ''
|
add_random = pkgs.writeDashBin "add_random" ''
|
||||||
${pkgs.mpc_cli}/bin/mpc add "$(${pkgs.mpc_cli}/bin/mpc ls the_playlist/music | grep '\.ogg$' | shuf -n1)"
|
${pkgs.mpc_cli}/bin/mpc add "$(${pkgs.findutils}/bin/find "${music_dir}/the_playlist" | grep -v '/other/' | grep '\.ogg$' | shuf -n1 | sed 's,${music_dir}/,,')"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
skip_track = pkgs.writeDashBin "skip_track" ''
|
skip_track = pkgs.writeBashBin "skip_track" ''
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
${add_random}/bin/add_random
|
${add_random}/bin/add_random
|
||||||
@ -23,21 +23,62 @@ let
|
|||||||
current_track=$(${pkgs.mpc_cli}/bin/mpc current -f %file%)
|
current_track=$(${pkgs.mpc_cli}/bin/mpc current -f %file%)
|
||||||
track_infos=$(${print_current}/bin/print_current)
|
track_infos=$(${print_current}/bin/print_current)
|
||||||
skip_count=$(${pkgs.attr}/bin/getfattr -n user.skip_count --only-values "$music_dir"/"$current_track" || echo 0)
|
skip_count=$(${pkgs.attr}/bin/getfattr -n user.skip_count --only-values "$music_dir"/"$current_track" || echo 0)
|
||||||
if [ "$skip_count" -gt 2 ]; then
|
if [[ "$current_track" =~ ^the_playlist/music/.* ]] && [ "$skip_count" -le 2 ]; then
|
||||||
mv "$music_dir"/"$current_track" "$music_dir"/.graveyard/
|
|
||||||
echo killing: "$track_infos"
|
|
||||||
else
|
|
||||||
skip_count=$((skip_count+1))
|
skip_count=$((skip_count+1))
|
||||||
${pkgs.attr}/bin/setfattr -n user.skip_count -v "$skip_count" "$music_dir"/"$current_track"
|
${pkgs.attr}/bin/setfattr -n user.skip_count -v "$skip_count" "$music_dir"/"$current_track"
|
||||||
echo skipping: "$track_infos" skip_count: "$skip_count"
|
echo skipping: "$track_infos" skip_count: "$skip_count"
|
||||||
|
else
|
||||||
|
mkdir -p "$music_dir"/.graveyard/
|
||||||
|
mv "$music_dir"/"$current_track" "$music_dir"/.graveyard/
|
||||||
|
echo killing: "$track_infos"
|
||||||
fi
|
fi
|
||||||
${pkgs.mpc_cli}/bin/mpc -q next
|
${pkgs.mpc_cli}/bin/mpc -q next
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
good_track = pkgs.writeBashBin "good_track" ''
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
music_dir=${escapeShellArg music_dir}
|
||||||
|
current_track=$(${pkgs.mpc_cli}/bin/mpc current -f %file%)
|
||||||
|
track_infos=$(${print_current}/bin/print_current)
|
||||||
|
if [[ "$current_track" =~ ^the_playlist/music/.* ]]; then
|
||||||
|
${pkgs.attr}/bin/setfattr -n user.skip_count -v 0 "$music_dir"/"$current_track"
|
||||||
|
else
|
||||||
|
mv "$music_dir"/"$current_track" "$music_dir"/the_playlist/music/ || :
|
||||||
|
fi
|
||||||
|
echo good: "$track_infos"
|
||||||
|
'';
|
||||||
|
|
||||||
|
track_youtube_link = pkgs.writeDash "track_youtube_link" ''
|
||||||
|
${pkgs.mpc_cli}/bin/mpc current -f %file% \
|
||||||
|
| ${pkgs.gnused}/bin/sed 's@.*\(.\{11\}\)\.ogg@https://www.youtube.com/watch?v=\1@'
|
||||||
|
'';
|
||||||
|
|
||||||
print_current = pkgs.writeDashBin "print_current" ''
|
print_current = pkgs.writeDashBin "print_current" ''
|
||||||
echo "$(${pkgs.mpc_cli}/bin/mpc current -f %file%) \
|
echo "$(${pkgs.mpc_cli}/bin/mpc current -f %file%) \
|
||||||
$(${pkgs.mpc_cli}/bin/mpc current -f %file% \
|
$(${track_youtube_link})"
|
||||||
| ${pkgs.gnused}/bin/sed 's@.*\(.\{11\}\)\.ogg@http://www.youtube.com/watch?v=\1@')"
|
'';
|
||||||
|
|
||||||
|
print_current_json = pkgs.writeDashBin "print_current_json" ''
|
||||||
|
${pkgs.jq}/bin/jq -n -c \
|
||||||
|
--arg name "$(${pkgs.mpc_cli}/bin/mpc current)" \
|
||||||
|
--arg filename "$(${pkgs.mpc_cli}/bin/mpc current -f %file%)" \
|
||||||
|
--arg youtube "$(${track_youtube_link})" '{
|
||||||
|
name: $name,
|
||||||
|
filename: $filename,
|
||||||
|
youtube: $youtube
|
||||||
|
}'
|
||||||
|
'';
|
||||||
|
|
||||||
|
write_to_irc = pkgs.writeDash "write_to_irc" ''
|
||||||
|
${pkgs.curl}/bin/curl -fsSv --unix-socket /home/radio/reaktor.sock http://z/ \
|
||||||
|
-H content-type:application/json \
|
||||||
|
-d "$(${pkgs.jq}/bin/jq -n \
|
||||||
|
--arg text "$1" '{
|
||||||
|
command:"PRIVMSG",
|
||||||
|
params:["#the_playlist",$text]
|
||||||
|
}'
|
||||||
|
)"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
in {
|
in {
|
||||||
@ -63,8 +104,10 @@ in {
|
|||||||
|
|
||||||
krebs.per-user.${name}.packages = with pkgs; [
|
krebs.per-user.${name}.packages = with pkgs; [
|
||||||
add_random
|
add_random
|
||||||
|
good_track
|
||||||
skip_track
|
skip_track
|
||||||
print_current
|
print_current
|
||||||
|
print_current_json
|
||||||
ncmpcpp
|
ncmpcpp
|
||||||
mpc_cli
|
mpc_cli
|
||||||
];
|
];
|
||||||
@ -130,6 +173,7 @@ in {
|
|||||||
tables = {
|
tables = {
|
||||||
filter.INPUT.rules = [
|
filter.INPUT.rules = [
|
||||||
{ predicate = "-p tcp --dport 8000"; target = "ACCEPT"; }
|
{ predicate = "-p tcp --dport 8000"; target = "ACCEPT"; }
|
||||||
|
{ predicate = "-i retiolum -p tcp --dport 8001"; target = "ACCEPT"; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -179,6 +223,7 @@ in {
|
|||||||
done | while read track; do
|
done | while read track; do
|
||||||
echo "$(date -Is)" "$track" | tee -a "$HISTORY_FILE"
|
echo "$(date -Is)" "$track" | tee -a "$HISTORY_FILE"
|
||||||
echo "$(tail -$LIMIT "$HISTORY_FILE")" > "$HISTORY_FILE"
|
echo "$(tail -$LIMIT "$HISTORY_FILE")" > "$HISTORY_FILE"
|
||||||
|
${write_to_irc} "playing: $track"
|
||||||
done
|
done
|
||||||
'';
|
'';
|
||||||
in {
|
in {
|
||||||
@ -190,6 +235,7 @@ in {
|
|||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = recentlyPlayed;
|
ExecStart = recentlyPlayed;
|
||||||
|
User = "radio";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -202,6 +248,7 @@ in {
|
|||||||
useTLS = true;
|
useTLS = true;
|
||||||
nick = "the_playlist";
|
nick = "the_playlist";
|
||||||
username = "radio";
|
username = "radio";
|
||||||
|
API.listen = "unix:/home/radio/reaktor.sock";
|
||||||
plugins = [
|
plugins = [
|
||||||
{
|
{
|
||||||
plugin = "register";
|
plugin = "register";
|
||||||
@ -224,6 +271,13 @@ in {
|
|||||||
arguments = [2];
|
arguments = [2];
|
||||||
commands = {
|
commands = {
|
||||||
skip.filename = "${skip_track}/bin/skip_track";
|
skip.filename = "${skip_track}/bin/skip_track";
|
||||||
|
next.filename = "${skip_track}/bin/skip_track";
|
||||||
|
bad.filename = "${skip_track}/bin/skip_track";
|
||||||
|
|
||||||
|
good.filename = "${good_track}/bin/good_track";
|
||||||
|
nice.filename = "${good_track}/bin/good_track";
|
||||||
|
like.filename = "${good_track}/bin/good_track";
|
||||||
|
|
||||||
current.filename = "${print_current}/bin/print_current";
|
current.filename = "${print_current}/bin/print_current";
|
||||||
suggest.filename = pkgs.writeDash "suggest" ''
|
suggest.filename = pkgs.writeDash "suggest" ''
|
||||||
echo "$@" >> playlist_suggest
|
echo "$@" >> playlist_suggest
|
||||||
@ -236,6 +290,42 @@ in {
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
krebs.htgen.radio = {
|
||||||
|
port = 8001;
|
||||||
|
user = {
|
||||||
|
name = "radio";
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
case "$Method $Request_URI" in
|
||||||
|
"GET /current")
|
||||||
|
printf 'HTTP/1.1 200 OK\r\n'
|
||||||
|
printf 'Connection: close\r\n'
|
||||||
|
printf '\r\n'
|
||||||
|
${print_current_json}/bin/print_current_json
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
"POST /skip")
|
||||||
|
printf 'HTTP/1.1 200 OK\r\n'
|
||||||
|
printf 'Connection: close\r\n'
|
||||||
|
printf '\r\n'
|
||||||
|
msg=$(${skip_track}/bin/skip_track)
|
||||||
|
${write_to_irc} "$msg"
|
||||||
|
echo "$msg"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
"POST /good")
|
||||||
|
printf 'HTTP/1.1 200 OK\r\n'
|
||||||
|
printf 'Connection: close\r\n'
|
||||||
|
printf '\r\n'
|
||||||
|
msg=$(${good_track}/bin/good_track)
|
||||||
|
${write_to_irc} "$msg"
|
||||||
|
echo "$msg"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
services.nginx = {
|
services.nginx = {
|
||||||
enable = true;
|
enable = true;
|
||||||
virtualHosts."radio.lassul.us" = {
|
virtualHosts."radio.lassul.us" = {
|
||||||
|
@ -4,6 +4,7 @@ _:
|
|||||||
./dnsmasq.nix
|
./dnsmasq.nix
|
||||||
./ejabberd
|
./ejabberd
|
||||||
./folderPerms.nix
|
./folderPerms.nix
|
||||||
|
./hass.nix
|
||||||
./hosts.nix
|
./hosts.nix
|
||||||
./mysql-backup.nix
|
./mysql-backup.nix
|
||||||
./news.nix
|
./news.nix
|
||||||
|
34
lass/3modules/hass.nix
Normal file
34
lass/3modules/hass.nix
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with import <stockholm/lib>;
|
||||||
|
let
|
||||||
|
|
||||||
|
cfg = config.lass.hass;
|
||||||
|
|
||||||
|
in {
|
||||||
|
options.lass.hass = {
|
||||||
|
config = mkOption {
|
||||||
|
default = {};
|
||||||
|
type = with lib.types; let
|
||||||
|
valueType = nullOr (oneOf [
|
||||||
|
bool
|
||||||
|
int
|
||||||
|
float
|
||||||
|
str
|
||||||
|
(attrsOf valueType)
|
||||||
|
(listOf valueType)
|
||||||
|
]) // {
|
||||||
|
description = "Yaml value";
|
||||||
|
emptyValue.value = {};
|
||||||
|
};
|
||||||
|
in valueType;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
assert versionOlder version "20.09";
|
||||||
|
mkIf (cfg.config != {})
|
||||||
|
{
|
||||||
|
services.home-assistant.config = cfg.config;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,10 @@
|
|||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
pkgs.writeHaskellPackage "xmonad-lass" {
|
pkgs.writers.writeHaskellBin "xmonad" {
|
||||||
executables.xmonad = {
|
libraries = with pkgs.haskellPackages; [
|
||||||
extra-depends = [
|
extra
|
||||||
"containers"
|
xmonad-stockholm
|
||||||
"extra"
|
|
||||||
"unix"
|
|
||||||
"X11"
|
|
||||||
"xmonad"
|
|
||||||
"xmonad-contrib"
|
|
||||||
"xmonad-stockholm"
|
|
||||||
];
|
];
|
||||||
text = /* haskell */ ''
|
} /* haskell */ ''
|
||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
|
||||||
|
|
||||||
@ -150,10 +144,7 @@ myKeyMap =
|
|||||||
|
|
||||||
, ("M4-<F2>", windows copyToAll)
|
, ("M4-<F2>", windows copyToAll)
|
||||||
|
|
||||||
, ("M4-<F4>", spawn "${pkgs.writeDash "nm-dmenu" ''
|
, ("M4-<F4>", spawn "${pkgs.nm-dmenu}/bin/nm-dmenu")
|
||||||
export PATH=$PATH:${pkgs.dmenu}/bin:${pkgs.networkmanagerapplet}/bin
|
|
||||||
exec ${pkgs.networkmanager_dmenu}/bin/networkmanager_dmenu "$@"
|
|
||||||
''}")
|
|
||||||
, ("M4-<Insert>", spawn "${pkgs.writeDash "paste" ''
|
, ("M4-<Insert>", spawn "${pkgs.writeDash "paste" ''
|
||||||
${pkgs.coreutils}/bin/sleep 0.1
|
${pkgs.coreutils}/bin/sleep 0.1
|
||||||
${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
|
${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
|
||||||
@ -223,6 +214,4 @@ gridConfig = def
|
|||||||
allWorkspaceNames :: W.StackSet i l a sid sd -> X [i]
|
allWorkspaceNames :: W.StackSet i l a sid sd -> X [i]
|
||||||
allWorkspaceNames ws =
|
allWorkspaceNames ws =
|
||||||
return $ map W.tag (W.hidden ws ++ (map W.workspace $ W.visible ws)) ++ [W.tag $ W.workspace $ W.current ws]
|
return $ map W.tag (W.hidden ws ++ (map W.workspace $ W.visible ws)) ++ [W.tag $ W.workspace $ W.current ws]
|
||||||
'';
|
''
|
||||||
};
|
|
||||||
}
|
|
||||||
|
@ -18,6 +18,9 @@
|
|||||||
ζ | zeta
|
ζ | zeta
|
||||||
(╯°□°)╯ ┻━┻ | table flip
|
(╯°□°)╯ ┻━┻ | table flip
|
||||||
(」゜ロ゜)」 | why woot
|
(」゜ロ゜)」 | why woot
|
||||||
|
(_゜_゜_) | gloom I see you
|
||||||
|
༼ ༎ຶ ෴ ༎ຶ༽ | sad
|
||||||
|
(\/) (°,,,,°) (\/) | krebs
|
||||||
'';
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
|
@ -33,7 +33,7 @@ pkgs.writeDashBin "fzfmenu" ''
|
|||||||
INPUT=$(${pkgs.coreutils}/bin/cat)
|
INPUT=$(${pkgs.coreutils}/bin/cat)
|
||||||
OUTPUT="$(${pkgs.coreutils}/bin/mktemp)"
|
OUTPUT="$(${pkgs.coreutils}/bin/mktemp)"
|
||||||
if [ -z ''${TERM+x} ]; then #check if we can print fzf in the shell
|
if [ -z ''${TERM+x} ]; then #check if we can print fzf in the shell
|
||||||
${pkgs.rxvt_unicode}/bin/urxvtc \
|
${pkgs.rxvt_unicode}/bin/urxvt \
|
||||||
-name fzfmenu -title fzfmenu \
|
-name fzfmenu -title fzfmenu \
|
||||||
-e ${pkgs.dash}/bin/dash -c \
|
-e ${pkgs.dash}/bin/dash -c \
|
||||||
"echo \"$INPUT\" | ${pkgs.fzf}/bin/fzf \
|
"echo \"$INPUT\" | ${pkgs.fzf}/bin/fzf \
|
||||||
|
6
lass/5pkgs/nm-dmenu/default.nix
Normal file
6
lass/5pkgs/nm-dmenu/default.nix
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
pkgs.writeDashBin "nm-dmenu" ''
|
||||||
|
export PATH=$PATH:${pkgs.dmenu}/bin:${pkgs.networkmanagerapplet}/bin
|
||||||
|
exec ${pkgs.networkmanager_dmenu}/bin/networkmanager_dmenu "$@"
|
||||||
|
''
|
39
lass/5pkgs/review-mail-queue/default.nix
Normal file
39
lass/5pkgs/review-mail-queue/default.nix
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{ pkgs }: let
|
||||||
|
|
||||||
|
review = pkgs.writers.writeBash "review-mail" ''
|
||||||
|
mail="$1"
|
||||||
|
${pkgs.exim}/bin/exim -Mvc "$mail" | grep -E 'Subject:|To:'
|
||||||
|
${pkgs.exim}/bin/exim -Mvl "$mail"
|
||||||
|
while :; do
|
||||||
|
read -p 'delete?' key
|
||||||
|
case "$key" in
|
||||||
|
v*)
|
||||||
|
${pkgs.exim}/bin/exim -Mvc "$mail"
|
||||||
|
;;
|
||||||
|
d*)
|
||||||
|
${pkgs.exim}/bin/exim -Mrm "$mail"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
r*)
|
||||||
|
${pkgs.exim}/bin/exim -Mt "$mail"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
n*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
echo '-------------------'
|
||||||
|
echo '-------------------'
|
||||||
|
echo '-------------------'
|
||||||
|
echo '-------------------'
|
||||||
|
echo '-------------------'
|
||||||
|
'';
|
||||||
|
|
||||||
|
in pkgs.writers.writeBashBin "review-mail" ''
|
||||||
|
for mail in $(${pkgs.exim}/bin/exim -bp \
|
||||||
|
| ${pkgs.gnugrep}/bin/grep frozen \
|
||||||
|
| ${pkgs.gawk}/bin/awk '{print $3}'); do
|
||||||
|
${review} "$mail"
|
||||||
|
done
|
||||||
|
''
|
@ -49,6 +49,8 @@ let
|
|||||||
|
|
||||||
indent = replaceChars ["\n"] ["\n "];
|
indent = replaceChars ["\n"] ["\n "];
|
||||||
|
|
||||||
|
stripAttr = converge (filterAttrsRecursive (n: v: v != {} && v != null));
|
||||||
|
|
||||||
mapNixDir = f: x: {
|
mapNixDir = f: x: {
|
||||||
list = foldl' mergeAttrs {} (map (mapNixDir1 f) x);
|
list = foldl' mergeAttrs {} (map (mapNixDir1 f) x);
|
||||||
path = mapNixDir1 f x;
|
path = mapNixDir1 f x;
|
||||||
|
@ -12,6 +12,9 @@ pactl = findExecutable "pactl"
|
|||||||
passmenu :: FilePath
|
passmenu :: FilePath
|
||||||
passmenu = findExecutable "passmenu"
|
passmenu = findExecutable "passmenu"
|
||||||
|
|
||||||
|
pavucontrol :: FilePath
|
||||||
|
pavucontrol = findExecutable "pavucontrol"
|
||||||
|
|
||||||
slock :: FilePath
|
slock :: FilePath
|
||||||
slock = findExecutable "slock"
|
slock = findExecutable "slock"
|
||||||
|
|
||||||
|
@ -160,6 +160,7 @@ myKeys conf = Map.fromList $
|
|||||||
, ((0, xF86XK_AudioLowerVolume), audioLowerVolume)
|
, ((0, xF86XK_AudioLowerVolume), audioLowerVolume)
|
||||||
, ((0, xF86XK_AudioRaiseVolume), audioRaiseVolume)
|
, ((0, xF86XK_AudioRaiseVolume), audioRaiseVolume)
|
||||||
, ((0, xF86XK_AudioMute), audioMute)
|
, ((0, xF86XK_AudioMute), audioMute)
|
||||||
|
, ((_4, xF86XK_AudioMute), pavucontrol [])
|
||||||
|
|
||||||
, ((_4, xK_Prior), forkFile Paths.xcalib ["-invert", "-alter"] Nothing)
|
, ((_4, xK_Prior), forkFile Paths.xcalib ["-invert", "-alter"] Nothing)
|
||||||
]
|
]
|
||||||
@ -175,6 +176,8 @@ myKeys conf = Map.fromList $
|
|||||||
_4SM = _4 .|. _S .|. _M
|
_4SM = _4 .|. _S .|. _M
|
||||||
|
|
||||||
pactl args = forkFile Paths.pactl args Nothing
|
pactl args = forkFile Paths.pactl args Nothing
|
||||||
|
pavucontrol args = forkFile Paths.pavucontrol args Nothing
|
||||||
|
|
||||||
audioLowerVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "-5%"]
|
audioLowerVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "-5%"]
|
||||||
audioRaiseVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "+5%"]
|
audioRaiseVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "+5%"]
|
||||||
audioMute = pactl ["--", "set-sink-mute", "@DEFAULT_SINK@", "toggle"]
|
audioMute = pactl ["--", "set-sink-mute", "@DEFAULT_SINK@", "toggle"]
|
||||||
|
Loading…
Reference in New Issue
Block a user