github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/image-unpacker/main.go (about)

     1  // +build linux
     2  
     3  package main
     4  
     5  import (
     6  	"flag"
     7  	"fmt"
     8  	"os"
     9  	"syscall"
    10  
    11  	"github.com/Cloud-Foundations/Dominator/imageunpacker/httpd"
    12  	"github.com/Cloud-Foundations/Dominator/imageunpacker/rpcd"
    13  	"github.com/Cloud-Foundations/Dominator/imageunpacker/unpacker"
    14  	"github.com/Cloud-Foundations/Dominator/lib/constants"
    15  	"github.com/Cloud-Foundations/Dominator/lib/flags/loadflags"
    16  	"github.com/Cloud-Foundations/Dominator/lib/log/serverlogger"
    17  	"github.com/Cloud-Foundations/Dominator/lib/srpc/setupserver"
    18  	"github.com/Cloud-Foundations/tricorder/go/tricorder"
    19  )
    20  
    21  const (
    22  	dirPerms = syscall.S_IRWXU | syscall.S_IRGRP | syscall.S_IXGRP |
    23  		syscall.S_IROTH | syscall.S_IXOTH
    24  )
    25  
    26  var (
    27  	imageServerHostname = flag.String("imageServerHostname", "localhost",
    28  		"Hostname of image server")
    29  	imageServerPortNum = flag.Uint("imageServerPortNum",
    30  		constants.ImageServerPortNumber,
    31  		"Port number of image server")
    32  	portNum = flag.Uint("portNum", constants.ImageUnpackerPortNumber,
    33  		"Port number to allocate and listen on for HTTP/RPC")
    34  	stateDir = flag.String("stateDir", "/var/lib/image-unpacker",
    35  		"Name of state directory.")
    36  )
    37  
    38  func main() {
    39  	if err := loadflags.LoadForDaemon("image-unpacker"); err != nil {
    40  		fmt.Fprintln(os.Stderr, err)
    41  		os.Exit(1)
    42  	}
    43  	flag.Parse()
    44  	tricorder.RegisterFlags()
    45  	if os.Geteuid() != 0 {
    46  		fmt.Fprintln(os.Stderr, "Must run the Image Unpacker as root")
    47  		os.Exit(1)
    48  	}
    49  	logger := serverlogger.New("")
    50  	if err := setupserver.SetupTls(); err != nil {
    51  		logger.Fatalln(err)
    52  	}
    53  	if err := os.MkdirAll(*stateDir, dirPerms); err != nil {
    54  		fmt.Fprintf(os.Stderr, "Cannot create state directory: %s\n", err)
    55  		os.Exit(1)
    56  	}
    57  	unpackerObj, err := unpacker.Load(*stateDir,
    58  		fmt.Sprintf("%s:%d", *imageServerHostname, *imageServerPortNum), logger)
    59  	if err != nil {
    60  		fmt.Fprintf(os.Stderr, "Cannot start unpacker: %s\n", err)
    61  		os.Exit(1)
    62  	}
    63  	rpcHtmlWriter := rpcd.Setup(unpackerObj, logger)
    64  	httpd.AddHtmlWriter(unpackerObj)
    65  	httpd.AddHtmlWriter(rpcHtmlWriter)
    66  	httpd.AddHtmlWriter(logger)
    67  	if err = httpd.StartServer(*portNum, unpackerObj, false); err != nil {
    68  		fmt.Fprintf(os.Stderr, "Unable to create http server: %s\n", err)
    69  		os.Exit(1)
    70  	}
    71  }