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  }