{ pkgs, lib, config, ... }: let cfg = config.services.dysnomia; printProperties = properties: lib.concatMapStrings ( propertyName: let property = properties.${propertyName}; in if lib.isList property then "${propertyName}=(${ lib.concatMapStrings (elem: "\"${toString elem}\" ") (properties.${propertyName}) })\n" else "${propertyName}=\"${toString property}\"\n" ) (builtins.attrNames properties); properties = pkgs.stdenv.mkDerivation { name = "dysnomia-properties"; buildCommand = '' cat > $out << "EOF" ${printProperties cfg.properties} EOF ''; }; containersDir = pkgs.stdenv.mkDerivation { name = "dysnomia-containers"; buildCommand = '' mkdir -p $out cd $out ${lib.concatMapStrings ( containerName: let containerProperties = cfg.containers.${containerName}; in '' cat > ${containerName} < If you have migrated already or don't rely on these Dysnomia modules, you can disable legacy mode with the following NixOS configuration option: dysnomia.enableLegacyModules = false; In a future version of Dysnomia (and NixOS) the legacy option will go away! '' true; } ); services.dysnomia.properties = { hostname = config.networking.hostName; inherit (pkgs.stdenv.hostPlatform) system; supportedTypes = [ "echo" "fileset" "process" "wrapper" # These are not base modules, but they are still enabled because they work with technology that are always enabled in NixOS "systemd-unit" "sysvinit-script" "nixos-configuration" ] ++ lib.optional (dysnomiaFlags.enableApacheWebApplication) "apache-webapplication" ++ lib.optional (dysnomiaFlags.enableAxis2WebService) "axis2-webservice" ++ lib.optional (dysnomiaFlags.enableDockerContainer) "docker-container" ++ lib.optional (dysnomiaFlags.enableEjabberdDump) "ejabberd-dump" ++ lib.optional (dysnomiaFlags.enableInfluxDatabase) "influx-database" ++ lib.optional (dysnomiaFlags.enableMySQLDatabase) "mysql-database" ++ lib.optional (dysnomiaFlags.enablePostgreSQLDatabase) "postgresql-database" ++ lib.optional (dysnomiaFlags.enableTomcatWebApplication) "tomcat-webapplication" ++ lib.optional (dysnomiaFlags.enableMongoDatabase) "mongo-database" ++ lib.optional (dysnomiaFlags.enableSubversionRepository) "subversion-repository"; }; services.dysnomia.containers = lib.recursiveUpdate ( { process = { }; wrapper = { }; } // lib.optionalAttrs (config.services.httpd.enable) { apache-webapplication = { documentRoot = config.services.httpd.virtualHosts.localhost.documentRoot; }; } // lib.optionalAttrs (config.services.tomcat.axis2.enable) { axis2-webservice = { }; } // lib.optionalAttrs (config.services.ejabberd.enable) { ejabberd-dump = { ejabberdUser = config.services.ejabberd.user; }; } // lib.optionalAttrs (config.services.mysql.enable) { mysql-database = { mysqlPort = config.services.mysql.settings.mysqld.port; mysqlSocket = "/run/mysqld/mysqld.sock"; } // lib.optionalAttrs cfg.enableAuthentication { mysqlUsername = "root"; }; } // lib.optionalAttrs (config.services.postgresql.enable) { postgresql-database = { } // lib.optionalAttrs (cfg.enableAuthentication) { postgresqlUsername = "postgres"; }; } // lib.optionalAttrs (config.services.tomcat.enable) { tomcat-webapplication = { tomcatPort = 8080; }; } // lib.optionalAttrs (config.services.mongodb.enable) { mongo-database = { }; } // lib.optionalAttrs (config.services.influxdb.enable) { influx-database = { influxdbUsername = config.services.influxdb.user; influxdbDataDir = "${config.services.influxdb.dataDir}/data"; influxdbMetaDir = "${config.services.influxdb.dataDir}/meta"; }; } // lib.optionalAttrs (config.services.svnserve.enable) { subversion-repository = { svnBaseDir = config.services.svnserve.svnBaseDir; }; } ) cfg.extraContainerProperties; boot.extraSystemdUnitPaths = [ "/etc/systemd-mutable/system" ]; system.activationScripts.dysnomia = '' mkdir -p /etc/systemd-mutable/system if [ ! -f /etc/systemd-mutable/system/dysnomia.target ] then ( echo "[Unit]" echo "Description=Services that are activated and deactivated by Dysnomia" echo "After=final.target" ) > /etc/systemd-mutable/system/dysnomia.target fi ''; }; }