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=16803wip/yesman
parent
fb730174a1
commit
8e6ad840f2
@ -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}"; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
} |
||||
|
Loading…
Reference in new issue