blob: 33d791969ae27564f3e2fd402b4923eec86d2fb8 [file] [log] [blame]
package main
import (
"flag"
"time"
"v.io/lib/cmdline"
"v.io/core/veyron/lib/signals"
_ "v.io/core/veyron/profiles/roaming"
"v.io/core/veyron/services/mgmt/device/config"
"v.io/core/veyron/services/mgmt/device/impl"
"v.io/core/veyron2"
"v.io/core/veyron2/vlog"
)
var (
// TODO(caprita): publishAs and restartExitCode should be provided by the
// config?
publishAs = flag.String("name", "", "name to publish the device manager at")
restartExitCode = flag.Int("restart_exit_code", 0, "exit code to return when device manager should be restarted")
)
func runServer(*cmdline.Command, []string) error {
ctx, shutdown := veyron2.Init()
defer shutdown()
server, err := veyron2.NewServer(ctx)
if err != nil {
vlog.Errorf("NewServer() failed: %v", err)
return err
}
defer server.Stop()
ls := veyron2.GetListenSpec(ctx)
endpoints, err := server.Listen(ls)
if err != nil {
vlog.Errorf("Listen(%s) failed: %v", ls, err)
return err
}
name := endpoints[0].Name()
vlog.VI(0).Infof("Device manager object name: %v", name)
configState, err := config.Load()
if err != nil {
vlog.Errorf("Failed to load config passed from parent: %v", err)
return err
}
configState.Name = name
// TODO(caprita): We need a way to set config fields outside of the
// update mechanism (since that should ideally be an opaque
// implementation detail).
var exitErr error
dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(ctx), configState, func() { exitErr = cmdline.ErrExitCode(*restartExitCode) })
if err != nil {
vlog.Errorf("Failed to create dispatcher: %v", err)
return err
}
if err := server.ServeDispatcher(*publishAs, dispatcher); err != nil {
vlog.Errorf("Serve(%v) failed: %v", *publishAs, err)
return err
}
vlog.VI(0).Infof("Device manager published as: %v", *publishAs)
impl.InvokeCallback(ctx, name)
// Wait until shutdown. Ignore duplicate signals (sent by agent and
// received as part of process group).
signals.SameSignalTimeWindow = 500 * time.Millisecond
<-signals.ShutdownOnSignals(ctx)
return exitErr
}