Browse Source
* Modularised the xinetd service. tftp has been factored out into a
* Modularised the xinetd service. tftp has been factored out into a
separate module, which just declares a configuration value that causes the xinetd module to add it to xinetd.conf. Also Nixified the service declarations to abstract over the inetd implementation. * Renamed the services.xinetd.tftpd options to services.tftpd. The fact that the tftpd module uses xinetd is an implementation detail. * xinetd: use -dontfork to let Upstart monitor it, and use -syslog to get error messages at startup. svn path=/nixos/trunk/; revision=16803nsd-state-dir
4 changed files with 161 additions and 77 deletions
-
3modules/module-list.nix
-
43modules/services/networking/tftpd.nix
-
190modules/services/networking/xinetd.nix
-
2modules/services/x11/xserver/desktop-managers/kde4.nix
@ -0,0 +1,43 @@ |
|||
{ config, pkgs, ... }: |
|||
|
|||
with pkgs.lib; |
|||
|
|||
{ |
|||
|
|||
###### interface |
|||
|
|||
options = { |
|||
|
|||
services.tftpd.enable = mkOption { |
|||
default = false; |
|||
description = '' |
|||
Whether to enable the anonymous FTP user. |
|||
''; |
|||
}; |
|||
|
|||
services.tftpd.path = mkOption { |
|||
default = "/home/tftp"; |
|||
description = '' |
|||
Where the tftp server files are stored |
|||
''; |
|||
}; |
|||
|
|||
}; |
|||
|
|||
|
|||
###### implementation |
|||
|
|||
config = mkIf config.services.tftpd.enable { |
|||
|
|||
services.xinetd.enable = true; |
|||
|
|||
services.xinetd.services = singleton |
|||
{ name = "tftp"; |
|||
protocol = "udp"; |
|||
server = "${pkgs.netkittftp}/sbin/in.tftpd"; |
|||
serverArgs = "${config.services.tftpd.path}"; |
|||
}; |
|||
|
|||
}; |
|||
|
|||
} |
@ -1,95 +1,135 @@ |
|||
{pkgs, config, ...}: |
|||
{ config, pkgs, ... }: |
|||
|
|||
###### interface |
|||
let |
|||
inherit (pkgs.lib) mkOption mkIf; |
|||
with pkgs.lib; |
|||
|
|||
let |
|||
|
|||
cfg = config.services.xinetd; |
|||
|
|||
inherit (pkgs) xinetd; |
|||
|
|||
configFile = pkgs.writeText "xinetd.conf" |
|||
'' |
|||
defaults |
|||
{ |
|||
log_type = SYSLOG daemon info |
|||
log_on_failure = HOST |
|||
log_on_success = PID HOST DURATION EXIT |
|||
} |
|||
|
|||
${concatMapStrings makeService cfg.services} |
|||
''; |
|||
|
|||
makeService = srv: |
|||
'' |
|||
service ${srv.name} |
|||
{ |
|||
protocol = ${srv.protocol} |
|||
${optionalString srv.unlisted "type = UNLISTED"} |
|||
socket_type = ${if srv.protocol == "udp" then "dgram" else "stream"} |
|||
${if srv.port != 0 then "port = ${toString srv.port}" else ""} |
|||
wait = ${if srv.protocol == "udp" then "yes" else "no"} |
|||
user = ${srv.user} |
|||
server = ${srv.server} |
|||
${optionalString (srv.serverArgs != "") "server_args = ${srv.serverArgs}"} |
|||
} |
|||
''; |
|||
|
|||
in |
|||
|
|||
{ |
|||
|
|||
###### interface |
|||
|
|||
options = { |
|||
services = { |
|||
xinetd = { |
|||
enable = mkOption { |
|||
default = false; |
|||
description = " |
|||
Whether to enable the vsftpd FTP server. |
|||
"; |
|||
}; |
|||
|
|||
services.xinetd.enable = mkOption { |
|||
default = false; |
|||
description = '' |
|||
Whether to enable the xinetd super-server daemon. |
|||
''; |
|||
}; |
|||
|
|||
services.xinetd.services = mkOption { |
|||
default = []; |
|||
description = '' |
|||
A list of services provided by xinetd. |
|||
''; |
|||
|
|||
type = types.list types.optionSet; |
|||
|
|||
options = { |
|||
|
|||
tftpd = { |
|||
enable = mkOption { |
|||
default = false; |
|||
description = " |
|||
Whether to enable the anonymous FTP user. |
|||
"; |
|||
}; |
|||
|
|||
path = mkOption { |
|||
default = "/home/tftp"; |
|||
description = " |
|||
Where the tftp server files are stored |
|||
"; |
|||
}; |
|||
name = mkOption { |
|||
type = types.string; |
|||
example = "login"; |
|||
description = "Name of the service."; |
|||
}; |
|||
}; |
|||
}; |
|||
}; |
|||
in |
|||
|
|||
###### implementation |
|||
protocol = mkOption { |
|||
type = types.string; |
|||
default = "tcp"; |
|||
description = |
|||
"Protocol of the service. Usually <literal>tcp</literal> or <literal>udp</literal>."; |
|||
}; |
|||
|
|||
let |
|||
port = mkOption { |
|||
type = types.int; |
|||
default = 0; |
|||
example = 123; |
|||
description = "Port number of the service."; |
|||
}; |
|||
|
|||
inherit (config.services.xinetd) tftpd; |
|||
inherit (pkgs) xinetd; |
|||
user = mkOption { |
|||
type = types.string; |
|||
default = "nobody"; |
|||
description = "User account for the service"; |
|||
}; |
|||
|
|||
tftpservice = '' |
|||
service tftp |
|||
{ |
|||
protocol = udp |
|||
port = 69 |
|||
socket_type = dgram |
|||
wait = yes |
|||
user = nobody |
|||
server = ${pkgs.netkittftp}/sbin/in.tftpd |
|||
server_args = ${tftpd.path} |
|||
disable = no |
|||
} |
|||
''; |
|||
|
|||
configFile = pkgs.writeText "xinetd.conf" '' |
|||
defaults |
|||
{ |
|||
log_type = SYSLOG daemon info |
|||
log_on_failure = HOST |
|||
log_on_success = PID HOST DURATION EXIT |
|||
} |
|||
${if tftpd.enable then tftpservice else ""} |
|||
''; |
|||
server = mkOption { |
|||
type = types.string; |
|||
example = "/foo/bin/ftpd"; |
|||
description = "Path of the program that implements the service."; |
|||
}; |
|||
|
|||
in |
|||
serverArgs = mkOption { |
|||
type = types.string; |
|||
default = ""; |
|||
description = "Command-line arguments for the server program."; |
|||
}; |
|||
|
|||
mkIf config.services.xinetd.enable { |
|||
require = [ |
|||
options |
|||
]; |
|||
unlisted = mkOption { |
|||
type = types.bool; |
|||
default = false; |
|||
description = '' |
|||
Whether this server is listed in |
|||
<filename>/etc/services</filename>. If so, the port |
|||
number can be omitted. |
|||
''; |
|||
}; |
|||
|
|||
services = { |
|||
extraJobs = [{ |
|||
name = "xinetd"; |
|||
}; |
|||
|
|||
job = '' |
|||
description "xinetd server" |
|||
}; |
|||
|
|||
start on network-interfaces/started |
|||
stop on network-interfaces/stop |
|||
}; |
|||
|
|||
|
|||
start script |
|||
###### implementation |
|||
|
|||
mkdir -p ${tftpd.path} |
|||
end script |
|||
config = mkIf cfg.enable { |
|||
|
|||
respawn ${xinetd}/sbin/xinetd -stayalive -f ${configFile} |
|||
''; |
|||
jobs = singleton |
|||
{ name = "xinetd"; |
|||
|
|||
}]; |
|||
description = "xinetd server"; |
|||
|
|||
startOn = "network-interfaces/started"; |
|||
stopOn = "network-interfaces/stop"; |
|||
|
|||
exec = "${xinetd}/sbin/xinetd -syslog daemon -dontfork -stayalive -f ${configFile}"; |
|||
}; |
|||
|
|||
}; |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue