go-hep.org/x/hep@v0.38.1/groot/cmd/root-srv/main.go (about) 1 // Copyright ©2017 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // root-srv runs a web server that can inspect and browse ROOT files. 6 // root-srv can also display ROOT objects (TH1x, TH2x, TGraphs, TGraphErrors, 7 // TGraphAsymmErrors, TDirectories, TTrees, ...). 8 // 9 // Usage: root-srv [options] 10 // 11 // ex: 12 // 13 // $> root-srv -addr=:8080 & 14 // 2017/04/06 15:13:59 server listening on :8080 15 // 16 // $> open localhost:8080 17 // 18 // $> root-srv -addr :8080 -serv https -host example.com 19 // 2017/04/06 15:13:59 https server listening on :8080 at example.com 20 package main // import "go-hep.org/x/hep/groot/cmd/root-srv" 21 22 import ( 23 "crypto/tls" 24 "flag" 25 "fmt" 26 "log" 27 "net/http" 28 "os" 29 "os/signal" 30 31 "golang.org/x/crypto/acme/autocert" 32 ) 33 34 var ( 35 addrFlag = flag.String("addr", ":8080", "server address:port") 36 servFlag = flag.String("serv", "http", "server protocol") 37 hostFlag = flag.String("host", "", "server domain name for TLS ") 38 ) 39 40 func main() { 41 flag.Usage = func() { 42 fmt.Fprintf( 43 os.Stderr, 44 `Usage: root-srv [options] 45 46 ex: 47 48 49 $> root-srv -addr :8080 -serv https -host example.com 50 2017/04/06 15:13:59 https server listening on :8080 at example.com 51 52 options: 53 `, 54 ) 55 flag.PrintDefaults() 56 } 57 58 flag.Parse() 59 60 log.SetPrefix("root-srv: ") 61 log.SetFlags(0) 62 63 dir, err := os.MkdirTemp("", "groot-rsrv-") 64 if err != nil { 65 log.Panicf("could not create temporary directory: %v", err) 66 } 67 68 c := make(chan os.Signal, 1) 69 signal.Notify(c, os.Interrupt) 70 71 run(dir, c) 72 } 73 74 func run(dir string, c chan os.Signal) { 75 defer func() { 76 log.Printf("shutdown sequence...") 77 os.RemoveAll(dir) 78 }() 79 80 log.Printf("%s server listening on %s", *servFlag, *addrFlag) 81 82 srv := newServer(*hostFlag == "", dir, http.DefaultServeMux) 83 defer srv.Shutdown() 84 85 go func() { 86 if *servFlag == "http" { 87 log.Fatal(http.ListenAndServe(*addrFlag, nil)) 88 } else if *servFlag == "https" { 89 m := autocert.Manager{ 90 Prompt: autocert.AcceptTOS, 91 HostPolicy: autocert.HostWhitelist(*hostFlag), 92 Cache: autocert.DirCache("certs"), //folder for storing certificates 93 } 94 server := &http.Server{ 95 Addr: *addrFlag, 96 TLSConfig: &tls.Config{ 97 GetCertificate: m.GetCertificate, 98 }, 99 } 100 log.Fatal(server.ListenAndServeTLS("", "")) 101 } 102 }() 103 <-c 104 }