| // Copyright 2024 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Package daemon provides utilities for interacting with daemon services, for |
| // linux it uses systemd and for windows it uses service control manager. |
| package daemon |
| |
| import ( |
| "context" |
| |
| "github.com/GoogleCloudPlatform/galog" |
| ) |
| |
| // Client is the client for interacting with systemd. |
| var Client ClientInterface |
| |
| // RestartMethod is a method with which to restart a service. Note that this is |
| // applicable only to linux. Windows does not support restart methods and |
| // ignores the method parameter. |
| type RestartMethod int |
| |
| // ServiceStatus is the status of a systemd unit. |
| type ServiceStatus int |
| |
| const ( |
| // Unknown is an unknown status. |
| Unknown ServiceStatus = iota |
| // Active is an active status. |
| Active |
| // Inactive is an inactive status. |
| Inactive |
| // Failed is a failed status. |
| Failed |
| ) |
| |
| // ClientInterface provides utilities for interacting with systemd. |
| type ClientInterface interface { |
| // DisableService disables a daemon service. It essentially prevents the |
| // service from starting automatically on restart. |
| DisableService(ctx context.Context, daemon string) error |
| // EnableService enables a daemon service. |
| EnableService(ctx context.Context, daemon string) error |
| // RestartService restarts a systemd service. |
| RestartService(ctx context.Context, service string, method RestartMethod) error |
| // CheckUnitExists checks if a systemd unit exists. |
| CheckUnitExists(ctx context.Context, unit string) (bool, error) |
| // ReloadDaemon reloads a systemd daemon. |
| ReloadDaemon(ctx context.Context, daemon string) error |
| // UnitStatus returns the status of a systemd unit. |
| UnitStatus(ctx context.Context, unit string) (ServiceStatus, error) |
| // StopDaemon stops a daemon service. |
| StopDaemon(ctx context.Context, daemon string) error |
| // StartDaemon starts a daemon service. |
| StartDaemon(ctx context.Context, daemon string) error |
| } |
| |
| const ( |
| // These are methods with which to restart a service. Restarting in this case |
| // means stopping, then starting the service. |
| |
| // Restart indicates to use `systemctl restart`, which stops and starts the |
| // service. |
| Restart RestartMethod = iota |
| // Reload indicates to use `systemctl reload`, which reloads the service- |
| // specific configuration. |
| Reload |
| // TryRestart indicates to use `systemctl try-restart`, which tries restarting |
| // the service. If the service is not running, this is no-op. |
| TryRestart |
| // ReloadOrRestart indicates to use `systemctl reload-or-restart`, which tries |
| // reloading the service, if supported. Otherwise, the service is restarted. |
| // If the service is not running, the service will be started. |
| ReloadOrRestart |
| // TryReloadOrRestart indicates to use `systemctl try-reload-or-restart`, which |
| // tries reloading the service, if supported. Otherwise, the service is |
| // restarted. If the service is not running, this is no-op. |
| TryReloadOrRestart |
| ) |
| |
| // EnableService enables a daemon service. |
| func EnableService(ctx context.Context, service string) error { |
| galog.Infof("Enabling service: %q", service) |
| return Client.EnableService(ctx, service) |
| } |
| |
| // DisableService disables a daemon service. It essentially prevents the service |
| // from starting automatically on restart. |
| func DisableService(ctx context.Context, service string) error { |
| galog.Infof("Disabling service: %q", service) |
| return Client.DisableService(ctx, service) |
| } |
| |
| // RestartService restarts a systemd service. RestartMethod is applicable only |
| // to linux. Windows does not support restart methods and ignores the method |
| // parameter. |
| func RestartService(ctx context.Context, service string, method RestartMethod) error { |
| galog.Infof("Restarting service: %q", service) |
| return Client.RestartService(ctx, service, method) |
| } |
| |
| // CheckUnitExists checks if a systemd unit exists. |
| func CheckUnitExists(ctx context.Context, unit string) (bool, error) { |
| return Client.CheckUnitExists(ctx, unit) |
| } |
| |
| // ReloadDaemon reloads a systemd daemon. |
| func ReloadDaemon(ctx context.Context, daemon string) error { |
| galog.Infof("Reloading daemon: %q", daemon) |
| return Client.ReloadDaemon(ctx, daemon) |
| } |
| |
| // UnitStatus returns the status of a systemd unit. |
| func UnitStatus(ctx context.Context, unit string) (ServiceStatus, error) { |
| return Client.UnitStatus(ctx, unit) |
| } |
| |
| // StopDaemon stops a daemon service. |
| func StopDaemon(ctx context.Context, daemon string) error { |
| galog.Infof("Stopping daemon: %q", daemon) |
| return Client.StopDaemon(ctx, daemon) |
| } |
| |
| // StartDaemon starts a daemon service. |
| func StartDaemon(ctx context.Context, daemon string) error { |
| galog.Infof("Starting daemon: %q", daemon) |
| return Client.StartDaemon(ctx, daemon) |
| } |