mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Windows: Set service recovery options
Signed-off-by: John Howard <jhoward@microsoft.com>
This commit is contained in:
		
							parent
							
								
									67b85f9d26
								
							
						
					
					
						commit
						eea679fbcc
					
				
					 1 changed files with 36 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -9,6 +9,8 @@ import (
 | 
			
		|||
	"os/exec"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"github.com/Sirupsen/logrus"
 | 
			
		||||
	"github.com/spf13/pflag"
 | 
			
		||||
| 
						 | 
				
			
			@ -183,6 +185,40 @@ func registerService() error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer s.Close()
 | 
			
		||||
 | 
			
		||||
	// See http://stackoverflow.com/questions/35151052/how-do-i-configure-failure-actions-of-a-windows-service-written-in-go
 | 
			
		||||
	const (
 | 
			
		||||
		scActionNone       = 0
 | 
			
		||||
		scActionRestart    = 1
 | 
			
		||||
		scActionReboot     = 2
 | 
			
		||||
		scActionRunCommand = 3
 | 
			
		||||
 | 
			
		||||
		serviceConfigFailureActions = 2
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	type serviceFailureActions struct {
 | 
			
		||||
		ResetPeriod  uint32
 | 
			
		||||
		RebootMsg    *uint16
 | 
			
		||||
		Command      *uint16
 | 
			
		||||
		ActionsCount uint32
 | 
			
		||||
		Actions      uintptr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type scAction struct {
 | 
			
		||||
		Type  uint32
 | 
			
		||||
		Delay uint32
 | 
			
		||||
	}
 | 
			
		||||
	t := []scAction{
 | 
			
		||||
		{Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)},
 | 
			
		||||
		{Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)},
 | 
			
		||||
		{Type: scActionNone},
 | 
			
		||||
	}
 | 
			
		||||
	lpInfo := serviceFailureActions{ResetPeriod: uint32(24 * time.Hour / time.Second), ActionsCount: uint32(3), Actions: uintptr(unsafe.Pointer(&t[0]))}
 | 
			
		||||
	err = windows.ChangeServiceConfig2(s.Handle, serviceConfigFailureActions, (*byte)(unsafe.Pointer(&lpInfo)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = eventlog.Install(*flServiceName, p, false, eventlog.Info|eventlog.Warning|eventlog.Error)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue