diff --git a/nixos/modules/services/networking/shout.nix b/nixos/modules/services/networking/shout.nix
index f069fe7bec96..761ecbcd173d 100644
--- a/nixos/modules/services/networking/shout.nix
+++ b/nixos/modules/services/networking/shout.nix
@@ -6,6 +6,21 @@ let
cfg = config.services.shout;
shoutHome = "/var/lib/shout";
+ defaultConfig = pkgs.runCommand "config.js" {} ''
+ EDITOR=true ${pkgs.shout}/bin/shout config --home $PWD
+ mv config.js $out
+ '';
+
+ configFile = if (cfg.configFile != null) then cfg.configFile else ''
+ var _ = require('${pkgs.shout}/lib/node_modules/shout/node_modules/lodash')
+
+ module.exports = _.merge(
+ {},
+ require('${defaultConfig}'),
+ ${builtins.toJSON cfg.config}
+ )
+ '';
+
in {
options.services.shout = {
enable = mkEnableOption "Shout web IRC client";
@@ -33,10 +48,33 @@ in {
configFile = mkOption {
type = types.nullOr types.lines;
- default = null;
+ default = configFile;
description = ''
- Contents of Shout's config.js file. If left empty,
- Shout will generate from its defaults at first startup.
+ Contents of Shout's config.js file.
+
+ Used for backward compatibility, recommended way is now to use
+ the config option.
+
+ Documentation: http://shout-irc.com/docs/server/configuration.html
+ '';
+ };
+
+ config = mkOption {
+ default = {};
+ type = types.attrs;
+ example = {
+ displayNetwork = false;
+ defaults = {
+ name = "Your Network";
+ host = "localhost";
+ port = 6697;
+ };
+ };
+ description = ''
+ Shout config.js contents as attribute set (will be
+ converted to JSON to generate the configuration file).
+
+ The options defined here will be merged to the default configuration file.
Documentation: http://shout-irc.com/docs/server/configuration.html
'';
@@ -57,11 +95,7 @@ in {
wantedBy = [ "multi-user.target" ];
wants = [ "network-online.target" ];
after = [ "network-online.target" ];
- preStart = if isNull cfg.configFile then ""
- else ''
- ln -sf ${pkgs.writeText "config.js" cfg.configFile} \
- ${shoutHome}/config.js
- '';
+ preStart = "ln -sf ${pkgs.writeText "config.js" configFile} ${shoutHome}/config.js";
script = concatStringsSep " " [
"${pkgs.shout}/bin/shout"
(if cfg.private then "--private" else "--public")