Hi folks,

as much as I'm opposed to systemd, I see some sense in the sd_notify*()
functions. OTOH, I dont think the API is so well thought, and I'm
clearly opposed to having that mixed up with a lot of disjunect things
in one big library, as systemd does.

So, I'd like to propose an separate API for those service reporting
things. That also could be coupled with a new logging API as syslog()
replacement, which adds a bit finer granularity (eg. job-IDs, operation
status, etc) - if that shouldn't go into its own library.

The idea goes like this:

* having an own library / API (in it's own .so) for service status
  notification
* that API should provide a high level semantic API (in contrast
  to the current one, which uses pretty free-text env-type attribute
  lists)
* we can have several implementations for it, which are binary-
  compatible (eg. build-time config).
* it could also provide multiple in one .so (eg. autodetect which
  protocol to the service mananger to use) - as build-time config
* distros can choose which implementations to package, maybe even
  provide multiple ones in separate packages (consumers just depend
  on a metapackage)
* implementations then can be changed by just replacing the library
  via package manager
* optionally, we could even have multiple ones on one system and
  use LD_PRELOAD magic to switch implementations for individual
  processes
* service packages then should be migrated to that library and
  so breaking up the direct dependency to systemd, w/o loosing
  any functionality.
* that library would live as it's own project, w/o any direct
  connection to systemd - in contrast to libsystemd replacement
  we dont need to keep up w/ systemd in short cycles

The API could look like that:


   /** report main process pid **/
   int srvman_report_mainpid(pid_t pid, const char *msg);

   /** parent process report child process - eg. right after
       a fork() **/
   int srvman_report_child(pid_t pid, const char *msg);

   /** same as above, but a child handling a connection **/
   int srvman_report_child_fd(pid_t pid, int fd, const char *msg);

   /** report that the main process will be a child of the
       original one **/
   int srvman_report_mainpid(pid_t pid, const char *msg);

   /** report service starting **/
   int srvman_report_starting(const char *msg);

   /** report service ready **/
   int srvman_report_ready(const char *msg);

   /** report service halted **/
   int srvman_report_halted(const char *msg);

   /** report service waiting for resources **/
   int srvman_report_waiting(const char *msg);

   /** report service interrupted by some failure **/
   int srvman_report_interrupted(const char *msg);

   [ ... ]


Maybe we could even extend it to allocation of resources, eg. sockets
on privileged ports:


   /** request IP listening socket (eg. for privleged ports) **/
   /** YES: using names for addresses, so the service manager could do
       an address translation by names, eg. for dynamic IPs, etc **/
   int srvman_request_ipv4_listener(const char *localaddr,
                                    const char *localport,
                                    const char *identifier);

By the way: that API, IMHO, could also be implemented on non-Unix
platforms, eg. Windows, Plan9, ...


What do you think about that ?


--mtx


--
Enrico Weigelt,
metux IT consulting
+49-151-27565287
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to