Author: NicolasPierron Date: Wed Jul 27 20:55:28 2011 New Revision: 27977 URL: https://svn.nixos.org/websvn/nix/?rev=27977&sc=1
Log: Add new services: freepops, fuppes and ups. Added: nixos/trunk/modules/services/audio/fuppes/ nixos/trunk/modules/services/audio/fuppes.nix nixos/trunk/modules/services/audio/fuppes/vfolder.cfg nixos/trunk/modules/services/mail/freepops.nix nixos/trunk/modules/services/monitoring/ups.nix Modified: nixos/trunk/modules/module-list.nix Modified: nixos/trunk/modules/module-list.nix ============================================================================== --- nixos/trunk/modules/module-list.nix Wed Jul 27 16:42:00 2011 (r27976) +++ nixos/trunk/modules/module-list.nix Wed Jul 27 20:55:28 2011 (r27977) @@ -50,6 +50,7 @@ ./security/sudo.nix ./services/amqp/rabbitmq.nix ./services/audio/alsa.nix + ./services/audio/fuppes.nix ./services/audio/pulseaudio.nix ./services/backup/hydra-mirror.nix ./services/backup/mysql-backup.nix @@ -73,6 +74,7 @@ ./services/logging/logrotate.nix ./services/logging/syslogd.nix ./services/mail/dovecot.nix + ./services/mail/freepops.nix ./services/mail/mail.nix ./services/mail/postfix.nix ./services/misc/autofs.nix @@ -89,6 +91,7 @@ ./services/misc/virtualbox.nix ./services/monitoring/monit.nix ./services/monitoring/nagios/default.nix + ./services/monitoring/ups.nix ./services/monitoring/smartd.nix ./services/monitoring/systemhealth.nix ./services/monitoring/zabbix-agent.nix Added: nixos/trunk/modules/services/audio/fuppes.nix ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ nixos/trunk/modules/services/audio/fuppes.nix Wed Jul 27 20:55:28 2011 (r27977) @@ -0,0 +1,114 @@ +{config, pkgs, ...}: + +let + cfg = config.services.fuppesd; +in + +with pkgs.lib; + +{ + options = { + services.fuppesd = { + enable = mkOption { + default = false; + type = with types; bool; + description = '' + Enables Fuppes (UPnP A/V Media Server). Can be used to watch + photos, video and listen to music from a phone/tv connected to the + local network. + ''; + }; + + name = mkOption { + example = "Media Center"; + type = with types; uniq string; + description = '' + Enables Fuppes (UPnP A/V Media Server). Can be used to watch + photos, video and listen to music from a phone/tv connected to the + local network. + ''; + }; + + log = { + level = mkOption { + default = 0; + example = 3; + type = with types; uniq int; + description = '' + Logging level of fuppes, An integer between 0 and 3. + ''; + }; + + file = mkOption { + default = "/var/log/fuppes.log"; + type = with types; uniq string; + description = '' + File which will contains the log produced by the daemon. + ''; + }; + }; + + config = mkOption { + example = "/etc/fuppes/fuppes.cfg"; + type = with types; uniq string; + description = '' + Mutable configuration file which can be edited with the web + interface. Due to possible modification, double quote the full + path of the filename stored in your filesystem to avoid attempts + to modify the content of the nix store. + ''; + }; + + vfolder = mkOption { + default = ./fuppes/vfolder.cfg; + example = /etc/fuppes/vfolder.cfg; + description = '' + XML file describing the layout of virtual folder visible by the + client. + ''; + }; + + database = mkOption { + default = "/var/lib/fuppes/fuppes.db"; + type = with types; uniq string; + description = '' + Database file which index all shared files. + ''; + }; + + ## At the moment, no plugins are packaged. + /* + plugins = mkOption { + type = with types; listOf package; + description = '' + List of Fuppes plugins. + ''; + }; + */ + + user = mkOption { + default = "root"; # The default is not secure. + example = "fuppes"; + type = with types; uniq string; + description = '' + Name of the user which own the configuration files and under which + the fuppes daemon will be executed. + ''; + }; + + }; + }; + + config = mkIf cfg.enable { + jobs.fuppesd = { + description = "UPnP A/V Media Server. (${cfg.name})"; + startOn = "ip-up"; + daemonType = "fork"; + exec = ''/var/setuid-wrappers/sudo -u ${cfg.user} -- ${pkgs.fuppes}/bin/fuppesd --friendly-name ${cfg.name} --log-level ${toString cfg.log.level} --log-file ${cfg.log.file} --config-file ${cfg.config} --vfolder-config-file ${cfg.vfolder} --database-file ${cfg.database}''; + }; + + services.fuppesd.name = mkDefault config.networking.hostName; + + security.sudo.enable = true; + }; +} Added: nixos/trunk/modules/services/audio/fuppes/vfolder.cfg ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ nixos/trunk/modules/services/audio/fuppes/vfolder.cfg Wed Jul 27 20:55:28 2011 (r27977) @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="UTF-8"?> +<fuppes_vfolder_config version="0.2"> + + <vfolder_layout device="default" enabled="false"> + + <vfolder name="Genre"> + <vfolders property="genre"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="Genre/Artists"> + <vfolders property="genre"> + <vfolders property="artist"> + <items type="audioItem" /> + </vfolders> + </vfolders> + </vfolder> + + <vfolder name="Artists/Albums"> + <vfolders property="artist"> + <vfolders property="album"> + <items type="audioItem" /> + </vfolders> + </vfolders> + </vfolder> + + <vfolder name="ABC/Artists/Albums"> + <vfolders split="ABC"> + <vfolders property="artist"> + <vfolders property="album"> + <items type="audioItem" /> + </vfolders> + </vfolders> + </vfolders> + </vfolder> + + <vfolder name="Photos"> + <vfolder name="All"> + <items type="imageItem" /> + </vfolder> + <vfolder name="Folders"> + <folders filter="contains(imageItem)" /> + </vfolder> + </vfolder> + + <vfolder name="Videos"> + <vfolder name="All"> + <items type="videoItem" /> + </vfolder> + <vfolder name="Folders"> + <folders filter="contains(videoItem)" /> + </vfolder> + </vfolder> + + <vfolder name="shared dirs"> + <shared_dirs full_extend="true" /> + </vfolder> + + </vfolder_layout> + + <vfolder_layout device="Xbox 360" enabled="false"> + + <vfolder name="Music" id="1"> + <vfolder name="Album" id="7"> + <vfolders property="album"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="All Music" id="4"> + <items type="audioItem" /> + </vfolder> + + <vfolder name="Artist" id="6"> + <vfolders property="artist"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="Folders" id="20"> + <folders filter="contains(audioItem)" /> + </vfolder> + + <vfolder name="Genre" id="5"> + <vfolders property="genre"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="Playlist" id="15" /> + </vfolder> + + <vfolder name="Pictures" id="3"> + <vfolder name="Album" id="13" /> + + <vfolder name="All Pictures" id="11"> + <items type="imageItem" /> + </vfolder> + + <vfolder name="Date Taken" id="12" /> + + <vfolder name="Folders" id="22"> + <folders filter="contains(imageItem)" /> + </vfolder> + </vfolder> + + <vfolder name="Playlists" id="18"> + <vfolder name="All Playlists" id="19" /> + <vfolder name="Folders" id="23" /> + </vfolder> + + <vfolder name="Video" id="2"> + <vfolder name="Actor" id="10" /> + <vfolder name="Album" id="14" /> + <vfolder name="All Video" id="8"> + <items type="videoItem" /> + </vfolder> + <vfolder name="Folders" id="21"> + <folders filter="contains(videoItem)" /> + </vfolder> + <vfolder name="Genre" id="9" /> + </vfolder> + + </vfolder_layout> + + <vfolder_layout device="Yamaha" enabled="false" create_references="true" > + + <vfolder name="Playlists" /> + + <vfolder name="Artists"> + <vfolders property="artist"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="Albums"> + <vfolders property="album"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + <vfolder name="Songs"> + <items type="audioItem" /> + </vfolder> + + <vfolder name="Genres"> + <vfolders property="genre"> + <items type="audioItem" /> + </vfolders> + </vfolder> + + </vfolder_layout> + +</fuppes_vfolder_config> Added: nixos/trunk/modules/services/mail/freepops.nix ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ nixos/trunk/modules/services/mail/freepops.nix Wed Jul 27 20:55:28 2011 (r27977) @@ -0,0 +1,87 @@ +{config, pkgs, ...}: + +with pkgs.lib; + +let + cfg = config.services.mail.freepopsd; +in + +{ + options = { + services.mail.freepopsd = { + enable = mkOption { + default = false; + type = with types; bool; + description = '' + Enables Freepops, a POP3 webmail wrapper. + ''; + }; + + port = mkOption { + default = 2000; + type = with types; uniq int; + description = '' + Port on which the pop server will listen. + ''; + }; + + threads = mkOption { + default = 5; + type = with types; uniq int; + description = '' + Max simultaneous connections. + ''; + }; + + bind = mkOption { + default = "0.0.0.0"; + type = with types; uniq string; + description = '' + Bind over an IPv4 address instead of any. + ''; + }; + + logFile = mkOption { + default = "/var/log/freepopsd"; + example = "syslog"; + type = with types; uniq string; + description = '' + Filename of the log file or syslog to rely on the logging daemon. + ''; + }; + + suid = { + user = mkOption { + default = "nobody"; + type = with types; uniq string; + description = '' + User name under which freepopsd will be after binding the port. + ''; + }; + + group = mkOption { + default = "nogroup"; + type = with types; uniq string; + description = '' + Group under which freepopsd will be after binding the port. + ''; + }; + }; + + }; + }; + + config = mkIf cfg.enable { + jobs.freepopsd = { + description = "Freepopsd (webmail over POP3)"; + startOn = "ip-up"; + exec = ''${pkgs.freepops}/bin/freepopsd \ + -p ${toString cfg.port} \ + -t ${toString cfg.threads} \ + -b ${cfg.bind} \ + -vv -l ${cfg.logFile} \ + -s ${cfg.suid.user}.${cfg.suid.group} + ''; + }; + }; +} \ No newline at end of file Added: nixos/trunk/modules/services/monitoring/ups.nix ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ nixos/trunk/modules/services/monitoring/ups.nix Wed Jul 27 20:55:28 2011 (r27977) @@ -0,0 +1,268 @@ +{config, pkgs, ...}: + +# TODO: This is not secure, have a look at the file docs/security.txt inside +# the project sources. +with pkgs.lib; + +let + cfg = config.power.ups; +in + +let + upsOptions = {name, config, ...}: + { + options = { + # This can be infered from the UPS model by looking at + # /nix/store/nut/share/driver.list + driver = mkOption { + type = types.uniq types.string; + description = '' + Specify the program to run to talk to this UPS. apcsmart, + bestups, and sec are some examples. + ''; + }; + + port = mkOption { + type = types.uniq types.string; + description = '' + The serial port where your UPS is connected. /dev/ttyS0 is + usually the first port on Linux boxes, for example. + ''; + }; + + shutdownOrder = mkOption { + default = 0; + type = types.uniq types.int; + description = '' + When you have multiple UPSes on your system, you usually need to + turn them off in a certain order. upsdrvctl shuts down all the + 0s, then the 1s, 2s, and so on. To exclude a UPS from the + shutdown sequence, set this to -1. + ''; + }; + + maxStartDelay = mkOption { + default = null; + type = types.uniq (types.nullOr types.int); + description = '' + This can be set as a global variable above your first UPS + definition and it can also be set in a UPS section. This value + controls how long upsdrvctl will wait for the driver to finish + starting. This keeps your system from getting stuck due to a + broken driver or UPS. + ''; + }; + + description = mkOption { + default = ""; + type = types.string; + description = '' + Description of the UPS. + ''; + }; + + directives = mkOption { + default = []; + type = types.listOf types.string; + description = '' + List of configuration directives for this UPS. + ''; + }; + + summary = mkOption { + default = ""; + type = types.string; + description = '' + Lines which would be added inside ups.conf for handling this UPS. + ''; + }; + + }; + + config = { + directives = mkHeader ([ + "driver = ${config.driver}" + "port = ${config.port}" + ''desc = "${config.description}"'' + "sdorder = ${toString config.shutdownOrder}" + ] ++ (optional (config.maxStartDelay != null) + "maxstartdelay = ${toString config.maxStartDelay}") + ); + + summary = + concatStringsSep "\n " + (["[${name}]"] ++ config.directives); + }; + }; + +in + + +{ + options = { + # powerManagement.powerDownCommands + + power.ups = { + enable = mkOption { + default = false; + type = with types; bool; + description = '' + Enables support for Power Devices, such as Uninterruptible Power + Supplies, Power Distribution Units and Solar Controllers. + ''; + }; + + # This option is not used yet. + mode = mkOption { + default = "standalone"; + type = types.uniq types.string; + description = '' + The MODE determines which part of the NUT is to be started, and + which configuration files must be modified. + + The values of MODE can be: + + - none: NUT is not configured, or use the Integrated Power + Management, or use some external system to startup NUT + components. So nothing is to be started. + + - standalone: This mode address a local only configuration, with 1 + UPS protecting the local system. This implies to start the 3 NUT + layers (driver, upsd and upsmon) and the matching configuration + files. This mode can also address UPS redundancy. + + - netserver: same as for the standalone configuration, but also + need some more ACLs and possibly a specific LISTEN directive in + upsd.conf. Since this MODE is opened to the network, a special + care should be applied to security concerns. + + - netclient: this mode only requires upsmon. + ''; + }; + + schedulerRules = mkOption { + example = "/etc/nixos/upssched.conf"; + type = types.uniq types.string; + description = '' + File which contains the rules to handle UPS events. + ''; + }; + + + maxStartDelay = mkOption { + default = 45; + type = types.uniq types.int; + description = '' + This can be set as a global variable above your first UPS + definition and it can also be set in a UPS section. This value + controls how long upsdrvctl will wait for the driver to finish + starting. This keeps your system from getting stuck due to a + broken driver or UPS. + ''; + }; + + ups = mkOption { + default = {}; + # see nut/etc/ups.conf.sample + description = '' + This is where you configure all the UPSes that this system will be + monitoring directly. These are usually attached to serial ports, + but USB devices are also supported. + ''; + type = types.attrsOf types.optionSet; + options = [ upsOptions ]; + }; + + }; + }; + + config = mkIf cfg.enable { + + environment.systemPackages = [ pkgs.nut ]; + + jobs.upsmon = { + description = "Uninterruptible Power Supplies (Monitor)"; + startOn = "ip-up"; + daemonType = "fork"; + exec = ''${pkgs.nut}/sbin/upsmon''; + environment.NUT_CONFPATH = "/etc/nut/"; + environment.NUT_STATEPATH = "/var/lib/nut/"; + }; + + jobs.upsd = { + description = "Uninterruptible Power Supplies (Daemon)"; + startOn = "started network-interfaces and upsmon"; + daemonType = "fork"; + # TODO: replace 'root' by another username. + exec = ''${pkgs.nut}/sbin/upsd -u root''; + environment.NUT_CONFPATH = "/etc/nut/"; + environment.NUT_STATEPATH = "/var/lib/nut/"; + }; + + jobs.upsdrv = { + description = "Uninterruptible Power Supplies (Register all UPS)"; + startOn = "started upsd"; + # TODO: replace 'root' by another username. + exec = ''${pkgs.nut}/bin/upsdrvctl -u root start''; + task = true; + environment.NUT_CONFPATH = "/etc/nut/"; + environment.NUT_STATEPATH = "/var/lib/nut/"; + }; + + environment.etc = [ + { source = pkgs.writeText "nut.conf" + '' + MODE = ${cfg.mode} + ''; + target = "nut/nut.conf"; + } + { source = pkgs.writeText "ups.conf" + '' + maxstartdelay = ${toString cfg.maxStartDelay} + + ${flip concatStringsSep (flip map (attrValues cfg.ups) (ups: ups.summary)) " + + "} + ''; + target = "nut/ups.conf"; + } + { source = cfg.schedulerRules; + target = "nut/upssched.conf"; + } + # These file are containing private informations and thus should not + # be stored inside the Nix store. + /* + { source = ; + target = "nut/upsd.conf"; + } + { source = ; + target = "nut/upsd.users"; + } + { source = ; + target = "nut/upsmon.conf; + } + */ + ]; + + power.ups.schedulerRules = mkDefault "${pkgs.nut}/etc/upssched.conf.sample"; + +/* + users.extraUsers = [ + { name = "nut"; + uid = 84; + home = "/var/lib/nut"; + createHome = true; + group = "nut"; + description = "UPnP A/V Media Server user"; + } + ]; + + users.extraGroups = [ + { name = "nut"; + gid = 84; + } + ]; +*/ + + }; +} _______________________________________________ nix-commits mailing list nix-comm...@cs.uu.nl http://mail.cs.uu.nl/mailman/listinfo/nix-commits