shout service: New module.

Changed files
+83
nixos
modules
misc
services
networking
+2
nixos/modules/misc/ids.nix
···
riemanntools = 203;
subsonic = 204;
riak = 205;
+
shout = 206;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
···
riemanntools = 203;
subsonic = 204;
riak = 205;
+
#shout = 206; #unused
# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal
+1
nixos/modules/module-list.nix
···
./services/networking/searx.nix
./services/networking/seeks.nix
./services/networking/skydns.nix
+
./services/networking/shout.nix
./services/networking/spiped.nix
./services/networking/sslh.nix
./services/networking/ssh/lshd.nix
+80
nixos/modules/services/networking/shout.nix
···
+
{ pkgs, lib, config, options, ... }:
+
+
with lib;
+
+
let
+
cfg = config.services.shout;
+
shoutHome = "/var/lib/shout";
+
+
in {
+
options.services.shout = {
+
enable = mkEnableOption "Shout web IRC client";
+
+
private = mkOption {
+
type = types.bool;
+
default = false;
+
description = ''
+
Make your shout instance private. You will need to configure user
+
accounts by adding entries in <filename>${shoutHome}/users</filename>.
+
'';
+
};
+
+
host = mkOption {
+
type = types.string;
+
default = "0.0.0.0";
+
description = "IP interface to listen on for http connections.";
+
};
+
+
port = mkOption {
+
type = types.int;
+
default = 9000;
+
description = "TCP port to listen on for http connections.";
+
};
+
+
configFile = mkOption {
+
type = types.nullOr types.lines;
+
default = null;
+
description = ''
+
Contents of Shout's <filename>config.js</filename> file. If left empty,
+
Shout will generate from its defaults at first startup.
+
+
Documentation: http://shout-irc.com/docs/server/configuration.html
+
'';
+
};
+
};
+
+
config = mkIf cfg.enable {
+
users.extraUsers = singleton {
+
name = "shout";
+
uid = config.ids.uids.shout;
+
description = "Shout daemon user";
+
home = shoutHome;
+
createHome = true;
+
};
+
+
systemd.services.shout = {
+
description = "Shout web IRC client";
+
wantedBy = [ "multi-user.target" ];
+
wants = [ "network-online.target" ];
+
after = [ "network-online.target" ];
+
preStart = if isNull cfg.configFile then null
+
else ''
+
ln -sf ${pkgs.writeText "config.js" cfg.configFile} \
+
${shoutHome}/config.js
+
'';
+
script = concatStringsSep " " [
+
"${pkgs.shout}/bin/shout"
+
(if cfg.private then "--private" else "--public")
+
"--port" (toString cfg.port)
+
"--host" (toString cfg.host)
+
"--home" shoutHome
+
];
+
serviceConfig = {
+
User = "shout";
+
ProtectHome = "true";
+
ProtectSystem = "full";
+
PrivateTmp = "true";
+
};
+
};
+
};
+
}