github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/filegen-server/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"os"
     7  	"syscall"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/constants"
    10  	"github.com/Cloud-Foundations/Dominator/lib/filegen"
    11  	"github.com/Cloud-Foundations/Dominator/lib/filegen/httpd"
    12  	"github.com/Cloud-Foundations/Dominator/lib/filegen/util"
    13  	"github.com/Cloud-Foundations/Dominator/lib/flags/loadflags"
    14  	"github.com/Cloud-Foundations/Dominator/lib/fsutil"
    15  	"github.com/Cloud-Foundations/Dominator/lib/log/serverlogger"
    16  	"github.com/Cloud-Foundations/Dominator/lib/srpc/setupserver"
    17  	"github.com/Cloud-Foundations/tricorder/go/tricorder"
    18  )
    19  
    20  var (
    21  	configFile = flag.String("configFile", "/var/lib/filegen-server/config",
    22  		"Name of file containing the configuration")
    23  	permitInsecureMode = flag.Bool("permitInsecureMode", false,
    24  		"If true, run in insecure mode. This gives remote access to all")
    25  	portNum = flag.Uint("portNum", constants.BasicFileGenServerPortNumber,
    26  		"Port number to allocate and listen on for HTTP/RPC")
    27  )
    28  
    29  func printUsage() {
    30  	fmt.Fprintln(os.Stderr, "Usage: filegen-server [flags...] directory...")
    31  	fmt.Fprintln(os.Stderr, "Common flags:")
    32  	flag.PrintDefaults()
    33  	fmt.Fprintln(os.Stderr, "directory: tree of source files")
    34  }
    35  
    36  func main() {
    37  	if os.Geteuid() == 0 {
    38  		fmt.Fprintln(os.Stderr, "Do not run the filegen server as root")
    39  		os.Exit(1)
    40  	}
    41  	if err := loadflags.LoadForDaemon("filegen-server"); err != nil {
    42  		fmt.Fprintln(os.Stderr, err)
    43  		os.Exit(1)
    44  	}
    45  	flag.Usage = printUsage
    46  	flag.Parse()
    47  	tricorder.RegisterFlags()
    48  	logger := serverlogger.New("")
    49  	if err := setupserver.SetupTls(); err != nil {
    50  		if *permitInsecureMode {
    51  			logger.Println(err)
    52  		} else {
    53  			logger.Fatalln(err)
    54  		}
    55  	}
    56  	manager := filegen.New(logger)
    57  	if *configFile != "" {
    58  		if err := util.LoadConfiguration(manager, *configFile); err != nil {
    59  			fmt.Fprintln(os.Stderr, err)
    60  			os.Exit(1)
    61  		}
    62  		ch := fsutil.WatchFile(*configFile, nil)
    63  		(<-ch).Close() // Drain the first event.
    64  		go func() {
    65  			<-ch
    66  			err := syscall.Exec(os.Args[0], os.Args, os.Environ())
    67  			if err != nil {
    68  				logger.Printf("Unable to Exec:%s: %s\n", os.Args[0], err)
    69  			}
    70  		}()
    71  	}
    72  	httpd.AddHtmlWriter(manager)
    73  	httpd.AddHtmlWriter(logger)
    74  	for _, pathname := range flag.Args() {
    75  		if err := registerSourceDirectory(manager, pathname, "/"); err != nil {
    76  			fmt.Fprintln(os.Stderr, err)
    77  			os.Exit(1)
    78  		}
    79  	}
    80  	if err := httpd.StartServer(*portNum, manager, false); err != nil {
    81  		fmt.Fprintf(os.Stderr, "Unable to create http server: %s\n", err)
    82  		os.Exit(1)
    83  	}
    84  }