mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-07-28 16:01:05 +00:00
TUN-3195: Don't colorize console logs when stderr is not a terminal
This commit is contained in:
7
vendor/golang.org/x/sys/windows/svc/mgr/config.go
generated
vendored
7
vendor/golang.org/x/sys/windows/svc/mgr/config.go
generated
vendored
@@ -98,6 +98,12 @@ func (s *Service) Config() (Config, error) {
|
||||
delayedStart = true
|
||||
}
|
||||
|
||||
b, err = s.queryServiceConfig2(windows.SERVICE_CONFIG_SERVICE_SID_INFO)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
sidType := *(*uint32)(unsafe.Pointer(&b[0]))
|
||||
|
||||
return Config{
|
||||
ServiceType: p.ServiceType,
|
||||
StartType: p.StartType,
|
||||
@@ -110,6 +116,7 @@ func (s *Service) Config() (Config, error) {
|
||||
DisplayName: windows.UTF16PtrToString(p.DisplayName),
|
||||
Description: windows.UTF16PtrToString(p2.Description),
|
||||
DelayedAutoStart: delayedStart,
|
||||
SidType: sidType,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
3
vendor/golang.org/x/sys/windows/svc/mgr/mgr.go
generated
vendored
3
vendor/golang.org/x/sys/windows/svc/mgr/mgr.go
generated
vendored
@@ -117,9 +117,6 @@ func (m *Mgr) CreateService(name, exepath string, c Config, args ...string) (*Se
|
||||
if c.StartType == 0 {
|
||||
c.StartType = StartManual
|
||||
}
|
||||
if c.ErrorControl == 0 {
|
||||
c.ErrorControl = ErrorNormal
|
||||
}
|
||||
if c.ServiceType == 0 {
|
||||
c.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS
|
||||
}
|
||||
|
8
vendor/golang.org/x/sys/windows/svc/mgr/service.go
generated
vendored
8
vendor/golang.org/x/sys/windows/svc/mgr/service.go
generated
vendored
@@ -68,8 +68,10 @@ func (s *Service) Query() (svc.Status, error) {
|
||||
return svc.Status{}, err
|
||||
}
|
||||
return svc.Status{
|
||||
State: svc.State(t.CurrentState),
|
||||
Accepts: svc.Accepted(t.ControlsAccepted),
|
||||
ProcessId: t.ProcessId,
|
||||
State: svc.State(t.CurrentState),
|
||||
Accepts: svc.Accepted(t.ControlsAccepted),
|
||||
ProcessId: t.ProcessId,
|
||||
Win32ExitCode: t.Win32ExitCode,
|
||||
ServiceSpecificExitCode: t.ServiceSpecificExitCode,
|
||||
}, nil
|
||||
}
|
||||
|
98
vendor/golang.org/x/sys/windows/svc/security.go
generated
vendored
98
vendor/golang.org/x/sys/windows/svc/security.go
generated
vendored
@@ -7,6 +7,10 @@
|
||||
package svc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
@@ -23,6 +27,8 @@ func allocSid(subAuth0 uint32) (*windows.SID, error) {
|
||||
// IsAnInteractiveSession determines if calling process is running interactively.
|
||||
// It queries the process token for membership in the Interactive group.
|
||||
// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s
|
||||
//
|
||||
// Deprecated: Use IsWindowsService instead.
|
||||
func IsAnInteractiveSession() (bool, error) {
|
||||
interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID)
|
||||
if err != nil {
|
||||
@@ -57,3 +63,95 @@ func IsAnInteractiveSession() (bool, error) {
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
var (
|
||||
ntdll = windows.NewLazySystemDLL("ntdll.dll")
|
||||
_NtQueryInformationProcess = ntdll.NewProc("NtQueryInformationProcess")
|
||||
|
||||
kernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
||||
_QueryFullProcessImageNameA = kernel32.NewProc("QueryFullProcessImageNameA")
|
||||
)
|
||||
|
||||
// IsWindowsService reports whether the process is currently executing
|
||||
// as a Windows service.
|
||||
func IsWindowsService() (bool, error) {
|
||||
// This code was copied from runtime.isWindowsService function.
|
||||
|
||||
// The below technique looks a bit hairy, but it's actually
|
||||
// exactly what the .NET framework does for the similarly named function:
|
||||
// https://github.com/dotnet/extensions/blob/f4066026ca06984b07e90e61a6390ac38152ba93/src/Hosting/WindowsServices/src/WindowsServiceHelpers.cs#L26-L31
|
||||
// Specifically, it looks up whether the parent process has session ID zero
|
||||
// and is called "services".
|
||||
const _CURRENT_PROCESS = ^uintptr(0)
|
||||
// pbi is a PROCESS_BASIC_INFORMATION struct, where we just care about
|
||||
// the 6th pointer inside of it, which contains the pid of the process
|
||||
// parent:
|
||||
// https://github.com/wine-mirror/wine/blob/42cb7d2ad1caba08de235e6319b9967296b5d554/include/winternl.h#L1294
|
||||
var pbi [6]uintptr
|
||||
var pbiLen uint32
|
||||
r0, _, _ := syscall.Syscall6(_NtQueryInformationProcess.Addr(), 5, _CURRENT_PROCESS, 0, uintptr(unsafe.Pointer(&pbi[0])), uintptr(unsafe.Sizeof(pbi)), uintptr(unsafe.Pointer(&pbiLen)), 0)
|
||||
if r0 != 0 {
|
||||
return false, errors.New("NtQueryInformationProcess failed: error=" + itoa(int(r0)))
|
||||
}
|
||||
var psid uint32
|
||||
err := windows.ProcessIdToSessionId(uint32(pbi[5]), &psid)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if psid != 0 {
|
||||
// parent session id should be 0 for service process
|
||||
return false, nil
|
||||
}
|
||||
|
||||
pproc, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, uint32(pbi[5]))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
defer windows.CloseHandle(pproc)
|
||||
|
||||
// exeName gets the path to the executable image of the parent process
|
||||
var exeName [261]byte
|
||||
exeNameLen := uint32(len(exeName) - 1)
|
||||
r0, _, e0 := syscall.Syscall6(_QueryFullProcessImageNameA.Addr(), 4, uintptr(pproc), 0, uintptr(unsafe.Pointer(&exeName[0])), uintptr(unsafe.Pointer(&exeNameLen)), 0, 0)
|
||||
if r0 == 0 {
|
||||
if e0 != 0 {
|
||||
return false, e0
|
||||
} else {
|
||||
return false, syscall.EINVAL
|
||||
}
|
||||
}
|
||||
const (
|
||||
servicesLower = "services.exe"
|
||||
servicesUpper = "SERVICES.EXE"
|
||||
)
|
||||
i := int(exeNameLen) - 1
|
||||
j := len(servicesLower) - 1
|
||||
if i < j {
|
||||
return false, nil
|
||||
}
|
||||
for {
|
||||
if j == -1 {
|
||||
return i == -1 || exeName[i] == '\\', nil
|
||||
}
|
||||
if exeName[i] != servicesLower[j] && exeName[i] != servicesUpper[j] {
|
||||
return false, nil
|
||||
}
|
||||
i--
|
||||
j--
|
||||
}
|
||||
}
|
||||
|
||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
|
||||
if val < 0 {
|
||||
return "-" + itoa(-val)
|
||||
}
|
||||
var buf [32]byte // big enough for int64
|
||||
i := len(buf) - 1
|
||||
for val >= 10 {
|
||||
buf[i] = byte(val%10 + '0')
|
||||
i--
|
||||
val /= 10
|
||||
}
|
||||
buf[i] = byte(val + '0')
|
||||
return string(buf[i:])
|
||||
}
|
||||
|
17
vendor/golang.org/x/sys/windows/svc/service.go
generated
vendored
17
vendor/golang.org/x/sys/windows/svc/service.go
generated
vendored
@@ -50,6 +50,7 @@ const (
|
||||
HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE)
|
||||
PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT)
|
||||
SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE)
|
||||
PreShutdown = Cmd(windows.SERVICE_CONTROL_PRESHUTDOWN)
|
||||
)
|
||||
|
||||
// Accepted is used to describe commands accepted by the service.
|
||||
@@ -65,15 +66,18 @@ const (
|
||||
AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE)
|
||||
AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT)
|
||||
AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE)
|
||||
AcceptPreShutdown = Accepted(windows.SERVICE_ACCEPT_PRESHUTDOWN)
|
||||
)
|
||||
|
||||
// Status combines State and Accepted commands to fully describe running service.
|
||||
type Status struct {
|
||||
State State
|
||||
Accepts Accepted
|
||||
CheckPoint uint32 // used to report progress during a lengthy operation
|
||||
WaitHint uint32 // estimated time required for a pending operation, in milliseconds
|
||||
ProcessId uint32 // if the service is running, the process identifier of it, and otherwise zero
|
||||
State State
|
||||
Accepts Accepted
|
||||
CheckPoint uint32 // used to report progress during a lengthy operation
|
||||
WaitHint uint32 // estimated time required for a pending operation, in milliseconds
|
||||
ProcessId uint32 // if the service is running, the process identifier of it, and otherwise zero
|
||||
Win32ExitCode uint32 // set if the service has exited with a win32 exit code
|
||||
ServiceSpecificExitCode uint32 // set if the service has exited with a service-specific exit code
|
||||
}
|
||||
|
||||
// ChangeRequest is sent to the service Handler to request service status change.
|
||||
@@ -202,6 +206,9 @@ func (s *service) updateStatus(status *Status, ec *exitCode) error {
|
||||
if status.Accepts&AcceptSessionChange != 0 {
|
||||
t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE
|
||||
}
|
||||
if status.Accepts&AcceptPreShutdown != 0 {
|
||||
t.ControlsAccepted |= windows.SERVICE_ACCEPT_PRESHUTDOWN
|
||||
}
|
||||
if ec.errno == 0 {
|
||||
t.Win32ExitCode = windows.NO_ERROR
|
||||
t.ServiceSpecificExitCode = windows.NO_ERROR
|
||||
|
Reference in New Issue
Block a user