|
|
|
|
@ -55,6 +55,11 @@ func isWindowsService() bool { |
|
|
|
|
return v |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// runWindowsService starts running Tailscale under the Windows
|
|
|
|
|
// Service environment.
|
|
|
|
|
//
|
|
|
|
|
// At this point we're still the parent process that
|
|
|
|
|
// Windows started.
|
|
|
|
|
func runWindowsService(pol *logpolicy.Policy) error { |
|
|
|
|
return svc.Run(serviceName, &ipnService{Policy: pol}) |
|
|
|
|
} |
|
|
|
|
@ -93,6 +98,7 @@ func (service *ipnService) Execute(args []string, r <-chan svc.ChangeRequest, ch |
|
|
|
|
select { |
|
|
|
|
case <-doneCh: |
|
|
|
|
case cmd := <-r: |
|
|
|
|
log.Printf("Got Windows Service event: %v", cmdName(cmd.Cmd)) |
|
|
|
|
switch cmd.Cmd { |
|
|
|
|
case svc.Stop: |
|
|
|
|
cancel() |
|
|
|
|
@ -109,6 +115,42 @@ func (service *ipnService) Execute(args []string, r <-chan svc.ChangeRequest, ch |
|
|
|
|
return false, windows.NO_ERROR |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func cmdName(c svc.Cmd) string { |
|
|
|
|
switch c { |
|
|
|
|
case svc.Stop: |
|
|
|
|
return "Stop" |
|
|
|
|
case svc.Pause: |
|
|
|
|
return "Pause" |
|
|
|
|
case svc.Continue: |
|
|
|
|
return "Continue" |
|
|
|
|
case svc.Interrogate: |
|
|
|
|
return "Interrogate" |
|
|
|
|
case svc.Shutdown: |
|
|
|
|
return "Shutdown" |
|
|
|
|
case svc.ParamChange: |
|
|
|
|
return "ParamChange" |
|
|
|
|
case svc.NetBindAdd: |
|
|
|
|
return "NetBindAdd" |
|
|
|
|
case svc.NetBindRemove: |
|
|
|
|
return "NetBindRemove" |
|
|
|
|
case svc.NetBindEnable: |
|
|
|
|
return "NetBindEnable" |
|
|
|
|
case svc.NetBindDisable: |
|
|
|
|
return "NetBindDisable" |
|
|
|
|
case svc.DeviceEvent: |
|
|
|
|
return "DeviceEvent" |
|
|
|
|
case svc.HardwareProfileChange: |
|
|
|
|
return "HardwareProfileChange" |
|
|
|
|
case svc.PowerEvent: |
|
|
|
|
return "PowerEvent" |
|
|
|
|
case svc.SessionChange: |
|
|
|
|
return "SessionChange" |
|
|
|
|
case svc.PreShutdown: |
|
|
|
|
return "PreShutdown" |
|
|
|
|
} |
|
|
|
|
return fmt.Sprintf("Unknown-Service-Cmd-%d", c) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func beWindowsSubprocess() bool { |
|
|
|
|
if beFirewallKillswitch() { |
|
|
|
|
return true |
|
|
|
|
|