github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imageserver/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/imageserver/httpd" 10 imageserverRpcd "github.com/Cloud-Foundations/Dominator/imageserver/rpcd" 11 "github.com/Cloud-Foundations/Dominator/imageserver/scanner" 12 "github.com/Cloud-Foundations/Dominator/lib/constants" 13 "github.com/Cloud-Foundations/Dominator/lib/flags/loadflags" 14 "github.com/Cloud-Foundations/Dominator/lib/log/serverlogger" 15 "github.com/Cloud-Foundations/Dominator/lib/objectserver/filesystem" 16 "github.com/Cloud-Foundations/Dominator/lib/srpc" 17 "github.com/Cloud-Foundations/Dominator/lib/srpc/setupserver" 18 objectserverRpcd "github.com/Cloud-Foundations/Dominator/objectserver/rpcd" 19 "github.com/Cloud-Foundations/tricorder/go/healthserver" 20 "github.com/Cloud-Foundations/tricorder/go/tricorder" 21 "github.com/Cloud-Foundations/tricorder/go/tricorder/units" 22 ) 23 24 var ( 25 allowPublicAddObjects = flag.Bool("allowPublicAddObjects", false, 26 "If true, allow all users to call AddObjects method") 27 allowPublicCheckObjects = flag.Bool("allowPublicCheckObjects", false, 28 "If true, allow all users to call CheckObjects method") 29 allowPublicGetObjects = flag.Bool("allowPublicGetObjects", false, 30 "If true, allow all users to call GetObjects method") 31 debug = flag.Bool("debug", false, "If true, show debugging output") 32 imageDir = flag.String("imageDir", "/var/lib/imageserver", 33 "Name of image server data directory.") 34 imageServerHostname = flag.String("imageServerHostname", "", 35 "Hostname of image server to receive updates from") 36 imageServerPortNum = flag.Uint("imageServerPortNum", 37 constants.ImageServerPortNumber, 38 "Port number of image server") 39 lockCheckInterval = flag.Duration("lockCheckInterval", 2*time.Second, 40 "Interval between checks for lock timeouts") 41 lockLogTimeout = flag.Duration("lockLogTimeout", 5*time.Second, 42 "Timeout before logging that a lock has been held too long") 43 maximumExpirationDuration = flag.Duration("maximumExpirationDuration", 44 24*time.Hour, 45 "Maximum expiration time for regular users") 46 maximumExpirationDurationPrivileged = flag.Duration( 47 "maximumExpirationDurationPrivileged", 730*time.Hour, 48 "Maximum expiration time for privileged users") 49 objectDir = flag.String("objectDir", "/var/lib/objectserver", 50 "Name of image server data directory.") 51 permitInsecureMode = flag.Bool("permitInsecureMode", false, 52 "If true, run in insecure mode. This gives remote access to all") 53 portNum = flag.Uint("portNum", constants.ImageServerPortNumber, 54 "Port number to allocate and listen on for HTTP/RPC") 55 ) 56 57 func main() { 58 if os.Geteuid() == 0 { 59 fmt.Fprintln(os.Stderr, "Do not run the Image Server as root") 60 os.Exit(1) 61 } 62 if err := loadflags.LoadForDaemon("imageserver"); err != nil { 63 fmt.Fprintln(os.Stderr, err) 64 os.Exit(1) 65 } 66 flag.Parse() 67 tricorder.RegisterFlags() 68 logger := serverlogger.New("") 69 srpc.SetDefaultLogger(logger) 70 params := setupserver.Params{Logger: logger} 71 if err := setupserver.SetupTlsWithParams(params); err != nil { 72 if *permitInsecureMode { 73 logger.Println(err) 74 } else { 75 logger.Fatalln(err) 76 } 77 } 78 objSrv, err := filesystem.NewObjectServerWithConfigAndParams( 79 filesystem.Config{ 80 BaseDirectory: *objectDir, 81 LockCheckInterval: *lockCheckInterval, 82 LockLogTimeout: *lockLogTimeout, 83 }, 84 filesystem.Params{ 85 Logger: logger, 86 }) 87 if err != nil { 88 logger.Fatalf("Cannot create ObjectServer: %s\n", err) 89 } 90 var imageServerAddress string 91 if *imageServerHostname != "" { 92 imageServerAddress = fmt.Sprintf("%s:%d", *imageServerHostname, 93 *imageServerPortNum) 94 } 95 imdb, err := scanner.Load( 96 scanner.Config{ 97 BaseDirectory: *imageDir, 98 LockCheckInterval: *lockCheckInterval, 99 LockLogTimeout: *lockLogTimeout, 100 MaximumExpirationDuration: *maximumExpirationDuration, 101 MaximumExpirationDurationPrivileged: *maximumExpirationDurationPrivileged, 102 ReplicationMaster: imageServerAddress, 103 }, 104 scanner.Params{ 105 Logger: logger, 106 ObjectServer: objSrv, 107 }) 108 if err != nil { 109 logger.Fatalf("Cannot load image database: %s\n", err) 110 } 111 tricorder.RegisterMetric("/image-count", 112 func() uint { return imdb.CountImages() }, 113 units.None, "number of images") 114 imgSrvRpcHtmlWriter, err := imageserverRpcd.Setup(imdb, imageServerAddress, 115 objSrv, logger) 116 if err != nil { 117 logger.Fatalln(err) 118 } 119 objSrvRpcHtmlWriter := objectserverRpcd.Setup( 120 objectserverRpcd.Config{ 121 AllowPublicAddObjects: *allowPublicAddObjects, 122 AllowPublicCheckObjects: *allowPublicCheckObjects, 123 AllowPublicGetObjects: *allowPublicGetObjects, 124 ReplicationMaster: imageServerAddress, 125 }, 126 objectserverRpcd.Params{ 127 Logger: logger, 128 ObjectServer: objSrv, 129 }) 130 httpd.AddHtmlWriter(imdb) 131 httpd.AddHtmlWriter(imgSrvRpcHtmlWriter) 132 httpd.AddHtmlWriter(objSrv) 133 httpd.AddHtmlWriter(objSrvRpcHtmlWriter) 134 httpd.AddHtmlWriter(logger) 135 healthserver.SetReady() 136 if err = httpd.StartServer(*portNum, imdb, objSrv, false); err != nil { 137 logger.Fatalf("Unable to create http server: %s\n", err) 138 } 139 }