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  }