github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/imageserver/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 8 "github.com/Cloud-Foundations/Dominator/imageserver/httpd" 9 imageserverRpcd "github.com/Cloud-Foundations/Dominator/imageserver/rpcd" 10 "github.com/Cloud-Foundations/Dominator/imageserver/scanner" 11 "github.com/Cloud-Foundations/Dominator/lib/constants" 12 "github.com/Cloud-Foundations/Dominator/lib/flags/loadflags" 13 "github.com/Cloud-Foundations/Dominator/lib/log/serverlogger" 14 "github.com/Cloud-Foundations/Dominator/lib/objectserver/filesystem" 15 "github.com/Cloud-Foundations/Dominator/lib/srpc/setupserver" 16 objectserverRpcd "github.com/Cloud-Foundations/Dominator/objectserver/rpcd" 17 "github.com/Cloud-Foundations/tricorder/go/tricorder" 18 "github.com/Cloud-Foundations/tricorder/go/tricorder/units" 19 ) 20 21 var ( 22 debug = flag.Bool("debug", false, "If true, show debugging output") 23 imageDir = flag.String("imageDir", "/var/lib/imageserver", 24 "Name of image server data directory.") 25 imageServerHostname = flag.String("imageServerHostname", "", 26 "Hostname of image server to receive updates from") 27 imageServerPortNum = flag.Uint("imageServerPortNum", 28 constants.ImageServerPortNumber, 29 "Port number of image server") 30 objectDir = flag.String("objectDir", "/var/lib/objectserver", 31 "Name of image server data directory.") 32 permitInsecureMode = flag.Bool("permitInsecureMode", false, 33 "If true, run in insecure mode. This gives remote access to all") 34 portNum = flag.Uint("portNum", constants.ImageServerPortNumber, 35 "Port number to allocate and listen on for HTTP/RPC") 36 ) 37 38 type imageObjectServersType struct { 39 imdb *scanner.ImageDataBase 40 objSrv *filesystem.ObjectServer 41 } 42 43 func main() { 44 if os.Geteuid() == 0 { 45 fmt.Fprintln(os.Stderr, "Do not run the Image Server as root") 46 os.Exit(1) 47 } 48 if err := loadflags.LoadForDaemon("imageserver"); err != nil { 49 fmt.Fprintln(os.Stderr, err) 50 os.Exit(1) 51 } 52 flag.Parse() 53 tricorder.RegisterFlags() 54 logger := serverlogger.New("") 55 if err := setupserver.SetupTls(); err != nil { 56 if *permitInsecureMode { 57 logger.Println(err) 58 } else { 59 logger.Fatalln(err) 60 } 61 } 62 objSrv, err := filesystem.NewObjectServer(*objectDir, logger) 63 if err != nil { 64 logger.Fatalf("Cannot create ObjectServer: %s\n", err) 65 } 66 var imageServerAddress string 67 if *imageServerHostname != "" { 68 imageServerAddress = fmt.Sprintf("%s:%d", *imageServerHostname, 69 *imageServerPortNum) 70 } 71 imdb, err := scanner.LoadImageDataBase(*imageDir, objSrv, 72 imageServerAddress, logger) 73 if err != nil { 74 logger.Fatalf("Cannot load image database: %s\n", err) 75 } 76 tricorder.RegisterMetric("/image-count", 77 func() uint { return imdb.CountImages() }, 78 units.None, "number of images") 79 imgSrvRpcHtmlWriter, err := imageserverRpcd.Setup(imdb, imageServerAddress, 80 objSrv, logger) 81 if err != nil { 82 logger.Fatalln(err) 83 } 84 objSrvRpcHtmlWriter := objectserverRpcd.Setup(objSrv, imageServerAddress, 85 logger) 86 httpd.AddHtmlWriter(imdb) 87 httpd.AddHtmlWriter(&imageObjectServersType{imdb, objSrv}) 88 httpd.AddHtmlWriter(imgSrvRpcHtmlWriter) 89 httpd.AddHtmlWriter(objSrvRpcHtmlWriter) 90 httpd.AddHtmlWriter(logger) 91 if err = httpd.StartServer(*portNum, imdb, objSrv, false); err != nil { 92 logger.Fatalf("Unable to create http server: %s\n", err) 93 } 94 }