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 }