...

Source file src/github.com/sigstore/timestamp-authority/cmd/timestamp-server/app/serve.go

Documentation: github.com/sigstore/timestamp-authority/cmd/timestamp-server/app

     1  //
     2  // Copyright 2022 The Sigstore Authors.
     3  //
     4  // Licensed under the Apache License, Version 2.0 (the "License");
     5  // you may not use this file except in compliance with the License.
     6  // You may obtain a copy of the License at
     7  //
     8  //     http://www.apache.org/licenses/LICENSE-2.0
     9  //
    10  // Unless required by applicable law or agreed to in writing, software
    11  // distributed under the License is distributed on an "AS IS" BASIS,
    12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  // See the License for the specific language governing permissions and
    14  // limitations under the License.
    15  
    16  package app
    17  
    18  import (
    19  	"flag"
    20  	"net/http"
    21  
    22  	"github.com/spf13/cobra"
    23  	"github.com/spf13/viper"
    24  	"sigs.k8s.io/release-utils/version"
    25  
    26  	"github.com/sigstore/timestamp-authority/pkg/log"
    27  	"github.com/sigstore/timestamp-authority/pkg/ntpmonitor"
    28  	"github.com/sigstore/timestamp-authority/pkg/server"
    29  )
    30  
    31  // serveCmd represents the serve command
    32  var serveCmd = &cobra.Command{
    33  	Use:   "serve",
    34  	Short: "start http server with configured api",
    35  	Long:  `Starts a http server and serves the configured api`,
    36  	Run: func(cmd *cobra.Command, args []string) {
    37  		if err := viper.BindPFlags(cmd.Flags()); err != nil {
    38  			log.Logger.Fatal(err)
    39  		}
    40  		// Setup the logger to dev/prod
    41  		log.ConfigureLogger(viper.GetString("log-type"))
    42  
    43  		// workaround for https://github.com/sigstore/rekor/issues/68
    44  		// from https://github.com/golang/glog/commit/fca8c8854093a154ff1eb580aae10276ad6b1b5f
    45  		_ = flag.CommandLine.Parse([]string{})
    46  
    47  		vi := version.GetVersionInfo()
    48  		viStr, err := vi.JSONString()
    49  		if err != nil {
    50  			viStr = vi.String()
    51  		}
    52  		log.Logger.Infof("starting timestamp-server @ %v", viStr)
    53  
    54  		// create the prometheus, pprof, and rest API servers
    55  
    56  		readTimeout := viper.GetDuration("read-timeout")
    57  		writeTimeout := viper.GetDuration("write-timeout")
    58  
    59  		go func() {
    60  			promServer := server.NewPrometheusServer(readTimeout, writeTimeout)
    61  
    62  			if err := promServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
    63  				log.Logger.Fatalf("error when starting or running http server for metrics: %v", err)
    64  			}
    65  		}()
    66  
    67  		enablePprof := viper.GetBool("enable-pprof")
    68  		log.Logger.Debugf("pprof enabled: %v", enablePprof)
    69  		// Enable pprof
    70  		if enablePprof {
    71  			go func() {
    72  				pprofServer := server.NewPprofServer(readTimeout, writeTimeout)
    73  
    74  				if err := pprofServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
    75  					log.Logger.Fatalf("error when starting or running http server for pprof: %v", err)
    76  				}
    77  			}()
    78  		}
    79  
    80  		var ntpm *ntpmonitor.NTPMonitor
    81  		disableNTPMonitoring := viper.GetBool("disable-ntp-monitoring")
    82  		if disableNTPMonitoring {
    83  			log.Logger.Info("ntp monitoring disabled")
    84  		} else {
    85  			ntpMonitoring := viper.GetString("ntp-monitoring")
    86  			if ntpMonitoring != "" {
    87  				log.Logger.Infof("using custom ntp monitoring config: %s", ntpMonitoring)
    88  			}
    89  
    90  			go func() {
    91  				ntpm, err = ntpmonitor.New(ntpMonitoring)
    92  				if err != nil {
    93  					log.Logger.Fatalf("error initializing ntp monitor %s", err)
    94  				}
    95  
    96  				ntpm.Start()
    97  			}()
    98  		}
    99  
   100  		host := viper.GetString("host")
   101  		port := int(viper.GetUint("port"))
   102  		scheme := viper.GetStringSlice("scheme")
   103  		server := server.NewRestAPIServer(host, port, scheme, httpPingOnly, readTimeout, writeTimeout)
   104  		defer func() {
   105  			if err := server.Shutdown(); err != nil {
   106  				log.Logger.Error(err)
   107  			}
   108  			if ntpm != nil {
   109  				ntpm.Stop()
   110  			}
   111  		}()
   112  		if err := server.Serve(); err != nil {
   113  			log.Logger.Fatal(err)
   114  		}
   115  	},
   116  }
   117  
   118  func init() {
   119  	rootCmd.AddCommand(serveCmd)
   120  	rootCmd.AddCommand(version.Version())
   121  }
   122  

View as plain text