internal/daemon/daemon.go (61 lines of code) (raw):

// 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) }