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 cyclog@.service
* ... configures for a rôle by:
1. install_file_copy()s both ${wibble}.service and cyclog@.service 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 cyclog@.service 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
cyclog@.service
* ... configures for a rôle by:
1. install_file_copy()s all of ${wibble}.socket, ${wibble}@.service, and
cyclog@.service 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
cyclog@.service 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:

; gopherd@.service
[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 cyclog@.service, 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

Reply via email to