summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/networking/nntp-proxy.nix
diff options
context:
space:
mode:
authorTristan Helmich <tristan.helmich@gmail.com>2016-02-26 15:19:46 +0100
committerTristan Helmich <tristan.helmich@gmail.com>2016-03-03 14:14:19 +0100
commit17389e256fa1651d8577555ac8fe7aa23044f0e6 (patch)
treec9286030a8f8ea5db7b5a9e3c2ce9335275f101f /nixos/modules/services/networking/nntp-proxy.nix
parentc8e55671cd85a7468a726eb0bc2d127b61aaa4f4 (diff)
nntp-proxy service: init
Diffstat (limited to 'nixos/modules/services/networking/nntp-proxy.nix')
-rw-r--r--nixos/modules/services/networking/nntp-proxy.nix234
1 files changed, 234 insertions, 0 deletions
diff --git a/nixos/modules/services/networking/nntp-proxy.nix b/nixos/modules/services/networking/nntp-proxy.nix
new file mode 100644
index 000000000000..cd0889351a3d
--- /dev/null
+++ b/nixos/modules/services/networking/nntp-proxy.nix
@@ -0,0 +1,234 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ inherit (pkgs) nntp-proxy;
+
+ proxyUser = "nntp-proxy";
+
+ cfg = config.services.nntp-proxy;
+
+ configBool = b: if b then "TRUE" else "FALSE";
+
+ confFile = pkgs.writeText "nntp-proxy.conf" ''
+ nntp_server:
+ {
+ # NNTP Server host and port address
+ server = "${cfg.upstreamServer}";
+ port = ${toString cfg.upstreamPort};
+ # NNTP username
+ username = "${cfg.upstreamUser}";
+ # NNTP password in clear text
+ password = "${cfg.upstreamPassword}";
+ # Maximum number of connections allowed by the NNTP
+ max_connections = ${toString cfg.upstreamMaxConnections};
+ };
+
+ proxy:
+ {
+ # Local address and port to bind to
+ bind_ip = "${cfg.listenAddress}";
+ bind_port = ${toString cfg.port};
+
+ # SSL key and cert file
+ ssl_key = "${cfg.sslKey}";
+ ssl_cert = "${cfg.sslCert}";
+
+ # prohibit users from posting
+ prohibit_posting = ${configBool cfg.prohibitPosting};
+ # Verbose levels: ERROR, WARNING, NOTICE, INFO, DEBUG
+ verbose = "${toUpper cfg.verbosity}";
+ # Password is made with: 'mkpasswd -m sha-512 <password>'
+ users = (${concatStringsSep ",\n" (mapAttrsToList (username: userConfig:
+ ''
+ {
+ username = "${username}";
+ password = "${userConfig.passwordHash}";
+ max_connections = ${toString userConfig.maxConnections};
+ }
+ '') cfg.users)});
+ };
+ '';
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.nntp-proxy = {
+ enable = mkEnableOption "NNTP-Proxy";
+
+ upstreamServer = mkOption {
+ type = types.str;
+ default = "";
+ example = "ssl-eu.astraweb.com";
+ description = ''
+ Upstream server address
+ '';
+ };
+
+ upstreamPort = mkOption {
+ type = types.int;
+ default = 563;
+ description = ''
+ Upstream server port
+ '';
+ };
+
+ upstreamMaxConnections = mkOption {
+ type = types.int;
+ default = 20;
+ description = ''
+ Upstream server maximum allowed concurrent connections
+ '';
+ };
+
+ upstreamUser = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ Upstream server username
+ '';
+ };
+
+ upstreamPassword = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ Upstream server password
+ '';
+ };
+
+ listenAddress = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ example = "[::]";
+ description = ''
+ Proxy listen address (IPv6 literal addresses need to be enclosed in "[" and "]" characters)
+ '';
+ };
+
+ port = mkOption {
+ type = types.int;
+ default = 5555;
+ description = ''
+ Proxy listen port
+ '';
+ };
+
+ sslKey = mkOption {
+ type = types.str;
+ default = "key.pem";
+ example = "/path/to/your/key.file";
+ description = ''
+ Proxy ssl key path
+ '';
+ };
+
+ sslCert = mkOption {
+ type = types.str;
+ default = "cert.pem";
+ example = "/path/to/your/cert.file";
+ description = ''
+ Proxy ssl certificate path
+ '';
+ };
+
+ prohibitPosting = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to prohibit posting to the upstream server
+ '';
+ };
+
+ verbosity = mkOption {
+ type = types.str;
+ default = "info";
+ example = "error";
+ description = ''
+ Verbosity level (error, warning, notice, info, debug)
+ '';
+ };
+
+ users = mkOption {
+ type = types.attrsOf (types.submodule {
+ options = {
+ username = mkOption {
+ type = types.str;
+ default = null;
+ description = ''
+ Username
+ '';
+ };
+
+ passwordHash = mkOption {
+ type = types.str;
+ default = null;
+ example = "$6$GtzE7FrpE$wwuVgFYU.TZH4Rz.Snjxk9XGua89IeVwPQ/fEUD8eujr40q5Y021yhn0aNcsQ2Ifw.BLclyzvzgegopgKcneL0";
+ description = ''
+ SHA-512 password hash (can be generated by 'mkpasswd -m sha-512 <password>')
+ '';
+ };
+
+ maxConnections = mkOption {
+ type = types.int;
+ default = 1;
+ description = ''
+ Maximum number of concurrent connections to the proxy for this user
+ '';
+ };
+ };
+ });
+ description = ''
+ NNTP-Proxy user configuration
+ '';
+
+ default = {};
+ example = literalExample ''
+ "user1" = {
+ passwordHash = "$6$1l0t5Kn2Dk$appzivc./9l/kjq57eg5UCsBKlcfyCr0zNWYNerKoPsI1d7eAwiT0SVsOVx/CTgaBNT/u4fi2vN.iGlPfv1ek0";
+ maxConnections = 5;
+ };
+ "anotheruser" = {
+ passwordHash = "$6$6lwEsWB.TmsS$W7m1riUx4QrA8pKJz8hvff0dnF1NwtZXgdjmGqA1Dx2MDPj07tI9GNcb0SWlMglE.2/hBgynDdAd/XqqtRqVQ0";
+ maxConnections = 7;
+ };
+ '';
+ };
+ };
+
+ };
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ users.extraUsers = singleton
+ { name = proxyUser;
+ uid = config.ids.uids.nntp-proxy;
+ description = "NNTP-Proxy daemon user";
+ };
+
+ systemd.services.nntp-proxy = {
+ description = "NNTP proxy";
+ after = [ "network.target" "nss-lookup.target" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = { User="${proxyUser}"; };
+ serviceConfig.ExecStart = "${nntp-proxy}/bin/nntp-proxy ${confFile}";
+ preStart = ''
+ if [ ! \( -f ${cfg.sslCert} -a -f ${cfg.sslKey} \) ]; then
+ ${pkgs.openssl}/bin/openssl req -subj '/CN=AutoGeneratedCert/O=NixOS Service/C=US' \
+ -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout ${cfg.sslKey} -out ${cfg.sslCert};
+ fi
+ '';
+ };
+
+ };
+
+}