in cmd/ops_agent_windows/install_windows.go [53:123]
func install() error {
m, err := mgr.Connect()
if err != nil {
return err
}
defer m.Disconnect()
diagnosticError := uninstallDiagnosticService(m)
if diagnosticError != nil {
return diagnosticError
}
handles := make([]*mgr.Service, len(services))
for i, s := range services {
// Registering with the event log is required to suppress the "The description for Event ID 1 from source Google Cloud Ops Agent cannot be found" message in the logs.
if err := eventlog.InstallAsEventCreate(s.name, eventlog.Error|eventlog.Warning|eventlog.Info); err != nil {
// Ignore error since it likely means the event log already exists.
}
deps := []string{"rpcss"}
if i > 0 {
// All services depend on the config generation service.
deps = append(deps, services[0].name)
}
serviceHandle, err := m.OpenService(s.name)
if err == nil {
// Service already exists; just update its configuration.
defer serviceHandle.Close()
config, err := serviceHandle.Config()
if err != nil {
return err
}
config.DisplayName = s.displayName
config.BinaryPathName = escapeExe(s.exepath, s.args)
config.Dependencies = deps
config.DelayedAutoStart = true
if err := serviceHandle.UpdateConfig(config); err != nil {
return err
}
} else {
serviceHandle, err = m.CreateService(
s.name,
s.exepath,
mgr.Config{
DisplayName: s.displayName,
StartType: mgr.StartAutomatic,
Dependencies: deps,
DelayedAutoStart: true,
},
s.args...,
)
if err != nil {
return err
}
defer serviceHandle.Close()
}
// restart after 1s then 2s, reset error counter after 60s
serviceHandle.SetRecoveryActions([]mgr.RecoveryAction{
{Type: mgr.ServiceRestart, Delay: time.Second},
{Type: mgr.ServiceRestart, Delay: 2 * time.Second},
}, 60)
handles[i] = serviceHandle
}
// Automatically (re)start the Ops Agent service.
for i := len(services) - 1; i >= 0; i-- {
if err := stopService(handles[i], 30*time.Second); err != nil {
return fmt.Errorf("failed to stop service: %v, error: %v", services[i].name, err)
}
}
return handles[0].Start()
}