* tv identity: define type harder
This commit is contained in:
parent
14ac6d3bba
commit
504b1b90e8
@ -35,11 +35,8 @@ in
|
||||
singleton config.tv.github-hosts-sync.port;
|
||||
}
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
self = config.tv.identity.hosts.cd;
|
||||
};
|
||||
imports = [ ../../2configs/tv/identity.nix ];
|
||||
tv.identity.self = config.tv.identity.hosts.cd;
|
||||
}
|
||||
{
|
||||
imports = [ ../../3modules/tv/iptables.nix ];
|
||||
|
@ -11,11 +11,8 @@ with lib;
|
||||
../../2configs/tv/exim-smarthost.nix
|
||||
../../2configs/tv/git-public.nix
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
self = config.tv.identity.hosts.mkdir;
|
||||
};
|
||||
imports = [ ../../2configs/tv/identity.nix ];
|
||||
tv.identity.self = config.tv.identity.hosts.mkdir;
|
||||
}
|
||||
{
|
||||
imports = [ ../../3modules/tv/iptables.nix ];
|
||||
|
@ -10,11 +10,8 @@ with lib;
|
||||
../../2configs/tv/exim-retiolum.nix
|
||||
../../2configs/tv/git-public.nix
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
self = config.tv.identity.hosts.nomic;
|
||||
};
|
||||
imports = [ ../../2configs/tv/identity.nix ];
|
||||
tv.identity.self = config.tv.identity.hosts.nomic;
|
||||
}
|
||||
{
|
||||
imports = [ ../../3modules/tv/iptables.nix ];
|
||||
|
@ -11,11 +11,8 @@ with lib;
|
||||
../../2configs/tv/exim-smarthost.nix
|
||||
../../2configs/tv/git-public.nix
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
self = config.tv.identity.hosts.rmdir;
|
||||
};
|
||||
imports = [ ../../2configs/tv/identity.nix ];
|
||||
tv.identity.self = config.tv.identity.hosts.rmdir;
|
||||
}
|
||||
{
|
||||
imports = [ ../../3modules/tv/iptables.nix ];
|
||||
|
@ -18,11 +18,8 @@ in
|
||||
../../2configs/tv/xserver.nix
|
||||
../../2configs/tv/synaptics.nix # TODO w110er if xserver is enabled
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
self = config.tv.identity.hosts.wu;
|
||||
};
|
||||
imports = [ ../../2configs/tv/identity.nix ];
|
||||
tv.identity.self = config.tv.identity.hosts.wu;
|
||||
}
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
|
@ -123,7 +123,7 @@ let
|
||||
#loadmodule "extensions/ip_cloaking.so";
|
||||
|
||||
serverinfo {
|
||||
name = ${toJSON config.tv.identity.self.fqdn};
|
||||
name = ${toJSON (head config.tv.identity.self.nets.retiolum.aliases)};
|
||||
sid = "4z3";
|
||||
description = "miep!";
|
||||
network_name = "irc.retiolum";
|
||||
@ -133,9 +133,9 @@ let
|
||||
/* On multi-homed hosts you may need the following. These define
|
||||
* the addresses we connect from to other servers. */
|
||||
/* for IPv4 */
|
||||
vhost = ${toJSON config.tv.identity.self.addr};
|
||||
vhost = ${concatMapStringsSep ", " toJSON config.tv.identity.self.nets.retiolum.addrs4};
|
||||
/* for IPv6 */
|
||||
vhost6 = ${toJSON config.tv.identity.self.addr6};
|
||||
vhost6 = ${concatMapStringsSep ", " toJSON config.tv.identity.self.nets.retiolum.addrs6};
|
||||
|
||||
/* ssl_private_key: our ssl private key */
|
||||
ssl_private_key = "/tmp/ssl.key";
|
||||
@ -238,12 +238,10 @@ let
|
||||
/* If you want to listen on a specific IP only, specify host.
|
||||
* host definitions apply only to the following port line.
|
||||
*/
|
||||
host = ${toJSON config.tv.identity.self.addr};
|
||||
port = 6667;
|
||||
sslport = 6697;
|
||||
|
||||
/* Listen on IPv6 (if you used host= above). */
|
||||
host = ${toJSON config.tv.identity.self.addr6};
|
||||
# XXX This is stupid because only one host is allowed[?]
|
||||
#host = ''${concatMapStringsSep ", " toJSON (
|
||||
# config.tv.identity.self.nets.retiolum.addrs
|
||||
#)};
|
||||
port = 6667;
|
||||
sslport = 6697;
|
||||
};
|
||||
|
91
2configs/tv/identity.nix
Normal file
91
2configs/tv/identity.nix
Normal file
@ -0,0 +1,91 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
imports = [ ../../3modules/tv/identity.nix ];
|
||||
tv.identity = {
|
||||
enable = true;
|
||||
hosts = {
|
||||
cd = {
|
||||
cores = 2;
|
||||
dc = "tv"; #dc = "cac";
|
||||
nets = {
|
||||
internet = {
|
||||
addrs4 = ["162.219.7.216"];
|
||||
aliases = [
|
||||
"cd.internet"
|
||||
"cd.viljetic.de"
|
||||
"cgit.cd.viljetic.de"
|
||||
"cd.krebsco.de"
|
||||
];
|
||||
};
|
||||
retiolum = {
|
||||
addrs4 = ["10.243.113.222"];
|
||||
addrs6 = ["42:4522:25f8:36bb:8ccb:0150:231a:2af3"];
|
||||
aliases = [
|
||||
"cd.retiolum"
|
||||
"cgit.cd.retiolum"
|
||||
];
|
||||
};
|
||||
};
|
||||
search = "retiolum";
|
||||
};
|
||||
mkdir = {
|
||||
cores = 1;
|
||||
dc = "tv"; #dc = "cac";
|
||||
nets = {
|
||||
retiolum = {
|
||||
addrs4 = ["10.243.113.223"];
|
||||
aliases = [
|
||||
"mkdir.retiolum"
|
||||
"cgit.mkdir.retiolum"
|
||||
];
|
||||
};
|
||||
};
|
||||
search = "retiolum";
|
||||
};
|
||||
nomic = {
|
||||
cores = 2;
|
||||
dc = "tv"; #dc = "gg23";
|
||||
nets = {
|
||||
retiolum = {
|
||||
addrs4 = ["10.243.0.110"];
|
||||
aliases = [
|
||||
"nomic.retiolum"
|
||||
"cgit.nomic.retiolum"
|
||||
];
|
||||
};
|
||||
};
|
||||
search = "retiolum";
|
||||
};
|
||||
rmdir = {
|
||||
cores = 1;
|
||||
dc = "tv"; #dc = "cac";
|
||||
nets = {
|
||||
retiolum = {
|
||||
addrs4 = ["10.243.113.224"];
|
||||
addrs6 = ["42:4522:25f8:36bb:8ccb:0150:231a:2af5"];
|
||||
aliases = [
|
||||
"rmdir.retiolum"
|
||||
"cgit.rmdir.retiolum"
|
||||
];
|
||||
};
|
||||
};
|
||||
search = "retiolum";
|
||||
};
|
||||
wu = {
|
||||
cores = 4;
|
||||
# TODO wu is mobile, so dc means "home data center"
|
||||
dc = "tv"; #dc = "gg23";
|
||||
nets = {
|
||||
retiolum = {
|
||||
addrs4 = ["10.243.13.37"];
|
||||
aliases = [
|
||||
"wu.retiolum"
|
||||
];
|
||||
};
|
||||
};
|
||||
search = "retiolum";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -5,8 +5,7 @@
|
||||
# TODO consul-bootstrap HOST that actually does is
|
||||
# TODO tools to inspect state of a cluster in outage state
|
||||
|
||||
with builtins;
|
||||
with lib;
|
||||
with import ../../4lib/tv { inherit lib pkgs; };
|
||||
let
|
||||
cfg = config.tv.consul;
|
||||
|
||||
@ -24,10 +23,10 @@ let
|
||||
enable = mkEnableOption "tv.consul";
|
||||
|
||||
dc = mkOption {
|
||||
type = types.unspecified;
|
||||
type = types.label;
|
||||
};
|
||||
hosts = mkOption {
|
||||
type = with types; listOf unspecified;
|
||||
type = with types; listOf host;
|
||||
};
|
||||
encrypt-file = mkOption {
|
||||
type = types.str; # TODO path (but not just into store)
|
||||
@ -38,7 +37,7 @@ let
|
||||
default = "/var/lib/consul";
|
||||
};
|
||||
self = mkOption {
|
||||
type = types.unspecified;
|
||||
type = types.host;
|
||||
};
|
||||
server = mkOption {
|
||||
type = types.bool;
|
||||
@ -56,9 +55,11 @@ let
|
||||
log_level = "INFO";
|
||||
#node_name =
|
||||
server = cfg.server;
|
||||
bind_addr = cfg.self.addr; # TODO cfg.addr
|
||||
enable_syslog = true;
|
||||
retry_join = map (getAttr "addr") (filter (host: host.fqdn != cfg.self.fqdn) cfg.hosts);
|
||||
retry_join =
|
||||
# TODO allow consul in other nets than retiolum [maybe]
|
||||
concatMap (host: host.nets.retiolum.addrs)
|
||||
(filter (host: host.name != cfg.self.name) cfg.hosts);
|
||||
leave_on_terminate = true;
|
||||
} // optionalAttrs cfg.server {
|
||||
bootstrap_expect = length cfg.hosts;
|
||||
|
@ -1,6 +1,6 @@
|
||||
{ config, lib, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
with import ../../4lib/tv { inherit lib pkgs; };
|
||||
let
|
||||
cfg = config.tv.identity;
|
||||
|
||||
@ -13,77 +13,66 @@ let
|
||||
enable = mkEnableOption "tv.identity";
|
||||
|
||||
self = mkOption {
|
||||
type = types.unspecified;
|
||||
type = types.host;
|
||||
};
|
||||
|
||||
others = mkOption {
|
||||
type = types.host;
|
||||
default = filterAttrs (name: _host: name != cfg.self.name) cfg.hosts;
|
||||
};
|
||||
|
||||
hosts = mkOption {
|
||||
type = with types; attrsOf unspecified;
|
||||
default = {
|
||||
cd = {
|
||||
#dc = "cac";
|
||||
dc = "tv";
|
||||
fqdn = "cd.retiolum";
|
||||
subdomains = [
|
||||
"cgit"
|
||||
];
|
||||
addr = "10.243.113.222";
|
||||
addr6 = "42:4522:25f8:36bb:8ccb:0150:231a:2af3";
|
||||
#internet-addr = "162.219.5.183";
|
||||
cores = 2;
|
||||
};
|
||||
mkdir = {
|
||||
#dc = "cac";
|
||||
dc = "tv";
|
||||
fqdn = "mkdir.retiolum";
|
||||
subdomains = [
|
||||
"cgit"
|
||||
];
|
||||
addr = "10.243.113.223";
|
||||
cores = 1;
|
||||
};
|
||||
nomic = {
|
||||
#dc = "gg";
|
||||
dc = "tv";
|
||||
fqdn = "nomic.retiolum";
|
||||
subdomains = [
|
||||
"cgit"
|
||||
];
|
||||
addr = "10.243.0.110";
|
||||
cores = 2;
|
||||
};
|
||||
rmdir = {
|
||||
#dc = "cac";
|
||||
dc = "tv";
|
||||
fqdn = "rmdir.retiolum";
|
||||
subdomains = [
|
||||
"cgit"
|
||||
];
|
||||
addr = "10.243.113.224";
|
||||
#addr = "42:4522:25f8:36bb:8ccb:0150:231a:2af5";
|
||||
cores = 1;
|
||||
};
|
||||
wu = {
|
||||
#dc = "gg";
|
||||
dc = "tv";
|
||||
fqdn = "wu.retiolum";
|
||||
subdomains = [
|
||||
"cgit"
|
||||
];
|
||||
addr = "10.243.13.37";
|
||||
cores = 8;
|
||||
};
|
||||
};
|
||||
type = with types; attrsOf host;
|
||||
apply = mapAttrs (name: value: value // { inherit name; });
|
||||
};
|
||||
};
|
||||
|
||||
imp = {
|
||||
networking.extraHosts =
|
||||
let
|
||||
f = name: { addr, fqdn, subdomains, ... }: ''
|
||||
${addr} ${toString (map (s: "${s}.${name} ${s}.${fqdn}") subdomains)}
|
||||
'';
|
||||
in
|
||||
concatStringsSep "\n" (mapAttrsToList f cfg.hosts);
|
||||
concatStringsSep "\n" (flatten (
|
||||
# TODO deepMap ["hosts" "nets"] (hostname: host: netname: net:
|
||||
mapAttrsToList (hostname: host:
|
||||
mapAttrsToList (netname: net:
|
||||
let
|
||||
aliases = toString (unique (longs ++ shorts));
|
||||
longs = (splitByProvider net.aliases).hosts;
|
||||
shorts = map (removeSuffix ".${cfg.self.search}") longs;
|
||||
in
|
||||
map (addr: "${addr} ${aliases}") net.addrs
|
||||
) host.nets
|
||||
) cfg.hosts
|
||||
));
|
||||
};
|
||||
|
||||
# TODO move domain name providers to a dedicated module
|
||||
# providers : tree label providername
|
||||
providers = {
|
||||
internet = "hosts";
|
||||
retiolum = "hosts";
|
||||
de.viljetic = "regfish";
|
||||
de.krebsco = "ovh";
|
||||
};
|
||||
|
||||
# splitByProvider : [alias] -> set providername [alias]
|
||||
splitByProvider = foldl (acc: alias: insert (providerOf alias) alias acc) {};
|
||||
|
||||
# providerOf : alias -> providername
|
||||
providerOf = alias:
|
||||
tree-get (splitString "." alias) providers;
|
||||
|
||||
# insert : k -> v -> set k [v] -> set k [v]
|
||||
insert = name: value: set:
|
||||
set // { ${name} = set.${name} or [] ++ [value]; };
|
||||
|
||||
# tree k v = set k (either v (tree k v))
|
||||
|
||||
# tree-get : [k] -> tree k v -> v
|
||||
tree-get = path: x:
|
||||
let
|
||||
y = x.${last path};
|
||||
in
|
||||
if typeOf y != "set"
|
||||
then y
|
||||
else tree-get (init path) y;
|
||||
in
|
||||
out
|
||||
|
@ -1,12 +1,10 @@
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
with builtins;
|
||||
with lib;
|
||||
|
||||
let
|
||||
inherit (lib) mapAttrs stringAsChars;
|
||||
in
|
||||
builtins // lib // rec {
|
||||
|
||||
rec {
|
||||
git = import ./git.nix {
|
||||
lib = lib // {
|
||||
inherit addNames;
|
||||
@ -59,4 +57,62 @@ rec {
|
||||
else if c == "\n" then "'\n'"
|
||||
else "\\${c}");
|
||||
|
||||
types = lib.types // (with lib.types; rec {
|
||||
|
||||
host = submodule {
|
||||
options = {
|
||||
name = mkOption {
|
||||
type = label;
|
||||
};
|
||||
dc = mkOption {
|
||||
type = label;
|
||||
};
|
||||
cores = mkOption {
|
||||
type = positive;
|
||||
};
|
||||
nets = mkOption {
|
||||
type = attrsOf net;
|
||||
apply = x: assert hasAttr "retiolum" x; x;
|
||||
};
|
||||
search = mkOption {
|
||||
type = hostname;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
net = submodule ({ config, ... }: {
|
||||
options = {
|
||||
addrs = mkOption {
|
||||
type = listOf addr;
|
||||
apply = _: config.addrs4 ++ config.addrs6;
|
||||
};
|
||||
addrs4 = mkOption {
|
||||
type = listOf addr4;
|
||||
default = [];
|
||||
};
|
||||
addrs6 = mkOption {
|
||||
type = listOf addr6;
|
||||
default = [];
|
||||
};
|
||||
aliases = mkOption {
|
||||
# TODO nonEmptyListOf hostname
|
||||
type = listOf hostname;
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
positive = mkOptionType {
|
||||
name = "positive integer";
|
||||
check = x: isInt x && x > 0;
|
||||
merge = mergeOneOption;
|
||||
};
|
||||
|
||||
# TODO
|
||||
addr = str;
|
||||
addr4 = str;
|
||||
addr6 = str;
|
||||
hostname = str;
|
||||
label = str;
|
||||
});
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user