Davin McCall [Fri, 15 Jan 2016 19:26:16 +0000 (19:26 +0000)]
Makefile improvements (fix clean target), and build with -fno-rtti
for reduced binary size.
Davin McCall [Fri, 15 Jan 2016 11:49:46 +0000 (11:49 +0000)]
Use $HOME/dinit.d for default service directory if not system init.
Add command line options to specify service directory and control
socket path. Add command line option to run as system init (default
when pid == 1).
Davin McCall [Thu, 14 Jan 2016 18:19:41 +0000 (18:19 +0000)]
Remove some explicit memory deallocation in favor of using unique_ptr.
Davin McCall [Thu, 14 Jan 2016 10:02:40 +0000 (10:02 +0000)]
Use delete[] to delete buffers allocated via new[]
(thank you LLVM static analyzer...)
Davin McCall [Thu, 14 Jan 2016 10:02:06 +0000 (10:02 +0000)]
Remove std::move(...) so that copy ellision can occur.
Davin McCall [Wed, 13 Jan 2016 20:02:14 +0000 (20:02 +0000)]
Add support for unpin command in dinitctl (includes corresponding
control protocol changes)
Davin McCall [Wed, 13 Jan 2016 18:51:10 +0000 (18:51 +0000)]
Add support for pinning services to dinitctl
Davin McCall [Wed, 13 Jan 2016 18:49:40 +0000 (18:49 +0000)]
Make "pinStart" and "start", and "pinStop" and "stop", separate
operations.
"pinStart" and "pinStop" set the pin for the started and stopped
states respectively, but do not attempt to move the service into
the chosen state.
Davin McCall [Tue, 12 Jan 2016 09:54:35 +0000 (09:54 +0000)]
Update README with info on service hierarchy and service states
(especially active vs inactive)
Davin McCall [Tue, 12 Jan 2016 08:56:10 +0000 (08:56 +0000)]
Mark service active if it is started while not active.
(It will mark itself inactive when it stops).
Davin McCall [Tue, 12 Jan 2016 00:58:55 +0000 (00:58 +0000)]
During shutdown, let process attrition occur naturally, instead of forcing
the services down early.
Also, don't restart a service which has desired_state = STARTED if auto-restart
is disabled.
Davin McCall [Mon, 11 Jan 2016 23:56:04 +0000 (23:56 +0000)]
Various changes to match changes to command protocol.
Davin McCall [Mon, 11 Jan 2016 23:52:36 +0000 (23:52 +0000)]
Refactor/fix control commands, add a few start/stop alternatives
Davin McCall [Mon, 11 Jan 2016 23:46:00 +0000 (23:46 +0000)]
Fix stop(). Give it a boolean argument for 2 modes of operation:
One, release the service if it was explicitly started (which will
bring it down only if it is no longer needed by any active service)
Two, release the service and bring it down (which will also bring
down any dependent services).
Davin McCall [Mon, 11 Jan 2016 22:59:24 +0000 (22:59 +0000)]
Make sure to initialise all members of ControlConn
Davin McCall [Mon, 11 Jan 2016 22:21:16 +0000 (22:21 +0000)]
Restore "restart" flag functionality. Services no longer auto-restart
just because they are active (required) - they now only do so if
the auto-restart flag has been set for the service.
Davin McCall [Mon, 11 Jan 2016 20:00:40 +0000 (20:00 +0000)]
Cleanups and refactoring.
Davin McCall [Mon, 11 Jan 2016 19:38:12 +0000 (19:38 +0000)]
Largish re-work of how dependencies are handled. The "start" and
"dependentStopped" methods were overloaded in unsound ways.
Add require() and release() methods to make an explicit requirement
on a dependency. A require() is added when the service is explictly
started, or when it is a dependency of such a service (directly),
or when it is a dependency of a service which has been required.
Davin McCall [Sun, 10 Jan 2016 11:49:23 +0000 (11:49 +0000)]
Fix "skip to reply packet" method.
It was possible to skip over an information packet but not read any
further reply, so the packet type test (rbuffer[0] == ...) would not
work correctly.
Davin McCall [Sat, 9 Jan 2016 19:59:36 +0000 (19:59 +0000)]
Refactoring, and one fix: stopping an already-stopped service can be
used to remove its explicitly-started state, and in that case needs
to notify dependencies of complete shutdown.
Davin McCall [Sat, 9 Jan 2016 18:20:48 +0000 (18:20 +0000)]
Introduce "explicitly started" state flag for services, and automatically
stop services which were not explicitly started when they have no
dependents running.
This means that if you start a service, and then stop that service, the
system should return to its original state with no additional services
running.
Davin McCall [Thu, 7 Jan 2016 23:06:54 +0000 (23:06 +0000)]
Fix protocol errors in dinitctl
Davin McCall [Thu, 7 Jan 2016 22:08:40 +0000 (22:08 +0000)]
Add license (Apache license version 2.0).
Davin McCall [Thu, 7 Jan 2016 22:08:10 +0000 (22:08 +0000)]
Update gitignore
Davin McCall [Thu, 7 Jan 2016 22:02:05 +0000 (22:02 +0000)]
Make sure to not write a partial command packet.
Davin McCall [Thu, 7 Jan 2016 21:34:23 +0000 (21:34 +0000)]
dinitctl: recognize and report FAILEDSTART events.
Davin McCall [Thu, 7 Jan 2016 20:45:09 +0000 (20:45 +0000)]
Refactoring: remove unneeded method
Davin McCall [Thu, 7 Jan 2016 10:52:31 +0000 (10:52 +0000)]
Make "dinitctl start" start a service and "dinitctl stop" stop a
service, rather than the other way around...
Davin McCall [Wed, 6 Jan 2016 22:07:56 +0000 (22:07 +0000)]
Change command line and implement stopping of services in dinitctl.
"dinitctl start <servicename>" and "dinit stop <servicename>" now function
as you'd expect.
Davin McCall [Wed, 6 Jan 2016 19:08:46 +0000 (19:08 +0000)]
Rename dinit-start to dinitctl, as I think one command for service
management is probably the best route to take.
Davin McCall [Tue, 5 Jan 2016 23:55:05 +0000 (23:55 +0000)]
Move source files int src directory
Davin McCall [Mon, 4 Jan 2016 13:50:24 +0000 (13:50 +0000)]
Add socket-uid and socket-gid service settings for controlling
activation socket ownership.
Davin McCall [Mon, 4 Jan 2016 00:13:06 +0000 (00:13 +0000)]
Update TODO list
Davin McCall [Mon, 4 Jan 2016 00:01:43 +0000 (00:01 +0000)]
Implement socket activation (single, unix-family socket only)
Davin McCall [Sun, 3 Jan 2016 23:16:14 +0000 (23:16 +0000)]
Add some info about Nosh, another init/service system I just found out about.
Davin McCall [Sun, 3 Jan 2016 16:39:35 +0000 (16:39 +0000)]
Make sure to initialise all state bits
Davin McCall [Sun, 3 Jan 2016 16:16:21 +0000 (16:16 +0000)]
A forced stop at the point of reaching STARTED state should not
actually change the desired state: call start() after stop() if
the desired state is not STOPPED.
Davin McCall [Sun, 3 Jan 2016 16:06:31 +0000 (16:06 +0000)]
Re-read PID file after recovering a BGPROCESS service.
Davin McCall [Sun, 3 Jan 2016 11:34:15 +0000 (11:34 +0000)]
Update TODO (log messages to console should be buffered when a service
is holding the console)
Davin McCall [Sun, 3 Jan 2016 11:30:53 +0000 (11:30 +0000)]
Minor re-organisation and logging improvements
Davin McCall [Sun, 3 Jan 2016 01:37:46 +0000 (01:37 +0000)]
Add support for "bgprocess" services - daemons which fork and put
themselves in the background (but which ideally write their PID
into a file that can be read by Dinit).
Davin McCall [Sat, 2 Jan 2016 18:41:05 +0000 (18:41 +0000)]
If a "scripted" service has no stop command, allow it to stop immediately.
This allows no stop command to be specified if none is needed. (This probably
already worked, but only because Dinit would try to exec "" (the empty string)
when the service stopped, which would fail, and the service would get marked
as stopped anyway).
Davin McCall [Sat, 2 Jan 2016 18:10:53 +0000 (18:10 +0000)]
When performing shutdown, un-pin services after issuing stop.
Davin McCall [Sat, 2 Jan 2016 17:22:51 +0000 (17:22 +0000)]
Fix: scripted service might not have its start/stop registered
if the script finishes too quickly.
Davin McCall [Sat, 2 Jan 2016 13:24:31 +0000 (13:24 +0000)]
Add "smooth-recovery" option for process services.
A process service with smooth-recovery set will restart its
process (if it dies unexpectedly) without bring the service
itself down. I.e the service remains in STARTED state, and
any dependents do not have to be brought down.
Davin McCall [Sat, 2 Jan 2016 11:12:16 +0000 (11:12 +0000)]
Move to asynchronous handling of child exec status.
This gives ever-so-slightly better parallelism, and staves off
potential future priority inversion problems.
Davin McCall [Fri, 1 Jan 2016 18:44:25 +0000 (18:44 +0000)]
Remove the "release_console" on-start flag. It is now redundant.
Davin McCall [Fri, 1 Jan 2016 18:11:07 +0000 (18:11 +0000)]
Various improvements to state transitions.
Introduce a new variable to track if a service is waiting for its
dependencies (starting) or dependents (stopping). In these cases
it is possible to transition directly from STARTING to STOPPED or
from STOPPING to STARTED. This also removes the need for special
handling of "internal" services (which will never transition from
STARTING to STARTED or STOPPING to STOPPED excet via transitions
of their dependencies/dependents).
Davin McCall [Fri, 1 Jan 2016 16:32:21 +0000 (16:32 +0000)]
Run "run-on-console" services as a new process group/session so
that ^C can be used to interrupt it.
(Probably will make this optional, later).
Davin McCall [Fri, 1 Jan 2016 14:58:51 +0000 (14:58 +0000)]
Don't reque for console immediately if we acquire it when dependencies
haven't started.
The theory was that we could append to the end of the queue. In practice,
though, we might be the only service in the queue, in which case
we'll immediately acquire the console if we queue for it and so go
into infinite recursion.
Davin McCall [Fri, 1 Jan 2016 04:23:38 +0000 (04:23 +0000)]
I could swear I fixed this not too long ago...
Davin McCall [Fri, 1 Jan 2016 04:01:34 +0000 (04:01 +0000)]
Fix another hanging state: "internal" services can be stopped
while they are starting and immediately transition from
STARTING to STOPPED. If this is not allowed, they hang in
STARTING state.
(Other service types eventually start due to an external event,
and can then stop).
Davin McCall [Fri, 1 Jan 2016 02:16:00 +0000 (02:16 +0000)]
Add "run-on-console" service option, to specify that a service
runs on the console.
Only one service can be running on the console at a time, so
there is a queue to obtain the console.
Not 100% complete yet. Part of the functionality seems to have
crept in with previous commit though? git gremlins...
Davin McCall [Fri, 1 Jan 2016 02:13:37 +0000 (02:13 +0000)]
Fix a problem that left services incorrectly marked as active.
Davin McCall [Thu, 31 Dec 2015 23:50:24 +0000 (23:50 +0000)]
For scripted services, accept both a "command" and "stop-command" setting.
Do not automatically add "start" or "stop" to the command.
Davin McCall [Thu, 31 Dec 2015 23:28:48 +0000 (23:28 +0000)]
Fix: when a dependency failed, the dependent process was not marked
as inactive.
Davin McCall [Thu, 31 Dec 2015 22:09:51 +0000 (22:09 +0000)]
Merge "shutdown" and "dinit-reboot" functionality into the "shutdown"
executable.
dinit-reboot function (of actually unmounting file systems and performing
shutdown) is accessed using --system argument, which is not expected to
be used by users.
Davin McCall [Wed, 30 Dec 2015 22:24:54 +0000 (22:24 +0000)]
Implement a shutdown commoand which issues a shutdown via Dinit's
control protocol. Includes 'halt' and 'reboot' alias scripts.
Implement a dinit-reboot helper program to be called by the main
Dinit process to actually perform shutdown.
Davin McCall [Wed, 30 Dec 2015 22:22:04 +0000 (22:22 +0000)]
Control protocol: Remove 'ROLLBACK' command, add a 'SHUTDOWN'
command to replace it. Remove the rollback handler interface
from ServiceSet.
Davin McCall [Wed, 30 Dec 2015 22:18:14 +0000 (22:18 +0000)]
Record shutdown type (halt, poweroff, reboot) in the service set.
Davin McCall [Wed, 30 Dec 2015 00:35:32 +0000 (00:35 +0000)]
Documentation updates.
Davin McCall [Wed, 30 Dec 2015 00:30:19 +0000 (00:30 +0000)]
Overhaul of dinit-start utility.
It isn't yet complete, but is functional.
Davin McCall [Wed, 30 Dec 2015 00:29:09 +0000 (00:29 +0000)]
Include desired state of service in SERVICERECORD packets.
Davin McCall [Wed, 30 Dec 2015 00:24:22 +0000 (00:24 +0000)]
Fix bug in ServiceSet::loadService (only worked properly for already-loaded
services) and add an accessor method for desired_state.
Davin McCall [Wed, 30 Dec 2015 00:16:26 +0000 (00:16 +0000)]
Fix include style for service-constants.h include
Davin McCall [Wed, 30 Dec 2015 00:08:39 +0000 (00:08 +0000)]
Move service event types into service-constants.h
Davin McCall [Tue, 29 Dec 2015 12:14:37 +0000 (12:14 +0000)]
Control stream: Use a circular receive buffer
Davin McCall [Tue, 29 Dec 2015 10:05:58 +0000 (10:05 +0000)]
Overhaul of the control protocol.
Numeric service handles can be allocated for a service (via FINDSERVICE/LOADSERVICE
requests), and commands are issued against a service handle. Notification of events
is performed using information packets which include the relevant service handle.
Davin McCall [Tue, 29 Dec 2015 09:21:28 +0000 (09:21 +0000)]
Remove obselete TODO comment.
Davin McCall [Tue, 29 Dec 2015 09:17:54 +0000 (09:17 +0000)]
Split service constants (state/event enumerations) into a separate
include file.
Davin McCall [Tue, 29 Dec 2015 09:16:40 +0000 (09:16 +0000)]
Prevent force_stop state being set in a service that has already
stopped.
Davin McCall [Mon, 28 Dec 2015 16:33:09 +0000 (16:33 +0000)]
Add a publicly-accessible method to load a service (and return
a pointer to its service record).
Davin McCall [Mon, 28 Dec 2015 16:15:24 +0000 (16:15 +0000)]
Fix bind of control socket, and unlink control socket path on exit
Davin McCall [Sun, 27 Dec 2015 11:56:21 +0000 (11:56 +0000)]
Add an event listener interface to services.
Davin McCall [Thu, 24 Dec 2015 23:39:24 +0000 (23:39 +0000)]
Minor re-arrangement of fields and code documentation improvements.
Davin McCall [Wed, 23 Dec 2015 20:33:03 +0000 (20:33 +0000)]
Cleanup error handling / logging
Davin McCall [Tue, 1 Dec 2015 19:53:33 +0000 (19:53 +0000)]
Add possibility to pin services started or stopped. This prevents
them from automatically stopping or starting as part of a dependency
chain.
Davin McCall [Tue, 24 Nov 2015 11:49:52 +0000 (11:49 +0000)]
Improve error message logged when failing to load a service (give
reason for failure).
(Also correct some comments explaining util-linux-ng shutdown/init
behavior).
Davin McCall [Tue, 24 Nov 2015 00:03:10 +0000 (00:03 +0000)]
Add "nosigterm" service setting to inhibit sending SIGTERM to service
process. (Unless an aleternative signal is specified using 'termsignal',
no termination signal will be sent).
Davin McCall [Mon, 23 Nov 2015 09:43:59 +0000 (09:43 +0000)]
Add a "query version" command to the control protocol.
Davin McCall [Mon, 23 Nov 2015 09:25:13 +0000 (09:25 +0000)]
Add possibility to retrieve textual description of errors from service
load exceptions.
Davin McCall [Mon, 23 Nov 2015 08:29:05 +0000 (08:29 +0000)]
Control protocol cleanups.
Davin McCall [Mon, 23 Nov 2015 07:42:13 +0000 (07:42 +0000)]
Comment update.
Davin McCall [Mon, 23 Nov 2015 07:39:42 +0000 (07:39 +0000)]
Fix remaining case of ControlConn being used after being deleted.
Davin McCall [Sun, 22 Nov 2015 14:50:13 +0000 (14:50 +0000)]
In processPacket() always check the response of queuePacket(), to
avoid writing to instance variables after the ControlConn instance
has been deleted.
Also make some functions private.
Davin McCall [Sun, 22 Nov 2015 14:27:17 +0000 (14:27 +0000)]
Various control protocol improvements, still needs significant work.
Davin McCall [Sat, 21 Nov 2015 12:30:12 +0000 (12:30 +0000)]
Introduce queuePacket() variant which takes a `const char *` buffer
rather than a pre-made vector. Use it where appropriate to send ACK
responses.
Davin McCall [Sat, 21 Nov 2015 11:29:35 +0000 (11:29 +0000)]
Add function to queue outgoing packet to a control connection.
Davin McCall [Thu, 19 Nov 2015 22:45:29 +0000 (22:45 +0000)]
Move compiler flags out of the Makefile and into mconfig
Davin McCall [Thu, 19 Nov 2015 22:03:51 +0000 (22:03 +0000)]
Various exception handling fixes and 'noexcept' declarations
Davin McCall [Thu, 19 Nov 2015 18:46:22 +0000 (18:46 +0000)]
Remove incorrect comment
Davin McCall [Thu, 19 Nov 2015 18:42:28 +0000 (18:42 +0000)]
Remove functional TODO comments.
Davin McCall [Thu, 19 Nov 2015 18:28:34 +0000 (18:28 +0000)]
Add a control command to initiate service rollback (and receive
notification when rollback is complete).
Davin McCall [Thu, 19 Nov 2015 18:20:34 +0000 (18:20 +0000)]
Fix some logging, and add a variable to track how many control connections
are open. Don't terminate while there are still control connections.
Davin McCall [Thu, 19 Nov 2015 11:24:08 +0000 (11:24 +0000)]
Commit .gitignore
Davin McCall [Thu, 19 Nov 2015 11:02:18 +0000 (11:02 +0000)]
Add the "termsignal" setting to process services. This allows an
additional signal (alongside SIGTERM) to be sent to the process to
terminate it.
Davin McCall [Wed, 18 Nov 2015 22:40:04 +0000 (22:40 +0000)]
Catch allocation exception when receiving a control socket connection
Davin McCall [Wed, 18 Nov 2015 17:13:05 +0000 (17:13 +0000)]
Documentation updates
Davin McCall [Wed, 18 Nov 2015 17:07:09 +0000 (17:07 +0000)]
Improve the state model.
A service now transitions into the STARTING state from the STOPPED state
as soon as start() is called, rather than after all dependencies have
started. Similarly a service enteres the STOPPING state (from STARTED)
immediately when stop() is called.
Forced re-starts should now work properly in all cases.
Davin McCall [Wed, 18 Nov 2015 14:23:35 +0000 (14:23 +0000)]
Add 'dependencyStarted' method instead of directly overloading 'start'