Creating/Learning about services
Hello,
I'm currently researching how services work within Dovecot and what scope these services are capable of. For example, I created a service as such:
service myservice { executable = /home/me/executable type = worker unix_listener myservice { mode = 0666 } }
When data is provided to the myservice unix socket, Dovecot appears to create a new process by executing "/home/me/executable". I found out about "status updates" through examining the logs. At first I received this:
master: Error: service(myservice): Initial status notification not received in 30 seconds, killing the process
What is this status notification?
I found out that writing to file descriptor 5 from the executable does seem to be valid. When I write out 12 bytes I don't get an error, but when I write out 13 bytes I get the following:
master: Error: service(dmon): service sent partial status update (13 bytes)
What I've also noticed is that exiting 0 will cause Dovecot to spawn the process again, in what appears to be infinitely.
Are there any resources/documentation that I could reference to learn more about how services work on a lower level besides just looking at the source code?
Thanks.
On 25/08/2021 20:22 Dan Conway darkc0de@archnix6.net wrote:
Hello,
I'm currently researching how services work within Dovecot and what scope these services are capable of. For example, I created a service as such:
service myservice { executable = /home/me/executable type = worker unix_listener myservice { mode = 0666 } }
When data is provided to the myservice unix socket, Dovecot appears to create a new process by executing "/home/me/executable". I found out about "status updates" through examining the logs. At first I received this:
master: Error: service(myservice): Initial status notification not received in 30 seconds, killing the process
What is this status notification?
I found out that writing to file descriptor 5 from the executable does seem to be valid. When I write out 12 bytes I don't get an error, but when I write out 13 bytes I get the following:
master: Error: service(dmon): service sent partial status update (13 bytes)
What I've also noticed is that exiting 0 will cause Dovecot to spawn the process again, in what appears to be infinitely.
Are there any resources/documentation that I could reference to learn more about how services work on a lower level besides just looking at the source code?
Thanks.
Making native services requires practically C program using lib-master. We provide a simple helpers called script
and login-script
which wrap your program as a Dovecot service and provide you parameters from stdin and, when possible, lets you write into stdout your reply.
See https://github.com/dovecot/core/blob/master/src/util/script.c#L83 for provided input.
You can use it like
service foobar { executable = script /path/to/your/stuff unix_listener myservice { mode = 0666 } }
btw, there is no type = worker
setting, see
https://doc.dovecot.org/configuration_manual/service_configuration/
Aki
On 25/08/2021 20:41 Aki Tuomi aki.tuomi@open-xchange.com wrote:
On 25/08/2021 20:22 Dan Conway darkc0de@archnix6.net wrote:
Hello,
I'm currently researching how services work within Dovecot and what scope these services are capable of. For example, I created a service as such:
service myservice { executable = /home/me/executable type = worker unix_listener myservice { mode = 0666 } }
When data is provided to the myservice unix socket, Dovecot appears to create a new process by executing "/home/me/executable". I found out about "status updates" through examining the logs. At first I received this:
master: Error: service(myservice): Initial status notification not received in 30 seconds, killing the process
What is this status notification?
I found out that writing to file descriptor 5 from the executable does seem to be valid. When I write out 12 bytes I don't get an error, but when I write out 13 bytes I get the following:
master: Error: service(dmon): service sent partial status update (13 bytes)
What I've also noticed is that exiting 0 will cause Dovecot to spawn the process again, in what appears to be infinitely.
Are there any resources/documentation that I could reference to learn more about how services work on a lower level besides just looking at the source code?
Thanks.
Making native services requires practically C program using lib-master. We provide a simple helpers called
script
andlogin-script
which wrap your program as a Dovecot service and provide you parameters from stdin and, when possible, lets you write into stdout your reply.See https://github.com/dovecot/core/blob/master/src/util/script.c#L83 for provided input.
You can use it like
service foobar { executable = script /path/to/your/stuff unix_listener myservice { mode = 0666 } }
btw, there is no
type = worker
setting, see https://doc.dovecot.org/configuration_manual/service_configuration/Aki
I mean script-login
of course. These are both bit underdocumented currently. The script-login is used to execute post-login scripts.
Aki
participants (2)
-
Aki Tuomi
-
Dan Conway