Create function to automatically generate log companion services

This commit is contained in:
Sander van der Burg 2021-01-20 23:28:24 +01:00 committed by Sander van der Burg
parent b773dfe295
commit a0f6da840e
6 changed files with 94 additions and 11 deletions

View File

@ -1,5 +1,11 @@
{createManagedProcess, s6, runtimeDir}:
{instanceSuffix ? "", instanceName ? "s6-svscan${instanceSuffix}", scanDir ? "${runtimeDir}/service${instanceSuffix}"}:
{ instanceSuffix ? ""
, instanceName ? "s6-svscan${instanceSuffix}"
, scanDir ? "${runtimeDir}/service${instanceSuffix}"
, logUser ? "s6-log${instanceSuffix}"
, logGroup ? "s6-log${instanceSuffix}"
}:
createManagedProcess {
name = instanceName;
@ -9,4 +15,22 @@ createManagedProcess {
initialize = ''
mkdir -p ${scanDir}
'';
credentials = {
groups = {
"${logGroup}" = {};
};
users = {
"${logUser}" = {
group = logGroup;
description = "s6-log user";
};
};
};
overrides = {
sysvinit = {
runlevels = [ 3 4 5 ];
};
};
}

View File

@ -0,0 +1,37 @@
{stdenv, execline, logDir, logDirUser, logDirGroup, forceDisableUserChange}:
{name}:
let
serviceName = "${name}-log";
util = import ./util.nix {
inherit (stdenv) lib;
};
serviceLogDir = "${logDir}/s6-log/${name}";
notificationFd = 3;
in
stdenv.mkDerivation {
name = serviceName;
buildCommand = ''
mkdir -p $out/etc/s6/sv/${serviceName}
cd $out/etc/s6/sv/${serviceName}
''
+ util.generateStringProperty { value = "longrun"; filename = "type"; }
+ ''
cat > run <<EOF
#!${execline}/bin/execlineb -P
foreground { mkdir -p ${serviceLogDir} }
${stdenv.lib.optionalString (!forceDisableUserChange) ''
foreground { chown -R ${logDirUser}:${logDirGroup} ${serviceLogDir} }
s6-setuidgid ${logDirUser}
''}
exec -c s6-log -d${toString notificationFd} ${serviceLogDir}
EOF
''
+ util.generateStringProperty { value = "${name}-srv"; filename = "consumer-for"; }
+ util.generateIntProperty { value = notificationFd; filename = "notification-fd"; }
+ util.generateStringProperty { value = name; filename = "pipeline-name"; };
}

View File

@ -1,4 +1,4 @@
{stdenv, createCredentials}:
{stdenv, createCredentials, createLogServiceForLongRunService}:
{ name
# When a service is flagged as essential it will not stop with the command: s6-rc -d change foo, but only: s6-rc -D change foo
@ -33,6 +33,8 @@
# named with the content of the pipeline-name file, and containing all the services in the pipeline that ends at service.
# The pipeline-name file is ignored if service is not a last consumer.
, pipelineName ? null
# Automatically generates a logging longrun service that writes the output to a log file
, autoGenerateLogService ? true
# Specifies which groups and users that need to be created.
, credentials ? {}
# Arbitrary commands executed after generating the configuration files
@ -45,12 +47,21 @@ let
util = import ./util.nix {
inherit (stdenv) lib;
};
logService = createLogServiceForLongRunService {
inherit name;
};
_producerFor = if autoGenerateLogService then logService else producerFor;
# The service name gets a -srv suffix so that it can be paired with a -log service and put in a bundle that corresponds to: name
serviceName = if autoGenerateLogService then "${name}-srv" else name;
in
stdenv.mkDerivation {
inherit name;
name = serviceName;
buildCommand = ''
mkdir -p $out/etc/s6/sv/${name}
cd $out/etc/s6/sv/${name}
mkdir -p $out/etc/s6/sv/${serviceName}
cd $out/etc/s6/sv/${serviceName}
''
+ util.generateStringProperty { value = "longrun"; filename = "type"; }
+ util.generateBooleanProperty { value = flagEssential; filename = "flag-essential"; }
@ -65,9 +76,13 @@ stdenv.mkDerivation {
+ util.generateStringProperty { value = downSignal; filename = "down-signal"; }
+ util.copyDir { path = data; filename = "data"; }
+ util.copyDir { path = env; filename = "env"; }
+ util.generateServiceName { service = producerFor; filename = "producer-for"; }
+ util.generateServiceName { service = _producerFor; filename = "producer-for"; }
+ util.generateServiceNameList { services = consumerFor; filename = "consumer-for"; }
+ util.generateStringProperty { value = pipelineName; filename = "pipeline-name"; }
+ stdenv.lib.optionalString autoGenerateLogService ''
cd ..
ln -sfn ${logService}/etc/s6/sv/${name}-log
''
+ ''
ln -s ${credentialsSpec}/dysnomia-support $out/dysnomia-support

View File

@ -1,8 +1,11 @@
{stdenv, createCredentials}:
{stdenv, execline, createCredentials, logDir, logDirUser ? "s6-log", logDirGroup ? "s6-log", forceDisableUserChange}:
{
rec {
createLogServiceForLongRunService = import ./create-log-service-for-longrun-service.nix {
inherit stdenv execline logDir logDirUser logDirGroup forceDisableUserChange;
};
createLongRunService = import ./create-longrun-service.nix {
inherit stdenv createCredentials;
inherit stdenv createCredentials createLogServiceForLongRunService;
};
createOneShotService = import ./create-oneshot-service.nix {
inherit stdenv createCredentials;

View File

@ -88,6 +88,10 @@ let
''
+ stdenv.lib.optionalString (nice != null) ''
nice -n ${toString nice}
''
# Always forward standard error so that it can be captured by the s6-log service
+ ''
fdmove -c 2 1
'';
escapeArgs = args:

View File

@ -104,8 +104,8 @@ let
};
s6-rc = import ../s6-rc {
inherit (pkgs) stdenv;
inherit createCredentials;
inherit (pkgs) stdenv execline;
inherit createCredentials logDir forceDisableUserChange;
};
generateS6Service = import ../s6-rc/generate-s6-service.nix {