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