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  }