Dan Ritter:
>
> Eventually we'll have to do the work, but the operations staff here has a
> consensus that if we're going to do the work, we might as well go to a system
> that we feel capable of understanding and trusting, something more like
> daemontools. Nosh is being considered.
>
Having thought about this, I'd do things this way:
You need two new extensions Tuttle:noshService and Tuttle::noshSocket. Both
work by having INI files in your master configuration area, and they generate
the actual service bundles on the slave systems from those.
Tuttle:noshService ...
* ... has the extension keyword nosh-service.
* ... has two source INI files, ${wibble}.service and [email protected]
* ... configures for a rôle by:
1. install_file_copy()s both ${wibble}.service and [email protected] to
/var/local/sv/
2. run_command()s system-control convert-systemd-units --local-bundle
--no-systemd-quirks --bundle-root /var/local/sv/ --
/var/local/sv/${wibble}.service
3. run_command()s system-control convert-systemd-units --local-bundle
--no-systemd-quirks --bundle-root /var/local/sv/ --
/var/local/sv/cyclog@${wibble}.service
4. symbolically links /var/local/sv/${wibble}/log to ../cyclog@${wibble}
5. run_command()s system-control enable -- cyclog@${wibble}.service
${wibble}.service
6. run_command()s system-control start --verbose -- cyclog@${wibble}.service
${wibble}.service
* ... deconfigures for a rôle by:
1. run_command()s system-control disable -- cyclog@${wibble}.service
${wibble}.service
2. run_command()s system-control stop --verbose -- cyclog@${wibble}.service
${wibble}.service
3. run_command()s system-control unload_when_stopped -- cyclog@${wibble}.service
${wibble}.service
4. remove_file()s both ${wibble}.service and [email protected] from /var/local/sv/
5. removes the whole tree at /var/local/sv/${wibble}/ and at
/var/local/sv/cyclog@${wibble}/
Tuttle:noshSocket ...
* ... has the extension keyword nosh-socket.
* ... has three source INI files, ${wibble}.socket, ${wibble}@.service, and
[email protected]
* ... configures for a rôle by:
1. install_file_copy()s all of ${wibble}.socket, ${wibble}@.service, and
[email protected] to /var/local/sv/
2. run_command()s system-control convert-systemd-units --local-bundle
--no-systemd-quirks --bundle-root /var/local/sv/ --
/var/local/sv/${wibble}.socket
3. run_command()s system-control convert-systemd-units --local-bundle
--no-systemd-quirks --bundle-root /var/local/sv/ --
/var/local/sv/cyclog@${wibble}.service
4. symbolically links /var/local/sv/${wibble}/log to ../cyclog@${wibble}
5. run_command()s system-control enable -- cyclog@${wibble}.service
${wibble}.socket
6. run_command()s system-control start --verbose -- cyclog@${wibble}.service
${wibble}.socket
* ... deconfigures for a rôle by:
1. run_command()s system-control disable -- cyclog@${wibble}.service
${wibble}.socket
2. run_command()s system-control stop --verbose -- cyclog@${wibble}.service
${wibble}.socket
3. run_command()s system-control unload-when-stopped -- cyclog@${wibble}.service
${wibble}.socket
4. remove_file()s all of ${wibble}.socket, ${wibble}@.service, and
[email protected] from /var/local/sv/
5. removes the whole tree at /var/local/sv/${wibble}/ and at
/var/local/sv/cyclog@${wibble}/
I've not complicated the aforegiven by including all of the ${tuttle:id}s and
where they would be inserted into the file and directory names (just before
${wibble}, usually), on the presumption that you know all about that.
Then the INI files that you write for (say, HTTP being already taken in your
examples) nosh-socket gopherd would look like:
; [email protected]
[Unit]
Description=GOPHER service over IP4/IP6 using djbwares' gopherd
Description=http://jdebp.eu./Softwares/djbwares/
[Service]
EnvironmentDirectory=env
EnvironmentUser=%p-d
LimitNOFILE=20
LimitDATA=5000000
ExecStart=${localhost:+setenv ${PROTO:-TCP}LOCALHOST "${localhost}"} %p
${root:-/home/publicfile/public}
[Install]
WantedBy=server.target
; gopherd.socket
[Unit]
Description=GOPHER socket capable of single-stack IPV6 and IPV6-mapped IPV4
[Socket]
Backlog=2
ListenStream=gopher
Accept=true
MaxConnections=16
UCSPIRules=false
LogUCSPIRules=yes
NoDelay=false
BindIPv6Only=both
Setting up [email protected], so that the generated /var/local/sv/cyclog@${wibble}
runs cyclog as user ${wibble}-l logging to /var/log/${wibble}, is an exercise in
more of the same that you only need to write once:
[Unit]
Description=Standard format %p logging service for %I
Before=%I
[Service]
WorkingDirectory=/var/log/
User=%i-l
ExecStart=%p %I/
[Install]
WantedBy=workstation.target