diff options
author | Andrey Nering <andrey.nering@gmail.com> | 2017-01-25 14:19:55 -0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-25 14:19:55 -0200 |
commit | e7c3be5f2f20a358cabf96d0807845865caf2cbd (patch) | |
tree | 6db69faeaa73954ff447a9e02494fa90a8a87caf /modules | |
parent | da1b6164fe3384a43cd440e54a8a2a10defc3553 (diff) | |
parent | 2009f4cbdae9095240bd8c5408e097e101499879 (diff) | |
download | gitea-e7c3be5f2f20a358cabf96d0807845865caf2cbd.tar.gz gitea-e7c3be5f2f20a358cabf96d0807845865caf2cbd.zip |
Merge pull request #736 from andreynering/fix-windows-ssh
Fix SSH server on Windows when running as service
Diffstat (limited to 'modules')
-rw-r--r-- | modules/minwinsvc/LICENSE | 20 | ||||
-rw-r--r-- | modules/minwinsvc/README.md | 18 | ||||
-rw-r--r-- | modules/minwinsvc/minwinsvc.go | 18 | ||||
-rw-r--r-- | modules/minwinsvc/svc_other.go | 11 | ||||
-rw-r--r-- | modules/minwinsvc/svc_windows.go | 75 | ||||
-rw-r--r-- | modules/setting/setting.go | 3 | ||||
-rw-r--r-- | modules/ssh/ssh.go | 6 |
7 files changed, 149 insertions, 2 deletions
diff --git a/modules/minwinsvc/LICENSE b/modules/minwinsvc/LICENSE new file mode 100644 index 0000000000..fce91b4e1a --- /dev/null +++ b/modules/minwinsvc/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015 Daniel Theophanes + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. diff --git a/modules/minwinsvc/README.md b/modules/minwinsvc/README.md new file mode 100644 index 0000000000..260dceeac3 --- /dev/null +++ b/modules/minwinsvc/README.md @@ -0,0 +1,18 @@ +### Minimal windows service stub + +Programs designed to run from most *nix style operating systems +can import this package to enable running programs as services without modifying +them. + +``` +import _ "github.com/kardianos/minwinsvc" +``` + +If you need more control over the exit behavior, set +``` +minwinsvc.SetOnExit(func() { + // Do something. + // Within 10 seconds call: + os.Exit(0) +}) +``` diff --git a/modules/minwinsvc/minwinsvc.go b/modules/minwinsvc/minwinsvc.go new file mode 100644 index 0000000000..4cd89ffdb4 --- /dev/null +++ b/modules/minwinsvc/minwinsvc.go @@ -0,0 +1,18 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +// Package minwinsvc is a minimal non-invasive windows only service stub. +// +// Import to allow running as a windows service. +// import _ "github.com/kardianos/minwinsvc" +// This will detect if running as a windows service +// and install required callbacks for windows. +package minwinsvc + +// SetOnExit sets the function to be called when the windows service +// requests an exit. If this is not called, or if it is called where +// f == nil, then it defaults to calling "os.Exit(0)". +func SetOnExit(f func()) { + setOnExit(f) +} diff --git a/modules/minwinsvc/svc_other.go b/modules/minwinsvc/svc_other.go new file mode 100644 index 0000000000..197d30021f --- /dev/null +++ b/modules/minwinsvc/svc_other.go @@ -0,0 +1,11 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +//+build !windows + +package minwinsvc + +func setOnExit(f func()) { + // Nothing. +} diff --git a/modules/minwinsvc/svc_windows.go b/modules/minwinsvc/svc_windows.go new file mode 100644 index 0000000000..c6e87e29df --- /dev/null +++ b/modules/minwinsvc/svc_windows.go @@ -0,0 +1,75 @@ +// Copyright 2015 Daniel Theophanes. +// Use of this source code is governed by a zlib-style +// license that can be found in the LICENSE file.package service + +//+build windows + +package minwinsvc + +import ( + "os" + "strconv" + "sync" + + "golang.org/x/sys/windows/svc" +) + +var ( + onExit func() + guard sync.Mutex + skip, _ = strconv.ParseBool(os.Getenv("SKIP_MINWINSVC")) +) + +func init() { + if skip { + return + } + interactive, err := svc.IsAnInteractiveSession() + if err != nil { + panic(err) + } + if interactive { + return + } + go func() { + _ = svc.Run("", runner{}) + + guard.Lock() + f := onExit + guard.Unlock() + + // Don't hold this lock in user code. + if f != nil { + f() + } + // Make sure we exit. + os.Exit(0) + }() +} + +func setOnExit(f func()) { + guard.Lock() + onExit = f + guard.Unlock() +} + +type runner struct{} + +func (runner) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) { + const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown + changes <- svc.Status{State: svc.StartPending} + + changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} + for { + c := <-r + switch c.Cmd { + case svc.Interrogate: + changes <- c.CurrentStatus + case svc.Stop, svc.Shutdown: + changes <- svc.Status{State: svc.StopPending} + return false, 0 + } + } + + return false, 0 +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index fd0f5085c9..0586bce94b 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -22,13 +22,14 @@ import ( "code.gitea.io/git" "code.gitea.io/gitea/modules/log" + _ "code.gitea.io/gitea/modules/minwinsvc" // import minwinsvc for windows services "code.gitea.io/gitea/modules/user" + "github.com/Unknwon/com" _ "github.com/go-macaron/cache/memcache" // memcache plugin for cache _ "github.com/go-macaron/cache/redis" "github.com/go-macaron/session" _ "github.com/go-macaron/session/redis" // redis plugin for store session - _ "github.com/kardianos/minwinsvc" // import minwinsvc for windows services "gopkg.in/ini.v1" "strk.kbt.io/projects/go/libravatar" ) diff --git a/modules/ssh/ssh.go b/modules/ssh/ssh.go index 056ef084ef..18bac8dbf2 100644 --- a/modules/ssh/ssh.go +++ b/modules/ssh/ssh.go @@ -67,7 +67,11 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { args := []string{"serv", "key-" + keyID, "--config=" + setting.CustomConf} log.Trace("SSH: Arguments: %v", args) cmd := exec.Command(setting.AppPath, args...) - cmd.Env = append(os.Environ(), "SSH_ORIGINAL_COMMAND="+cmdName) + cmd.Env = append( + os.Environ(), + "SSH_ORIGINAL_COMMAND="+cmdName, + "SKIP_MINWINSVC=1", + ) stdout, err := cmd.StdoutPipe() if err != nil { |