Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "flag" |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 5 | "os" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 6 | |
Jiri Simsa | 519c507 | 2014-09-17 21:37:57 -0700 | [diff] [blame] | 7 | "veyron.io/veyron/veyron2/naming" |
| 8 | "veyron.io/veyron/veyron2/rt" |
| 9 | "veyron.io/veyron/veyron2/vlog" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 10 | |
| 11 | "veyron.io/veyron/veyron/lib/signals" |
| 12 | "veyron.io/veyron/veyron/profiles/roaming" |
Bogdan Caprita | a456f47 | 2014-12-10 10:18:03 -0800 | [diff] [blame] | 13 | "veyron.io/veyron/veyron/services/mgmt/device/config" |
| 14 | "veyron.io/veyron/veyron/services/mgmt/device/impl" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 17 | var ( |
Bogdan Caprita | 2b21936 | 2014-12-09 17:03:33 -0800 | [diff] [blame] | 18 | publishAs = flag.String("name", "", "name to publish the device manager at") |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 19 | installSelf = flag.Bool("install_self", false, "perform installation using environment and command-line flags") |
| 20 | installFrom = flag.String("install_from", "", "if not-empty, perform installation from the provided application envelope object name") |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 21 | ) |
| 22 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 23 | func main() { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 24 | flag.Parse() |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 25 | runtime, err := rt.New() |
| 26 | if err != nil { |
| 27 | vlog.Fatalf("Could not initialize runtime: %v", err) |
| 28 | } |
Bogdan Caprita | 4258d88 | 2014-07-02 09:15:22 -0700 | [diff] [blame] | 29 | defer runtime.Cleanup() |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 30 | |
| 31 | if len(*installFrom) > 0 { |
| 32 | if err := impl.InstallFrom(*installFrom); err != nil { |
| 33 | vlog.Errorf("InstallFrom failed: %v", err) |
| 34 | os.Exit(1) |
| 35 | } |
| 36 | return |
| 37 | } |
| 38 | |
| 39 | if *installSelf { |
Bogdan Caprita | 35fcead | 2014-12-04 17:38:30 -0800 | [diff] [blame] | 40 | // TODO(caprita): Make the flags survive updates. |
| 41 | if err := impl.SelfInstall(flag.Args(), os.Environ()); err != nil { |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 42 | vlog.Errorf("SelfInstall failed: %v", err) |
| 43 | os.Exit(1) |
| 44 | } |
| 45 | return |
| 46 | } |
| 47 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 48 | server, err := runtime.NewServer() |
| 49 | if err != nil { |
| 50 | vlog.Fatalf("NewServer() failed: %v", err) |
| 51 | } |
| 52 | defer server.Stop() |
Cosmos Nicolaou | f8d4c2b | 2014-10-23 22:36:38 -0700 | [diff] [blame] | 53 | endpoint, err := server.Listen(roaming.ListenSpec) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 54 | if err != nil { |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 55 | vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 56 | } |
David Why Use Two When One Will Do Presotto | 8b4dbbf | 2014-11-06 10:50:14 -0800 | [diff] [blame] | 57 | name := naming.JoinAddressName(endpoint.String(), "") |
Bogdan Caprita | 2b21936 | 2014-12-09 17:03:33 -0800 | [diff] [blame] | 58 | vlog.VI(0).Infof("Device manager object name: %v", name) |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 59 | configState, err := config.Load() |
| 60 | if err != nil { |
| 61 | vlog.Fatalf("Failed to load config passed from parent: %v", err) |
| 62 | return |
| 63 | } |
| 64 | configState.Name = name |
| 65 | // TODO(caprita): We need a way to set config fields outside of the |
| 66 | // update mechanism (since that should ideally be an opaque |
| 67 | // implementation detail). |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 68 | dispatcher, err := impl.NewDispatcher(runtime.Principal(), configState) |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 69 | if err != nil { |
| 70 | vlog.Fatalf("Failed to create dispatcher: %v", err) |
| 71 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 72 | if err := server.ServeDispatcher(*publishAs, dispatcher); err != nil { |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 73 | vlog.Fatalf("Serve(%v) failed: %v", *publishAs, err) |
Jiri Simsa | 24e87aa | 2014-06-09 09:27:34 -0700 | [diff] [blame] | 74 | } |
Bogdan Caprita | 2b21936 | 2014-12-09 17:03:33 -0800 | [diff] [blame] | 75 | vlog.VI(0).Infof("Device manager published as: %v", *publishAs) |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 76 | impl.InvokeCallback(runtime.NewContext(), name) |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 77 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 78 | // Wait until shutdown. |
Matt Rosencrantz | c7fecf1 | 2014-11-27 19:58:43 -0800 | [diff] [blame] | 79 | <-signals.ShutdownOnSignals(runtime) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 80 | } |