grim/hgkeeper

Start of hgweb support
feature/hgweb
2019-09-17, Gary Kramlich
45b57bfc4382
Parents 48860d0159a2
Children 8d3f0cd8203a
Start of hgweb support
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgweb/hgweb.go Tue Sep 17 20:31:09 2019 -0500
@@ -0,0 +1,48 @@
+package hgweb
+
+import (
+ "io/ioutil"
+ "net/http"
+ "net/http/cgi"
+ "os"
+
+ log "github.com/sirupsen/logrus"
+)
+
+type Server struct {
+ server *http.Server
+ cgiPath string
+}
+
+func NewServer(listenAddr string) (*Server, error) {
+ return &Server{
+ server: &http.Server{
+ Addr: listenAddr,
+ },
+ }, nil
+}
+
+func (s *Server) Startup() error {
+ cgiPath, err := ioutil.TempFile("", "hgkeeper-hgweb-*.cgi")
+ if err != nil {
+ return err
+ }
+
+ log.Warnf("path: %q", cgiPath.Name())
+
+ s.cgiPath = cgiPath.Name()
+
+ s.server.Handler = &cgi.Handler{Path: s.cgiPath}
+
+ return s.server.ListenAndServe()
+}
+
+func (s *Server) Shutdown() {
+ if err := os.Remove(s.cgiPath); err != nil {
+ log.Warnf("failed to remove temporary cgi file %q: %v", s.cgiPath, err)
+ }
+
+ if err := s.server.Close(); err != nil {
+ log.Warnf("failed to shutdown http server: %v", err)
+ }
+}
--- a/serve/command.go Wed Sep 18 11:13:34 2019 -0500
+++ b/serve/command.go Tue Sep 17 20:31:09 2019 -0500
@@ -1,8 +1,15 @@
package serve
import (
+ "os"
+ "os/signal"
+ "syscall"
+
+ log "github.com/sirupsen/logrus"
+
"bitbucket.org/rw_grim/hgkeeper/access"
"bitbucket.org/rw_grim/hgkeeper/globals"
+ "bitbucket.org/rw_grim/hgkeeper/hgweb"
"bitbucket.org/rw_grim/hgkeeper/ssh"
)
@@ -16,15 +23,43 @@
return err
}
- s, err := ssh.NewServer(c.SSHHostKeysPath, g.ReposPath, access.AdminRepoPath())
+ signalChan := make(chan os.Signal, 1)
+ signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
+
+ errChan := make(chan error, 10)
+
+ ssh, err := ssh.NewServer(c.SSHHostKeysPath, g.ReposPath, access.AdminRepoPath())
if err != nil {
return err
}
- err = s.Listen(c.SSHAddr)
+ hgweb, err := hgweb.NewServer(":3333")
if err != nil {
return err
}
+ defer hgweb.Shutdown()
- return nil
+ go func() {
+ if err := ssh.Listen(c.SSHAddr); err != nil {
+ errChan <- err
+ }
+ }()
+
+ go func() {
+ if err := hgweb.Startup(); err != nil {
+ errChan <- err
+ }
+ }()
+
+ for {
+ select {
+ case err := <-errChan:
+ if err != nil {
+ return err
+ }
+ case s := <-signalChan:
+ log.Infof("Captured %v signal. Exiting...", s)
+ return nil
+ }
+ }
}